Ver código fonte

!157 merge
Merge pull request !157 from AE86/design_consumer

AE86 1 ano atrás
pai
commit
9d1c59f488
17 arquivos alterados com 198 adições e 138 exclusões
  1. 6 15
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/system/SystemConfigChecker.java
  2. 4 7
      dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java
  3. 10 10
      dbsyncer-common/src/main/java/org/dbsyncer/common/config/StorageConfig.java
  4. 83 0
      dbsyncer-common/src/main/java/org/dbsyncer/common/util/BeanUtil.java
  5. 2 1
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQueryCount.java
  6. 4 2
      dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/BigintValueMapper.java
  7. 2 2
      dbsyncer-connector/src/main/test/ConnectionTest.java
  8. 5 10
      dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/MonitorFactory.java
  9. 0 43
      dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/enums/TaskMetricEnum.java
  10. 26 0
      dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/model/AppReportMetric.java
  11. 1 2
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/ParserFactory.java
  12. 2 2
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/AbstractFlushStrategy.java
  13. 1 1
      dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/EnableFlushStrategy.java
  14. 1 1
      dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java
  15. 4 4
      dbsyncer-web/src/main/resources/application.properties
  16. 3 3
      dbsyncer-web/src/main/resources/public/monitor/monitor.html
  17. 44 35
      dbsyncer-web/src/main/resources/static/js/monitor/index.js

+ 6 - 15
dbsyncer-biz/src/main/java/org/dbsyncer/biz/checker/impl/system/SystemConfigChecker.java

@@ -1,20 +1,18 @@
 package org.dbsyncer.biz.checker.impl.system;
 
 import org.dbsyncer.biz.checker.AbstractChecker;
-import org.dbsyncer.common.util.NumberUtil;
-import org.dbsyncer.common.util.StringUtil;
+import org.dbsyncer.common.util.BeanUtil;
 import org.dbsyncer.manager.Manager;
 import org.dbsyncer.parser.logger.LogService;
 import org.dbsyncer.parser.logger.LogType;
-import org.dbsyncer.parser.model.SystemConfig;
 import org.dbsyncer.parser.model.ConfigModel;
-import org.dbsyncer.storage.constant.ConfigConstant;
+import org.dbsyncer.parser.model.SystemConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.Assert;
 
