Selaa lähdekoodia

优化监控指标

穿云 1 kuukausi sitten
vanhempi
säilyke
8872ddb3c3

+ 15 - 3
dbsyncer-biz/src/main/java/org/dbsyncer/biz/enums/DiskMetricEnum.java

@@ -1,5 +1,8 @@
 package org.dbsyncer.biz.enums;
 
+import org.dbsyncer.biz.BizException;
+import org.dbsyncer.common.util.StringUtil;
+
 /**
  * 硬盘指标
  *
@@ -24,9 +27,9 @@ public enum DiskMetricEnum {
      */
     TOTAL("disk.space.total", "硬盘", "总共"),;
 
-    private String code;
-    private String group;
-    private String metricName;
+    private final String code;
+    private final String group;
+    private final String metricName;
 
     DiskMetricEnum(String code, String group, String metricName) {
         this.code = code;
@@ -34,6 +37,15 @@ public enum DiskMetricEnum {
         this.metricName = metricName;
     }
 
+    public static DiskMetricEnum getMetric(String code) throws BizException {
+        for (DiskMetricEnum e : DiskMetricEnum.values()) {
+            if (StringUtil.equals(code, e.getCode())) {
+                return e;
+            }
+        }
+        return null;
+    }
+
     public String getCode() {
         return code;
     }

+ 10 - 10
dbsyncer-biz/src/main/java/org/dbsyncer/biz/enums/MetricEnum.java

@@ -15,12 +15,12 @@ public enum MetricEnum {
     /**
      * 线程活跃数
      */
-    THREADS_LIVE("jvm.threads.live", "应用线程", "活跃"),
+    THREADS_LIVE("jvm.threads.live", "应用线程", "活跃"),
 
     /**
      * 线程峰值
      */
-    THREADS_PEAK("jvm.threads.peak", "应用线程", "峰值"),
+    THREADS_PEAK("jvm.threads.peak", "应用线程", "峰值"),
 
     /**
      * 内存已用
@@ -37,19 +37,19 @@ public enum MetricEnum {
      */
     MEMORY_MAX("jvm.memory.max", "内存", "总共"),
 
-//    /**
-//     * GC
-//     */
-//    GC_PAUSE("jvm.gc.pause", "GC", "已用"),
+    /**
+     * GC
+     */
+    GC_PAUSE("jvm.gc.pause", "GC", "已用"),
 
     /**
      * CPU已用
      */
     CPU_USAGE("system.cpu.usage", "CPU", "已用");
 
-    private String code;
-    private String group;
-    private String metricName;
+    private final String code;
+    private final String group;
+    private final String metricName;
 
     MetricEnum(String code, String group, String metricName) {
         this.code = code;
@@ -63,7 +63,7 @@ public enum MetricEnum {
                 return e;
             }
         }
-        throw new BizException(String.format("Metric code \"%s\" does not exist.", code));
+        return null;
     }
 
     public String getCode() {

+ 7 - 8
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MetricReporter.java

@@ -107,7 +107,7 @@ public class MetricReporter implements ScheduledTaskJob {
             });
             list.addAll(tableList.stream()
                     .sorted(Comparator.comparing(MetricResponseInfo::getQueueUp).reversed())
-                    .limit(7)
+                    .limit(11)
                     .collect(Collectors.toList()));
         }
         return list.stream().map(MetricResponseInfo::getResponse).collect(Collectors.toList());
