公司为了方便运维人员部署项目,单独搞了个java的部署以及监控服务器状态的小工具
其中用到了一个三方库,可以读取到系统以及硬件信息(支持各种系统,我在linux和windows都试了是可以的)
了解了下源码就是通过JNA去读取系统信息的
下面是工具中用到的一些方法:
首先引包,一开始引的包在win7可以工作在win10有些接口有问题,然后自己单独引了最新的jna的包
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>5.3.6</version>
<exclusions>
<exclusion>
<artifactId>jna</artifactId>
<groupId>net.java.dev.jna</groupId>
</exclusion>
<exclusion>
<artifactId>jna-platform</artifactId>
<groupId>net.java.dev.jna</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.5.0</version>
<exclusions>
<exclusion>
<artifactId>jna</artifactId>
<groupId>net.java.dev.jna</groupId>
</exclusion>
</exclusions>
</dependency>
一:读取内存和cpu信息,通过比较内存信息比较准确,cpu有时和任务管理器的优点差异,但差异不会很大
private static SystemInfo si;
@Scheduled(fixedDelay = 25000)
public void collectMetrics() throws CreatingSettingsFolderException, ReadingEcosystemException {
log.info("Collecting Memory Dashboard Information");
if (si == null){
si = new SystemInfo();
}
HardwareAbstractionLayer hal = si.getHardware();
GlobalMemory memory = hal.getMemory();
MemoryUsageDto memoryUsageDto = new MemoryUsageDto();
Date date = new Date();
memoryUsageDto.setDate(new SimpleDateFormat("HH:mm:ss").format(date));
memoryUsageDto.setFreeMemory(String.valueOf(memory.getAvailable() / (1024 * 1024)));
memoryUsageDto.setTotalMemory(String.valueOf(memory.getTotal() / (1024 * 1024)));
memoryUsageDto.setCpuUsed(cpuUsed(hal));
memoryUsageQueue.add(memoryUsageDto);
//加到文件中,用于记录历史记录
MemoryUsageDto saveDto = new MemoryUsageDto();
BeanUtils.copyProperties(memoryUsageDto,saveDto);
saveDto.setDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
fileManager.saveSysInfo(saveDto);
}
private String cpuUsed(HardwareAbstractionLayer hal){
//SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = hal.getProcessor();
long[] prevTicks = processor.getSystemCpuLoadTicks();
Util.sleep(5000);
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
return new DecimalFormat("#.#").format((totalCpu == 0L ?0:1.0-(idle * 1.0 / totalCpu))*100);
}
界面展示
二、获取进程和磁盘信息
/**
* 获取进程信息
* @return
*/
public ProcessInfo[] parseProcesses(String order) {
if (si == null){
si = new SystemInfo();
}
OperatingSystem os = si.getOperatingSystem();
List<OSProcess> list = os.getProcesses(0, null);
long totalMem = si.getHardware().getMemory().getTotal();
//int cpuCount = si.getHardware().getProcessor().getLogicalProcessorCount();
// Build a map with a value for each process to control the sort
Map<OSProcess, Double> processSortValueMap = new HashMap<>();
for (OSProcess p : list) {
int pid = p.getProcessID();
// Ignore the Idle process on Windows
if (pid > 0 || !SystemInfo.getCurrentPlatformEnum().equals(PlatformEnum.WINDOWS)) {
// Set up for appropriate sort
if ("cpu".equals(order)) {
processSortValueMap.put(p, p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid)));
// } else if (cumulativeCpuButton.isSelected()) {
// processSortValueMap.put(p, p.getProcessCpuLoadCumulative());
} else {
processSortValueMap.put(p, (double) p.getResidentSetSize());
}
}
}
// Now sort the list by the values
List<Map.Entry<OSProcess, Double>> procList = new ArrayList<>(processSortValueMap.entrySet());
procList.sort(Map.Entry.comparingByValue());
// Insert into array in reverse order (lowest sort value last)
int i = procList.size();
ProcessInfo[] procArr = new ProcessInfo[i];
// These are in descending CPU order
for (Map.Entry<OSProcess, Double> e : procList) {
OSProcess p = e.getKey();
// Matches order of COLUMNS field
i--;
int pid = p.getProcessID();
ProcessInfo info = new ProcessInfo();
info.setPid(pid);
info.setPpid(p.getParentProcessID());
info.setThreads(p.getThreadCount());
info.setCpuPercent(String.format("%.1f",
100d * p.getProcessCpuLoadBetweenTicks(priorSnapshotMap.get(pid))));
//procArr[i][4] = String.format("%.1f", 100d * p.getProcessCpuLoadCumulative());
//procArr[i][5] = FormatUtil.formatBytes(p.getVirtualSize());
info.setMemory(FormatUtil.formatBytes(p.getResidentSetSize()));
info.setMemoryPercent(String.format("%.1f", 100d * p.getResidentSetSize() / totalMem));
info.setName(p.getName());
procArr[i] = info;
}
// Re-populate snapshot map
priorSnapshotMap.clear();
for (OSProcess p : list) {
priorSnapshotMap.put(p.getProcessID(), p);
}
return procArr;
}
public List<DiskInfo> fileInfo() {
if (si == null){
si = new SystemInfo();
}
FileSystem fileSystem = si.getOperatingSystem().getFileSystem();
List<OSFileStore> fsArray = fileSystem.getFileStores();
List<DiskInfo> diskInfos = new ArrayList<>();
for (OSFileStore fs : fsArray) {
long usable = fs.getUsableSpace();
long total = fs.getTotalSpace();
DiskInfo diskInfo = new DiskInfo();
diskInfo.setName(fs.getName());
diskInfo.setType(fs.getType());
String used = String.format("%s(%.1f%%)",FormatUtil.formatBytes(usable), 100d * usable / total);
diskInfo.setFree(used);
diskInfo.setTotal(FormatUtil.formatBytes(fs.getTotalSpace()));
diskInfos.add(diskInfo);
}
return diskInfos;
}
界面展示
还有很多接口使用方法作者都给了例子和demo
这里也把基本使用给展示了
https://www.cnblogs.com/songxingzhu/p/9107878.html