工业互联网平台2.0版本后端代码
houzhongjian
2025-06-05 ca6ad5acfb389b852211355c4a56c71769a018c9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
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);
        }
    }
}