Forráskód Böngészése

优化显示同步数据

AE86 2 éve
szülő
commit
3a175a52b1

+ 66 - 5
dbsyncer-biz/src/main/java/org/dbsyncer/biz/impl/MonitorServiceImpl.java

@@ -2,13 +2,24 @@ package org.dbsyncer.biz.impl;
 
 import org.dbsyncer.biz.MonitorService;
 import org.dbsyncer.biz.metric.MetricDetailFormatter;
-import org.dbsyncer.biz.metric.impl.*;
-import org.dbsyncer.biz.vo.*;
+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.vo.AppReportMetricVo;
+import org.dbsyncer.biz.vo.DataVo;
+import org.dbsyncer.biz.vo.LogVo;
+import org.dbsyncer.biz.vo.MetaVo;
+import org.dbsyncer.biz.vo.MetricResponseVo;
+import org.dbsyncer.cache.CacheService;
 import org.dbsyncer.common.model.Paging;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.NumberUtil;
 import org.dbsyncer.common.util.StringUtil;
+import org.dbsyncer.connector.model.Field;
 import org.dbsyncer.monitor.Monitor;
 import org.dbsyncer.monitor.enums.DiskMetricEnum;
 import org.dbsyncer.monitor.enums.MetricEnum;
@@ -19,15 +30,24 @@ import org.dbsyncer.monitor.model.MetricResponse;
 import org.dbsyncer.parser.enums.ModelEnum;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.Meta;
