云计算百科
云计算领域专业知识百科平台

SpringBoot使用oshi获取服务器相关信息

概念

OSHI是Java的免费基于JNA的(本机)操作系统和硬件信息库。它不需要安装任何其他本机库,并且旨在提供一种跨平台的实现来检索系统信息,例如操作系统版本,进程,内存和CPU使用率,磁盘和分区,设备,传感器等。

使用OSHI我们可以对应用程序进行监控,可以对应用程序所在的服务器资源进行监控,可以监控到很多的指标,如下:

1、计算机系统和固件,底板
2、操作系统和版本/内部版本
3、物理(核心)和逻辑(超线程)CPU,处理器组,NUMA节点
4、系统和每个处理器的负载百分比和滴答计数器
5、CPU正常运行时间,进程和线程
6、进程正常运行时间,CPU,内存使用率,用户/组,命令行
7、已使用/可用的物理和虚拟内存
8、挂载的文件系统(类型,可用空间和总空间)
9、磁盘驱动器(型号,序列号,大小)和分区
10、网络接口(IP,带宽输入/输出)
11、电池状态(电量百分比,剩余时间,电量使用情况统计信息)
12、连接的显示器(带有EDID信息)
13、USB设备
14、传感器(温度,风扇速度,电压)

项目结构

在这里插入图片描述

使用

pom.xml

<!– 获取系统信息 –>
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>3.9.1</version>
</dependency>
<!– 项目中用到了 –>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>

domain依次导入实体

package com.wcbtest.oshi.domain;

import cn.hutool.core.util.NumberUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;

@ApiModel(value="CPU信息")
@Data
public class Cpu implements Serializable {
private static final long serialVersionUID = 1L;

/**
* 核心数
*/

private int cpuNum;

/**
* CPU总的使用率
*/

private double total;

/**
* CPU系统使用率
*/

private double sys;

/**
* CPU用户使用率
*/

private double used;

/**
* CPU当前等待率
*/

private double wait;

/**
* CPU当前空闲率
*/

private double free;

public double getTotal() {
return NumberUtil.round(NumberUtil.mul(total, 100), 2).doubleValue();
}

public double getSys() {
return NumberUtil.round(NumberUtil.mul(sys / total, 100), 2).doubleValue();
}

public double getUsed() {
return NumberUtil.round(NumberUtil.mul(used / total, 100), 2).doubleValue();
}

public double getWait() {
return NumberUtil.round(NumberUtil.mul(wait / total, 100), 2).doubleValue();
}

public double getFree() {
return NumberUtil.round(NumberUtil.mul(free / total, 100), 2).doubleValue();
}
}

package com.wcbtest.oshi.domain;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;
import java.lang.management.ManagementFactory;
import java.util.Date;

@ApiModel(value="Jvm信息")
@Data
public class Jvm implements Serializable {

private static final long serialVersionUID = 1L;

/**
* 当前JVM占用的内存总数(M)
*/

private double total;

/**
* JVM最大可用内存总数(M)
*/

private double max;

/**
* JVM空闲内存(M)
*/

private double free;

/**
* JDK版本
*/

private String version;

/**
* JDK路径
*/

private String home;

public double getTotal() {
return NumberUtil.div(total, (1024 * 1024), 2);
}

public double getMax() {
return NumberUtil.div(max, (1024 * 1024), 2);
}

public double getFree() {
return NumberUtil.div(free, (1024 * 1024), 2);
}

public double getUsed() {
return NumberUtil.div(total free, (1024 * 1024), 2);
}

public String getVersion() {
return version;
}

public String getHome() {
return home;
}

public double getUsage() {
return NumberUtil.mul(NumberUtil.div(total free, total, 4), 100);
}
/**
* 获取JDK名称
*/

public String getName() {
return ManagementFactory.getRuntimeMXBean().getVmName();
}

/**
* JDK启动时间
*/

public String getStartTime() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
Date date = new Date(time);
return DateUtil.formatDateTime(date);
}

/**
* JDK运行时间
*/