@@ -254,13 +254,12 @@ public class MetricReporter implements ScheduledTaskJob {
         ThreadPoolTaskExecutor threadTask = (ThreadPoolTaskExecutor) bufferActuator.getExecutor();
         ThreadPoolExecutor pool = threadTask.getThreadPoolExecutor();
         info.setQueueUp(bufferActuator.getQueue().size());
-        StringBuilder msg = new StringBuilder();
-        msg.append("堆积").append(StringUtil.COLON).append(info.getQueueUp());
-        msg.append(StringUtil.FORWARD_SLASH).append(bufferActuator.getQueueCapacity()).append(StringUtil.SPACE);
-        msg.append(ThreadPoolMetricEnum.CORE_SIZE.getMetricName()).append(StringUtil.COLON).append(pool.getActiveCount());
-        msg.append(StringUtil.FORWARD_SLASH).append(pool.getMaximumPoolSize()).append(StringUtil.SPACE);
-        msg.append(ThreadPoolMetricEnum.COMPLETED.getMetricName()).append(StringUtil.COLON).append(pool.getCompletedTaskCount());
-        info.setResponse(new MetricResponse(code, group, metricName, Arrays.asList(new Sample(StatisticEnum.COUNT.getTagValueRepresentation(), msg.toString()))));
+        String msg = "堆积" + StringUtil.COLON + info.getQueueUp() +
+                StringUtil.FORWARD_SLASH + bufferActuator.getQueueCapacity() + StringUtil.SPACE +
+                ThreadPoolMetricEnum.CORE_SIZE.getMetricName() + StringUtil.COLON + pool.getActiveCount() +
+                StringUtil.FORWARD_SLASH + pool.getMaximumPoolSize() + StringUtil.SPACE +
+                ThreadPoolMetricEnum.COMPLETED.getMetricName() + StringUtil.COLON + pool.getCompletedTaskCount();
+        info.setResponse(new MetricResponse(code, group, metricName, Collections.singletonList(new Sample(StatisticEnum.COUNT.getTagValueRepresentation(), msg))));
         return info;
     }
 

+ 28 - 22
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java

@@ -11,9 +11,11 @@ import org.dbsyncer.biz.enums.BufferActuatorMetricEnum;
 import org.dbsyncer.biz.enums.DiskMetricEnum;
 import org.dbsyncer.biz.enums.MetricEnum;
 import org.dbsyncer.biz.metric.MetricDetailFormatter;
+import org.dbsyncer.biz.metric.MetricGroupProcessor;
 import org.dbsyncer.biz.metric.impl.CpuMetricDetailFormatter;
 import org.dbsyncer.biz.metric.impl.DiskMetricDetailFormatter;
 import org.dbsyncer.biz.metric.impl.DoubleRoundMetricDetailFormatter;
+import org.dbsyncer.biz.metric.impl.GCMetricDetailFormatter;
 import org.dbsyncer.biz.metric.impl.MemoryMetricDetailFormatter;
 import org.dbsyncer.biz.metric.impl.ValueMetricDetailFormatter;
 import org.dbsyncer.biz.model.AppReportMetric;
@@ -94,23 +96,26 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     @Resource
     private SystemConfigService systemConfigService;
 
