parent
4908f5449c
commit
23671e12d8
@ -0,0 +1,108 @@
|
|||||||
|
package com.soa.monitoring;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务监控组件 - 负责监控服务的性能、可用性和错误率
|
||||||
|
*/
|
||||||
|
public class ServiceMonitor {
|
||||||
|
private static final Logger logger = LogManager.getLogger(ServiceMonitor.class);
|
||||||
|
private static ServiceMonitor instance;
|
||||||
|
private final Map<String, ServiceMetrics> metricsMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private ServiceMonitor() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取监控器单例
|
||||||
|
*/
|
||||||
|
public static synchronized ServiceMonitor getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new ServiceMonitor();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录服务调用开始
|
||||||
|
*/
|
||||||
|
public long startMonitoring(String serviceName) {
|
||||||
|
return System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录服务调用结束
|
||||||
|
*/
|
||||||
|
public void endMonitoring(String serviceName, long startTime, boolean success) {
|
||||||
|
long executionTime = System.currentTimeMillis() - startTime;
|
||||||
|
|
||||||
|
ServiceMetrics metrics = metricsMap.computeIfAbsent(serviceName, k -> new ServiceMetrics());
|
||||||
|
metrics.recordCall(executionTime, success);
|
||||||
|
|
||||||
|
logger.info("Service: {} - Execution time: {}ms, Status: {}",
|
||||||
|
serviceName, executionTime, success ? "SUCCESS" : "FAILED");
|
||||||
|
|
||||||
|
// 检查性能阈值
|
||||||
|
if (executionTime > 1000) { // 1秒阈值
|
||||||
|
logger.warn("Service {} performance warning: execution time {}ms exceeds threshold",
|
||||||
|
serviceName, executionTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取服务指标
|
||||||
|
*/
|
||||||
|
public ServiceMetrics getServiceMetrics(String serviceName) {
|
||||||
|
return metricsMap.get(serviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 打印所有服务的监控报告
|
||||||
|
*/
|
||||||
|
public void printMonitoringReport() {
|
||||||
|
logger.info("===== SERVICE MONITORING REPORT =====");
|
||||||
|
for (Map.Entry<String, ServiceMetrics> entry : metricsMap.entrySet()) {
|
||||||
|
String serviceName = entry.getKey();
|
||||||
|
ServiceMetrics metrics = entry.getValue();
|
||||||
|
logger.info("Service: {}", serviceName);
|
||||||
|
logger.info(" Total calls: {}", metrics.getTotalCalls());
|
||||||
|
logger.info(" Successful calls: {}", metrics.getSuccessfulCalls());
|
||||||
|
logger.info(" Failed calls: {}", metrics.getFailedCalls());
|
||||||
|
logger.info(" Avg response time: {}ms", metrics.getAvgResponseTime());
|
||||||
|
logger.info(" Error rate: {}%", metrics.getErrorRate());
|
||||||
|
}
|
||||||
|
logger.info("===================================");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 服务指标内部类
|
||||||
|
*/
|
||||||
|
public static class ServiceMetrics {
|
||||||
|
private long totalCalls = 0;
|
||||||
|
private long successfulCalls = 0;
|
||||||
|
private long failedCalls = 0;
|
||||||
|
private long totalResponseTime = 0;
|
||||||
|
|
||||||
|
public synchronized void recordCall(long executionTime, boolean success) {
|
||||||
|
totalCalls++;
|
||||||
|
totalResponseTime += executionTime;
|
||||||
|
if (success) {
|
||||||
|
successfulCalls++;
|
||||||
|
} else {
|
||||||
|
failedCalls++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalCalls() { return totalCalls; }
|
||||||
|
public long getSuccessfulCalls() { return successfulCalls; }
|
||||||
|
public long getFailedCalls() { return failedCalls; }
|
||||||
|
public double getAvgResponseTime() {
|
||||||
|
return totalCalls > 0 ? (double) totalResponseTime / totalCalls : 0;
|
||||||
|
}
|
||||||
|
public double getErrorRate() {
|
||||||
|
return totalCalls > 0 ? (double) failedCalls / totalCalls * 100 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in new issue