增加ping丢包率采集

This commit is contained in:
gaoyutao
2026-01-19 18:18:16 +08:00
parent 158fddd0b2
commit 6c5010119f
2 changed files with 71 additions and 5 deletions
@@ -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;
@@ -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<String, Long> totalBytesRecvMap = new HashMap<>();
private Map<String, Long> totalBytesSentMap = new HashMap<>();
// 缓存最近一次的ping结果
private final Map<String, Double> pingCache = new ConcurrentHashMap<>();
@Override
public List<NetVO> 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<Double> 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<String, String> ethtoolMap = getNetworkMode(net.getName());
if (ethtoolMap != null && !ethtoolMap.isEmpty()) {