+import org.dbsyncer.parser.model.Picker;
+import org.dbsyncer.parser.model.TableGroup;
+import org.dbsyncer.storage.binlog.proto.BinlogMap;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.dbsyncer.storage.enums.StorageDataStatusEnum;
+import org.dbsyncer.storage.util.BinlogMessageUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.Assert;
 
 import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -41,9 +61,14 @@ import java.util.stream.Collectors;
 @Service
 public class MonitorServiceImpl implements MonitorService {
 
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
     @Autowired
     private Monitor monitor;
 
+    @Autowired
+    private CacheService cacheService;
+
     private Map<String, MetricDetailFormatter> metricDetailFormatterMap = new LinkedHashMap<>();
 
     @PostConstruct
@@ -94,9 +119,45 @@ public class MonitorServiceImpl implements MonitorService {
 
         Paging paging = monitor.queryData(getDefaultMetaId(id), pageNum, pageSize, error, success);
         List<Map> data = (List<Map>) paging.getData();
-        paging.setData(data.stream()
-                .map(m -> convert2Vo(m, DataVo.class))
-                .collect(Collectors.toList()));
+        List<DataVo> list = new ArrayList<>();
+        for (Map m : data) {
+            try {
+                DataVo dataVo = convert2Vo(m, DataVo.class);
+                String tableGroupId = (String) m.get(ConfigConstant.DATA_TABLE_GROUP_ID);
+                byte[] bytes = (byte[]) m.get(ConfigConstant.BINLOG_DATA);
+                BinlogMap message = BinlogMap.parseFrom(bytes);
+
+                // 1、获取配置信息
+                final TableGroup tableGroup = cacheService.get(tableGroupId, TableGroup.class);
+
+                // 2、反序列数据
+                Map<String, Object> row = new HashMap<>();
+                final Picker picker = new Picker(tableGroup.getFieldMapping());
+                final Map<String, Field> fieldMap = picker.getSourceFieldMap();
+                message.getRowMap().forEach((k, v) -> {
+                    if (fieldMap.containsKey(k)) {
+                        Object val = BinlogMessageUtil.deserializeValue(fieldMap.get(k).getType(), v);
+                        // 处理二进制对象显示
+                        if (null != val && val instanceof byte[]) {
+                            byte[] b = (byte[]) val;
+                            if (b.length > 128) {
+                                row.put(k, String.format("bytes[%d]", b.length));
+                                return;
+                            }
+                            row.put(k, Arrays.toString(b));
+                            return;
+                        }
+                        row.put(k, val);
+                    }
+                });
+
+                dataVo.setJson(JsonUtil.objToJson(row));
+                list.add(dataVo);
+            } catch (Exception e) {
+                logger.error(e.getLocalizedMessage());
+            }
+        }
+        paging.setData(list);
         return paging;
     }
 

+ 6 - 0
dbsyncer-monitor/src/main/java/org/dbsyncer/monitor/MonitorFactory.java

@@ -20,6 +20,7 @@ import org.dbsyncer.parser.flush.BufferActuator;
 import org.dbsyncer.parser.model.Mapping;
 import org.dbsyncer.parser.model.Meta;
 import org.dbsyncer.storage.constant.ConfigConstant;
+import org.dbsyncer.storage.enums.IndexFieldResolverEnum;
 import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 import org.dbsyncer.storage.enums.StorageEnum;
 import org.dbsyncer.storage.query.Query;
@@ -34,7 +35,9 @@ import javax.annotation.PostConstruct;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.atomic.AtomicLong;
@@ -98,6 +101,9 @@ public class MonitorFactory implements Monitor, ScheduledTaskJob {
         if (StringUtil.isNotBlank(error)) {
             query.addFilter(ConfigConstant.DATA_ERROR, error, true);
         }
+        Map<String, IndexFieldResolverEnum> fieldResolvers = new LinkedHashMap<>();
+        fieldResolvers.put(ConfigConstant.BINLOG_DATA, IndexFieldResolverEnum.BINARY);
+        query.setIndexFieldResolverMap(fieldResolvers);
         // 查询是否成功, 默认查询失败
         query.addFilter(ConfigConstant.DATA_SUCCESS, StringUtil.isNotBlank(success) ? NumberUtil.toInt(success) : StorageDataStatusEnum.FAIL.getValue());
         query.setMetaId(metaId);

+ 1 - 13
dbsyncer-parser/src/main/java/org/dbsyncer/parser/AbstractWriterBinlog.java

@@ -1,6 +1,5 @@
 package org.dbsyncer.parser;
 
-import com.google.protobuf.ByteString;
 import org.dbsyncer.cache.CacheService;
 import org.dbsyncer.common.util.CollectionUtils;
 import org.dbsyncer.connector.model.Field;
@@ -10,7 +9,6 @@ import org.dbsyncer.parser.model.Picker;
 import org.dbsyncer.parser.model.TableGroup;
 import org.dbsyncer.parser.model.WriterRequest;
 import org.dbsyncer.storage.binlog.AbstractBinlogService;
-import org.dbsyncer.storage.binlog.proto.BinlogMap;
 import org.dbsyncer.storage.binlog.proto.BinlogMessage;
 import org.dbsyncer.storage.binlog.proto.EventEnum;
 import org.dbsyncer.storage.util.BinlogMessageUtil;
@@ -34,20 +32,10 @@ public abstract class AbstractWriterBinlog extends AbstractBinlogService<WriterR
 
     protected void flush(String tableGroupId, String event, Map<String, Object> data) {
         try {
-            BinlogMap.Builder dataBuilder = BinlogMap.newBuilder();
-            data.forEach((k, v) -> {
-                if (null != v) {
-                    ByteString bytes = BinlogMessageUtil.serializeValue(v);
-                    if (null != bytes) {
-                        dataBuilder.putRow(k, bytes);
-                    }
-                }
-            });
-
             BinlogMessage builder = BinlogMessage.newBuilder()
                     .setTableGroupId(tableGroupId)
                     .setEvent(EventEnum.valueOf(event))
-                    .setData(dataBuilder.build())
+                    .setData(BinlogMessageUtil.toBinlogMap(data))
                     .build();
             super.flush(builder);
         } catch (Exception e) {

+ 5 - 6
dbsyncer-parser/src/main/java/org/dbsyncer/parser/flush/impl/FlushServiceImpl.java

@@ -1,9 +1,7 @@
 package org.dbsyncer.parser.flush.impl;
 
-import com.alibaba.fastjson.JSONException;
 import org.dbsyncer.common.config.IncrementDataConfig;
 import org.dbsyncer.common.snowflake.SnowflakeIdWorker;
-import org.dbsyncer.common.util.JsonUtil;
 import org.dbsyncer.common.util.StringUtil;
 import org.dbsyncer.parser.flush.BufferActuator;
 import org.dbsyncer.parser.flush.FlushService;
@@ -12,6 +10,7 @@ import org.dbsyncer.storage.StorageService;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.dbsyncer.storage.enums.StorageDataStatusEnum;
 import org.dbsyncer.storage.enums.StorageEnum;
+import org.dbsyncer.storage.util.BinlogMessageUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -69,13 +68,13 @@ public class FlushServiceImpl implements FlushService {
             row.put(ConfigConstant.DATA_TARGET_TABLE_NAME, targetTableGroupName);
             row.put(ConfigConstant.DATA_EVENT, event);
             row.put(ConfigConstant.DATA_ERROR, substring(error));
+            row.put(ConfigConstant.CONFIG_MODEL_CREATE_TIME, now);
             try {
-                row.put(ConfigConstant.CONFIG_MODEL_JSON, JsonUtil.objToJson(r));
-            } catch (JSONException e) {
+                byte[] bytes = BinlogMessageUtil.toBinlogMap(r).toByteArray();
+                row.put(ConfigConstant.BINLOG_DATA, bytes);
+            } catch (Exception e) {
                 logger.warn("可能存在Blob或inputStream大文件类型, 无法序列化:{}", r);
-                row.put(ConfigConstant.CONFIG_MODEL_JSON, r.toString());
             }
-            row.put(ConfigConstant.CONFIG_MODEL_CREATE_TIME, now);
 
             // 缓存队列满时,打印日志
             if (!storageBufferActuator.offer(new StorageRequest(metaId, row))) {

+ 1 - 1
dbsyncer-storage/src/main/java/org/dbsyncer/storage/enums/IndexFieldResolverEnum.java

@@ -10,7 +10,7 @@ public enum IndexFieldResolverEnum {
 
     STRING((f) -> f.stringValue()),
 
-    BINARY((f) -> f.binaryValue());
+    BINARY((f) -> f.binaryValue().bytes);
 
     private IndexFieldResolver indexFieldResolver;
 

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

@@ -14,10 +14,10 @@ import org.dbsyncer.storage.AbstractStorageService;
 import org.dbsyncer.storage.StorageException;
 import org.dbsyncer.storage.constant.ConfigConstant;
 import org.dbsyncer.storage.enums.StorageEnum;
+import org.dbsyncer.storage.lucene.Option;
 import org.dbsyncer.storage.lucene.Shard;
 import org.dbsyncer.storage.query.AbstractFilter;
 import org.dbsyncer.storage.query.BooleanFilter;
-import org.dbsyncer.storage.lucene.Option;
 import org.dbsyncer.storage.query.Query;
 import org.dbsyncer.storage.util.DocumentUtil;
 
@@ -237,7 +237,4 @@ public class DiskStorageServiceImpl extends AbstractStorageService {
         void apply(Shard shard, List<Document> docs) throws IOException;
     }
 
-    interface BooleanClauseBuilder {
-        BooleanClause toBooleanClause();
-    }
 }

+ 22 - 3
dbsyncer-storage/src/main/java/org/dbsyncer/storage/util/BinlogMessageUtil.java

@@ -6,6 +6,7 @@ import oracle.sql.CLOB;
 import oracle.sql.TIMESTAMP;
 import org.apache.commons.io.IOUtils;
 import org.dbsyncer.storage.binlog.BinlogColumnValue;
+import org.dbsyncer.storage.binlog.proto.BinlogMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -14,9 +15,14 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
-import java.sql.*;
+import java.sql.Date;
+import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.sql.Types;
 import java.time.LocalDateTime;
 import java.util.BitSet;
+import java.util.Map;
 
 /**
  * Java语言提供了八种基本类型,六种数字类型(四个整数型,两个浮点型),一种字符类型,一种布尔型。
@@ -52,6 +58,19 @@ public abstract class BinlogMessageUtil {
 
     private static final BinlogColumnValue value = new BinlogColumnValue();
 
+    public static BinlogMap toBinlogMap(Map<String, Object> data) {
+        BinlogMap.Builder dataBuilder = BinlogMap.newBuilder();
+        data.forEach((k, v) -> {
+            if (null != v) {
+                ByteString bytes = serializeValue(v);
+                if (null != bytes) {
+                    dataBuilder.putRow(k, bytes);
+                }
+            }
+        });
+        return dataBuilder.build();
+    }
+
     public static ByteString serializeValue(Object v) {
         String type = v.getClass().getName();
         switch (type) {
@@ -202,7 +221,7 @@ public abstract class BinlogMessageUtil {
             case Types.BINARY:
             case Types.VARBINARY:
             case Types.LONGVARBINARY:
-            // 二进制对象
+                // 二进制对象
             case Types.NCLOB:
             case Types.CLOB:
             case Types.BLOB:
@@ -224,7 +243,7 @@ public abstract class BinlogMessageUtil {
             is = blob.getBinaryStream();
             b = new byte[(int) blob.length()];
             int read = is.read(b);
-            if(-1 == read){
+            if (-1 == read) {
                 return b;
             }
         } catch (Exception e) {

+ 6 - 2
dbsyncer-storage/src/main/java/org/dbsyncer/storage/util/DocumentUtil.java

@@ -97,7 +97,6 @@ public abstract class DocumentUtil {
         String targetTableName = (String) params.get(ConfigConstant.DATA_TARGET_TABLE_NAME);
         String event = (String) params.get(ConfigConstant.DATA_EVENT);
         String error = (String) params.get(ConfigConstant.DATA_ERROR);
-        String json = (String) params.get(ConfigConstant.CONFIG_MODEL_JSON);
         Long createTime = (Long) params.get(ConfigConstant.CONFIG_MODEL_CREATE_TIME);
 
         doc.add(new StringField(ConfigConstant.CONFIG_MODEL_ID, id, Field.Store.YES));
@@ -107,7 +106,12 @@ public abstract class DocumentUtil {
         doc.add(new StringField(ConfigConstant.DATA_TARGET_TABLE_NAME, targetTableName, Field.Store.YES));
         doc.add(new StringField(ConfigConstant.DATA_EVENT, event, Field.Store.YES));
         doc.add(new TextField(ConfigConstant.DATA_ERROR, error, Field.Store.YES));
-        doc.add(new StoredField(ConfigConstant.CONFIG_MODEL_JSON, json));
+
+        // 同步数据
+        byte[] bytes = (byte[]) params.get(ConfigConstant.BINLOG_DATA);
+        doc.add(new BinaryDocValuesField(ConfigConstant.BINLOG_DATA, new BytesRef(bytes)));
+        doc.add(new StoredField(ConfigConstant.BINLOG_DATA, bytes));
+
         // 创建时间
         doc.add(new LongPoint(ConfigConstant.CONFIG_MODEL_CREATE_TIME, createTime));
         doc.add(new StoredField(ConfigConstant.CONFIG_MODEL_CREATE_TIME, createTime));

+ 101 - 60
dbsyncer-web/src/main/resources/static/js/monitor/index.js

@@ -6,21 +6,39 @@ function formatDate(time) {
     var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
     var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
     var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
-    return YY + MM + DD +" "+hh + mm + ss;
+    return YY + MM + DD + " " + hh + mm + ss;
 }
 
 // 查看详细数据
 function bindQueryDataDetailEvent() {
-    var $queryData = $(".queryData");
+    let $queryData = $(".queryData");
     $queryData.unbind("click");
     $queryData.click(function () {
-        var json = $(this).parent().find("div").text();
-        var html = '<div class="row driver_break_word">' + json + '</div>';
+        let json = $(this).parent().find("div").text();
         BootstrapDialog.show({
+            size: BootstrapDialog.SIZE_WIDE,
             title: "注意信息安全",
             type: BootstrapDialog.TYPE_INFO,
-            message: html,
-            size: BootstrapDialog.SIZE_NORMAL,
+            message: function (dialog) {
+                let $content = '<table class="table table-hover">';
+                $content += '<thead><tr><th></th><th>字段</th><th>值</th></tr></thead>';
+                $content += '<tbody id="dataDetail" tableGroupId="">';
+
+                let jsonObj = $.parseJSON(json);
+                let index = 1;
+                $.each(jsonObj, function(name, value) {
+                    $content += '<tr>';
+                    $content += '<td>' + index + '</td>';
+                    $content += '<td>' + name + '</td>';
+                    $content += '<td class="driver_break_word">' + value + '</td>';
+                    $content += '</tr>';
+                    index++;
+                });
+
+                $content += '</tbody>';
+                $content += '</table>';
+                return $content;
+            },
             buttons: [{
                 label: "关闭",
                 action: function (dialog) {
@@ -54,7 +72,7 @@ function bindQueryErrorDetailEvent() {
 }
 
 // 清空数据
-function bindClearEvent($btn, $title, $msg, $url, $callback){
+function bindClearEvent($btn, $title, $msg, $url, $callback) {
     $btn.click(function () {
         var $id = null != $callback ? $callback() : $(this).attr("id");
         var data = {"id": $id};
@@ -88,12 +106,12 @@ function bindClearEvent($btn, $title, $msg, $url, $callback){
 }
 
 // 显示更多
-function showMore($this, $url, $params, $call){
+function showMore($this, $url, $params, $call) {
     $params.pageNum = parseInt($this.attr("num")) + 1;
     $params.pageSize = 10;
     doGetter($url, $params, function (data) {
         if (data.success == true) {
-            if(data.resultValue.data.length > 0){
+            if (data.resultValue.data.length > 0) {
                 $this.attr("num", $params.pageNum);
             }
             $call(data.resultValue);
@@ -109,7 +127,13 @@ function bindQueryDataEvent() {
         var keyword = $("#searchDataKeyword").val();
         var id = $("#searchMetaData").selectpicker("val");
         var success = $("#searchDataSuccess").selectpicker("val");
-        doGetter('/monitor/queryData', {"error": keyword, "success": success, "id" : id, "pageNum" : 1, "pageSize" : 10}, function (data) {
+        doGetter('/monitor/queryData', {
+            "error": keyword,
+            "success": success,
+            "id": id,
+            "pageNum": 1,
+            "pageSize": 10
+        }, function (data) {
             if (data.success == true) {
                 refreshDataList(data.resultValue);
             } else {
@@ -118,23 +142,29 @@ function bindQueryDataEvent() {
         });
     });
 }
+
 function bindQueryDataMoreEvent() {
     $("#queryDataMore").click(function () {
         var keyword = $("#searchDataKeyword").val();
         var id = $("#searchMetaData").selectpicker("val");
         var success = $("#searchDataSuccess").selectpicker("val");
-        showMore($(this), '/monitor/queryData', {"error": keyword, "success": success, "id" : id}, function(resultValue){
+        showMore($(this), '/monitor/queryData', {
+            "error": keyword,
+            "success": success,
+            "id": id
+        }, function (resultValue) {
             refreshDataList(resultValue, true)
         });
     });
 }
-function refreshDataList(resultValue, append){
+
+function refreshDataList(resultValue, append) {
     var $dataList = $("#dataList");
     var $dataTotal = $("#dataTotal");
     var html = showData($dataList, resultValue.data, append);
-    if(append){
+    if (append) {
         $dataList.append(html);
-    }else{
+    } else {
         $dataList.html(html);
         $("#queryDataMore").attr("num", 1);
     }
@@ -142,12 +172,13 @@ function refreshDataList(resultValue, append){
     bindQueryDataDetailEvent();
     bindQueryErrorDetailEvent();
 }
-function showData($dataList, arr, append){
+
+function showData($dataList, arr, append) {
     var html = '';
     var size = arr.length;
-    if(size > 0){
+    if (size > 0) {
         var start = append ? $dataList.find("tr").size() : 0;
-        for(i = 0; i < size; i++) {
+        for (i = 0; i < size; i++) {
             html += '<tr>';
             html += '<td>' + (start + i + 1) + '</td>';
             html += '<td>' + arr[i].targetTableName + '</td>';
@@ -166,7 +197,7 @@ function showData($dataList, arr, append){
 function bindQueryLogEvent() {
     $("#queryLogBtn").click(function () {
         var keyword = $("#searchLogKeyword").val();
-        doGetter('/monitor/queryLog', {"json": keyword, "pageNum" : 1, "pageSize" : 10}, function (data) {
+        doGetter('/monitor/queryLog', {"json": keyword, "pageNum": 1, "pageSize": 10}, function (data) {
             if (data.success == true) {
                 refreshLogList(data.resultValue);
             } else {
@@ -175,32 +206,35 @@ function bindQueryLogEvent() {
         });
     });
 }
+
 function bindQueryLogMoreEvent() {
     $("#queryLogMore").click(function () {
         var keyword = $("#searchLogKeyword").val();
-        showMore($(this), '/monitor/queryLog', {"json": keyword}, function(resultValue){
+        showMore($(this), '/monitor/queryLog', {"json": keyword}, function (resultValue) {
             refreshLogList(resultValue, true)
         });
     });
 }
-function refreshLogList(resultValue, append){
+
+function refreshLogList(resultValue, append) {
     var $logList = $("#logList");
     var $logTotal = $("#logTotal");
     var html = showLog($logList, resultValue.data, append);
-    if(append){
+    if (append) {
         $logList.append(html);
-    }else{
+    } else {
         $logList.html(html);
         $("#queryLogMore").attr("num", 1);
     }
     $logTotal.html(resultValue.total);
 }
-function showLog($logList, arr, append){
+
+function showLog($logList, arr, append) {
     var size = arr.length;
     var html = '';
-    if(size > 0){
+    if (size > 0) {
         var start = append ? $logList.find("tr").size() : 0;
-        for(i = 0; i < size; i++) {
+        for (i = 0; i < size; i++) {
             html += '<tr>';
             html += '<td>' + (start + i + 1) + '</td>';
             html += '<td>' + arr[i].json + '</td>';
@@ -212,14 +246,14 @@ function showLog($logList, arr, append){
 }
 
 // 堆积数据
-function showQueueChart(queueUp, queueCapacity){
-    var option={
-        title:{
-            text:"堆积数据",
-            x:'center',
+function showQueueChart(queueUp, queueCapacity) {
+    var option = {
+        title: {
+            text: "堆积数据",
+            x: 'center',
             y: 'top'
         },
-        tooltip : {
+        tooltip: {
             formatter: "{a}: {c}",
             position: 'top'
         },
@@ -233,7 +267,7 @@ function showQueueChart(queueUp, queueCapacity){
                 splitNumber: 2,
                 axisLine: {            // 坐标轴线
                     lineStyle: {       // 属性lineStyle控制线条样式
-                        color: [[0.3, '#67e0e3'], [0.7, '#37a2da'],[1, '#fd666d']],
+                        color: [[0.3, '#67e0e3'], [0.7, '#37a2da'], [1, '#fd666d']],
                         width: 5
                     }
                 },
@@ -249,15 +283,16 @@ function showQueueChart(queueUp, queueCapacity){
                         color: 'auto'
                     }
                 },
-                detail: {fontSize:12, offsetCenter:[0,'65%']},
+                detail: {fontSize: 12, offsetCenter: [0, '65%']},
                 data: [{value: queueUp, name: ''}]
             }
         ]
     };
     echarts.init(document.getElementById('queueChart')).setOption(option);
 }
+
 // 事件分类
-function showEventChart(ins, upd, del){
+function showEventChart(ins, upd, del) {
     var option = {
         title: {
             text: '事件分类',
@@ -276,9 +311,9 @@ function showEventChart(ins, upd, del){
                 type: 'pie',
                 radius: '50%',
                 data: [
-                    {value:upd, name:'更新'},
-                    {value:ins, name:'插入'},
-                    {value:del, name:'删除'}
+                    {value: upd, name: '更新'},
+                    {value: ins, name: '插入'},
+                    {value: del, name: '删除'}
                 ],
                 emphasis: {
                     itemStyle: {
@@ -296,8 +331,9 @@ function showEventChart(ins, upd, del){
     $("#updateSpan").html(upd);
     $("#deleteSpan").html(del);
 }
+
 // 统计成功失败
-function showTotalChart(success, fail){
+function showTotalChart(success, fail) {
     var option = {
         title: {
             text: '已完成数据',
@@ -316,8 +352,8 @@ function showTotalChart(success, fail){
                 type: 'pie',
                 radius: '50%',
                 data: [
-                    {value:success, name:'成功'},
-                    {value:fail, name:'失败'}
+                    {value: success, name: '成功'},
+                    {value: fail, name: '失败'}
                 ],
                 emphasis: {
                     itemStyle: {
@@ -335,16 +371,17 @@ function showTotalChart(success, fail){
     $("#successSpan").html(success);
     $("#failSpan").html(fail);
 }
+
 // CPU历史
-function showCpuChart(cpu){
+function showCpuChart(cpu) {
     var option = {
-        title : {
-            show:true,
+        title: {
+            show: true,
             text: 'CPU(%)',
-            x:'center',
+            x: 'center',
             y: 'bottom'
         },
-        tooltip : {
+        tooltip: {
             trigger: 'item',
             formatter: "{b} : {c}%"
         },
@@ -362,16 +399,17 @@ function showCpuChart(cpu){
     };
     echarts.init(document.getElementById('cpuChart')).setOption(option);
 }
+
 // 内存历史
-function showMemoryChart(memory){
+function showMemoryChart(memory) {
     var option = {
-        title : {
-            show:true,
+        title: {
+            show: true,
             text: '内存(MB)',
-            x:'center',
+            x: 'center',
             y: 'bottom'
         },
-        tooltip : {
+        tooltip: {
             trigger: 'item',
             formatter: "{b} : {c}MB"
         },
@@ -391,21 +429,23 @@ function showMemoryChart(memory){
     };
     echarts.init(document.getElementById('memoryChart')).setOption(option);
 }
+
 // 指标列表
-function showMetricTable(metrics){
+function showMetricTable(metrics) {
     var html = '';
-    $.each(metrics, function(i) {
+    $.each(metrics, function (i) {
         html += '<tr>';
-        html += '   <td style="width:5%;">'+ (i + 1) +'</td>';
-        html += '   <td>'+ '['+ metrics[i].group + ']' + metrics[i].metricName +'</td>';
-        html += '   <td>'+ metrics[i].detail +'</td>';
+        html += '   <td style="width:5%;">' + (i + 1) + '</td>';
+        html += '   <td>' + '[' + metrics[i].group + ']' + metrics[i].metricName + '</td>';
+        html += '   <td>' + metrics[i].detail + '</td>';
         html += '</tr>';
     });
     $("#metricTable").html(html);
 }
+
 // 显示图表信息
-function showChartTable(){
-    doGetWithoutLoading("/monitor/queryAppReportMetric",{}, function (data) {
+function showChartTable() {
+    doGetWithoutLoading("/monitor/queryAppReportMetric", {}, function (data) {
         if (data.success == true) {
             var report = data.resultValue;
             showTotalChart(report.success, report.fail);
@@ -419,12 +459,13 @@ function showChartTable(){
         }
     });
 }
+
 // 创建定时器
-function createTimer(){
+function createTimer() {
     showChartTable();
-    doGetWithoutLoading("/monitor/getRefreshInterval",{}, function (data) {
+    doGetWithoutLoading("/monitor/getRefreshInterval", {}, function (data) {
         if (data.success == true) {
-            timer = setInterval(function(){
+            timer = setInterval(function () {
                 showChartTable();
             }, data.resultValue * 1000);
         } else {