优化mtr监控策略

This commit is contained in:
gaoyutao
2025-11-24 18:28:43 +08:00
parent bb231b3a3d
commit 8cf95456a5
4 changed files with 93 additions and 0 deletions
@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* mtr策略信息
@@ -42,4 +44,6 @@ public class MtrPolicyConfigEO {
/** 探测频率(秒) */
private Long probeFrequency;
/** clientId和ip对应集合 */
private Map<String, List<String>> clientIdToIpsMap;
}
@@ -7,6 +7,7 @@ import java.util.Date;
@Data
public class MtrVO {
private String targetIp; // 目标IP
private String clientId; // 对应的clientId
private Long policyId; // 策略ID
private double firstLossPercent; // 第一次探测丢包率
private double finalLossPercent; // 最终丢包率
@@ -33,6 +33,7 @@ import javax.annotation.Resource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@@ -287,6 +288,8 @@ public class AgentServiceImpl implements AgentService {
// 检测监控策略配置
AssertLog.info("检测监控策略配置");
checkMonitor();
AssertLog.info("检测mtr探测策略配置");
checkMtrDelect();
}
@Override
@@ -833,7 +836,24 @@ public class AgentServiceImpl implements AgentService {
}
if(jsonObject.containsKey("mtrPolicys")){
String mtrPolicys = jsonObject.getString("mtrPolicys");
AssertLog.info("接收的mtrPolicys原始值: {}", mtrPolicys);
AssertLog.info("GlobalConfig.MTRPOLICYMSG当前值: {}", GlobalConfig.MTRPOLICYMSG);
if(!mtrPolicys.equals(GlobalConfig.MTRPOLICYMSG)){
// 准备写入的内容
String[] lines = {
"# MTR探测策略配置文件",
"# 生成时间: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()),
"",
"# MTR策略配置(JSON格式)",
"mtrPolicys=" + mtrPolicys,
"",
"# 配置元信息",
"lastUpdateTime=" + System.currentTimeMillis()
};
//检查外置目录是否存在
if(AdvancedAsyncDownloader.createSingleDirectoryIfNotExists(properties.getConfPath())){
AgentUtil.bufferedWriter(properties.getConfPath()+"/mtrdelect.conf",lines);
}
GlobalConfig.MTRPOLICYMSG = mtrPolicys;
List<MtrPolicyConfigEO> mtrPolicyConfigEOList = JSON.parseArray(mtrPolicys, MtrPolicyConfigEO.class);
try {
@@ -1495,6 +1515,49 @@ public class AgentServiceImpl implements AgentService {
}
public void checkMtrDelect(){
File mtrFile = new File(properties.getConfPath() + "/mtrdelect.conf");
if (mtrFile.exists()) {
Properties props = new Properties();
try (InputStream input = Files.newInputStream(mtrFile.toPath())) {
props.load(input);
String mtrPolicys = props.getProperty("mtrPolicys");
if (StringUtils.isNotBlank(mtrPolicys)) {
GlobalConfig.MTRPOLICYMSG = mtrPolicys;
// 解析策略并启动定时任务
List<MtrPolicyConfigEO> mtrPolicyConfigEOList = JSON.parseArray(mtrPolicys, MtrPolicyConfigEO.class);
if (CollectionUtil.isNotEmpty(mtrPolicyConfigEOList)) {
// 检查策略是否仍然有效
long currentTimestamp = System.currentTimeMillis() / 1000;
boolean hasValidPolicy = false;
for (MtrPolicyConfigEO policy : mtrPolicyConfigEOList) {
if (isPolicyTimeValid(policy, currentTimestamp)) {
hasValidPolicy = true;
break;
}
}
if (hasValidPolicy) {
long milli = AgentUtil.millisecondsToNext5Minute();
dynamicTaskService.scheduleTask("mtrTask",
businessTasks::mtrTask, milli, 300000L);
AssertLog.info("应用启动时加载MTR配置成功,策略数量: {}", mtrPolicyConfigEOList.size());
} else {
AssertLog.info("应用启动时加载的MTR配置已过期");
}
}
}
} catch (Exception e) {
AssertLog.error("应用启动时加载MTR配置异常", e);
}
}
}
public void caseTypeBySystem(String type, int interval, boolean collect){
@@ -101,11 +101,36 @@ public class MtrServiceImpl implements MtrService {
}
}
/**
* 预先构建IP到clientId的反向映射
*/
private Map<String, String> buildIpToClientIdMap(Map<String, List<String>> clientIdToIpMap) {
Map<String, String> ipToClientIdMap = new HashMap<>();
if (clientIdToIpMap == null) {
return ipToClientIdMap;
}
for (Map.Entry<String, List<String>> entry : clientIdToIpMap.entrySet()) {
String clientId = entry.getKey();
List<String> 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) {
// 构建IP到clientId的反向映射
Map<String, String> ipToClientIdMap = buildIpToClientIdMap(policy.getClientIdToIpsMap());
MtrVO mtrVO = new MtrVO();
mtrVO.setClientId(ipToClientIdMap.getOrDefault(targetIp, "unknown"));
mtrVO.setTargetIp(targetIp);
mtrVO.setPolicyId(policy.getId());
mtrVO.setTimestamp(timestamp);