+import javax.annotation.Resource;
 import java.util.Map;
 
 /**
@@ -27,10 +25,10 @@ public class SystemConfigChecker extends AbstractChecker {
 
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
-    @Autowired
+    @Resource
     private Manager manager;
 
-    @Autowired
+    @Resource
     private LogService logService;
 
     @Override
@@ -52,14 +50,7 @@ public class SystemConfigChecker extends AbstractChecker {
 
         SystemConfig systemConfig = manager.getSystemConfig();
         Assert.notNull(systemConfig, "配置文件为空.");
-
-        // 同步数据过期时间(天)
-        systemConfig.setExpireDataDays(NumberUtil.toInt(params.get("expireDataDays"), systemConfig.getExpireDataDays()));
-        // 系统日志过期时间(天)
-        systemConfig.setExpireLogDays(NumberUtil.toInt(params.get("expireLogDays"), systemConfig.getExpireLogDays()));
-        // 刷新监控间隔(秒)
-        systemConfig.setRefreshIntervalSeconds(NumberUtil.toInt(params.get("refreshIntervalSeconds"), systemConfig.getRefreshIntervalSeconds()));
-
+        BeanUtil.mapToBean(params, systemConfig);
         logService.log(LogType.SystemLog.INFO, "修改系统配置");
 
         // 修改基本配置

+ 4 - 7
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java

@@ -27,7 +27,6 @@ import org.dbsyncer.connector.enums.FilterEnum;
 import org.dbsyncer.monitor.Monitor;
 import org.dbsyncer.monitor.enums.DiskMetricEnum;
 import org.dbsyncer.monitor.enums.MetricEnum;
-import org.dbsyncer.monitor.enums.TaskMetricEnum;
 import org.dbsyncer.monitor.enums.ThreadPoolMetricEnum;
 import org.dbsyncer.monitor.model.AppReportMetric;
 import org.dbsyncer.monitor.model.MetricResponse;
@@ -90,8 +89,6 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
 
     @PostConstruct
     private void init() {
-        metricDetailFormatterMap.putIfAbsent(TaskMetricEnum.STORAGE_ACTIVE.getCode(), new ValueMetricDetailFormatter());
-        metricDetailFormatterMap.putIfAbsent(TaskMetricEnum.STORAGE_REMAINING_CAPACITY.getCode(), new ValueMetricDetailFormatter());
         metricDetailFormatterMap.putIfAbsent(ThreadPoolMetricEnum.CORE_SIZE.getCode(), new ValueMetricDetailFormatter());
         metricDetailFormatterMap.putIfAbsent(ThreadPoolMetricEnum.TASK_SUBMITTED.getCode(), new ValueMetricDetailFormatter());
         metricDetailFormatterMap.putIfAbsent(ThreadPoolMetricEnum.QUEUE_UP.getCode(), new ValueMetricDetailFormatter());
@@ -297,13 +294,13 @@ public class MonitorServiceImpl extends BaseServiceImpl implements MonitorServic
     }
 
     private List<MetricResponseVo> getMetrics(List<MetricResponse> metrics) {
-        // 线程池状态
-        List<MetricResponse> metricList = monitor.getMetricInfo();
         // 系统指标
-        metricList.addAll(metrics);
+        List<MetricResponse> metricList = monitor.getMetricInfo();
+        // 线程池状态
+        metrics.addAll(metricList);
 
         // 转换显示
-        return metricList.stream().map(metric -> {
+        return metrics.stream().map(metric -> {
             MetricResponseVo vo = new MetricResponseVo();
             BeanUtils.copyProperties(metric, vo);
             MetricDetailFormatter detailFormatter = metricDetailFormatterMap.get(vo.getCode());

+ 10 - 10
dbsyncer-common/src/main/java/org/dbsyncer/common/config/StorageConfig.java

@@ -30,12 +30,12 @@ public class StorageConfig extends BufferActuatorConfig {
     /**
      * 是否记录同步成功数据
      */
-    private boolean writerSuccess;
+    private boolean writeSuccess;
 
     /**
      * 是否记录同步失败数据
      */
