package com.iailab.module.infra.util; import cn.hutool.core.util.NumberUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.iailab.module.infra.api.monitor.dto.MonitorDiskDTO; import com.iailab.module.infra.api.monitor.dto.MonitorMemDTO; import org.apache.commons.lang3.ObjectUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.math.BigDecimal; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.file.FileStore; import java.nio.file.FileSystems; import java.util.ArrayList; import java.util.List; public class ServerInfoCollector { private static BigDecimal UNIT = new BigDecimal(1024 * 1024); private static BigDecimal PERCENT_UNIT = new BigDecimal(100); private static String hostName; private static String hostIp; public static void initServerInfo() throws UnknownHostException { // 获取本地主机对象 InetAddress localHost = InetAddress.getLocalHost(); // 获取主机名 hostName = localHost.getHostName(); // // 获取IP地址 hostIp = localHost.getHostAddress(); // try { // Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); // while (interfaces.hasMoreElements()) { // NetworkInterface networkInterface = interfaces.nextElement(); // // 过滤掉loopback接口 // if (networkInterface.isLoopback() || !networkInterface.isUp()) { // continue; // } // Enumeration addresses = networkInterface.getInetAddresses(); // while (addresses.hasMoreElements()) { // InetAddress addr = addresses.nextElement(); // // 过滤掉IPv6地址和回环地址 // if (!addr.isLoopbackAddress() && addr.getHostAddress().contains(".")) { // 确保是IPv4地址 // System.out.println("局域网IP地址: " + addr.getHostAddress()); // hostIp = addr.getHostAddress(); // } // } // } // } catch (SocketException e) { // e.printStackTrace(); // } } /** * 内存信息处理 */ public static MonitorMemDTO collectMonitorMem(String serverName) throws UnknownHostException { initServerInfo(); OperatingSystemMXBean operatingSystemBean = ManagementFactory.getOperatingSystemMXBean(); JSONObject operatingSystemJson = JSON.parseObject(JSON.toJSONString(operatingSystemBean)); BigDecimal totalPhysicalMemory = operatingSystemJson.getBigDecimal("totalPhysicalMemorySize"); BigDecimal freePhysicalMemory = operatingSystemJson.getBigDecimal("freePhysicalMemorySize"); BigDecimal usedPhysicalMemory = totalPhysicalMemory.subtract(freePhysicalMemory); BigDecimal systemCpuLoad = operatingSystemJson.getBigDecimal("systemCpuLoad"); BigDecimal processCpuLoad = operatingSystemJson.getBigDecimal("processCpuLoad"); Runtime runtime = Runtime.getRuntime(); MonitorMemDTO monitorMemDTO = new MonitorMemDTO(); monitorMemDTO.setHostName(hostName) .setHostIp(hostIp) .setServerName(serverName) .setPhysicalTotal(totalPhysicalMemory.divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setPhysicalUsed(usedPhysicalMemory.divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setPhysicalFree(freePhysicalMemory.divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setPhysicalUsage(NumberUtil.div(usedPhysicalMemory, totalPhysicalMemory).setScale(2, BigDecimal.ROUND_HALF_UP)) .setRuntimeTotal(new BigDecimal(runtime.totalMemory()).divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setRuntimeFree(new BigDecimal(runtime.freeMemory()).divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setRuntimeMax(new BigDecimal(runtime.maxMemory()).divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setRuntimeUsed(new BigDecimal(runtime.maxMemory() - runtime.totalMemory() + runtime.freeMemory()).divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP)) .setRuntimeUsage(new BigDecimal(NumberUtil.div(runtime.totalMemory()/1f - runtime.freeMemory(), runtime.totalMemory())).setScale(2, BigDecimal.ROUND_HALF_UP)) .setSystemCpuLoad(systemCpuLoad.multiply(PERCENT_UNIT)) .setProcessCpuLoad(processCpuLoad.multiply(PERCENT_UNIT)); return monitorMemDTO; } /** * 磁盘信息处理 */ public static List collectMonitorDisk() throws IOException { List monitorDiskSaveReqVOS = new ArrayList<>(); String os = System.getProperty("os.name").toLowerCase(); System.out.println(os); if (os.contains("win")) { getWindowsDiskUsage(monitorDiskSaveReqVOS); } else if (os.contains("nix") || os.contains("nux") || os.contains("mac")) { try { getLinuxDiskUsage(monitorDiskSaveReqVOS); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } else { System.out.println("不支持的服务器系统!"); } return monitorDiskSaveReqVOS; } private static void getWindowsDiskUsage(List monitorDiskSaveReqVOS) throws IOException { initServerInfo(); // 获取默认文件系统的所有存储设备 Iterable fileStores = FileSystems.getDefault().getFileStores(); for (FileStore store : fileStores) { MonitorDiskDTO monitorDiskSaveReqVO = new MonitorDiskDTO(); // 获取磁盘的总空间、已用空间和可用空间 BigDecimal totalSpace = new BigDecimal(store.getTotalSpace()).divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP); // 总空间 BigDecimal usableSpace = new BigDecimal(store.getUsableSpace()).divide(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP); // 可用空间 BigDecimal usedSpace = totalSpace.subtract(usableSpace).setScale(2, BigDecimal.ROUND_HALF_UP); // 计算已用空间 monitorDiskSaveReqVO.setHostName(hostName) .setHostIp(hostIp) .setDisk(store.toString()) .setDiskName(ObjectUtils.isNotEmpty(store.name()) ? store.name(): "/") .setSpaceTotal(totalSpace) .setSpaceUsable(usableSpace) .setSpaceUsed(usedSpace) .setSpaceRatio(usedSpace.divide(totalSpace, BigDecimal.ROUND_HALF_UP).setScale(4, BigDecimal.ROUND_HALF_UP)); monitorDiskSaveReqVOS.add(monitorDiskSaveReqVO); } } /** * 获取 Linux 系统的磁盘使用情况 */ private static void getLinuxDiskUsage(List monitorDiskSaveReqVOS) throws IOException, InterruptedException { Process process = Runtime.getRuntime().exec("df -h"); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; boolean isHeader = true; while ((line = reader.readLine()) != null) { if (isHeader) { isHeader = false; continue; } String[] parts = line.trim().split("\\s+"); System.out.println(parts); if (parts.length >= 6) { MonitorDiskDTO monitorDiskSaveReqVO = new MonitorDiskDTO(); String filesystem = parts[0]; String size = parts[1]; String used = parts[2]; String available = parts[3]; String mountedOn = parts[5]; BigDecimal totalSpace = formatSize(size); BigDecimal usableSpace = formatSize(available); BigDecimal usedSpace = formatSize(used); monitorDiskSaveReqVO.setHostName(hostName) .setHostIp(hostIp) .setDisk(filesystem + "(" + mountedOn + ")") .setDiskName(mountedOn) .setSpaceTotal(totalSpace) .setSpaceUsable(usableSpace) .setSpaceUsed(usedSpace) .setSpaceRatio(usedSpace.divide(totalSpace, BigDecimal.ROUND_HALF_UP).setScale(4, BigDecimal.ROUND_HALF_UP)); monitorDiskSaveReqVOS.add(monitorDiskSaveReqVO); } } int exitCode = process.waitFor(); if (exitCode != 0) { System.err.println("Command execution failed with exit code: " + exitCode); } reader.close(); } /** * 将字节大小转换为可读的格式 * @param size 字节数 * @return 人类可读的大小(MB) */ private static BigDecimal formatSize(String size) { if(size.contains("T")){ return new BigDecimal(Float.parseFloat(size.replace("T",""))).multiply(UNIT).setScale(2, BigDecimal.ROUND_HALF_UP); } else if (size.contains("G")){ return new BigDecimal(Float.parseFloat(size.replace("G","")) * 1024).setScale(2, BigDecimal.ROUND_HALF_UP); } else if (size.contains("M")){ return new BigDecimal(Float.parseFloat(size.replace("M",""))).setScale(2, BigDecimal.ROUND_HALF_UP); } else if (size.contains("K")){ return new BigDecimal(Float.parseFloat(size.replace("K","")) / 1024).setScale(2, BigDecimal.ROUND_HALF_UP); } else { return new BigDecimal(0); } } }