public String getRunTime() {
long time = ManagementFactory.getRuntimeMXBean().getStartTime();
Date date = new Date(time);

//运行多少分钟
long runMS = DateUtil.between(date, new Date(), DateUnit.MS);

long nd = 1000 * 24 * 60 * 60;
long nh = 1000 * 60 * 60;
long nm = 1000 * 60;

long day = runMS / nd;
long hour = runMS % nd / nh;
long min = runMS % nd % nh / nm;
return day + "天" + hour + "小时" + min + "分钟";
}
}

package com.wcbtest.oshi.domain;

import cn.hutool.core.util.NumberUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;

@ApiModel(value="内存信息")
@Data
public class Mem implements Serializable {

private static final long serialVersionUID = 1L;

/**
* 内存总量
*/

private double total;

/**
* 已用内存
*/

private double used;

/**
* 剩余内存
*/

private double free;

public double getTotal() {
return NumberUtil.div(total, (1024 * 1024 * 1024), 2);
}

public double getUsed() {
return NumberUtil.div(used, (1024 * 1024 * 1024), 2);
}

public double getFree() {
return NumberUtil.div(free, (1024 * 1024 * 1024), 2);
}

public double getUsage() {
return NumberUtil.mul(NumberUtil.div(used, total, 4), 100);
}
}

package com.wcbtest.oshi.domain;

import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;

@ApiModel(value="服务器相关信息")
@Data
public class Sys implements Serializable {

private static final long serialVersionUID = 1L;

/**
* 服务器名称
*/

private String computerName;

/**
* 服务器Ip
*/

private String computerIp;

/**
* 项目路径
*/

private String userDir;

/**
* 操作系统
*/

private String osName;

/**
* 系统架构
*/

private String osArch;
}

package com.wcbtest.oshi.domain;

import io.swagger.annotations.ApiModel;
import lombok.Data;

import java.io.Serializable;
@ApiModel(value="磁盘相关信息")
@Data
public class SysFile implements Serializable {

private static final long serialVersionUID = 1L;

/**
* 盘符路径
*/

private String dirName;

/**
* 盘符类型
*/

private String sysTypeName;

/**
* 文件类型
*/

private String typeName;

/**
* 总大小
*/

private String total;

/**
* 剩余大小
*/

private String free;

/**
* 已经使用量
*/

private String used;

/**
* 资源的使用率
*/

private double usage;
}

package com.wcbtest.oshi.domain;

import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.system.HostInfo;
import cn.hutool.system.SystemUtil;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.CentralProcessor.TickType;
import oshi.hardware.GlobalMemory;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;

import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;

