From 137d1b26c6459ee6106022ab6781338267d1fb04 Mon Sep 17 00:00:00 2001 From: freefish <1099550751@qq.com> Date: Thu, 15 May 2025 20:38:17 +0800 Subject: [PATCH] feat(server): add port usage display in server overview Port usage information is now shown in the server summary page, which helps users quickly identify which ports are occupied. --- .../sql/mysql/phoenix.sql" | 1 + .../common/domain/server/ProcessDomain.java | 4 ++ .../common/util/server/oshi/ProcessUtils.java | 55 ++++++++++++++++++- .../server/entity/MonitorServerProcess.java | 6 ++ .../impl/ServerProcessServiceImpl.java | 1 + .../web/entity/MonitorServerProcess.java | 4 ++ .../web/vo/MonitorServerProcessVo.java | 3 + .../static/modules/server/serverDetail.js | 7 +++ 8 files changed, 78 insertions(+), 3 deletions(-) diff --git "a/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/sql/mysql/phoenix.sql" "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/sql/mysql/phoenix.sql" index 5b521ef2..224e7b0b 100644 --- "a/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/sql/mysql/phoenix.sql" +++ "b/doc/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/sql/mysql/phoenix.sql" @@ -1028,6 +1028,7 @@ CREATE TABLE `MONITOR_SERVER_PROCESS` `CPU_LOAD_CUMULATIVE` double(16, 4) NULL DEFAULT NULL COMMENT '进程的累积CPU使用率', `BITNESS` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '进程的位数', `MEMORY_SIZE` bigint(20) NULL DEFAULT NULL COMMENT '占用内存大小(单位:byte)', + `PORT` varchar(1024) DEFAULT NULL COMMENT '端口列表(逗号分割)', `INSERT_TIME` datetime NOT NULL COMMENT '新增时间', `UPDATE_TIME` datetime NULL DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (`ID`) USING BTREE, diff --git a/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/domain/server/ProcessDomain.java b/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/domain/server/ProcessDomain.java index dac70d0b..e9bce84a 100644 --- a/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/domain/server/ProcessDomain.java +++ b/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/domain/server/ProcessDomain.java @@ -89,5 +89,9 @@ public class ProcessDomain extends AbstractSuperBean { * 占用内存大小(单位:byte) */ private long memorySize; + /** + * 进程占用的端口列表 + */ + private String port; } } diff --git a/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/util/server/oshi/ProcessUtils.java b/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/util/server/oshi/ProcessUtils.java index c091a702..7d6543e4 100644 --- a/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/util/server/oshi/ProcessUtils.java +++ b/phoenix-common/phoenix-common-core/src/main/java/com/gitee/pifeng/monitoring/common/util/server/oshi/ProcessUtils.java @@ -3,19 +3,19 @@ package com.gitee.pifeng.monitoring.common.util.server.oshi; import cn.hutool.core.date.BetweenFormatter; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; import com.gitee.pifeng.monitoring.common.domain.server.ProcessDomain; import com.gitee.pifeng.monitoring.common.init.InitOshi; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; +import oshi.software.os.InternetProtocolStats; import oshi.software.os.OSProcess; import oshi.software.os.OperatingSystem; import oshi.software.os.OperatingSystem.ProcessFiltering; import oshi.software.os.OperatingSystem.ProcessSorting; -import java.util.Comparator; -import java.util.Date; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; import static com.gitee.pifeng.monitoring.common.util.CollectionUtils.distinctByKey; @@ -128,6 +128,8 @@ public class ProcessUtils extends InitOshi { */ private static List wrapProcessInfoDomainList(List processes) { List processInfoList = Lists.newArrayList(); + // 获取进程与端口的映射关系 + Map> processPortsMap = getProcessPortsMapping(); for (OSProcess process : processes) { // 进程ID int processId = process.getProcessID(); @@ -167,11 +169,58 @@ public class ProcessUtils extends InitOshi { processInfoDomain.setCpuLoadCumulative(cpuLoadCumulative); processInfoDomain.setBitness(bitness); processInfoDomain.setMemorySize(memorySize); + // 设置进程占用的端口 + if (processPortsMap.containsKey(processId)) { + processInfoDomain.setPort(StrUtil.join(",", processPortsMap.get(processId))); + } processInfoList.add(processInfoDomain); } return processInfoList; } + + /** + *

+ * 获取进程与对应端口的映射关系 + *

+ * + * @return 进程ID与端口列表的映射 + * @author weixu38 + * @custom.date 2025/4/15 16:48 + */ + public static Map> getProcessPortsMapping() { + try { + Map> processPortsMap = new HashMap<>(); + + OperatingSystem os = SYSTEM_INFO.getOperatingSystem(); + InternetProtocolStats ipStats = os.getInternetProtocolStats(); + + List connections = ipStats.getConnections(); + + if (connections != null) { + for (InternetProtocolStats.IPConnection conn : connections) { + int localPort = conn.getLocalPort(); + int pid = conn.getowningProcessId(); + // 过滤无效数据 + if (pid <= 0 || localPort <= 0) { + continue; + } + // 可选:只保留监听中的连接 + if (conn.getState() != InternetProtocolStats.TcpState.LISTEN) { + continue; + } + processPortsMap.computeIfAbsent(pid, k -> new ArrayList<>()).add(localPort); + } + } + + return processPortsMap; + } catch (Throwable e) { + log.error("获取进程端口映射关系异常:{}", e.getMessage(), e); + return Collections.emptyMap(); + } + } + + /** *

* 获取正在运行的进程数 diff --git a/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/entity/MonitorServerProcess.java b/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/entity/MonitorServerProcess.java index 14b73c9d..472b3841 100644 --- a/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/entity/MonitorServerProcess.java +++ b/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/entity/MonitorServerProcess.java @@ -110,6 +110,12 @@ public class MonitorServerProcess { @TableField("MEMORY_SIZE") private Long memorySize; + /** + * 端口号列表(逗号分隔) + */ + @TableField("PORT") + private String port; + /** * 新增时间 */ diff --git a/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/service/impl/ServerProcessServiceImpl.java b/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/service/impl/ServerProcessServiceImpl.java index f1644262..78e31348 100644 --- a/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/service/impl/ServerProcessServiceImpl.java +++ b/phoenix-server/src/main/java/com/gitee/pifeng/monitoring/server/business/server/service/impl/ServerProcessServiceImpl.java @@ -67,6 +67,7 @@ public class ServerProcessServiceImpl extends ServiceImpl进程ID:' + processId + ' ' + @@ -718,6 +720,11 @@ '

' + ' ' + user + '
'; + if (!isEmpty(port)) { + html += '
' + + ' ' + port + + '
'; + } if (!isEmpty(commandLine)) { html += '
' + ' ' + commandLine + -- Gitee