-    private boolean writerFail;
+    private boolean writeFail;
 
     /**
      * 最大记录异常信息长度
@@ -63,20 +63,20 @@ public class StorageConfig extends BufferActuatorConfig {
         this.threadQueueCapacity = threadQueueCapacity;
     }
 
-    public boolean isWriterSuccess() {
-        return writerSuccess;
+    public boolean isWriteSuccess() {
+        return writeSuccess;
     }
 
-    public void setWriterSuccess(boolean writerSuccess) {
-        this.writerSuccess = writerSuccess;
+    public void setWriteSuccess(boolean writeSuccess) {
+        this.writeSuccess = writeSuccess;
     }
 
-    public boolean isWriterFail() {
-        return writerFail;
+    public boolean isWriteFail() {
+        return writeFail;
     }
 
-    public void setWriterFail(boolean writerFail) {
-        this.writerFail = writerFail;
+    public void setWriteFail(boolean writeFail) {
+        this.writeFail = writeFail;
     }
 
     public int getMaxErrorLength() {

+ 83 - 0
dbsyncer-common/src/main/java/org/dbsyncer/common/util/BeanUtil.java

@@ -0,0 +1,83 @@
+package org.dbsyncer.common.util;
+
+import org.dbsyncer.common.CommonException;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class BeanUtil {
+
+    public static Object mapToBean(Map<String, String> map, Object instance) {
+        try {
+            Class<?> clazz = instance.getClass();
+            for (Map.Entry<String, String> eachMap : map.entrySet()) {
+                String property = eachMap.getKey();
+                String value = eachMap.getValue();
+
+                String setMethod = "set" + property.substring(0, 1).toUpperCase() + property.substring(1);
+                Field field = getField(property, clazz);
+                Class<?> fType = field.getType();
+                Object newValue = convert(value, fType);
+                clazz.getMethod(setMethod, fType).invoke(instance, newValue);
+            }
+        } catch (Exception e) {
+            throw new CommonException(e);
+        }
+        return instance;
+    }
+
+    public static Map beanToMap(Object object) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
+        Field[] field = object.getClass().getDeclaredFields();
+        Map map = new HashMap();
+        for (Field fi : field) {
+            String property = fi.getName();
+            String getMe = "get" + property.substring(0, 1).toUpperCase() + property.substring(1);
+            Object obj = object.getClass().getMethod(getMe).invoke(object);
+            map.put(property, obj);
+        }
+        return map;
+    }
+
+    private static Object convert(String value, Class<?> fType) {
+        if (Long.class.getName().equals(fType.getName()) || long.class.getName().equals(fType.getName())) {
+            return Long.parseLong(value);
+        }
+
+        if (Float.class.getName().equals(fType.getName()) || float.class.getName().equals(fType.getName())) {
+            return Float.parseFloat(value);
+        }
+
+        if (Double.class.getName().equals(fType.getName()) || double.class.getName().equals(fType.getName())) {
+            return Double.parseDouble(value);
+        }
+
+        if (Integer.class.getName().equals(fType.getName()) || int.class.getName().equals(fType.getName())) {
+            return Integer.parseInt(value);
+        }
+
+        if (Boolean.class.getName().equals(fType.getName()) || boolean.class.getName().equals(fType.getName())) {
+            return Boolean.valueOf(value);
+        }
+        return value;
+    }
+
+    private static Field getField(String property, Class<?> obj) {
+        if (Object.class.getName().equals(obj.getName())) {
+            return null;
+        }
+        Field[] field = obj.getDeclaredFields();
+        for (Field f : field) {
+            if (f.getName().equals(property)) {
+                return f;
+            }
+        }
+        Class<?> parent = obj.getSuperclass();
+        if (parent != null) {
+            return getField(property, parent);
+        }
+        return null;
+    }
+
+}

+ 2 - 1
dbsyncer-connector/src/main/java/org/dbsyncer/connector/database/sqlbuilder/SqlBuilderQueryCount.java

@@ -24,7 +24,8 @@ public class SqlBuilderQueryCount extends SqlBuilderQuery {
         String queryFilter = config.getQueryFilter();
 
         StringBuilder sql = new StringBuilder();
-        sql.append("SELECT COUNT(1) FROM (SELECT 1 FROM ").append(schema);
+        sql.append("SELECT COUNT(1) FROM (SELECT 1 AS ").append(quotation).append("_ROW").append(quotation).append(" FROM ");
+        sql.append(schema);
         sql.append(quotation);
         sql.append(database.buildTableName(tableName));
         sql.append(quotation);

+ 4 - 2
dbsyncer-connector/src/main/java/org/dbsyncer/connector/schema/BigintValueMapper.java

@@ -25,8 +25,10 @@ public class BigintValueMapper extends AbstractValueMapper<Long> {
             return bitInt.longValue();
         }
         if (val instanceof Integer) {
-            Integer integer = (Integer) val;
-            return new Long(integer);
+            return new Long((Integer) val);
+        }
+        if (val instanceof String) {
+            return new Long((String) val);
         }
 
         throw new ConnectorException(String.format("%s can not find type [%s], val [%s]", getClass().getSimpleName(), val.getClass(), val));

+ 2 - 2
dbsyncer-connector/src/main/test/ConnectionTest.java

@@ -114,11 +114,11 @@ public class ConnectionTest {
         long begin = Instant.now().toEpochMilli();
         final int threadSize = 10;
         final ExecutorService pool = Executors.newFixedThreadPool(threadSize);
-        final String sql = "INSERT INTO `vote_records` (`id`, `user_id`, `vote_num`, `group_id`, `status`, `create_time`) VALUES (?, ?, ?, ?, ?, ?)";
+        final String sql = "INSERT INTO `vote_records_copy` (`id`, `user_id`, `vote_num`, `group_id`, `status`, `create_time`) VALUES (?, ?, ?, ?, ?, ?)";
 
         // 模拟1000w条数据
         List<Object[]> dataList = new ArrayList<>();
-        for (int i = 2000002; i <= 5000000; i++) {
+        for (int i = 1; i <= 200001; i++) {
             // 442001, 'dA8LeJLtX9MgQgDe7H1O', 9620, 1, 2, '2022-11-17 16:35:21'
             Object[] args = new Object[6];
             args[0] = i;

+ 5 - 10
dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/MonitorFactory.java

@@ -11,7 +11,6 @@ import org.dbsyncer.manager.Manager;
 import org.dbsyncer.manager.puller.BufferActuatorRouter;
 import org.dbsyncer.monitor.enums.MetricEnum;
 import org.dbsyncer.monitor.enums.StatisticEnum;
-import org.dbsyncer.monitor.enums.TaskMetricEnum;
 import org.dbsyncer.monitor.enums.ThreadPoolMetricEnum;
 import org.dbsyncer.monitor.model.AppReportMetric;
 import org.dbsyncer.monitor.model.MappingReportMetric;
@@ -180,8 +179,6 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
         ThreadPoolExecutor pool = threadTask.getThreadPoolExecutor();
 
         List<MetricResponse> list = new ArrayList<>();
-        list.add(createTaskMetricResponse(TaskMetricEnum.STORAGE_ACTIVE, storageBufferActuator.getQueue().size()));
-        list.add(createTaskMetricResponse(TaskMetricEnum.STORAGE_REMAINING_CAPACITY, storageBufferActuator.getQueueCapacity() - storageBufferActuator.getQueue().size()));
         list.add(createThreadPoolMetricResponse(ThreadPoolMetricEnum.CORE_SIZE, pool.getCorePoolSize()));
         list.add(createThreadPoolMetricResponse(ThreadPoolMetricEnum.TASK_SUBMITTED, pool.getTaskCount()));
         list.add(createThreadPoolMetricResponse(ThreadPoolMetricEnum.QUEUE_UP, pool.getQueue().size()));
@@ -200,10 +197,12 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
         report.setInsert(mappingReportMetric.getInsert());
         report.setUpdate(mappingReportMetric.getUpdate());
         report.setDelete(mappingReportMetric.getDelete());
-        // 堆积数据(通用执行器 + 表执行器)
+        // 堆积任务(通用执行器 + 表执行器)
         report.setQueueUp(bufferActuatorRouter.getQueueSize().addAndGet(generalBufferActuator.getQueue().size()));
-        // 容量(通用执行器 + 表执行器)
-        report.setQueueCapacity( bufferActuatorRouter.getQueueCapacity().addAndGet(generalBufferActuator.getQueueCapacity()));
+        report.setQueueCapacity(bufferActuatorRouter.getQueueCapacity().addAndGet(generalBufferActuator.getQueueCapacity()));
+        // 持久化任务
+        report.setStorageQueueUp(storageBufferActuator.getQueue().size());
+        report.setStorageQueueCapacity(storageBufferActuator.getQueueCapacity());
         return report;
     }
 
@@ -287,10 +286,6 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
         return new MetricResponse(metricEnum.getCode(), metricEnum.getGroup(), metricEnum.getMetricName(), Arrays.asList(new Sample(StatisticEnum.COUNT.getTagValueRepresentation(), value)));
     }
 
-    private MetricResponse createTaskMetricResponse(TaskMetricEnum metricEnum, Object value) {
-        return new MetricResponse(metricEnum.getCode(), metricEnum.getGroup(), metricEnum.getMetricName(), Arrays.asList(new Sample(StatisticEnum.COUNT.getTagValueRepresentation(), value)));
-    }
-
     private long queryMappingMetricCount(List<Meta> metaAll, QueryMappingOperation operation) {
         AtomicLong total = new AtomicLong(0);
         if (!CollectionUtils.isEmpty(metaAll)) {

+ 0 - 43
dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/enums/TaskMetricEnum.java

@@ -1,43 +0,0 @@
-package org.dbsyncer.monitor.enums;
-
-/**
- * 执行任务指标
- *
- * @author AE86
- * @version 1.0.0
- * @date 2021/07/23 0:19
- */
-public enum TaskMetricEnum {
-
-    /**
-     * 处理中
-     */
-    STORAGE_ACTIVE("parser.storage.buffer.actuator.active", "持久化", "处理中"),
-
-    /**
-     * 空闲队列
-     */
-    STORAGE_REMAINING_CAPACITY("parser.storage.buffer.actuator.capacity", "持久化", "空闲队列");
-
-    private String code;
-    private String group;
-    private String metricName;
-
-    TaskMetricEnum(String code, String group, String metricName) {
-        this.code = code;
-        this.group = group;
-        this.metricName = metricName;
-    }
-
-    public String getCode() {
-        return code;
-    }
-
-    public String getGroup() {
-        return group;
-    }
-
-    public String getMetricName() {
-        return metricName;
-    }
-}