-    private Map<String, MetricDetailFormatter> metricDetailFormatterMap = new ConcurrentHashMap<>();
+    @Resource
+    private MetricGroupProcessor metricGroupProcessor;
+
+    private final Map<String, MetricDetailFormatter> metricMap = new ConcurrentHashMap<>();
 
     @PostConstruct
     private void init() {
-        metricDetailFormatterMap.putIfAbsent(BufferActuatorMetricEnum.GENERAL.getCode(), new ValueMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(BufferActuatorMetricEnum.STORAGE.getCode(), new ValueMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(BufferActuatorMetricEnum.TABLE_GROUP.getCode(), new ValueMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(MetricEnum.THREADS_LIVE.getCode(), new DoubleRoundMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(MetricEnum.THREADS_PEAK.getCode(), new DoubleRoundMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(MetricEnum.MEMORY_USED.getCode(), new MemoryMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(MetricEnum.MEMORY_COMMITTED.getCode(), new MemoryMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(MetricEnum.MEMORY_MAX.getCode(), new MemoryMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(MetricEnum.CPU_USAGE.getCode(), new CpuMetricDetailFormatter());
-//        metricDetailFormatterMap.putIfAbsent(MetricEnum.GC_PAUSE.getCode(), new GCMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(DiskMetricEnum.THRESHOLD.getCode(), new DiskMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(DiskMetricEnum.FREE.getCode(), new DiskMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(DiskMetricEnum.TOTAL.getCode(), new DiskMetricDetailFormatter());
+        metricMap.putIfAbsent(BufferActuatorMetricEnum.GENERAL.getCode(), new ValueMetricDetailFormatter());
+        metricMap.putIfAbsent(BufferActuatorMetricEnum.STORAGE.getCode(), new ValueMetricDetailFormatter());
+        metricMap.putIfAbsent(BufferActuatorMetricEnum.TABLE_GROUP.getCode(), new ValueMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.THREADS_LIVE.getCode(), new DoubleRoundMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.THREADS_PEAK.getCode(), new DoubleRoundMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.MEMORY_USED.getCode(), new MemoryMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.MEMORY_COMMITTED.getCode(), new MemoryMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.MEMORY_MAX.getCode(), new MemoryMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.CPU_USAGE.getCode(), new CpuMetricDetailFormatter());
+        metricMap.putIfAbsent(MetricEnum.GC_PAUSE.getCode(), new GCMetricDetailFormatter());
+        metricMap.putIfAbsent(DiskMetricEnum.THRESHOLD.getCode(), new DiskMetricDetailFormatter());
+        metricMap.putIfAbsent(DiskMetricEnum.FREE.getCode(), new DiskMetricDetailFormatter());
+        metricMap.putIfAbsent(DiskMetricEnum.TOTAL.getCode(), new DiskMetricDetailFormatter());
 
         // 间隔10分钟预警
         scheduledTaskService.start("0 */10 * * * ?", this);
@@ -118,12 +123,11 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
 
     @Override
     public List<MetaVo> getMetaAll() {
-        List<MetaVo> list = profileComponent.getMetaAll()
+        return profileComponent.getMetaAll()
                 .stream()
-                .map(m -> convertMeta2Vo(m))
+                .map(this::convertMeta2Vo)
                 .sorted(Comparator.comparing(MetaVo::getUpdateTime).reversed())
                 .collect(Collectors.toList());
-        return list;
     }
 
     @Override
@@ -332,18 +336,20 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
         metrics.addAll(metricList);
 
         // 转换显示
-        return metrics.stream().map(metric -> {
+        List<MetricResponseVo> formatMetrics = metrics.stream().map(metric -> {
             MetricResponseVo vo = new MetricResponseVo();
             vo.setCode(metric.getCode());
             vo.setGroup(metric.getGroup());
             vo.setMetricName(metric.getMetricName());
             vo.setMeasurements(metric.getMeasurements());
-            MetricDetailFormatter detailFormatter = metricDetailFormatterMap.get(vo.getCode());
-            if (null != detailFormatter) {
-                detailFormatter.format(vo);
-            }
+            metricMap.computeIfPresent(vo.getCode(), (k, mdf) -> {
+                mdf.format(vo);
+                return mdf;
+            });
             return vo;
         }).collect(Collectors.toList());
+        // 合并分组显示
+        return metricGroupProcessor.process(formatMetrics);
     }
 
 }

+ 19 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/metric/MetricGroupProcessor.java

@@ -0,0 +1,19 @@
+/**
+ * DBSyncer Copyright 2020-2025 All Rights Reserved.
+ */
+package org.dbsyncer.biz.metric;
+
+import org.dbsyncer.biz.vo.MetricResponseVo;
+
+import java.util.List;
+
+/**
+ * 合并分组指标
+ *
+ * @Author 穿云
+ * @Version 1.0.0
+ * @Date 2025-04-15 23:13
+ */
+public interface MetricGroupProcessor {
+    List<MetricResponseVo> process(List<MetricResponseVo> metrics);
+}

+ 73 - 0
dbsyncer-biz/src/main/java/org/dbsyncer/biz/metric/impl/MetricGroupProcessorImpl.java

@@ -0,0 +1,73 @@
+/**
+ * DBSyncer Copyright 2020-2025 All Rights Reserved.
+ */
+package org.dbsyncer.biz.metric.impl;
+
+import org.dbsyncer.biz.enums.DiskMetricEnum;
+import org.dbsyncer.biz.enums.MetricEnum;
+import org.dbsyncer.biz.metric.MetricGroupProcessor;
+import org.dbsyncer.biz.vo.MetricResponseVo;
+import org.dbsyncer.common.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+public final class MetricGroupProcessorImpl implements MetricGroupProcessor {
+
+    @Override
+    public List<MetricResponseVo> process(List<MetricResponseVo> metrics) {
+        Map<String, MetricResponseVo> group = new LinkedHashMap<>();
+        Iterator<MetricResponseVo> iterator = metrics.iterator();
+        while (iterator.hasNext()) {
+            MetricResponseVo metric = iterator.next();
+            // 应用性能指标
+            MetricEnum metricEnum = MetricEnum.getMetric(metric.getCode());
+            if (metricEnum != null) {
+                switch (metricEnum) {
+                    case THREADS_LIVE:
+                    case THREADS_PEAK:
+                    case MEMORY_USED:
+                    case MEMORY_COMMITTED:
+                    case MEMORY_MAX:
+                        buildMetricResponseVo(group, metricEnum.getGroup(), metricEnum.getMetricName(), metric.getDetail());
+                        iterator.remove();
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            // 硬盘
+            DiskMetricEnum diskEnum = DiskMetricEnum.getMetric(metric.getCode());
+            if (diskEnum != null) {
+                buildMetricResponseVo(group, diskEnum.getGroup(), diskEnum.getMetricName(), metric.getDetail());
+                iterator.remove();
+            }
+        }
+        metrics.addAll(0, group.values());
+        group.clear();
+        return metrics;
+    }
+
+    private void buildMetricResponseVo(Map<String, MetricResponseVo> group, String groupName, String metricName, String detail) {
+        MetricResponseVo vo = getMetricResponseVo(group, groupName);
+        vo.setDetail(vo.getDetail() + metricName + StringUtil.COLON + detail + StringUtil.SPACE);
+    }
+
+    private MetricResponseVo getMetricResponseVo(Map<String, MetricResponseVo> group, String groupName) {
+        return group.compute(groupName, (k, v) -> {
+            if (v == null) {
+                MetricResponseVo responseVo = new MetricResponseVo();
+                responseVo.setGroup(groupName);
+                responseVo.setMetricName(StringUtil.EMPTY);
+                responseVo.setDetail(StringUtil.EMPTY);
+                return responseVo;
+            }
+            return v;
+        });
+    }
+}

+ 8 - 3
dbsyncer-web/src/main/java/org/dbsyncer/web/controller/monitor/MonitorController.java

@@ -3,6 +3,7 @@
  */
 package org.dbsyncer.web.controller.monitor;
 
+import org.dbsyncer.biz.BizException;
 import org.dbsyncer.biz.ConnectorService;
 import org.dbsyncer.biz.DataSyncService;
 import org.dbsyncer.biz.MonitorService;
@@ -38,6 +39,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -48,8 +50,8 @@ public class MonitorController extends BaseController {
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     private final static int COUNT = 60;
-    private HistoryStackVo cpu = new HistoryStackVo();
-    private HistoryStackVo memory = new HistoryStackVo();
+    private final HistoryStackVo cpu = new HistoryStackVo();
+    private final HistoryStackVo memory = new HistoryStackVo();
 
     @Resource
     private MonitorService monitorService;
@@ -224,7 +226,7 @@ public class MonitorController extends BaseController {
 
     private MetricResponse createDiskMetricResponse(DiskMetricEnum metricEnum, Object value) {
         return new MetricResponse(metricEnum.getCode(), metricEnum.getGroup(), metricEnum.getMetricName(),
-                Arrays.asList(new Sample(StatisticEnum.COUNT.getTagValueRepresentation(), value)));
+                Collections.singletonList(new Sample(StatisticEnum.COUNT.getTagValueRepresentation(), value)));
     }
 
     private MetricResponse getMetricResponse(String code) {
@@ -234,6 +236,9 @@ public class MonitorController extends BaseController {
         }
         MetricResponse metricResponse = new MetricResponse();
         MetricEnum metricEnum = MetricEnum.getMetric(metric.getName());
+        if (metricEnum == null) {
+            throw new BizException(String.format("Metric code \"%s\" does not exist.", code));
+        }
         metricResponse.setCode(metricEnum.getCode());
         metricResponse.setGroup(metricEnum.getGroup());
         metricResponse.setMetricName(metricEnum.getMetricName());