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<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
|
// while (interfaces.hasMoreElements()) {
|
// NetworkInterface networkInterface = interfaces.nextElement();
|
// // 过滤掉loopback接口
|
// if (networkInterface.isLoopback() || !networkInterface.isUp()) {
|
// continue;
|
// }
|
// Enumeration<InetAddress> 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<MonitorDiskDTO> collectMonitorDisk() throws IOException {
|
List<MonitorDiskDTO> 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<MonitorDiskDTO> monitorDiskSaveReqVOS) throws IOException {
|
initServerInfo();
|
// 获取默认文件系统的所有存储设备
|
Iterable<FileStore> 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<MonitorDiskDTO> 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);
|
}
|
}
|
}
|