+ 26 - 0
dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/model/AppReportMetric.java

@@ -12,6 +12,16 @@ public class AppReportMetric extends MappingReportMetric{
      */
     private long queueCapacity;
 
+    /**
+     * 持久化待处理数
+     */
+    private long storageQueueUp;
+
+    /**
+     * 持久化队列长度
+     */
+    private long storageQueueCapacity;
+
     public long getQueueUp() {
         return queueUp;
     }
@@ -27,4 +37,20 @@ public class AppReportMetric extends MappingReportMetric{
     public void setQueueCapacity(long queueCapacity) {
         this.queueCapacity = queueCapacity;
     }
+
+    public long getStorageQueueUp() {
+        return storageQueueUp;
+    }
+
+    public void setStorageQueueUp(long storageQueueUp) {
+        this.storageQueueUp = storageQueueUp;
+    }
+
+    public long getStorageQueueCapacity() {
+        return storageQueueCapacity;
+    }
+
+    public void setStorageQueueCapacity(long storageQueueCapacity) {
+        this.storageQueueCapacity = storageQueueCapacity;
+    }
 }

+ 1 - 2
dbsyncer-parser/src/main/java/org/dbsyncer/parser/ParserFactory.java

@@ -190,8 +190,7 @@ public class ParserFactory implements Parser {
 
     @Override
     public <T> T parseObject(String json, Class<T> clazz) {
-        T t = JsonUtil.jsonToObj(json, clazz);
-        return t;
+        return JsonUtil.jsonToObj(json, clazz);
     }
 
     @Override

+ 2 - 2
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/AbstractFlushStrategy.java

@@ -41,13 +41,13 @@ public abstract class AbstractFlushStrategy implements FlushStrategy {
     protected void flush(String metaId, Result result, String event) {
         refreshTotal(metaId, result);
 
-        if (storageConfig.isWriterFail() && !CollectionUtils.isEmpty(result.getFailData())) {
+        if (storageConfig.isWriteFail() && !CollectionUtils.isEmpty(result.getFailData())) {
             final String error = StringUtil.substring(result.getError().toString(), 0, storageConfig.getMaxErrorLength());
             flushService.asyncWrite(metaId, result.getTableGroupId(), result.getTargetTableGroupName(), event, false, result.getFailData(), error);
         }
 
         // 是否写增量数据
-        if (storageConfig.isWriterSuccess() && !CollectionUtils.isEmpty(result.getSuccessData())) {
+        if (storageConfig.isWriteSuccess() && !CollectionUtils.isEmpty(result.getSuccessData())) {
             flushService.asyncWrite(metaId, result.getTableGroupId(), result.getTargetTableGroupName(), event, true, result.getSuccessData(), "");
         }
     }

+ 1 - 1
dbsyncer-parser/src/main/java/org/dbsyncer/parser/strategy/impl/EnableFlushStrategy.java

@@ -12,7 +12,7 @@ import org.springframework.stereotype.Component;
  * @date 2021/11/18 22:21
  */
 @Component
-@ConditionalOnProperty(value = "dbsyncer.storage.full.enabled", havingValue = "true")
+@ConditionalOnProperty(value = "dbsyncer.storage.write.full.enabled", havingValue = "true")
 public final class EnableFlushStrategy extends AbstractFlushStrategy {
 
 }

+ 1 - 1
dbsyncer-storage/src/main/java/org/dbsyncer/storage/support/MysqlStorageServiceImpl.java

@@ -248,7 +248,7 @@ public class MysqlStorageServiceImpl extends AbstractStorageService {
     private String buildQueryCountSql(Query query, Executor executor, List<Object> args) {
         StringBuilder queryCount = new StringBuilder();
         queryCount.append("SELECT COUNT(1) FROM (");
-        StringBuilder sql = new StringBuilder("SELECT 1 FROM `").append(executor.getTable()).append("`");
+        StringBuilder sql = new StringBuilder("SELECT 1 AS `_ROW` FROM `").append(executor.getTable()).append("`");
         buildQuerySqlWithParams(query, args, sql, null);
         queryCount.append(sql);
         queryCount.append(" GROUP BY `ID`) DBSYNCER_T");

+ 4 - 4
dbsyncer-web/src/main/resources/application.properties

@@ -24,7 +24,7 @@ dbsyncer.parser.general.buffer-writer-count=100
 # [GeneralBufferActuator]每次消费缓存队列的任务数
 dbsyncer.parser.general.buffer-pull-count=1000
 # [GeneralBufferActuator]缓存队列容量
-dbsyncer.parser.general.buffer-queue-capacity=100000
+dbsyncer.parser.general.buffer-queue-capacity=50000
 # [GeneralBufferActuator]定时消费缓存队列间隔(毫秒)
 dbsyncer.parser.general.buffer-period-millisecond=300
 # *********************** 表执行器配置 ***********************
@@ -63,11 +63,11 @@ dbsyncer.storage.buffer-queue-capacity=50000
 # [StorageBufferActuator]定时消费缓存队列间隔(毫秒)
 dbsyncer.storage.buffer-period-millisecond=300
 # 是否记录全量数据(false-关闭; true-开启)
-dbsyncer.storage.full.enabled=false
+dbsyncer.storage.write.full.enabled=false
 # 是否记录同步成功数据(false-关闭; true-开启)
-dbsyncer.storage.writer-success=true
+dbsyncer.storage.write-success=true
 # 是否记录同步失败数据(false-关闭; true-开启)
-dbsyncer.storage.writer-fail=true
+dbsyncer.storage.write-fail=true
 # 记录同步失败日志最大长度
 dbsyncer.storage.max-error-length=2048
 

+ 3 - 3
dbsyncer-web/src/main/resources/public/monitor/monitor.html

@@ -42,15 +42,15 @@
                                 <hr>
                                 <div class="row">
                                     <div class="col-md-4">
-                                        <div id="totalChart" style="height: 260px;"></div>
+                                        <div id="eventChart" style="height: 260px;"></div>
                                     </div>
 
                                     <div class="col-md-4">
-                                        <div id="eventChart" style="height: 260px;"></div>
+                                        <div id="queueChart" style="height: 260px;"></div>
                                     </div>
 
                                     <div class="col-md-4">
-                                        <div id="queueChart" style="height: 260px;"></div>
+                                        <div id="storageChart" style="height: 260px;"></div>
                                     </div>
                                 </div>
                                 <div class="row">

+ 44 - 35
dbsyncer-web/src/main/resources/static/js/monitor/index.js

@@ -261,7 +261,7 @@ function showLog($logList, arr, append) {
 
 // 堆积数据
 function showQueueChart(queueUp, queueCapacity) {
-    var option = {
+    let option = {
         title: {
             text: "堆积数据",
             x: 'center',
@@ -306,8 +306,8 @@ function showQueueChart(queueUp, queueCapacity) {
 }
 
 // 事件分类
-function showEventChart(ins, upd, del) {
-    var option = {
+function showEventChart(success, fail, ins, upd, del) {
+    let option = {
         title: {
             text: '事件分类',
             left: 'center'
@@ -341,49 +341,58 @@ function showEventChart(ins, upd, del) {
     };
     echarts.init(document.getElementById('eventChart')).setOption(option);
 
+    $("#totalSpan").html(success + fail);
+    $("#successSpan").html(success);
+    $("#failSpan").html(fail);
     $("#insertSpan").html(ins);
     $("#updateSpan").html(upd);
     $("#deleteSpan").html(del);
 }
 
 // 统计成功失败
-function showTotalChart(success, fail) {
-    var option = {
+function showStorageChart(queueUp, queueCapacity) {
+    let option = {
         title: {
-            text: '已完成数据',
-            left: 'center'
+            text: "持久化",
+            x: 'center',
+            y: 'top'
         },
         tooltip: {
-            trigger: 'item'
-        },
-        legend: {
-            orient: 'vertical',
-            left: 'left',
+            formatter: "{a}: {c}",
+            position: 'top'
         },
         series: [
             {
-                name: '已完成',
-                type: 'pie',
-                radius: '50%',
-                data: [
-                    {value: success, name: '成功'},
-                    {value: fail, name: '失败'}
-                ],
-                emphasis: {
-                    itemStyle: {
-                        shadowBlur: 10,
-                        shadowOffsetX: 0,
-                        shadowColor: 'rgba(0, 0, 0, 0.5)'
+                name: "待处理",
+                animation: true,
+                type: 'gauge',
+                min: 0,
+                max: queueCapacity,
+                splitNumber: 2,
+                axisLine: {            // 坐标轴线
+                    lineStyle: {       // 属性lineStyle控制线条样式
+                        color: [[0.3, '#67e0e3'], [0.7, '#37a2da'], [1, '#fd666d']],
+                        width: 5
                     }
-                }
+                },
+                axisTick: {            // 坐标轴小标记
+                    length: 10,        // 属性length控制线长
+                    lineStyle: {       // 属性lineStyle控制线条样式
+                        color: 'auto'
+                    }
+                },
+                splitLine: {           // 分隔线
+                    length: 10,         // 属性length控制线长
+                    lineStyle: {       // 属性lineStyle(详见lineStyle)控制线条样式
+                        color: 'auto'
+                    }
+                },
+                detail: {fontSize: 12, offsetCenter: [0, '65%']},
+                data: [{value: queueUp, name: ''}]
             }
         ]
     };
-    echarts.init(document.getElementById('totalChart')).setOption(option);
-
-    $("#totalSpan").html(success + fail);
-    $("#successSpan").html(success);
-    $("#failSpan").html(fail);
+    echarts.init(document.getElementById('storageChart')).setOption(option);
 }
 
 // CPU历史
@@ -416,7 +425,7 @@ function showCpuChart(cpu) {
 
 // 内存历史
 function showMemoryChart(memory) {
-    var option = {
+    let option = {
         title: {
             show: true,
             text: '内存(MB)',
@@ -446,7 +455,7 @@ function showMemoryChart(memory) {
 
 // 指标列表
 function showMetricTable(metrics) {
-    var html = '';
+    let html = '';
     $.each(metrics, function (i) {
         html += '<tr>';
         html += '   <td style="width:5%;">' + (i + 1) + '</td>';
@@ -461,10 +470,10 @@ function showMetricTable(metrics) {
 function showChartTable() {
     doGetWithoutLoading("/monitor/queryAppReportMetric", {}, function (data) {
         if (data.success == true) {
-            var report = data.resultValue;
-            showTotalChart(report.success, report.fail);
-            showEventChart(report.insert, report.update, report.delete);
+            let report = data.resultValue;
+            showEventChart(report.success, report.fail, report.insert, report.update, report.delete);
             showQueueChart(report.queueUp, report.queueCapacity);
+            showStorageChart(report.storageQueueUp, report.storageQueueCapacity);
             showCpuChart(report.cpu);
             showMemoryChart(report.memory);
             showMetricTable(report.metrics);