优化mtr监控策略
This commit is contained in:
@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mtr策略信息
|
* mtr策略信息
|
||||||
@@ -42,4 +44,6 @@ public class MtrPolicyConfigEO {
|
|||||||
|
|
||||||
/** 探测频率(秒) */
|
/** 探测频率(秒) */
|
||||||
private Long probeFrequency;
|
private Long probeFrequency;
|
||||||
|
/** clientId和ip对应集合 */
|
||||||
|
private Map<String, List<String>> clientIdToIpsMap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import java.util.Date;
|
|||||||
@Data
|
@Data
|
||||||
public class MtrVO {
|
public class MtrVO {
|
||||||
private String targetIp; // 目标IP
|
private String targetIp; // 目标IP
|
||||||
|
private String clientId; // 对应的clientId
|
||||||
private Long policyId; // 策略ID
|
private Long policyId; // 策略ID
|
||||||
private double firstLossPercent; // 第一次探测丢包率
|
private double firstLossPercent; // 第一次探测丢包率
|
||||||
private double finalLossPercent; // 最终丢包率
|
private double finalLossPercent; // 最终丢包率
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import javax.annotation.Resource;
|
|||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.nio.file.*;
|
import java.nio.file.*;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
@@ -287,6 +288,8 @@ public class AgentServiceImpl implements AgentService {
|
|||||||
// 检测监控策略配置
|
// 检测监控策略配置
|
||||||
AssertLog.info("检测监控策略配置");
|
AssertLog.info("检测监控策略配置");
|
||||||
checkMonitor();
|
checkMonitor();
|
||||||
|
AssertLog.info("检测mtr探测策略配置");
|
||||||
|
checkMtrDelect();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -833,7 +836,24 @@ public class AgentServiceImpl implements AgentService {
|
|||||||
}
|
}
|
||||||
if(jsonObject.containsKey("mtrPolicys")){
|
if(jsonObject.containsKey("mtrPolicys")){
|
||||||
String mtrPolicys = jsonObject.getString("mtrPolicys");
|
String mtrPolicys = jsonObject.getString("mtrPolicys");
|
||||||
|
AssertLog.info("接收的mtrPolicys原始值: {}", mtrPolicys);
|
||||||
|
AssertLog.info("GlobalConfig.MTRPOLICYMSG当前值: {}", GlobalConfig.MTRPOLICYMSG);
|
||||||
if(!mtrPolicys.equals(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;
|
GlobalConfig.MTRPOLICYMSG = mtrPolicys;
|
||||||
List<MtrPolicyConfigEO> mtrPolicyConfigEOList = JSON.parseArray(mtrPolicys, MtrPolicyConfigEO.class);
|
List<MtrPolicyConfigEO> mtrPolicyConfigEOList = JSON.parseArray(mtrPolicys, MtrPolicyConfigEO.class);
|
||||||
try {
|
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){
|
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探测
|
* 执行单个IP的MTR探测
|
||||||
*/
|
*/
|
||||||
private MtrVO executeSingleMtrProbe(String targetIp, MtrPolicyConfigEO policy, long timestamp) {
|
private MtrVO executeSingleMtrProbe(String targetIp, MtrPolicyConfigEO policy, long timestamp) {
|
||||||
|
// 构建IP到clientId的反向映射
|
||||||
|
Map<String, String> ipToClientIdMap = buildIpToClientIdMap(policy.getClientIdToIpsMap());
|
||||||
MtrVO mtrVO = new MtrVO();
|
MtrVO mtrVO = new MtrVO();
|
||||||
|
mtrVO.setClientId(ipToClientIdMap.getOrDefault(targetIp, "unknown"));
|
||||||
mtrVO.setTargetIp(targetIp);
|
mtrVO.setTargetIp(targetIp);
|
||||||
mtrVO.setPolicyId(policy.getId());
|
mtrVO.setPolicyId(policy.getId());
|
||||||
mtrVO.setTimestamp(timestamp);
|
mtrVO.setTimestamp(timestamp);
|
||||||
|
|||||||
Reference in New Issue
Block a user