From aa4af48c7a3b014af398085526db9c36055aaafe Mon Sep 17 00:00:00 2001 From: gaoyutao Date: Fri, 28 Nov 2025 16:20:07 +0800 Subject: [PATCH] =?UTF-8?q?mtr=E6=8E=A2=E6=B5=8B=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/core/eo/MtrPolicyConfigEO.java | 21 -------- .../agent/client/core/vo/HopInfoVO.java | 16 ++++++ .../tongran/agent/client/core/vo/MtrVO.java | 4 +- .../scheduler/service/AppInitializer.java | 2 + .../scheduler/service/BusinessTasks.java | 13 ++++- .../agent/client/service/AgentService.java | 2 + .../client/service/impl/AgentServiceImpl.java | 5 +- .../client/service/impl/MtrServiceImpl.java | 53 ++++++------------- 8 files changed, 54 insertions(+), 62 deletions(-) create mode 100644 src/main/java/com/tongran/agent/client/core/vo/HopInfoVO.java diff --git a/src/main/java/com/tongran/agent/client/core/eo/MtrPolicyConfigEO.java b/src/main/java/com/tongran/agent/client/core/eo/MtrPolicyConfigEO.java index 4107477..6aab4ed 100644 --- a/src/main/java/com/tongran/agent/client/core/eo/MtrPolicyConfigEO.java +++ b/src/main/java/com/tongran/agent/client/core/eo/MtrPolicyConfigEO.java @@ -12,27 +12,6 @@ import java.util.Map; */ @Data public class MtrPolicyConfigEO { - private static final long serialVersionUID = 1L; - - /** 主键ID */ - private Long id; - - /** 策略名称 */ - private String policyName; - - /** 优先级 */ - private Long priority; - - /** MTR客户端ID */ - private String mtrClientId; - - /** 服务器集合(换行符分割) */ - private String serverGroup; - /** 探测目标ip集合 */ - private String serveripGroup; - - /** 是否探测(0-否,1-是) */ - private Long probeFlag; /** 开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") diff --git a/src/main/java/com/tongran/agent/client/core/vo/HopInfoVO.java b/src/main/java/com/tongran/agent/client/core/vo/HopInfoVO.java new file mode 100644 index 0000000..f576981 --- /dev/null +++ b/src/main/java/com/tongran/agent/client/core/vo/HopInfoVO.java @@ -0,0 +1,16 @@ +package com.tongran.agent.client.core.vo; + +import lombok.Data; + +@Data +public class HopInfoVO { + private int hopNumber; // 跳数 + private String ipAddress; // IP地址 + private String hostname; // 主机名(如果有) + private double lossPercent; // 丢包率 + private double avgLatency; // 平均延迟(ms) + private String country; // 国家 + private String province; // 省份 + private String city; // 城市 + private String isp; // 运营商 +} diff --git a/src/main/java/com/tongran/agent/client/core/vo/MtrVO.java b/src/main/java/com/tongran/agent/client/core/vo/MtrVO.java index a48d26a..f4507f9 100644 --- a/src/main/java/com/tongran/agent/client/core/vo/MtrVO.java +++ b/src/main/java/com/tongran/agent/client/core/vo/MtrVO.java @@ -3,6 +3,7 @@ package com.tongran.agent.client.core.vo; import lombok.Data; import java.util.Date; +import java.util.List; @Data public class MtrVO { @@ -14,4 +15,5 @@ public class MtrVO { private long timestamp; // 探测时间戳 private boolean hasRetry; // 是否重试 private String errorMsg; // 错误信息 -} + private List hopInfos; // 每跳路由信息列表 +} \ No newline at end of file diff --git a/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java b/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java index 2031546..d8a49fc 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java +++ b/src/main/java/com/tongran/agent/client/scheduler/service/AppInitializer.java @@ -92,6 +92,8 @@ public class AppInitializer implements CommandLineRunner { // 检测监控策略配置 AssertLog.info("检测监控策略配置"); agentService.checkMonitor(); + AssertLog.info("检测mtr探测策略配置"); + agentService.checkMtrDelect(); }else{ //未注册,发送注册 try { diff --git a/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java b/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java index f033a85..172a0ad 100644 --- a/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java +++ b/src/main/java/com/tongran/agent/client/scheduler/service/BusinessTasks.java @@ -844,6 +844,17 @@ public class BusinessTasks { long milli = AgentUtil.getMillisToNextMinute() + 60000; AssertLog.info("启动更新策略定时任务 - 延迟: {}ms, 间隔: {}ms", milli, 60000); dynamicTaskService.scheduleTask("policy", businessTasks::policyTask, milli, 60000); + + // 创建多网IP探测上报 + AssertLog.info("启动多网IP探测定时任务 - 延迟: {}ms, 间隔: {}ms", milli, 300000); + dynamicTaskService.scheduleTask("networkDetect", businessTasks::networkDetectTask, milli, 300000); + + // 检测监控策略配置 + AssertLog.info("检测监控策略配置"); + agentService.checkMonitor(); + + AssertLog.info("检测mtr探测策略配置"); + agentService.checkMtrDelect(); }else{ //未注册,发送注册 try { @@ -867,7 +878,7 @@ public class BusinessTasks { //设置注册定时任务,收注册成功后取消该定时任务 dynamicTaskService.scheduleTask("register", businessTasks::registerTask, 0, 300000); } - dynamicTaskService.cancelTask("connectionTask"); + dynamicTaskService.cancelTask("connection"); } AssertLog.info("建立连接重试定时任务执行 - task #{} completed", count); } diff --git a/src/main/java/com/tongran/agent/client/service/AgentService.java b/src/main/java/com/tongran/agent/client/service/AgentService.java index 92be1de..eb19c23 100644 --- a/src/main/java/com/tongran/agent/client/service/AgentService.java +++ b/src/main/java/com/tongran/agent/client/service/AgentService.java @@ -30,4 +30,6 @@ public interface AgentService { String getLogicalNode(); void checkMonitor(); + + void checkMtrDelect(); } diff --git a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java index 0c7d494..b859c0a 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/AgentServiceImpl.java @@ -836,8 +836,8 @@ public class AgentServiceImpl implements AgentService { } if(jsonObject.containsKey("mtrPolicys")){ String mtrPolicys = jsonObject.getString("mtrPolicys"); - AssertLog.info("接收的mtrPolicys原始值: {}", mtrPolicys); - AssertLog.info("GlobalConfig.MTRPOLICYMSG当前值: {}", GlobalConfig.MTRPOLICYMSG); + AssertLog.debug("接收的mtrPolicys原始值: {}", mtrPolicys); + AssertLog.debug("GlobalConfig.MTRPOLICYMSG当前值: {}", GlobalConfig.MTRPOLICYMSG); if(!mtrPolicys.equals(GlobalConfig.MTRPOLICYMSG)){ // 准备写入的内容 String[] lines = { @@ -1515,6 +1515,7 @@ public class AgentServiceImpl implements AgentService { } + @Override public void checkMtrDelect(){ File mtrFile = new File(properties.getConfPath() + "/mtrdelect.conf"); if (mtrFile.exists()) { diff --git a/src/main/java/com/tongran/agent/client/service/impl/MtrServiceImpl.java b/src/main/java/com/tongran/agent/client/service/impl/MtrServiceImpl.java index f7d874e..dc1223a 100644 --- a/src/main/java/com/tongran/agent/client/service/impl/MtrServiceImpl.java +++ b/src/main/java/com/tongran/agent/client/service/impl/MtrServiceImpl.java @@ -42,16 +42,20 @@ public class MtrServiceImpl implements MtrService { if (!isPolicyTimeValid(policy, timestamp)) { continue; } - - String[] targetIps = policy.getServeripGroup().split(";"); - for (String targetIp : targetIps) { - String ip = targetIp.trim(); - if (!ip.isEmpty()) { - // 异步执行每个IP的探测 - CompletableFuture future = CompletableFuture.supplyAsync(() -> - executeSingleMtrProbe(ip, policy, timestamp) - ); - futures.add(future); + for (Map.Entry> entry : policy.getClientIdToIpsMap().entrySet()) { + String clientId = entry.getKey(); + List ips = entry.getValue(); + if (ips != null) { + for (String ip : ips) { + String targetIp = ip.trim(); + if (!targetIp.isEmpty()) { + // 异步执行每个IP的探测 + CompletableFuture future = CompletableFuture.supplyAsync(() -> + executeSingleMtrProbe(targetIp, clientId, timestamp) + ); + futures.add(future); + } + } } } } @@ -101,38 +105,14 @@ public class MtrServiceImpl implements MtrService { } } - /** - * 预先构建IP到clientId的反向映射 - */ - private Map buildIpToClientIdMap(Map> clientIdToIpMap) { - Map ipToClientIdMap = new HashMap<>(); - - if (clientIdToIpMap == null) { - return ipToClientIdMap; - } - - for (Map.Entry> entry : clientIdToIpMap.entrySet()) { - String clientId = entry.getKey(); - List ips = entry.getValue(); - if (ips != null) { - for (String ip : ips) { - ipToClientIdMap.put(ip.trim(), clientId); - } - } - } - - return ipToClientIdMap; - } /** * 执行单个IP的MTR探测 */ - private MtrVO executeSingleMtrProbe(String targetIp, MtrPolicyConfigEO policy, long timestamp) { + private MtrVO executeSingleMtrProbe(String targetIp, String clientId, long timestamp) { // 构建IP到clientId的反向映射 - Map ipToClientIdMap = buildIpToClientIdMap(policy.getClientIdToIpsMap()); MtrVO mtrVO = new MtrVO(); - mtrVO.setClientId(ipToClientIdMap.getOrDefault(targetIp, "unknown")); + mtrVO.setClientId(clientId); mtrVO.setTargetIp(targetIp); - mtrVO.setPolicyId(policy.getId()); mtrVO.setTimestamp(timestamp); try { @@ -158,7 +138,6 @@ public class MtrServiceImpl implements MtrService { mtrVO.setHasRetry(false); AssertLog.info("目标IP {} 丢包率 {}%,无需重试", targetIp, firstLossPercent); } - return mtrVO; } catch (Exception e) {