问题描述
目前线上的服务越来越多,需要监控对应服务的运行状态和系统基本信息:磁盘,cpu,内存的使用情况,线上服务和本地环境的机器类型不同,查找相关资料未找到可用的代码,经过查找相关资料,整理如下。
使用oshi
1.需要导入的包
<!--系统使用率导包开始-->
<dependency> <!--工具类 小数格式化 可以改为其他-->
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.0.9</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>4.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.oshi/oshi-json -->
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-json</artifactId>
<version>3.6.1</version>
</dependency>
<!--系统使用率导包结束-->
2.上干活 具体代码
这里获取磁盘使用情况在linux下有问题,所以使用了其他的方式获取
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import cn.hutool.core.util.NumberUtil;
import lombok.extern.slf4j.Slf4j;
import oshi.json.SystemInfo;
import oshi.json.hardware.CentralProcessor;
import oshi.json.hardware.GlobalMemory;
import oshi.json.hardware.HWDiskStore;
import oshi.json.hardware.HardwareAbstractionLayer;
/**
* <p>
* 类说明
* </p>
*
* @author Shawn
* @since 2018/06/29
*/
@Slf4j
public class SystemUsageUtil {
private static SystemInfo systemInfo = new SystemInfo();
/**
* 获取内存的使用率
*
* @return 内存使用率 0.36
*/
public static double getMemoryUsage() {
HardwareAbstractionLayer hal = systemInfo.getHardware();
GlobalMemory memory = hal.getMemory();
long available = memory.getAvailable();
long total = memory.getTotal();
log.info("getMemoryUsage available={},total={}", available, total);
double useRate = NumberUtil.div(available, total, 2);
return useRate;
}
/**
* 获取CPU的使用率
*
* @return CPU使用率 0.36
*/
public static double getCpuUsage() {
HardwareAbstractionLayer hal = systemInfo.getHardware();
CentralProcessor processor = hal.getProcessor();
double useRate = processor.getSystemCpuLoadBetweenTicks();
log.info("getCpuUsage useRate={}", useRate);
return NumberUtil.div(useRate, 1, 2);
}
/**
* 获取磁盘的使用率
*
* @return CPU使用率 0.36
*/
public static double getDiskUsage() {
if (isWindows()) {
return getWinDiskUsage();
}
return getUnixDiskUsage();
}
/**
* 判断系统是否为windows
*
* @return 是否
*/
private static boolean isWindows() {
return System.getProperties().getProperty("os.name").toUpperCase().contains("WINDOWS");
}
/**
* 获取linux 磁盘使用率
*
* @return 磁盘使用率
*/
private static double getUnixDiskUsage() {
String ioCmdStr = "df -h /";
String resultInfo = runCommand(ioCmdStr);
String[] data = resultInfo.split(" +");
double total = Double.parseDouble(data[10].replace("%", ""));
return total / 100;
}
/**
* 获取linux 磁盘使用率
*
* @return 磁盘使用率
*/
private static double getWinDiskUsage() {
HardwareAbstractionLayer hal = systemInfo.getHardware();
HWDiskStore[] diskStores = hal.getDiskStores();
long total = 0;
long used = 0;
if (diskStores != null && diskStores.length > 0) {
for (HWDiskStore diskStore : diskStores) {
long size = diskStore.getSize();
long writeBytes = diskStore.getWriteBytes();
total += size;
used += writeBytes;
}
}
return NumberUtil.div(used, total, 2);
}
/**
* 执行系统命令
*
* @param CMD 命令
* @return 字符串结果
*/
private static String runCommand(String CMD) {
StringBuilder info = new StringBuilder();
try {
Process pos = Runtime.getRuntime().exec(CMD);
pos.waitFor();
InputStreamReader isr = new InputStreamReader(pos.getInputStream());
LineNumberReader lnr = new LineNumberReader(isr);
String line;
while ((line = lnr.readLine()) != null) {
info.append(line).append("\n");
}
} catch (Exception e) {
info = new StringBuilder(e.toString());
}
return info.toString();
}
}
亲测 linux和windows环境可正常使用