文章目录
Java-SpringBoot-使用Sigar采集设备信息
项目要求:
采集设备信息,如CPU、内存、网络等信息,实现对设备的监控。
项目开源地址:
Gitee: https://gitee.com/xuhy34324/boot_sigar_acquisition
使用 Sigar 前的操作:
在使用 sigar 采集 window 或者 linux 系统信息时,需要在系统中添加 sigar 的指定文件,否则采集报错。(采集OS的没去研究)
具体操作在末尾。
一、Sigar依赖
<!-- https://mvnrepository.com/artifact/org.fusesource/sigar -->
<dependency>
<groupId>org.fusesource</groupId>
<artifactId>sigar</artifactId>
<version>1.6.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
二、项目讲解
项目环境:Window10
编译工具:IDEA
使用依赖:Sigar1.6.4、lombok
1. 项目结构图
2. 数据传递实体类
CpuVO.java
@Data
public class CpuVO {
private Double user; // 用户CPU使用率
private Double sys; // 系统CPU使用率
private Double wait; // 等待率
private Double nice; // 错误率
private Double idle; // 空闲率
private Double combined; // 使用率
}
MemoryVO.java
@Data
public class MemoryVO {
private Long memTotal; // 内存总容量 /k
private Long memUsed; // 当前内存使用量 /k
private Long memFree; // 当前内存剩余量 /k
private Long swapTotal; // 交换区总容量 /k
private Long swapUsed; // 当前交换区使用量 /k
private Long swapFree; // 当前交换区剩余量 /k
}
3. Sigar采集类
SigarLocalDeviceDataAcquisition.java
package com.example.acquisition;
import com.example.vo.CpuVO;
import com.example.vo.MemoryVO;
import org.hyperic.sigar.*;
import java.util.ArrayList;
import java.util.List;
/**
* @Author X_HuiYang
* @Date 2022/7/21 18:17
* @Description
*/
public class SigarLocalDeviceDataAcquisition {
public static Sigar sigar;
static {
sigar = new Sigar();
}
/**
* 采集本地设备内存数据
*/
public static MemoryVO getMemory() throws SigarException {
// 获取内存数据
Mem mem = sigar.getMem();
// 内存总容量
long memTotal = mem.getTotal();
// 内存使用量
long memUsed = mem.getUsed();
// 内存空闲量
long memFree = mem.getFree();
// 获取内存交换区数据
Swap swap = sigar.getSwap();
// 交换区总容量
long swapTotal = swap.getTotal();
// 交换区使用量
long swapUsed = swap.getUsed();
// 交换区剩余量
long swapFree = swap.getFree();
MemoryVO memoryVO = new MemoryVO();
// 除以1024,将原始数据单位变成 /k
memoryVO.setMemTotal(memTotal / 1024L);
memoryVO.setMemUsed(memUsed / 1024L);
memoryVO.setMemFree(memFree / 1024L);
memoryVO.setSwapTotal(swapTotal / 1024L);
memoryVO.setSwapUsed(swapUsed / 1024L);
memoryVO.setSwapFree(swapFree / 1024L);
return memoryVO;
}
/**
* 采集本地设备CPU数据
*/
public static CpuVO getCpu() throws SigarException {
// 获取设备总CPU数据
CpuPerc cpuPerc = sigar.getCpuPerc();
return cpuFormat(cpuPerc);
}
/**
* 采集本地设备所有CPU数据
*/
public static List<CpuVO> getCpuList() throws SigarException {
List<CpuVO> cpuVOS = new ArrayList<>();
// 获取设备所有CPU数据
CpuPerc[] cpuPercList = sigar.getCpuPercList();
for (CpuPerc cpuPerc : cpuPercList) {
cpuVOS.add(cpuFormat(cpuPerc));
}
return cpuVOS;
}
/**
* 采集本地设备所有网络数据
*/
public static void getNetwork() throws SigarException {
// 获取所有网络设备名称
String[] netInterfaceList = sigar.getNetInterfaceList();
for (String netInterface : netInterfaceList) {
// 按照名称查询所属数据
NetInterfaceConfig netInterfaceConfig = sigar.getNetInterfaceConfig(netInterface);
// IP地址
String address = netInterfaceConfig.getAddress();
// 子网掩码
String netmask = netInterfaceConfig.getNetmask();
NetInterfaceStat netInterfaceStat = sigar.getNetInterfaceStat(netInterface);
// 接收的总包数量
long rxPackets = netInterfaceStat.getRxPackets();
// 发送的总包数量
long txPackets = netInterfaceStat.getTxPackets();
// 接收的总字节数量
long rxBytes = netInterfaceStat.getRxBytes();
// 发送的总字节数量
long txBytes = netInterfaceStat.getTxBytes();
// 接收的错误包数量
long rxErrors = netInterfaceStat.getRxErrors();
// 发送的错误包数量
long txErrors = netInterfaceStat.getTxErrors();
// 接收时丢包数量
long rxDropped = netInterfaceStat.getRxDropped();
// 发送时丢包数量
long txDropped = netInterfaceStat.getTxDropped();
}
}
/**
* CPU数据返回值格式化
* */
private static CpuVO cpuFormat(CpuPerc cpuPerc) {
// 用户使用率
String cpuUser = CpuPerc.format(cpuPerc.getUser()); // CpuPerc.format() 此方法是将采集到的原始数据 计算成带 % 的使用率
// 系统使用率
String cpuSys = CpuPerc.format(cpuPerc.getSys());
// 当前等待率
String cpuWait = CpuPerc.format(cpuPerc.getWait());
// 当前错误率
String cpuNice = CpuPerc.format(cpuPerc.getNice());
// 当前空闲率
String cpuIdle = CpuPerc.format(cpuPerc.getIdle());
// 当前使用率
String cpuCombined = CpuPerc.format(cpuPerc.getCombined());
CpuVO cpuVO = new CpuVO();
// 将String类型的数据 转换为Double类型的数据。(个人项目需求 <非必要>)
cpuVO.setUser(Double.parseDouble(cpuUser.replace("%","")));
cpuVO.setSys(Double.parseDouble(cpuSys.replace("%","")));
cpuVO.setWait(Double.parseDouble(cpuWait.replace("%","")));
cpuVO.setNice(Double.parseDouble(cpuNice.replace("%","")));
cpuVO.setIdle(Double.parseDouble(cpuIdle.replace("%","")));
cpuVO.setCombined(Double.parseDouble(cpuCombined.replace("%","")));
return cpuVO;
}
}
4. Controller控制类
SigarController.java
package com.example.controller;
import com.example.acquisition.SigarLocalDeviceDataAcquisition;
import com.example.vo.CpuVO;
import com.example.vo.MemoryVO;
import lombok.extern.slf4j.Slf4j;
import org.hyperic.sigar.SigarException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author X_HuiYang
* @Date 2022/7/21 18:16
* @Description
*/
@Slf4j
@RestController
public class SigarController {
@PostMapping("/cpu")
public CpuVO getCpuData() {
try {
return SigarLocalDeviceDataAcquisition.getCpu();
} catch (SigarException e) {
e.printStackTrace();
return null;
}
}
@PostMapping("/memory")
public MemoryVO getMemory() {
try {
return SigarLocalDeviceDataAcquisition.getMemory();
} catch (SigarException e) {
e.printStackTrace();
return null;
}
}
}
三、采集失败原因以及解决方法
当你第一次在 Window 或 Linux 上运行 Sigar 采集数据时, 大概率会出现如下错误: 👇
在 Window 系统上运行是这个错误: no sigar-amd64-winnt.dll in java.library.path
在 Linux 系统上运行是这个错误: no libsigar-amd64-linux.so in java.library.path
错误原因:
系统缺少 Sigar 指定文件.
解决办法:
在系统文件夹中放入指定文件, 方法如下: 点击跳转文件下载页面
Window
: C:\Windows\System32 在此路径下移入 sigar-amd64-winnt.dll
Linux
: /usr/lib64 在此路径下移入 libsigar-amd64-linux.so