From 6c5010119fde68c2536d296ef168665c53593c43 Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Mon, 19 Jan 2026 18:18:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ping=E4=B8=A2=E5=8C=85?= =?UTF-8?q?=E7=8E=87=E9=87=87=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tongran/agent/client/core/vo/NetVO.java | 3 + .../client/service/impl/NetServiceImpl.java | 73 +++++++++++++++++-- 2 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/tongran/agent/client/core/vo/NetVO.java b/src/main/java/com/tongran/agent/client/core/vo/NetVO.java index 4a33f5b..e248188 100644 --- a/src/main/java/com/tongran/agent/client/core/vo/NetVO.java +++ b/src/main/java/com/tongran/agent/client/core/vo/NetVO.java @@ -40,6 +40,9 @@ public class NetVO implements Serializable { @Schema(description = "出站丢包") private long outDropped; + @Schema(description = "ping丢包率") + private Double pingDropped; + @Schema(description = "发送流量(发送总字节)") private long outSpeed; diff --git a/src/main/java/com/tongran/agent/client/service/impl/NetServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/NetServiceImpl.java index 70b7cd7..88c2e62 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/NetServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/NetServiceImpl.java @@ -4,6 +4,9 @@ import com.tongran.agent.client.core.config.GlobalConfig; import com.tongran.agent.client.core.vo.NetVO; import com.tongran.agent.client.service.NetService; import com.tongran.agent.client.utils.AgentUtil; +import com.tongran.agent.client.utils.AssertLog; +import lombok.AllArgsConstructor; +import lombok.Data; import org.springframework.stereotype.Service; import oshi.SystemInfo; import oshi.hardware.HardwareAbstractionLayer; @@ -14,14 +17,15 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.file.*; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @Service public class NetServiceImpl implements NetService { - // 用于保存总流量统计 - private Map totalBytesRecvMap = new HashMap<>(); - private Map totalBytesSentMap = new HashMap<>(); + // 缓存最近一次的ping结果 + private final Map pingCache = new ConcurrentHashMap<>(); @Override public List netList(long timestamp) { @@ -121,7 +125,52 @@ public class NetServiceImpl implements NetService { } return 0L; } + /** + * 启动异步ping监控 + */ + private void startPingMonitorAsync(String interfaceName, long timeStapm) { + CompletableFuture.runAsync(() -> { + try { + Double lossRate = getPingLossRateSync(interfaceName); + if (lossRate != null) { + AssertLog.info("网卡 " + interfaceName + " 5分钟平均丢包率: " + lossRate + "%"); + // 更新缓存,供下次使用 + pingCache.put(interfaceName+timeStapm, lossRate); + } + } catch (Exception e) { + AssertLog.error("网卡" + interfaceName + "ping监控异常: " + e.getMessage()); + } + }); + } + /** + * 同步获取ping丢包率(在异步线程中调用) + */ + private Double getPingLossRateSync(String interfaceName) { + String[] cmd = { + "/bin/sh", "-c", + String.format("ping -I %s -c 290 -i 1 -W 1 -w 290 %s 2>&1 | grep 'packet loss' | awk -F'[ ,%]+' '{print $6}'", + interfaceName, "223.5.5.5") + }; + + try { + Process process = Runtime.getRuntime().exec(cmd); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + + int exitCode = process.waitFor(); + if (exitCode != 0) { + return null; + } + + String result = reader.readLine(); + if (result != null && !result.trim().isEmpty()) { + return Double.parseDouble(result.trim()); + } + } catch (Exception e) { + AssertLog.error("执行ping命令失败: " + e.getMessage()); + } + return null; + } /** * 处理OSHI能识别到的网卡 */ @@ -139,7 +188,18 @@ public class NetServiceImpl implements NetService { break; } } - + String[] ipv4Arr = net.getIPv4addr(); + CompletableFuture pingLossFuture = null; + boolean hasIpv4 = false; + Double pingDropped = null; + if(ipv4Arr != null){ + for (String ipv4 : ipv4Arr) { + if(ipv4 != "" && !ipv4.startsWith("127.")){ + hasIpv4 = true; + break; + } + } + } System.out.println("接口名称: " + interfaceName + "(" + net.getDisplayName() + ")"); System.out.println("MAC地址: " + net.getMacaddr()); System.out.println("运行状态: " + (net.isConnectorPresent() ? "已连接" : "未连接")); @@ -191,7 +251,10 @@ public class NetServiceImpl implements NetService { .ipv6OutSpeed(ipv6BytesSent) .timestamp(timestamp) .build(); - + if(hasIpv4){ + startPingMonitorAsync(interfaceName, timestamp); + netVO.setPingDropped(pingCache.get(interfaceName+(timestamp-300))); + } // 设置协商速度和工作模式 Map ethtoolMap = getNetworkMode(net.getName()); if (ethtoolMap != null && !ethtoolMap.isEmpty()) {