Procházet zdrojové kódy

项目功能优化

liukaixiong před 4 roky
rodič
revize
92b5e4feca

+ 1 - 1
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/utils/ResponseUtils.java

@@ -124,7 +124,7 @@ public class ResponseUtils {
      * @param list
      * @return
      */
-    public static ListResponseModel<?> trueList(List<?> list) {
+    public static ListResponseModel trueList(List<?> list) {
         ListResponseModel listResponseModel = new ListResponseModel();
         listResponseModel.setSuccess(true);
         listResponseModel.setList(list);

+ 16 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/props/AlertProperties.java

@@ -1,8 +1,13 @@
 package com.jay.monitor.data.server.config.props;
 
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
 import com.jay.monitor.data.server.enums.AlertMsgEnums;
+import com.jay.monitor.data.server.models.config.AlertConfigModel;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @Module 属性配置
  * @Description 告警配置
@@ -26,6 +31,8 @@ public class AlertProperties {
      */
     private String url;
 
+    private Map<MsgTypeEnums, AlertConfigModel> alertConfigMap = new HashMap<>();
+
     public boolean isEnable() {
         return isEnable;
     }
@@ -49,4 +56,13 @@ public class AlertProperties {
     public void setUrl(String url) {
         this.url = url;
     }
+
+    public Map<MsgTypeEnums, AlertConfigModel> getAlertConfigMap() {
+        return alertConfigMap;
+    }
+
+    public void setAlertConfigMap(Map<MsgTypeEnums, AlertConfigModel> alertConfigMap) {
+        this.alertConfigMap = alertConfigMap;
+    }
 }
+

+ 12 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/TraceController.java

@@ -1,7 +1,9 @@
 package com.jay.monitor.data.server.controllers;//package com.jay.monitor.data.server.controllers;
 
+import com.jay.monitor.data.core.model.response.ListResponseModel;
 import com.jay.monitor.data.core.model.response.PageInfoModel;
 import com.jay.monitor.data.core.model.response.PageResponseModel;
+import com.jay.monitor.data.core.utils.ResponseUtils;
 import com.jay.monitor.data.server.models.entity.JayMonitorMq;
 import com.jay.monitor.data.server.models.entity.JayMonitorUrl;
 import com.jay.monitor.data.server.models.request.trace.MQRequest;
@@ -55,9 +57,18 @@ public class TraceController {
         return page + "urlList";
     }
 
+    @RequestMapping(value = "/mqNodeId", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public ListResponseModel<JayMonitorMq> findMQList(@RequestBody MQRequest request) throws Exception {
+        String date = DataUtils.parseDayString(request.getDate());
+        // 将参数对应的全部匹配赋值
+        List<JayMonitorMq> mqList = mqStoreProcess.searchDataByList(date, request.getPageSize(), request);
+        return ResponseUtils.trueList(mqList);
+    }
+
     @RequestMapping(value = "/mqList", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
     @ResponseBody
-    public PageResponseModel<JayMonitorMq> findMQList(@RequestBody MQRequest request) throws Exception {
+    public PageResponseModel<JayMonitorMq> mqNodeId(@RequestBody MQRequest request) throws Exception {
         String date = DataUtils.parseDayString(request.getDate());
         // 将参数对应的全部匹配赋值
         List<JayMonitorMq> mqList = mqStoreProcess.searchDataByList(date, request.getPageSize(), request);

+ 32 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/config/AlertConfigModel.java

@@ -0,0 +1,32 @@
+package com.jay.monitor.data.server.models.config;
+
+import java.util.List;
+
+/**
+ * @Module 告警
+ * @Description 告警配置
+ * @Author liukaixiong
+ * @Date 2021/1/14 10:55
+ */
+public class AlertConfigModel {
+
+    private Integer maxTime;
+
+    private List<Integer> statusList;
+
+    public Integer getMaxTime() {
+        return maxTime;
+    }
+
+    public void setMaxTime(Integer maxTime) {
+        this.maxTime = maxTime;
+    }
+
+    public List<Integer> getStatusList() {
+        return statusList;
+    }
+
+    public void setStatusList(List<Integer> statusList) {
+        this.statusList = statusList;
+    }
+}

+ 1 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/DayAlertProcess.java

@@ -3,7 +3,7 @@ package com.jay.monitor.data.server.report;
 import com.jay.monitor.data.server.config.props.AlertProperties;
 import com.jay.monitor.data.server.costs.MdConstants;
 import com.jay.monitor.data.server.ext.ClazzEqualsProcess;
-import com.jay.monitor.data.server.report.alert.AlertMsgProcess;
+import com.jay.monitor.data.server.report.alert.notify.AlertMsgProcess;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,7 +55,6 @@ public class DayAlertProcess implements ClazzEqualsProcess {
             boolean msgSend = alertMsgProcess.send(date, allMdAlertContent.toString());
             logger.info("消息发送[" + alertMsgProcess.name() + "]结果:" + msgSend);
         }
-
     }
 
 }

+ 24 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/RealtimeAlertProcess.java

@@ -0,0 +1,24 @@
+package com.jay.monitor.data.server.report;
+
+import com.jay.monitor.data.core.model.serializable.base.BaseDTO;
+
+import java.util.List;
+
+/**
+ * @Module 告警模块
+ * @Description 实时告警模块
+ * @Author liukaixiong
+ * @Date 2021/1/14 10:35
+ */
+public class RealtimeAlertProcess {
+
+    /**
+     * 批量数据验证
+     *
+     * @param baseDTO
+     */
+    public static void process(List<? extends BaseDTO> baseDTO) {
+
+    }
+
+}

+ 3 - 4
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/AlertMsgProcess.java

@@ -1,10 +1,10 @@
-package com.jay.monitor.data.server.report.alert;
+package com.jay.monitor.data.server.report.alert.notify;
 
 import com.jay.monitor.data.server.enums.AlertMsgEnums;
 
 /**
- * @Module TODO
- * @Description TODO
+ * @Module 告警模块
+ * @Description 告警执行器
  * @Author liukaixiong
  * @Date 2020/12/16 13:15
  */
@@ -14,5 +14,4 @@ public interface AlertMsgProcess {
 
     public boolean send(String dadt, String msg);
 
-
 }

+ 1 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/DingDingAlertMsgProcess.java

@@ -1,4 +1,4 @@
-package com.jay.monitor.data.server.report.alert;
+package com.jay.monitor.data.server.report.alert.notify;
 
 import com.jay.monitor.data.server.componts.OOSInvoke;
 import com.jay.monitor.data.server.config.props.AlertProperties;

+ 29 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/AlertRule.java

@@ -0,0 +1,29 @@
+package com.jay.monitor.data.server.report.alert.rule;
+
+import com.jay.monitor.data.core.model.serializable.base.BaseDTO;
+
+/**
+ * @Module 告警
+ * @Description 告警规则定义
+ * @Author liukaixiong
+ * @Date 2021/1/14 10:47
+ */
+public interface AlertRule {
+
+    /**
+     * 规则名称
+     *
+     * @return
+     */
+    public String name();
+
+    /**
+     * 是否触发告警
+     *
+     * @param baseDTO
+     * @return
+     */
+    public boolean isTrigger(BaseDTO baseDTO);
+
+
+}

+ 60 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/RequestTimeAlertRule.java

@@ -0,0 +1,60 @@
+package com.jay.monitor.data.server.report.alert.rule;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.serializable.base.BaseDTO;
+import com.jay.monitor.data.core.model.serializable.base.RequestDataData;
+import com.jay.monitor.data.server.config.props.AlertProperties;
+import com.jay.monitor.data.server.models.config.AlertConfigModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @Module 告警规则
+ * @Description 请求时长告警规则
+ * @Author liukaixiong
+ * @Date 2021/1/14 10:49
+ */
+public class RequestTimeAlertRule implements AlertRule, InitializingBean {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private AlertProperties alertProperties;
+
+    private volatile boolean isEnableRule = false;
+
+    @Override
+    public String name() {
+        return "请求耗时问题";
+    }
+
+    @Override
+    public boolean isTrigger(BaseDTO baseDTO) {
+        if (baseDTO instanceof RequestDataData) {
+            MsgTypeEnums type = baseDTO.getType();
+            RequestDataData requestData = (RequestDataData) baseDTO;
+            Long requestTime = requestData.getRequestTime();
+            if (requestTime != null) {
+                AlertConfigModel alertConfigModel = alertProperties.getAlertConfigMap().get(type);
+
+                if (alertConfigModel != null) {
+                    Integer maxTime = alertConfigModel.getMaxTime();
+                    if (requestTime >= maxTime) {
+                        return true;
+                    }
+                }
+            } else {
+                logger.debug("not fond request time !");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        this.isEnableRule = alertProperties.isEnable();
+
+    }
+}

+ 3 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlMQStoreProcess.java

@@ -8,6 +8,7 @@ import com.jay.monitor.data.core.model.serializable.MQDataDTO;
 import com.jay.monitor.data.server.daos.JayMonitorMqMapperExt;
 import com.jay.monitor.data.server.enums.StoreType;
 import com.jay.monitor.data.server.models.entity.JayMonitorMq;
+import com.jay.monitor.data.server.report.RealtimeAlertProcess;
 import com.jay.monitor.data.server.store.AbstractStoreProcess;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -86,6 +87,8 @@ public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO, JayMoni
             this.messageManagerProcess.insert(messageTree);
             logger.debug("添加成功:" + messageTree.getMessageId());
         }
+
+        RealtimeAlertProcess.process(dataList);
     }
 
     @Override

+ 92 - 35
jay-monitor-data-server/src/main/resources/templates/trace/mqList.html

@@ -37,6 +37,18 @@
                         <input code="text" class="layui-input" name="project" id="project" value="">
                     </div>
                 </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">应用IP</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="applicationIp" id="q_applicationIp" value="">
+                    </div>
+                </div>
+                <div class="layui-inline">
+                    <label class="layui-form-label">主题</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="topic" id="q_topic" value="">
+                    </div>
+                </div>
             </div>
             <div class="layui-form-item">
                 <div class="layui-inline">
@@ -57,6 +69,13 @@
                         <input code="text" class="layui-input" name="dataId" id="data_id">
                     </div>
                 </div>
+
+                <div class="layui-inline">
+                    <label class="layui-form-label">执行耗时</label>
+                    <div class="layui-input-block">
+                        <input code="text" class="layui-input" name="requestTime" id="q_request_time">
+                    </div>
+                </div>
             </div>
             <div class="layui-form-item">
                 <div class="layui-inline">
@@ -93,15 +112,66 @@
     // <!-- <div class="layui-btn-container" style="float:right"> <button class="layui-btn layui-btn-sm" lay-event="addData"> 刷新路由</button> </div> -->
 </script>
 <script>
+    var _self = this;
+    var catUrl = '[(${catUrl})]';
+    var nextTree = function nextTree(logId) {
+        let date = $("#d_date").val();
+        var requestBody = {};
+        requestBody["date"] = date;
+        requestBody["parentLogId"] = logId;
+        requestBody["pageSize"] = 100;
+        elab_common.postReq(urlConfig.trace.mqListService, requestBody, function (result) {
+            let resultSet = result.pageModel.resultSet;
+            if (resultSet) {
+                var jsonConfig = {collapsed: false, withQuotes: true, withLinks: true}
+                debugger;
+                var resultJson = [];
+                $(resultSet).each(function (index, obj) {
+                    debugger;
+                    var data = {};
+                    data["应用名称"] = obj.applicationName;
+                    data["应用ip"] = obj.applicationIp+"";
+                    data["日志"] = catUrl+obj.logId;
+                    data["执行状态"] = elab_common.getConfigTypeText("common_status", obj.status);
+                    data["创建时间"] = elab_common.longConvertDateTime(obj.createdTime);
+                    data["请求时长"] = obj.requestTime;
+                    resultJson[index] = data;
+                })
+
+                showJson(resultJson, jsonConfig);
+            }
+        });
+    }
+
+    function showJson(obj, jsonConfig) {
+
+        if (jsonConfig == undefined) {
+            jsonConfig = {collapsed: false, withQuotes: true, withLinks: false};
+        }
+
+        $('#json-renderer').jsonViewer(obj, jsonConfig);
+        layer.open({
+            type: 1
+            , title: false //不显示标题栏
+            , closeBtn: false
+            , area: '800px;'
+            , shade: 0.8
+            , id: 'LAY_layuipro' //设定一个id,防止重复弹出
+            , btnAlign: 'c'
+            , shadeClose: true
+            , moveType: 1 //拖拽模式,0或者1
+            , content: $('#json-renderer').show()
+        });
+    }
+
     layui.use(['laydate', 'layer', 'table', 'form', 'element'], function () {
         var laydate = layui.laydate, layer = layui.layer, table = layui.table, form = layui.form;
-        var catUrl = '[(${catUrl})]';
         var listUrl = urlConfig.trace.mqListService;
         var updateUrl = urlConfig.route.updateHtml;
         var delUrl = "";
         var addUrl = urlConfig.route.refreshHtml;
         var method = "post";
-        var title = "路由列表"
+        var title = "路由列表";
 
         // 构建数据
         var dataColumn = [
@@ -133,15 +203,20 @@
                 field: 'dataId', title: '索引编号', width: 100
             }, {
                 field: 'rootLogId', title: '链路顶层编号', hide: true, templet: function (res) {
-                    return '<em><a href="' + catUrl + res.rootLogId + '"  target="_blank">顶层日志</a></em>'
+                    return '<em><a href="' + catUrl + res.rootLogId + '"  target="_blank" title="点击查看日志详情"><i class="layui-icon" style="font-size: 30px; color: #1E9FFF;">&#xe64c;</i></a></em>'
                 }
             }, {
                 field: 'parentLogId', title: '链路上级编号', templet: function (res) {
-                    return '<em><a href="' + catUrl + res.parentLogId + '"  target="_blank">上层日志</a></em>'
+                    var style = "";
+                    // var style = "style=\"color: blue;text-decoration: underline;\"";
+                    return '<em> <a href="' + catUrl + res.parentLogId + '"  target="_blank" ' + style + ' title="点击查看日志详情"><i class="layui-icon" style="font-size: 30px; color: #1E9FFF;">&#xe64c;</i></a> </em>' +
+                        '<em><a href="javascript:void(0);" onclick="nextTree(\'' + res.logId + '\')"  ' + style + ' title="查看下级消息树"><i class="layui-icon" style="font-size: 30px; color: #1E9FFF;">&#xe62e;</i></a></em>'
                 }
             }, {
                 field: 'logId', title: '链路编号', rowspan: 2, width: 100, templet: function (res) {
-                    return '<em><a href="' + catUrl + res.logId + '" target="_blank">当前日志</a></em>'
+                    // var style = "style=\"color: blue;text-decoration: underline;\"";
+                    var style = "";
+                    return '<em><a href="' + catUrl + res.logId + '" target="_blank" ' + style + ' title="点击查看日志详情"><i class="layui-icon" style="font-size: 30px; color: #1E9FFF;">&#xe64c;</i></a></em>'
                 }
             }, {
                 field: 'status', title: '是否有效', rowspan: 1, width: 80, templet: function (res) {
@@ -151,10 +226,18 @@
                     }
                     return '<em ' + styleString + '>' + elab_common.getConfigTypeText("common_status", res.status) + '</em>'
                 }
+            }, {
+                field: 'requestTime', title: '执行耗时', rowspan: 1, width: 80, templet: function (res) {
+                    var styleString = "style=\"color: red;\"";
+                    if (res.requestTime < 500) {
+                        styleString = "style=\"color: #5fb878;\"";
+                    }
+                    return '<em ' + styleString + '>' + res.requestTime + '</em>'
+                }
             }
             ,
             {
-                field: 'sourceTime', title: '来源时间', width: 160, templet: function (res) {
+                field: 'sourceTime', title: '来源时间', width: 160, hide: true, templet: function (res) {
                     return '<em>' + elab_common.longConvertDateTime(res.sourceTime) + '</em>'
                 }
             }
@@ -173,39 +256,13 @@
             debugger;
             if ("findDetail" == event) {
                 elab_common.getReq("/api/log/mq?id=" + obj.data.id, null, function (data) {
-                    debugger;
-                    $('#json-renderer').jsonViewer(data, {collapsed: false, withQuotes: true, withLinks: false});
-                    layer.open({
-                        type: 1
-                        , title: false //不显示标题栏
-                        , closeBtn: false
-                        , area: '500px;'
-                        , shade: 0.8
-                        , id: 'LAY_layuipro' //设定一个id,防止重复弹出
-                        , btnAlign: 'c'
-                        , shadeClose: true
-                        , moveType: 1 //拖拽模式,0或者1
-                        , content: $('#json-renderer').show()
-                    });
+                    showJson(data);
                 })
-
             }
         });
 
         table.on('rowDouble(list_table)', function (obj) {
-            $('#json-renderer').jsonViewer(obj.data, {collapsed: false, withQuotes: true, withLinks: false});
-            layer.open({
-                type: 1
-                , title: false //不显示标题栏
-                , closeBtn: false
-                , area: '500px;'
-                , shade: 0.8
-                , id: 'LAY_layuipro' //设定一个id,防止重复弹出
-                , btnAlign: 'c'
-                , shadeClose: true
-                , moveType: 1 //拖拽模式,0或者1
-                , content: $('#json-renderer').show()
-            });
+            showJson(obj.data);
         });
 
         form.on('submit(submit_from)', function (data) {
@@ -243,7 +300,7 @@
 
 </script>
 <script code="text/html" id="barDemo">
-    <a className="layui-btn layui-btn-xs" lay-event="findDetail"> 消息内容 </a>
+    <a className="layui-btn layui-btn-xs" lay-event="findDetail">消息内容</a>
 </script>
 </body>