diff --git a/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/CpuInfo.java b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/CpuInfo.java new file mode 100644 index 000000000..d933a790b --- /dev/null +++ b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/CpuInfo.java @@ -0,0 +1,69 @@ +package cn.stylefeng.roses.kernel.monitor.api.pojo; + +import cn.hutool.core.util.NumberUtil; +import lombok.Setter; + +/** + * CPU相关信息 + * + * @author fengshuonan + * @date 2019-07-13 13:42 + */ +@Setter +public class CpuInfo { + + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() { + return cpuNum; + } + + public double getTotal() { + return NumberUtil.round(NumberUtil.mul(total, 100), 2).doubleValue(); + } + + public double getSys() { + return NumberUtil.round(NumberUtil.mul(sys / total, 100), 2).doubleValue(); + } + + public double getUsed() { + return NumberUtil.round(NumberUtil.mul(used / total, 100), 2).doubleValue(); + } + + public double getWait() { + return NumberUtil.round(NumberUtil.mul(wait / total, 100), 2).doubleValue(); + } + + public double getFree() { + return NumberUtil.round(NumberUtil.mul(free / total, 100), 2).doubleValue(); + } + +} diff --git a/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/JvmInfo.java b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/JvmInfo.java new file mode 100644 index 000000000..9382b1025 --- /dev/null +++ b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/JvmInfo.java @@ -0,0 +1,110 @@ +package cn.stylefeng.roses.kernel.monitor.api.pojo; + +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.NumberUtil; +import lombok.Setter; + +import java.lang.management.ManagementFactory; +import java.util.Date; + +/** + * JVM相关信息 + * + * @author fengshuonan + * @date 2019-07-13 13:42 + */ +@Setter +public class JvmInfo { + + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() { + return NumberUtil.div(total, (1024 * 1024), 2); + } + + public double getMax() { + return NumberUtil.div(max, (1024 * 1024), 2); + } + + public double getFree() { + return NumberUtil.div(free, (1024 * 1024), 2); + } + + public double getUsed() { + return NumberUtil.div(total - free, (1024 * 1024), 2); + } + + public String getVersion() { + return version; + } + + public String getHome() { + return home; + } + + public double getUsage() { + return NumberUtil.mul(NumberUtil.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + /** + * JDK启动时间 + */ + public String getStartTime() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + Date date = new Date(time); + return DateUtil.formatDateTime(date); + } + + /** + * JDK运行时间 + */ + public String getRunTime() { + + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + Date date = new Date(time); + + //运行多少分钟 + long runMS = DateUtil.between(date, new Date(), DateUnit.MS); + + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + + long day = runMS / nd; + long hour = runMS % nd / nh; + long min = runMS % nd % nh / nm; + + return day + "天" + hour + "小时" + min + "分钟"; + } +} diff --git a/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/MemInfo.java b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/MemInfo.java new file mode 100644 index 000000000..5dede0f23 --- /dev/null +++ b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/MemInfo.java @@ -0,0 +1,45 @@ +package cn.stylefeng.roses.kernel.monitor.api.pojo; + +import cn.hutool.core.util.NumberUtil; +import lombok.Setter; + +/** + * 內存相关信息 + * + * @author fengshuonan + * @date 2019-07-13 13:42 + */ +@Setter +public class MemInfo { + + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() { + return NumberUtil.div(total, (1024 * 1024 * 1024), 2); + } + + public double getUsed() { + return NumberUtil.div(used, (1024 * 1024 * 1024), 2); + } + + public double getFree() { + return NumberUtil.div(free, (1024 * 1024 * 1024), 2); + } + + public double getUsage() { + return NumberUtil.mul(NumberUtil.div(used, total, 4), 100); + } +} diff --git a/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/SysFileInfo.java b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/SysFileInfo.java new file mode 100644 index 000000000..12a640738 --- /dev/null +++ b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/SysFileInfo.java @@ -0,0 +1,49 @@ +package cn.stylefeng.roses.kernel.monitor.api.pojo; + +import lombok.Data; + +/** + * 系统文件相关信息 + * + * @author fengshuonan + * @date 2019-07-13 13:42 + */ +@Data +public class SysFileInfo { + + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + +} diff --git a/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/SysInfo.java b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/SysInfo.java new file mode 100644 index 000000000..1e35cb56e --- /dev/null +++ b/kernel-o-monitor/monitor-api/src/main/java/cn/stylefeng/roses/kernel/monitor/api/pojo/SysInfo.java @@ -0,0 +1,39 @@ +package cn.stylefeng.roses.kernel.monitor.api.pojo; + +import lombok.Data; + +/** + * 系统相关信息 + * + * @author fengshuonan + * @date 2019-07-13 13:42 + */ +@Data +public class SysInfo { + + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + +} diff --git a/kernel-o-monitor/monitor-business/README.md b/kernel-o-monitor/monitor-business/README.md deleted file mode 100644 index cd3c01b60..000000000 --- a/kernel-o-monitor/monitor-business/README.md +++ /dev/null @@ -1 +0,0 @@ -监控模块的业务 diff --git a/kernel-o-monitor/monitor-business/pom.xml b/kernel-o-monitor/monitor-business/pom.xml deleted file mode 100644 index e13334a17..000000000 --- a/kernel-o-monitor/monitor-business/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - 4.0.0 - - - cn.stylefeng.roses - kernel-o-monitor - 1.0.0 - ../pom.xml - - - monitor-business - - jar - - - - - - cn.stylefeng.roses - monitor-api - 1.0.0 - - - - - diff --git a/kernel-o-monitor/monitor-sdk-system-info/pom.xml b/kernel-o-monitor/monitor-sdk-system-info/pom.xml index 966d46ddd..bae9071ab 100644 --- a/kernel-o-monitor/monitor-sdk-system-info/pom.xml +++ b/kernel-o-monitor/monitor-sdk-system-info/pom.xml @@ -24,6 +24,20 @@ 1.0.0 + + + cn.stylefeng.roses + timer-api + 1.0.0 + + + + + com.github.oshi + oshi-core + ${oshi.version} + + diff --git a/kernel-o-monitor/monitor-sdk-system-info/src/main/java/cn/stylefeng/roses/kernel/monitor/system/SystemHardwareCalculator.java b/kernel-o-monitor/monitor-sdk-system-info/src/main/java/cn/stylefeng/roses/kernel/monitor/system/SystemHardwareCalculator.java new file mode 100644 index 000000000..62909378b --- /dev/null +++ b/kernel-o-monitor/monitor-sdk-system-info/src/main/java/cn/stylefeng/roses/kernel/monitor/system/SystemHardwareCalculator.java @@ -0,0 +1,200 @@ +package cn.stylefeng.roses.kernel.monitor.system; + +import cn.hutool.core.net.NetUtil; +import cn.hutool.core.util.NumberUtil; +import cn.stylefeng.roses.kernel.monitor.api.pojo.*; +import cn.stylefeng.roses.kernel.rule.util.IpInfoUtils; +import lombok.Data; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; + +/** + * 服务器相关信息 + * + * @author fengshuonan + * @date 2019-07-13 13:42 + */ +@Data +public class SystemHardwareCalculator { + + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private CpuInfo cpu = new CpuInfo(); + + /** + * 內存相关信息 + */ + private MemInfo mem = new MemInfo(); + + /** + * JVM相关信息 + */ + private JvmInfo jvm = new JvmInfo(); + + /** + * 服务器相关信息 + */ + private SysInfo sys = new SysInfo(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList<>(); + + /** + * 计算整理各个信息指标 + * + * @author fengshuonan + * @date 2021/2/1 20:39 + */ + public void calc() { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + setCpuInfo(hal.getProcessor()); + setMemInfo(hal.getMemory()); + setSysInfo(); + setJvmInfo(); + setSysFiles(si.getOperatingSystem()); + } + + /** + * 获取CPU信息 + * + * @author fengshuonan + * @date 2021/2/1 20:39 + */ + private void setCpuInfo(CentralProcessor processor) { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 获取内存信息 + * + * @author fengshuonan + * @date 2021/2/1 20:39 + */ + private void setMemInfo(GlobalMemory memory) { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 获取服务器信息 + * + * @author fengshuonan + * @date 2021/2/1 20:39 + */ + private void setSysInfo() { + Properties props = System.getProperties(); + sys.setComputerName(IpInfoUtils.getHostName()); + sys.setComputerIp(NetUtil.getLocalhostStr()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + * + * @author fengshuonan + * @date 2021/2/1 20:40 + */ + private void setJvmInfo() { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + jvm.setHome(props.getProperty("java.home")); + } + + /** + * 设置磁盘信息 + * + * @author fengshuonan + * @date 2021/2/1 20:40 + */ + private void setSysFiles(OperatingSystem os) { + FileSystem fileSystem = os.getFileSystem(); + OSFileStore[] fsArray = fileSystem.getFileStores(); + for (OSFileStore fs : fsArray) { + long free = fs.getUsableSpace(); + long total = fs.getTotalSpace(); + long used = total - free; + SysFileInfo sysFile = new SysFileInfo(); + sysFile.setDirName(fs.getMount()); + sysFile.setSysTypeName(fs.getType()); + sysFile.setTypeName(fs.getName()); + sysFile.setTotal(convertFileSize(total)); + sysFile.setFree(convertFileSize(free)); + sysFile.setUsed(convertFileSize(used)); + + if (total == 0) { + sysFile.setUsage(0); + } else { + sysFile.setUsage(NumberUtil.mul(NumberUtil.div(used, total, 4), 100)); + } + + sysFiles.add(sysFile); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + * @author fengshuonan + * @date 2021/2/1 20:40 + */ + public String convertFileSize(long size) { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) { + return String.format("%.1f GB", (float) size / gb); + } else if (size >= mb) { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } else if (size >= kb) { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } else { + return String.format("%d B", size); + } + } + +} diff --git a/kernel-o-monitor/monitor-sdk-system-info/src/main/java/cn/stylefeng/roses/kernel/monitor/system/holder/SystemHardwareInfoHolder.java b/kernel-o-monitor/monitor-sdk-system-info/src/main/java/cn/stylefeng/roses/kernel/monitor/system/holder/SystemHardwareInfoHolder.java new file mode 100644 index 000000000..403dc22eb --- /dev/null +++ b/kernel-o-monitor/monitor-sdk-system-info/src/main/java/cn/stylefeng/roses/kernel/monitor/system/holder/SystemHardwareInfoHolder.java @@ -0,0 +1,33 @@ +package cn.stylefeng.roses.kernel.monitor.system.holder; + +import cn.stylefeng.roses.kernel.monitor.system.SystemHardwareCalculator; +import cn.stylefeng.roses.kernel.timer.api.TimerAction; + +/** + * 定时刷新服务器状态信息 + * + * @author fengshuonan + * @date 2021/1/31 21:52 + */ +public class SystemHardwareInfoHolder implements TimerAction { + + private SystemHardwareCalculator systemHardwareCalculator = null; + + @Override + public void action() { + SystemHardwareCalculator newInfo = new SystemHardwareCalculator(); + newInfo.calc(); + systemHardwareCalculator = newInfo; + } + + public SystemHardwareCalculator getSystemHardwareInfo() { + if (systemHardwareCalculator != null) { + return systemHardwareCalculator; + } + + systemHardwareCalculator = new SystemHardwareCalculator(); + systemHardwareCalculator.calc(); + return systemHardwareCalculator; + } + +} diff --git a/kernel-o-monitor/monitor-spring-boot-starter/pom.xml b/kernel-o-monitor/monitor-spring-boot-starter/pom.xml index 826931bd4..c6d55bc50 100644 --- a/kernel-o-monitor/monitor-spring-boot-starter/pom.xml +++ b/kernel-o-monitor/monitor-spring-boot-starter/pom.xml @@ -20,7 +20,7 @@ cn.stylefeng.roses - monitor-business + monitor-sdk-system-info 1.0.0 diff --git a/kernel-o-monitor/monitor-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/monitor/starter/GunsMonitorAutoConfiguration.java b/kernel-o-monitor/monitor-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/monitor/starter/GunsMonitorAutoConfiguration.java index 9af2078b8..f42f90438 100644 --- a/kernel-o-monitor/monitor-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/monitor/starter/GunsMonitorAutoConfiguration.java +++ b/kernel-o-monitor/monitor-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/monitor/starter/GunsMonitorAutoConfiguration.java @@ -1,5 +1,7 @@ package cn.stylefeng.roses.kernel.monitor.starter; +import cn.stylefeng.roses.kernel.monitor.system.holder.SystemHardwareInfoHolder; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** @@ -11,5 +13,15 @@ import org.springframework.context.annotation.Configuration; @Configuration public class GunsMonitorAutoConfiguration { + /** + * 系统信息的holder,从这里获取系统信息 + * + * @author fengshuonan + * @date 2021/2/1 20:44 + */ + @Bean + public SystemHardwareInfoHolder systemHardwareInfoHolder() { + return new SystemHardwareInfoHolder(); + } } diff --git a/kernel-o-monitor/pom.xml b/kernel-o-monitor/pom.xml index 681edd3c3..986da57c9 100644 --- a/kernel-o-monitor/pom.xml +++ b/kernel-o-monitor/pom.xml @@ -17,7 +17,6 @@ monitor-api - monitor-business monitor-sdk-system-info monitor-spring-boot-starter diff --git a/pom.xml b/pom.xml index 7d3b0edc0..0160f456c 100644 --- a/pom.xml +++ b/pom.xml @@ -118,6 +118,7 @@ 4.5.2 1.6.2 3.0.7 + 3.9.1 @@ -270,6 +271,13 @@ pom + + + com.github.oshi + oshi-core + ${oshi.version} + +