package com.wgcloud; import com.wgcloud.entity.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.hardware.NetworkIF; import oshi.software.os.FileSystem; import oshi.software.os.OSFileStore; import oshi.software.os.OSProcess; import oshi.software.os.OperatingSystem; import oshi.util.Util; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; /** * @version v3.3 * @ClassName: OshiUtil * @author: http://www.wgstart.com * @date: 2021年11月19日 * @Description: Oshi工具类 * @Copyright: 2017-2024 wgcloud. All rights reserved. */ public class OshiUtil { private static Logger logger = LoggerFactory.getLogger(OshiUtil.class); private static CommonConfig commonConfig = (CommonConfig) ApplicationContextHelper.getBean(CommonConfig.class); private static Runtime r = Runtime.getRuntime(); /** * 获取内存使用信息 * * @return */ public static MemState memory(GlobalMemory memory) throws Exception { MemState memState = new MemState(); long total = memory.getTotal() / 1024L / 1024L; long free = memory.getAvailable() / 1024L / 1024L; double usePer = (double) (total - free) / (double) total; memState.setUsePer(FormatUtil.formatDouble(usePer * 100, 1)); memState.setHostname(commonConfig.getBindIp()); return memState; } /** * 获取cpu使用率,等待率,空闲率 * * @return * @throws Exception */ public static CpuState cpu(CentralProcessor processor) throws Exception { long[] prevTicks = processor.getSystemCpuLoadTicks(); // Wait a second... Util.sleep(1000); CpuState cpuState = new CpuState(); cpuState.setSys(FormatUtil.formatDouble(processor.getSystemCpuLoadBetweenTicks(prevTicks) * 100, 1)); cpuState.setHostname(commonConfig.getBindIp()); return cpuState; } /** * 获取操作系统信息 * * @return * @throws Exception */ public static com.wgcloud.entity.SystemInfo os(CentralProcessor processor, OperatingSystem os) throws Exception { com.wgcloud.entity.SystemInfo systemInfo = new com.wgcloud.entity.SystemInfo(); systemInfo.setHostname(commonConfig.getBindIp()); systemInfo.setCpuCoreNum(processor.getLogicalProcessorCount() + ""); String cpuInfo = processor.toString(); if (cpuInfo.indexOf("\n") > 0) { cpuInfo = cpuInfo.substring(0, cpuInfo.indexOf("\n")); } systemInfo.setCpuXh(cpuInfo); systemInfo.setVersion(os.toString()); systemInfo.setVersionDetail(os.toString()); systemInfo.setState("1"); return systemInfo; } /** * 获取磁盘使用信息 * * @throws Exception */ public static List file(Timestamp t, FileSystem fileSystem) throws Exception { List list = new ArrayList(); List fsArray = fileSystem.getFileStores(); for (OSFileStore fs : fsArray) { long usable = fs.getUsableSpace(); long total = fs.getTotalSpace(); DeskState deskState = new DeskState(); deskState.setFileSystem(fs.getName()); deskState.setHostname(commonConfig.getBindIp()); deskState.setUsed(((total - usable) / 1024 / 1024 / 1024) + "G"); deskState.setAvail((usable / 1024 / 1024 / 1024) + "G"); deskState.setSize((total / 1024 / 1024 / 1024) + "G"); double usedSize = (total - usable); double usePercent = 0; if (total > 0) { usePercent = FormatUtil.formatDouble(usedSize / total * 100D, 2); } deskState.setUsePer(usePercent + "%"); deskState.setCreateTime(t); list.add(deskState); } return list; } /** * 获取系统负载 * * @return */ public static SysLoadState getLoadState(com.wgcloud.entity.SystemInfo systemInfo, CentralProcessor processor) throws Exception { SysLoadState sysLoadState = new SysLoadState(); if (systemInfo == null) { return null; } if (systemInfo.getVersionDetail().indexOf("Microsoft") > -1) { //windows系统不支持负载指标 return null; } double[] loadAverage = processor.getSystemLoadAverage(3); sysLoadState.setOneLoad(loadAverage[0]); sysLoadState.setHostname(commonConfig.getBindIp()); sysLoadState.setFiveLoad(loadAverage[1]); sysLoadState.setFifteenLoad(loadAverage[2]); return sysLoadState; } /** * 获取进程信息 * * @return */ public static AppState getLoadPid(String pid, OperatingSystem os, GlobalMemory memory) throws Exception { try { List pidList = new ArrayList<>(); pidList.add(Integer.valueOf(pid)); List procs = os.getProcesses(pidList); for (int i = 0; i < procs.size() && i < 5; i++) { OSProcess p = procs.get(i); AppState appState = new AppState(); appState.setCpuPer(FormatUtil.formatDouble(100d * (p.getKernelTime() + p.getUserTime()) / p.getUpTime(), 2)); appState.setMemPer(FormatUtil.formatDouble(100d * p.getResidentSetSize() / memory.getTotal(), 2)); return appState; } } catch (Exception e) { logger.error("获取进程信息错误", e); } return null; } /** * 获取网络带宽 * * @param hal * @return * @throws Exception */ public static NetIoState net(HardwareAbstractionLayer hal) throws Exception { long rxBytesBegin = 0; long txBytesBegin = 0; long rxPacketsBegin = 0; long txPacketsBegin = 0; long rxBytesEnd = 0; long txBytesEnd = 0; long rxPacketsEnd = 0; long txPacketsEnd = 0; List listBegin = hal.getNetworkIFs(); for (NetworkIF net : listBegin) { rxBytesBegin += net.getBytesRecv(); txBytesBegin += net.getBytesSent(); rxPacketsBegin += net.getPacketsRecv(); txPacketsBegin += net.getPacketsSent(); } //暂停3秒 Thread.sleep(5000); List listEnd = hal.getNetworkIFs(); for (NetworkIF net : listEnd) { rxBytesEnd += net.getBytesRecv(); txBytesEnd += net.getBytesSent(); rxPacketsEnd += net.getPacketsRecv(); txPacketsEnd += net.getPacketsSent(); } long rxBytesAvg = (rxBytesEnd - rxBytesBegin) / 3 / 1024; long txBytesAvg = (txBytesEnd - txBytesBegin) / 3 / 1024; long rxPacketsAvg = (rxPacketsEnd - rxPacketsBegin) / 3 / 1024; long txPacketsAvg = (txPacketsEnd - txPacketsBegin) / 3 / 1024; NetIoState netIoState = new NetIoState(); netIoState.setRxbyt(rxBytesAvg + ""); netIoState.setTxbyt(txBytesAvg + ""); netIoState.setRxpck(rxPacketsAvg + ""); netIoState.setTxpck(txPacketsAvg + ""); netIoState.setHostname(commonConfig.getBindIp()); return netIoState; } }