package com.doumee.core.utils; import com.doumee.core.utils.monitor.*; import com.sun.jna.platform.mac.DiskArbitration; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import oshi.hardware.CentralProcessor; import oshi.hardware.GlobalMemory; import oshi.hardware.HardwareAbstractionLayer; import oshi.software.os.FileSystem; import oshi.software.os.OSFileStore; import oshi.software.os.OperatingSystem; import java.io.Serializable; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Properties; import java.util.concurrent.TimeUnit; /** * @author Eva.Caesar Liu * @date 2023/03/21 14:49 */ @Data @ApiModel("监听信息") public class Monitor implements Serializable { @ApiModelProperty(value = "操作系统名称") private String osName; @ApiModelProperty(value = "操作系统架构") private String osArch; @ApiModelProperty(value = "操作系统版本") private String osVersion; @ApiModelProperty(value = "服务器IP地址") private String ip; @ApiModelProperty(value = "MAC地址") private String mac; @ApiModelProperty(value = "服务器时间") private Date currentTime; @ApiModelProperty(value = "内存信息") private Memory memory; @ApiModelProperty(value = "CPU信息") private CPU cpu; @ApiModelProperty(value = "磁盘列表") private List disks; @ApiModelProperty(value = "JVM信息") private JVM jvm; /** * 获取实时信息 */ public Monitor current() { oshi.SystemInfo systemInfo = new oshi.SystemInfo(); HardwareAbstractionLayer hardware = systemInfo.getHardware(); systemInfo.getOperatingSystem().getSystemBootTime(); // 系统信息 OperatingSystemMXBean osMXBean = ManagementFactory.getOperatingSystemMXBean(); this.setOsName(osMXBean.getName()); this.setOsVersion(osMXBean.getVersion()); this.setOsArch(osMXBean.getArch()); this.setIp(Utils.Server.getIP()); this.setMac(Utils.Server.getMAC()); this.setCurrentTime(new Date(System.currentTimeMillis())); this.setMemory(hardware.getMemory()); this.setCpu(hardware.getProcessor()); this.setJvm(); this.setDisks(systemInfo.getOperatingSystem()); return this; } /** * 设置内存信息 */ private void setMemory(GlobalMemory memory) { this.memory = new Memory(); this.memory.setSize(this.toM(memory.getTotal())); this.memory.setFreeSpace(this.toM(memory.getAvailable())); } /** * 设置CPU信息 */ private void setCpu(CentralProcessor processor) { this.cpu = new CPU(); cpu.setLogicalCount(processor.getLogicalProcessorCount()); cpu.setPhysicalCount(processor.getPhysicalProcessorCount()); long[] prevTicks = processor.getSystemCpuLoadTicks(); try { TimeUnit.SECONDS.sleep(1); 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; cpu.setSystemRatio(cSys * 100.0 / totalCpu); cpu.setUserRatio(user * 100.0 / totalCpu); cpu.setUseRatio(100.0 - idle * 100.0 / totalCpu); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 设置JVM信息 */ private void setJvm() { this.jvm = new JVM(); Properties props = System.getProperties(); jvm.setMemory(new Memory()); jvm.getMemory().setSize(this.toM(Runtime.getRuntime().totalMemory())); jvm.getMemory().setFreeSpace(this.toM(Runtime.getRuntime().freeMemory())); jvm.setVersion(props.getProperty("java.version")); jvm.setHome(props.getProperty("java.home")); jvm.setBootTime(new Date(ManagementFactory.getRuntimeMXBean().getStartTime())); } /** * 设置磁盘信息 */ private void setDisks(OperatingSystem os) { try { this.disks = new LinkedList<>(); FileSystem fileSystem = os.getFileSystem(); List fsArray = fileSystem.getFileStores(); for (OSFileStore fileStore : fsArray) { Disk disk = new Disk(); disk.setName(fileStore.getName()); disk.setDir(fileStore.getMount()); disk.setFsType(fileStore.getType()); disk.setSize(this.toM(fileStore.getTotalSpace())); disk.setFreeSpace(this.toM(fileStore.getFreeSpace())); this.disks.add(disk); } } catch (Exception e) { e.printStackTrace(); } } /** * 转为兆 */ private double toM(long value) { return value * 1.0 / 1024 / 1024; } }