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<Disk> 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<OSFileStore> 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; 
 | 
    } 
 | 
} 
 |