@ApiModel(value = "获取系统硬件信息(所有信息)")
@Data
public class SystemHardwareInfo implements Serializable {

private static final long serialVersionUID = 1L;

private static final int OSHI_WAIT_SECOND = 1000;

/**
* CPU相关信息
*/

private Cpu cpu = new Cpu();

/**
* 內存相关信息
*/

private Mem mem = new Mem();

/**
* JVM相关信息
*/

private Jvm jvm = new Jvm();

/**
* 服务器相关信息
*/

private Sys sys = new Sys();

/**
* 磁盘相关信息
*/

private List<SysFile> sysFiles = new LinkedList<SysFile>();

/**
* 调用此方法初始化数据
*
* @throws Exception
*/

public void initData() {
String type = null;

SystemInfo si = new SystemInfo();

setCpuInfo(si.getHardware().getProcessor());

setJvmInfo();

setMemInfo(si.getHardware().getMemory());

setSysInfo();

setSysFiles(si.getOperatingSystem());
}

/**
* 设置CPU信息
*/

private void setCpuInfo(CentralProcessor processor) {
// CPU信息
long[] prevTicks = processor.getSystemCpuLoadTicks();
Util.sleep(OSHI_WAIT_SECOND);
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[TickType.NICE.getIndex()] prevTicks[TickType.NICE.getIndex()];
long irq = ticks[TickType.IRQ.getIndex()] prevTicks[TickType.IRQ.getIndex()];
long softirq = ticks[TickType.SOFTIRQ.getIndex()] prevTicks[TickType.SOFTIRQ.getIndex()];
long steal = ticks[TickType.STEAL.getIndex()] prevTicks[TickType.STEAL.getIndex()];
long cSys = ticks[TickType.SYSTEM.getIndex()] prevTicks[TickType.SYSTEM.getIndex()];
long user = ticks[TickType.USER.getIndex()] prevTicks[TickType.USER.getIndex()];
long iowait = ticks[TickType.IOWAIT.getIndex()] prevTicks[TickType.IOWAIT.getIndex()];
long idle = ticks[TickType.IDLE.getIndex()] prevTicks[TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
cpu.setCpuNum(processor.getLogicalProcessorCount());
cpu.setTotal(totalCpu);
cpu.setSys(cSys);
cpu.setUsed(user);
cpu.setWait(iowait);
cpu.setFree(idle);
}

/**
* 设置内存信息
*/

private void setMemInfo(GlobalMemory memory) {
mem.setTotal(memory.getTotal());
mem.setUsed(memory.getTotal() memory.getAvailable());
mem.setFree(memory.getAvailable());
}

/**
* 设置服务器信息
*/

private void setSysInfo() {
Properties props = System.getProperties();
HostInfo hostInfo = SystemUtil.getHostInfo();
String name = hostInfo.getName();
sys.setComputerName(name);
//sys.setComputerName(IpUtil.getHostName());
sys.setComputerIp(NetUtil.getLocalhostStr());
sys.setOsName(props.getProperty("os.name"));
sys.setOsArch(props.getProperty("os.arch"));
sys.setUserDir(props.getProperty("user.dir"));
}

/**
* 设置Java虚拟机
*/

private void setJvmInfo() {
Properties props = System.getProperties();
jvm.setTotal(Runtime.getRuntime().totalMemory());
jvm.setMax(Runtime.getRuntime().maxMemory());
jvm.setFree(Runtime.getRuntime().freeMemory());
jvm.setVersion(props.getProperty("java.version"));
jvm.setHome(props.getProperty("java.home"));
}

/**
* 设置磁盘信息
*/

private void setSysFiles(OperatingSystem os) {
FileSystem fileSystem = os.getFileSystem();
OSFileStore[] fsArray = fileSystem.getFileStores();
for (OSFileStore fs : fsArray) {
long free = fs.getUsableSpace();
long total = fs.getTotalSpace();
long used = total free;
SysFile sysFile = new SysFile();
sysFile.setDirName(fs.getMount());
sysFile.setSysTypeName(fs.getType());
sysFile.setTypeName(fs.getName());
sysFile.setTotal(convertFileSize(total));
sysFile.setFree(convertFileSize(free));
sysFile.setUsed(convertFileSize(used));
sysFile.setUsage(NumberUtil.round(NumberUtil.mul(used, total, 4), 100).doubleValue());
//sysFile.setUsage(NumberUtil.round(NumberUtil.mul((float)used/(float)total, 100), 2).doubleValue());
sysFiles.add(sysFile);
}
}

/**
* 字节转换
*
* @param size 字节大小
* @return 转换后值
*/

public String convertFileSize(long size) {
long kb = 1024;
long mb = kb * 1024;
long gb = mb * 1024;
if (size >= gb) {
return String.format("%.1f GB", (float) size / gb);
} else if (size >= mb) {
float f = (float) size / mb;
return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);
} else if (size >= kb) {
float f = (float) size / kb;
return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);
} else {
return String.format("%d B", size);
}
}
}

controller测试

package com.wcbtest.oshi.controller;

import com.wcbtest.oshi.domain.SystemHardwareInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Api(tags = "硬件信息基础接口")
@RequestMapping("/oshi")
public class OshiController {

@ApiOperation(value = "获取硬件信息信息")
@GetMapping("/sysInfo")
public Object all() {
SystemHardwareInfo systemHardwareInfo = new SystemHardwareInfo();
systemHardwareInfo.initData();
return systemHardwareInfo;
}

}

赞(0)
未经允许不得转载:网硕互联帮助中心 » SpringBoot使用oshi获取服务器相关信息
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!