Browse Source

项目功能优化

liukaixiong 4 years ago
parent
commit
47da22780c
32 changed files with 772 additions and 182 deletions
  1. 85 19
      README.md
  2. 28 28
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/KafkaMonitorAutoConfiguration.java
  3. 50 22
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/utils/MonitorUtils.java
  4. 27 3
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/base/CommonDataDTO.java
  5. 39 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/base/ErrorInfoData.java
  6. 0 23
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/anno/Description.java
  7. 39 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/props/AlertProperties.java
  8. 40 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/ApiController.java
  9. 17 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/costs/ServerConstants.java
  10. 43 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/config/AlertSleepModel.java
  11. 31 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/dto/alert/RealTimeAlert.java
  12. 14 19
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/RealtimeAlertProcess.java
  13. 3 3
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/notify/AlertRealTimeMsg.java
  14. 33 18
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/notify/DingDingRealTimeAlertProcess.java
  15. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/notify/DingDingReportAlertMsgProcess.java
  16. 78 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/AbstractAlertRule.java
  17. 76 12
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/AbstractStoreProcess.java
  18. 13 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/ConfigStoreManager.java
  19. 13 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/DefaultLocalConfigManager.java
  20. 10 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlConfigStoreManager.java
  21. 12 13
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlMQStoreProcess.java
  22. 11 8
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlUrlStoreProcess.java
  23. 29 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/utils/DataUtils.java
  24. 18 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/utils/PrefixUtils.java
  25. 3 1
      jay-monitor-data-server/src/main/resources/application-com.yml
  26. 3 1
      jay-monitor-data-server/src/main/resources/application-dev.yml
  27. 5 2
      jay-monitor-data-server/src/main/resources/application-test.yml
  28. 4 3
      jay-monitor-data-server/src/main/resources/application-uat.yml
  29. 23 0
      jay-monitor-data-server/src/main/resources/templates/base/json.html
  30. 1 1
      jay-monitor-data-server/src/main/resources/templates/trace/mqList.html
  31. 17 0
      jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/process/MQUserProcessTest.java
  32. 6 3
      jay-monitor-data-server/src/test/resources/application-dev.yml

+ 85 - 19
README.md

@@ -1,22 +1,99 @@
-# 后台管理服务
+# jay-monitor-data-web - 数据收集器
 
 ## 后台服务分层
 
-### elab-backstage-api
+**jay-monitor-data-api**
 
 对外暴露接口层
 
-### elab-backstage-serviceRealtimeAlertProcess
+**jay-monitor-data-client**
+
+客户端集成工具
+
+**jay-monitor-data-core**
+
+核心通用部分封装
+
+**jay-monitor-data-server**
+
+服务启动器:
+
+- 控制台访问
+- 数据收集计算 
+- 数据的存储
+  - Mysql - 表是按照天的纬度划分存储
+  - 本地文件 - 存储大文本
+  - 可拓展成自定义的引擎存储
+- 告警推送
+  - 目前默认是钉钉
+- 集成OSS文件传输服务
+- 目前收集的数据类型
+  - URL
+  - MQ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 
-具体后台页面接口实现层
 
 ## 开发注意事项
 
-### 1. 页面存放位置
+由于该应用是用的是蚂蚁金服的solt作为传输层,所以性能调整参数需要在启动脚本中配置:
+
+```shell
+-Dbolt.tp.min=500 -Dbolt.tp.max=1000 -Dbolt.tp.queue=1000
+```
+
+分别对应:
+
+- bolt.tp.min 	: 核心线最小程池
+- bolt.tp.max     : 核心线最大程池大小
+- bolt.tp.queue  : 等待队列大小
+
+> 启动的时候会打印当前应用的使用情况。
+
+比如启动命令:
+
+```shell
+java -jar -Dbolt.tp.min=500 -Dbolt.tp.max=1000 -Dbolt.tp.queue=1000 jay-monitor-data-server.jar
+```
+
+#### 1. 页面存放位置
 
 resource/templates
 
-### 2. 开发介绍
+#### 2. 开发介绍
 
 #### 公共页面
 
@@ -55,15 +132,11 @@ elab_common.getConfigTypeByCheckBox("#checkRuleDiv", "route_check_rule", "checkR
 // 将后端传过来的数据为时间戳的转换成时分秒
 elab_common.longConvertDateTime(res.created)
 // post请求后端地址
- elab_common.postReq(urlConfig.route.refreshService, data.field, function (data) {})
+elab_common.postReq(urlConfig.route.refreshService, data.field, function (data) {})
 ```
 
-
-
-
-
 Mysql 注意事项:
- 
+
  You can change this value on the server by setting the max_allowed_packet' variable.
 1. 配置方面希望加大`max_allowed_packet`参数,由于SQL是批量执行的,可以会比较大。
 ```mysql
@@ -75,13 +148,6 @@ max_allowed_packet = 50M # 也可以继续调大点
 show variables like '%max_allowed_pack%';
 ```
 
-## 支持功能
-- 支持表按纬度拆分
-- 钉钉告警
-- 监控控制台
-- 数据采集
-- 支持mysql【可拓展其他存储】
-
 
 
 

+ 28 - 28
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/config/KafkaMonitorAutoConfiguration.java

@@ -1,28 +1,28 @@
-package com.jay.monitor.data.client.config;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.kafka.core.KafkaTemplate;
-
-/**
- * @Module 配置类
- * @Description 相关kafka配置
- * @Author liukaixiong
- * @Date 2020/11/19 14:17
- */
-@Configuration
-@ConditionalOnBean(value = {KafkaTemplate.class})
-public class KafkaMonitorAutoConfiguration {
-
-//    @Bean
-//    public KafkaMonitorProducer kafkaMonitorProducer() {
-//        return new KafkaMonitorProducer();
-//    }
-
-//    @Bean
-//    @ConditionalOnBean(value = {MessageListener.class})
-//    public MonitorRuleFactory monitorRuleFactory() {
-//        return new MonitorRuleFactory();
-//    }
-
-}
+//package com.jay.monitor.data.client.config;
+//
+//import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.kafka.core.KafkaTemplate;
+//
+///**
+// * @Module 配置类
+// * @Description 相关kafka配置
+// * @Author liukaixiong
+// * @Date 2020/11/19 14:17
+// */
+//@Configuration
+//@ConditionalOnBean(value = {KafkaTemplate.class})
+//public class KafkaMonitorAutoConfiguration {
+//
+////    @Bean
+////    public KafkaMonitorProducer kafkaMonitorProducer() {
+////        return new KafkaMonitorProducer();
+////    }
+//
+////    @Bean
+////    @ConditionalOnBean(value = {MessageListener.class})
+////    public MonitorRuleFactory monitorRuleFactory() {
+////        return new MonitorRuleFactory();
+////    }
+//
+//}

+ 50 - 22
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/utils/MonitorUtils.java

@@ -4,6 +4,8 @@ import com.jay.monitor.data.core.enums.MQInvokeType;
 import com.jay.monitor.data.core.enums.MQTypeEnum;
 import com.jay.monitor.data.core.model.serializable.MQDataDTO;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
 import java.util.Date;
 
 /**
@@ -15,6 +17,23 @@ import java.util.Date;
 public class MonitorUtils {
 
     public static MQDataDTO builderMqDataDTO(String topic, String key, String partitionName, String msgId, String value, Integer status, Long requestTime) {
+        return builderMqDataDTO(topic, key, partitionName, msgId, value, status, requestTime, null);
+    }
+
+    /**
+     * 构建队列数据
+     *
+     * @param topic         主题
+     * @param key           key
+     * @param partitionName 分区
+     * @param msgId         消息编号
+     * @param value         值
+     * @param status        状态
+     * @param requestTime   请求时长
+     * @param e             错误信息
+     * @return
+     */
+    public static MQDataDTO builderMqDataDTO(String topic, String key, String partitionName, String msgId, String value, Integer status, Long requestTime, Throwable e) {
         MQDataDTO mq = new MQDataDTO();
         mq.setTopic(topic);
         mq.setMsgId(msgId);
@@ -26,25 +45,20 @@ public class MonitorUtils {
         mq.setStatus(status);
         mq.setRequestTime(requestTime);
         mq.setInvokeType(MQInvokeType.producer);
+
+        if (e != null) {
+            StringWriter writer = new StringWriter(2048);
+            e.printStackTrace(new PrintWriter(writer));
+            mq.setErrorMessage(e.getMessage());
+            mq.setErrorStackTrace(writer.toString());
+        }
+
         return mq;
     }
 
-    /**
-     * 发送RMQ消息
-     *
-     * @param topic         topic
-     * @param key           key
-     * @param partitionName 分区号,对应rmq-》tag
-     * @param msgId         消息编号
-     * @param value         值
-     * @param status        状态
-     * @return
-     */
-    public static MQDataDTO builderProducerRMQDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status) {
-        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, null);
-        mqDataDTO.setInvokeType(MQInvokeType.producer);
-        mqDataDTO.setMqType(MQTypeEnum.rocketMQ.name());
-        return mqDataDTO;
+
+    public static MQDataDTO builderConsumerRMQDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime) {
+        return builderConsumerRMQDataDTO(topic, key, partitionName, msgId, value, status, requestTime, null);
     }
 
     /**
@@ -57,15 +71,23 @@ public class MonitorUtils {
      * @param value         值
      * @param status        状态
      * @param requestTime   请求时长
+     * @param e             错误信息
      * @return
      */
-    public static MQDataDTO builderConsumerRMQDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime) {
-        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, requestTime);
+    public static MQDataDTO builderConsumerRMQDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime, Throwable e) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, requestTime, e);
         mqDataDTO.setInvokeType(MQInvokeType.consumer);
         mqDataDTO.setMqType(MQTypeEnum.rocketMQ.name());
         return mqDataDTO;
     }
 
+
+    public static MQDataDTO builderProducerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, null);
+        mqDataDTO.setInvokeType(MQInvokeType.producer);
+        return mqDataDTO;
+    }
+
     /**
      * 构建生产者监控数据
      *
@@ -75,14 +97,19 @@ public class MonitorUtils {
      * @param msgId         消息编号
      * @param value         消息内容
      * @param status        成功或者失败
+     * @param e             异常信息
      * @return
      */
-    public static MQDataDTO builderProducerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status) {
-        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, null);
+    public static MQDataDTO builderProducerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Throwable e) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, null, e);
         mqDataDTO.setInvokeType(MQInvokeType.producer);
         return mqDataDTO;
     }
 
+    public static MQDataDTO builderConsumerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime) {
+        return builderConsumerMqDataDTO(topic, key, partitionName, msgId, value, status, requestTime, null);
+    }
+
     /**
      * 构建消费者监控数据
      *
@@ -92,10 +119,11 @@ public class MonitorUtils {
      * @param msgId         消息编号
      * @param value         消息内容
      * @param status        成功或者失败
+     * @param e             异常信息
      * @return
      */
-    public static MQDataDTO builderConsumerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime) {
-        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, requestTime);
+    public static MQDataDTO builderConsumerMqDataDTO(String topic, String key, String partitionName, Object msgId, String value, Integer status, Long requestTime, Throwable e) {
+        MQDataDTO mqDataDTO = builderMqDataDTO(topic, key, partitionName, String.valueOf(msgId), value, status, requestTime, e);
         mqDataDTO.setInvokeType(MQInvokeType.consumer);
         return mqDataDTO;
     }

+ 27 - 3
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/base/CommonDataDTO.java

@@ -3,12 +3,12 @@ package com.jay.monitor.data.core.model.serializable.base;
 import com.jay.monitor.data.core.enums.MsgTypeEnums;
 
 /**
- * @Module TODO
- * @Description TODO
+ * @Module 传输实体
+ * @Description 通用的传输实体
  * @Author liukaixiong
  * @Date 2020/10/27 13:57
  */
-public class CommonDataDTO extends BaseDTO implements ApplicationData, SearchIndexData, JsonTextData, LogDataData, RequestDataData {
+public class CommonDataDTO extends BaseDTO implements ApplicationData, SearchIndexData, JsonTextData, LogDataData, RequestDataData, ErrorInfoData {
 
     public CommonDataDTO(MsgTypeEnums type) {
         super(type);
@@ -30,6 +30,30 @@ public class CommonDataDTO extends BaseDTO implements ApplicationData, SearchInd
 
     private Long requestTime;
 
+    private String errorMessage;
+
+    private String errorStackTrace;
+
+    @Override
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    @Override
+    public String getErrorMessage() {
+        return this.errorMessage;
+    }
+
+    @Override
+    public void setErrorStackTrace(String stackTrace) {
+        this.errorStackTrace = stackTrace;
+    }
+
+    @Override
+    public String getErrorStackTrace() {
+        return this.errorStackTrace;
+    }
+
     @Override
     public String getIp() {
         return ip;

+ 39 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/base/ErrorInfoData.java

@@ -0,0 +1,39 @@
+package com.jay.monitor.data.core.model.serializable.base;
+
+/**
+ * @Module 规则接口
+ * @Description 错误数据信息
+ * @Author liukaixiong
+ * @Date 2021/1/19 10:00
+ */
+public interface ErrorInfoData {
+
+    /**
+     * 获取错误信息
+     *
+     * @param errorMessage
+     */
+    public void setErrorMessage(String errorMessage);
+
+    /**
+     * 获取错误信息
+     *
+     * @return
+     */
+    public String getErrorMessage();
+
+    /**
+     * 获取异常栈
+     *
+     * @param stackTrace
+     */
+    public void setErrorStackTrace(String stackTrace);
+
+    /**
+     * 获取错误异常栈
+     *
+     * @return
+     */
+    public String getErrorStackTrace();
+
+}

+ 0 - 23
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/anno/Description.java

@@ -1,23 +0,0 @@
-package com.jay.monitor.data.server.anno;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * 字段描述值
- *
- * @author liukaixiong
- */
-@Documented
-@Target({ElementType.FIELD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Description {
-
-    String value();
-
-    String key() default "";
-}

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

@@ -38,6 +38,11 @@ public class AlertProperties {
      */
     private Map<MsgTypeEnums, AlertRuleConfigModel> alertRuleConfigMap = new HashMap<>();
 
+    /**
+     * 告警间隔分钟
+     */
+    private Long alertIntervalMinutes;
+
     /**
      * 监控后台URL
      */
@@ -48,6 +53,40 @@ public class AlertProperties {
      */
     private String consoleUrl;
 
+    /**
+     * 当前服务外网地址
+     */
+    private String serverDomain;
+
+    /**
+     * 服务的日志展示页面
+     */
+    private String serverLogConsole;
+
+    public String getServerLogConsole() {
+        return serverLogConsole;
+    }
+
+    public Long getAlertIntervalMinutes() {
+        return alertIntervalMinutes;
+    }
+
+    public void setAlertIntervalMinutes(Long alertIntervalMinutes) {
+        this.alertIntervalMinutes = alertIntervalMinutes;
+    }
+
+    public void setServerLogConsole(String serverLogConsole) {
+        this.serverLogConsole = serverLogConsole;
+    }
+
+    public String getServerDomain() {
+        return serverDomain;
+    }
+
+    public void setServerDomain(String serverDomain) {
+        this.serverDomain = serverDomain;
+    }
+
     public StoreType getStoreType() {
         return storeType;
     }

+ 40 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/ApiController.java

@@ -1,6 +1,7 @@
 package com.jay.monitor.data.server.controllers;
 
 import com.alibaba.fastjson.JSON;
+import com.cat.file.message.MessageManagerProcess;
 import com.jay.monitor.data.core.enums.MsgTypeEnums;
 import com.jay.monitor.data.core.model.response.ResponseCommonModel;
 import com.jay.monitor.data.core.utils.ResponseUtils;
@@ -10,6 +11,7 @@ import com.jay.monitor.data.server.store.StoreDataManager;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -28,12 +30,18 @@ import java.util.Date;
 public class ApiController {
     private SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
 
+    private String jsonPage = "/base/json";
+
+
     @Autowired
     private StoreDataManager storeDataManager;
 
     @Autowired
     private DayAlertProcess alertProcess;
 
+    @Autowired
+    protected MessageManagerProcess messageManagerProcess;
+
     @RequestMapping(value = "/log/mq", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
     @ResponseBody
     public String searchMqIdLog(@RequestParam(value = "date", required = false) String date, @RequestParam("id") String id) throws Exception {
@@ -44,6 +52,26 @@ public class ApiController {
         return body == null ? JSON.toJSONString(ResponseUtils.falses(CommonEnums.COMMON_DATA_NOT_FOUND)) : body;
     }
 
+    @RequestMapping(value = "/log/mq/error", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
+    @ResponseBody
+    public String searchMqErrorLog(@RequestParam(value = "date", required = false) String date, @RequestParam("id") String id) throws Exception {
+        if (StringUtils.isEmpty(date)) {
+            date = sdf.format(new Date());
+        }
+        String body = storeDataManager.selectContentById(MsgTypeEnums.MQ, date, id);
+        return body == null ? JSON.toJSONString(ResponseUtils.falses(CommonEnums.COMMON_DATA_NOT_FOUND)) : body;
+    }
+
+    @RequestMapping(value = "/log/url/error", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
+    @ResponseBody
+    public String searchUrlErrorLog(@RequestParam(value = "date", required = false) String date, @RequestParam("id") String id) throws Exception {
+        if (StringUtils.isEmpty(date)) {
+            date = sdf.format(new Date());
+        }
+        String body = storeDataManager.selectContentById(MsgTypeEnums.URL, date, id);
+        return body == null ? JSON.toJSONString(ResponseUtils.falses(CommonEnums.COMMON_DATA_NOT_FOUND)) : body;
+    }
+
     @RequestMapping(value = "/log/url", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
     @ResponseBody
     public String searchUrlIdLog(@RequestParam(value = "date", required = false) String date, @RequestParam("id") String id) throws Exception {
@@ -54,6 +82,18 @@ public class ApiController {
         return body == null ? JSON.toJSONString(ResponseUtils.falses(CommonEnums.COMMON_DATA_NOT_FOUND)) : body;
     }
 
+    @RequestMapping(value = "/log/console", method = RequestMethod.GET)
+    public String logConsole(@RequestParam(value = "logId") String logId, Model model) throws Exception {
+        String message = messageManagerProcess.getMessage(logId);
+
+        if (StringUtils.isEmpty(message)) {
+            message = "找不到对应的消息";
+        }
+
+        model.addAttribute("jsonData", message);
+        return jsonPage;
+    }
+
     @RequestMapping(value = "/alert/send", method = RequestMethod.GET, produces = "application/json; charset=utf-8")
     @ResponseBody
     public ResponseCommonModel alertSend(@RequestParam(value = "date", required = false) String date) throws Exception {

+ 17 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/costs/ServerConstants.java

@@ -0,0 +1,17 @@
+package com.jay.monitor.data.server.costs;
+
+/**
+ * @Module TODO
+ * @Description TODO
+ * @Author liukaixiong
+ * @Date 2021/1/19 18:27
+ */
+public class ServerConstants {
+
+    public static String INDEX_HOME = "/index.html";
+
+    public static int ERROR_STATUS = -1;
+
+    public static String ERROR_LOG_ID ="errorLogId";
+    public static String JSON_LOG_ID ="jsonLogId";
+}

+ 43 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/config/AlertSleepModel.java

@@ -0,0 +1,43 @@
+package com.jay.monitor.data.server.models.config;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Module 告警
+ * @Description 告警休眠
+ * @Author liukaixiong
+ * @Date 2021/1/20 15:34
+ */
+public class AlertSleepModel {
+
+    /**
+     * 告警时间
+     */
+    private Long alertTime;
+
+    /**
+     * 累计总数
+     */
+    private AtomicInteger number;
+
+    public AlertSleepModel(  Long alertTime, AtomicInteger number) {
+        this.alertTime = alertTime;
+        this.number = number;
+    }
+
+    public Long getAlertTime() {
+        return alertTime;
+    }
+
+    public void setAlertTime(Long alertTime) {
+        this.alertTime = alertTime;
+    }
+
+    public AtomicInteger getNumber() {
+        return number;
+    }
+
+    public void setNumber(AtomicInteger number) {
+        this.number = number;
+    }
+}

+ 31 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/dto/alert/RealTimeAlert.java

@@ -9,6 +9,7 @@ import com.jay.monitor.data.core.model.serializable.base.SearchIndexData;
 import com.jay.monitor.data.server.enums.AlertRuleEnums;
 
 import java.util.Date;
+import java.util.Map;
 
 /**
  * @Module 告警模块
@@ -46,13 +47,43 @@ public class RealTimeAlert implements ApplicationData, SearchIndexData, RequestD
     private String dataId;
     @JSONField(name = "状态",ordinal = 14)
     private Integer status;
+    @JSONField(name = "错误信息",ordinal = 15)
+    private String errorMessage;
     @JSONField(name = "请求时长",ordinal = 15)
     private Long requestTime;
     @JSONField(name = "创建时间", format = "yyyy-MM-dd HH:mm:ss",ordinal = 16)
     private Date createDate;
 
+    private transient Map<String,Object> extMap;
+
+    private transient String errorStackTrace;
+
     private transient String logId;
 
+    public Map<String, Object> getExtMap() {
+        return extMap;
+    }
+
+    public void setExtMap(Map<String, Object> extMap) {
+        this.extMap = extMap;
+    }
+
+    public String getErrorStackTrace() {
+        return errorStackTrace;
+    }
+
+    public void setErrorStackTrace(String errorStackTrace) {
+        this.errorStackTrace = errorStackTrace;
+    }
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
     public Integer getTriggerCount() {
         return triggerCount;
     }

+ 14 - 19
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/RealtimeAlertProcess.java

@@ -11,10 +11,7 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * @Module 告警模块
@@ -45,34 +42,32 @@ public class RealtimeAlertProcess {
             return;
         }
 
-        Map<AlertRuleEnums, List<RealTimeAlert>> baseGroupMap = new HashMap<>();
 
         for (int i = 0; i < baseDTOList.size(); i++) {
             BaseDTO baseDTO = baseDTOList.get(i);
             for (int j = 0; j < this.alertRules.size(); j++) {
+                // 进行规则验证
                 AlertRule alertRule = this.alertRules.get(j);
                 if (alertRule.isTrigger(baseDTO)) {
                     RealTimeAlert realTimeAlert = new RealTimeAlert();
                     AlertRuleEnums alertRuleEnums = alertRule.ruleType();
-                    List<RealTimeAlert> baseRuleList = baseGroupMap.get(alertRuleEnums);
-                    if (baseRuleList == null) {
-                        baseRuleList = new ArrayList<>();
-                        baseGroupMap.put(alertRuleEnums, baseRuleList);
-                    }
                     BeanUtils.copyProperties(baseDTO, realTimeAlert);
-                    baseRuleList.add(realTimeAlert);
-                    continue;
+                    realTimeAlert.setTriggerType(alertRuleEnums);
+                    // 实时告警处理器
+                    if (this.realTimeMsgProcesses != null) {
+                        this.realTimeMsgProcesses.forEach((alert) -> {
+                            if (!alert.isSkipAlert(realTimeAlert)) {
+                                logger.debug("[[[[[[[[触发告警]]]]]]]]");
+                                alert.send(alertRuleEnums, realTimeAlert);
+                            } else {
+                                logger.debug("该项目处于告警休眠期,不告警。");
+                            }
+                        });
+                    }
+                    break;
                 }
             }
         }
-
-        if (this.realTimeMsgProcesses != null && baseGroupMap.size() > 0) {
-            this.realTimeMsgProcesses.forEach((alert) -> {
-                baseGroupMap.forEach((k, v) -> {
-                    alert.send(k, v);
-                });
-            });
-        }
     }
 
 }

+ 3 - 3
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/notify/AlertRealTimeMsg.java

@@ -4,8 +4,6 @@ import com.jay.monitor.data.server.enums.AlertRuleEnums;
 import com.jay.monitor.data.server.models.dto.alert.RealTimeAlert;
 import com.jay.monitor.data.server.report.alert.AlertType;
 
-import java.util.List;
-
 /**
  * @Module 告警
  * @Description 实时告警规则
@@ -14,6 +12,8 @@ import java.util.List;
  */
 public interface AlertRealTimeMsg extends AlertType {
 
-    public boolean send(AlertRuleEnums triggerRule, List<RealTimeAlert> msg);
+    public boolean isSkipAlert(RealTimeAlert msg);
+
+    public boolean send(AlertRuleEnums triggerRule, RealTimeAlert msg);
 
 }

+ 33 - 18
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/notify/DingDingRealTimeAlertProcess.java

@@ -3,20 +3,20 @@ package com.jay.monitor.data.server.report.alert.notify;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.jay.monitor.data.server.costs.MdConstants;
+import com.jay.monitor.data.server.costs.ServerConstants;
 import com.jay.monitor.data.server.enums.AlertMsgEnums;
 import com.jay.monitor.data.server.enums.AlertRuleEnums;
 import com.jay.monitor.data.server.models.config.AlertConfigModel;
 import com.jay.monitor.data.server.models.dto.alert.RealTimeAlert;
 import com.jay.monitor.data.server.models.request.dingding.ActionCardModel;
-import com.jay.monitor.data.server.store.ConfigStoreManager;
+import com.jay.monitor.data.server.report.alert.rule.AbstractAlertRule;
 import com.jay.monitor.data.server.utils.DingDingUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 
-import java.util.Arrays;
-import java.util.Comparator;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Module 告警
@@ -25,10 +25,7 @@ import java.util.List;
  * @Date 2021/1/14 13:25
  */
 @Component
-public class DingDingRealTimeAlertProcess implements AlertRealTimeMsg {
-
-    @Autowired
-    private ConfigStoreManager configStoreManager;
+public class DingDingRealTimeAlertProcess extends AbstractAlertRule {
 
     @Value("${spring.profiles.active:}")
     private String profiles;
@@ -39,21 +36,16 @@ public class DingDingRealTimeAlertProcess implements AlertRealTimeMsg {
     }
 
     @Override
-    public boolean send(AlertRuleEnums triggerRule, List<RealTimeAlert> msg) {
+    public boolean send(AlertRuleEnums triggerRule, RealTimeAlert realTimeAlert) {
         AlertConfigModel alertConfigModel = configStoreManager.getAlertConfigModel(AlertMsgEnums.DingDing);
         String url = alertConfigModel.getUrl();
         String consoleUrl = configStoreManager.getConsoleUrl();
         String logMonitorUrl = configStoreManager.getLogMonitorUrl();
+        String serverLogConsole = configStoreManager.getServerLogConsole();
 
-        msg.sort(Comparator.comparingLong(RealTimeAlert::getRequestTime).reversed());
-
-        RealTimeAlert realTimeAlert = msg.get(0);
         realTimeAlert.setTriggerType(triggerRule);
 
-        if (msg.size() > 1) {
-            realTimeAlert.setTriggerCount(msg.size());
-        }
-
+        realTimeAlert.setTriggerCount(sleepMap.get(getCacheKey(realTimeAlert)).getNumber().get());
 
         String logUrl = logMonitorUrl + realTimeAlert.getLogId();
 
@@ -69,8 +61,31 @@ public class DingDingRealTimeAlertProcess implements AlertRealTimeMsg {
         mdText.append(object);
         mdText.append(MdConstants.newLine);
 
-        List<ActionCardModel.ActionCardDTO.BtnsDTO> btnDTOList = Arrays.asList(new ActionCardModel.ActionCardDTO.BtnsDTO("查看日志", logUrl), new ActionCardModel.ActionCardDTO.BtnsDTO("控制台查看", consoleUrl));
-        ActionCardModel actionCardModel = DingDingUtils.buildActionCardModel("jay - 实时告警", mdText.toString(), 0, btnDTOList);
+        List<ActionCardModel.ActionCardDTO.BtnsDTO> btnList = new ArrayList<>();
+        Map<String, Object> extMap = realTimeAlert.getExtMap();
+        if (extMap != null) {
+            Object id = extMap.get(ServerConstants.ERROR_LOG_ID);
+            if (id != null) {
+                String linkConsole = serverLogConsole + "?logId=" + id.toString();
+                ActionCardModel.ActionCardDTO.BtnsDTO errorBtn = new ActionCardModel.ActionCardDTO.BtnsDTO("查看异常栈", linkConsole);
+                btnList.add(errorBtn);
+            }
+
+            Object jsonLogId = extMap.get(ServerConstants.JSON_LOG_ID);
+
+            if (jsonLogId != null) {
+                String linkConsole = serverLogConsole + "?logId=" + jsonLogId.toString();
+                ActionCardModel.ActionCardDTO.BtnsDTO errorBtn = new ActionCardModel.ActionCardDTO.BtnsDTO("查看请求参数", linkConsole);
+                btnList.add(errorBtn);
+            }
+        }
+
+        btnList.add(new ActionCardModel.ActionCardDTO.BtnsDTO("控制台查看", consoleUrl));
+
+        ActionCardModel actionCardModel = DingDingUtils.buildActionCardModel("jay - 实时告警", mdText.toString(), 0, btnList);
+
         return DingDingUtils.send(url, actionCardModel);
     }
+
+
 }

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

@@ -62,7 +62,7 @@ public class DingDingReportAlertMsgProcess implements AlertReportMsg {
         mdText.append("------ ");
         mdText.append(MdConstants.newLine);
 
-        MdModel model = DingDingUtils.builderMdModel("监控数据每日提醒:" + date, mdText.toString(), false, null);
+        MdModel model = DingDingUtils.builderMdModel("监控告警每日提醒:" + date, mdText.toString(), false, null);
 
         boolean send = DingDingUtils.send(dingDingUrl, model);
         if (send) {

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

@@ -0,0 +1,78 @@
+package com.jay.monitor.data.server.report.alert.rule;
+
+import com.jay.monitor.data.server.models.config.AlertSleepModel;
+import com.jay.monitor.data.server.models.dto.alert.RealTimeAlert;
+import com.jay.monitor.data.server.report.alert.notify.AlertRealTimeMsg;
+import com.jay.monitor.data.server.store.ConfigStoreManager;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Module 告警规则抽象类
+ * @Description 抽象告警模版
+ * @Author liukaixiong
+ * @Date 2021/1/20 15:38
+ */
+public abstract class AbstractAlertRule implements AlertRealTimeMsg {
+
+    @Autowired
+    protected ConfigStoreManager configStoreManager;
+
+    /**
+     * 休眠间隔记录,记录每次告警时间
+     */
+    protected Map<String, AlertSleepModel> sleepMap = new ConcurrentHashMap<>();
+
+    /**
+     * 是否跳过告警,避免无线循环告警
+     *
+     * @param msg
+     * @return
+     */
+    @Override
+    public boolean isSkipAlert(RealTimeAlert msg) {
+        return isSkip(msg, 1);
+    }
+
+    private boolean isSkip(RealTimeAlert realTimeAlert, int addNumber) {
+        Long alertIntervalMinutes = configStoreManager.getAlertIntervalMinutes();
+        long currentTimeMillis = System.currentTimeMillis();
+        String key = getCacheKey(realTimeAlert);
+        AlertSleepModel alertSleepModel = sleepMap.get(key);
+        if (alertSleepModel == null) {
+            alertSleepModel = new AlertSleepModel(currentTimeMillis, new AtomicInteger(1));
+            sleepMap.put(key, alertSleepModel);
+            return false;
+        } else {
+            // 先自增
+            alertSleepModel.getNumber().addAndGet(addNumber);
+            Long alertTime = alertSleepModel.getAlertTime();
+            long timeInterval = currentTimeMillis - alertTime;
+            // 如果没有超过配置的间隔范围
+            if (timeInterval < alertIntervalMinutes) {
+                return true;
+            }
+
+            // 超过间隔范围的情况下,重新计算周期
+            // 如果算出来的间隔时间和配置的间隔时间范围过大,也就是超过配置的间隔时间计算周期了,则进行重新计算
+            if (timeInterval - alertIntervalMinutes > alertIntervalMinutes) {
+                alertSleepModel = new AlertSleepModel(currentTimeMillis, new AtomicInteger(1));
+                sleepMap.put(key, alertSleepModel);
+            } else {
+                alertSleepModel.getNumber().addAndGet(1);
+                alertSleepModel.setAlertTime(currentTimeMillis);
+                sleepMap.put(key, alertSleepModel);
+            }
+
+            return false;
+        }
+    }
+
+    protected String getCacheKey(RealTimeAlert realTimeAlert) {
+        return realTimeAlert.getApplicationName() + "_" + realTimeAlert.getTriggerType();
+    }
+
+}

+ 76 - 12
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/AbstractStoreProcess.java

@@ -1,14 +1,21 @@
 package com.jay.monitor.data.server.store;
 
+import com.cat.file.message.MessageManagerProcess;
+import com.cat.file.message.internal.DefaultMessageTree;
 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.ErrorInfoData;
+import com.jay.monitor.data.core.model.serializable.base.JsonTextData;
 import com.jay.monitor.data.server.config.props.MonitorProperties;
+import com.jay.monitor.data.server.costs.ServerConstants;
 import com.jay.monitor.data.server.enums.DataSplitType;
 import com.jay.monitor.data.server.enums.StoreType;
 import com.jay.monitor.data.server.factory.thread.TaskRunnable;
 import com.jay.monitor.data.server.report.RealtimeAlertProcess;
 import com.jay.monitor.data.server.store.mysql.MysqlDDLProcess;
+import com.jay.monitor.data.server.utils.DataUtils;
 import com.jay.monitor.data.server.utils.MonitorPropertiesUtil;
+import org.apache.commons.beanutils.BeanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
@@ -50,6 +57,9 @@ public abstract class AbstractStoreProcess<T extends BaseDTO, E> implements Task
     @Autowired
     private RealtimeAlertProcess realtimeAlertProcess;
 
+    @Autowired
+    protected MessageManagerProcess messageManagerProcess;
+
     public void setQueueSize(int queueSize) {
         this.queueSize = queueSize;
     }
@@ -80,6 +90,44 @@ public abstract class AbstractStoreProcess<T extends BaseDTO, E> implements Task
      */
     public abstract MsgTypeEnums msgTypeEnums();
 
+    /**
+     * 根据信息编号查询异常内容信息
+     *
+     * @param date
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    public abstract String searchErrorById(String date, String id) throws Exception;
+
+    /**
+     * 根据信息编号查询请求内容信息
+     *
+     * @param date
+     * @param id
+     * @return
+     * @throws Exception
+     */
+    public abstract String searchContentById(String date, String id) throws Exception;
+
+    /**
+     * 查询分页数据
+     *
+     * @param date
+     * @param pageSize
+     * @param entity
+     * @return
+     * @throws Exception
+     */
+    public abstract List<E> searchDataByList(String date, Integer pageSize, E entity) throws Exception;
+
+    /**
+     * 加速消费
+     *
+     * @param request
+     */
+    public abstract List<E> speedUpConsumerList(List<T> request);
+
     public Object store(T request) throws Exception {
 
         if (!this.isConsumer) {
@@ -99,8 +147,6 @@ public abstract class AbstractStoreProcess<T extends BaseDTO, E> implements Task
             }
         }
 
-        storeAfter(request, add);
-
         return add;
     }
 
@@ -116,21 +162,39 @@ public abstract class AbstractStoreProcess<T extends BaseDTO, E> implements Task
     /**
      * 存储之后触发
      *
-     * @param request
+     * @param resultList
      * @param success
      */
-    protected void storeAfter(T request, boolean success) {
-
-    }
+    protected void storeAfter(List<T> requestList, List<E> resultList, boolean success) throws Exception {
+        // 记录一些大文本数据
+        for (int i = 0; i < resultList.size(); i++) {
+            T request = requestList.get(i);
+            E result = resultList.get(i);
+            String id = BeanUtils.getProperty(result, "id");
+            if (request instanceof JsonTextData) {
+                DefaultMessageTree messageTree = DataUtils.getJsonContentMessageTree(request, Integer.valueOf(id));
+                if (messageTree != null) {
+                    request.getExtMap().put(ServerConstants.JSON_LOG_ID, messageTree.getFormatMessageId());
+                    this.messageManagerProcess.insert(messageTree);
+                }
+            }
 
+            if (request instanceof ErrorInfoData) {
 
-    public abstract String searchContentById(String date, String id) throws Exception;
+                DefaultMessageTree messageTree = DataUtils.getErrorMessageTree(request, Integer.valueOf(id));
+                if (messageTree != null) {
+                    request.getExtMap().put(ServerConstants.ERROR_LOG_ID, messageTree.getFormatMessageId());
+                    this.messageManagerProcess.insert(messageTree);
+                }
+            }
+        }
 
-    public abstract List<E> searchDataByList(String date, Integer pageSize, E entity) throws Exception;
+        // 告警触发
+        realtimeAlertProcess.process(requestList);
+    }
 
-    public abstract void speedUpConsumerList(List<T> request);
 
-    public void speedUpConsumer(BlockingQueue<T> queue, int rate) {
+    public void speedUpConsumer(BlockingQueue<T> queue, int rate) throws Exception {
         List<T> requestList = new ArrayList<>();
 
         for (int i = 0; i < rate; i++) {
@@ -138,9 +202,9 @@ public abstract class AbstractStoreProcess<T extends BaseDTO, E> implements Task
             requestList.add(request);
         }
 
-        speedUpConsumerList(requestList);
+        List<E> resultList = speedUpConsumerList(requestList);
 
-        realtimeAlertProcess.process(requestList);
+        storeAfter(requestList, resultList, true);
     }
 
     protected BlockingQueue<T> getQueue() {

+ 13 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/ConfigStoreManager.java

@@ -27,6 +27,13 @@ public interface ConfigStoreManager {
      */
     public String getLogMonitorUrl();
 
+    /**
+     * 获取服务控制台路径
+     *
+     * @return
+     */
+    public String getServerLogConsole();
+
     /**
      * 告警开启
      *
@@ -50,5 +57,11 @@ public interface ConfigStoreManager {
      */
     public AlertRuleConfigModel getAlertRuleConfigModel(MsgTypeEnums msgTypeEnums);
 
+    /**
+     * 告警的间隔分钟级别
+     *
+     * @return
+     */
+    public Long getAlertIntervalMinutes();
 
 }

+ 13 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/DefaultLocalConfigManager.java

@@ -5,9 +5,11 @@ import com.jay.monitor.data.server.config.props.AlertProperties;
 import com.jay.monitor.data.server.enums.AlertMsgEnums;
 import com.jay.monitor.data.server.models.config.AlertConfigModel;
 import com.jay.monitor.data.server.models.config.AlertRuleConfigModel;
+import com.jay.monitor.data.server.utils.DataUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @Module 配置模块
@@ -30,9 +32,14 @@ public class DefaultLocalConfigManager implements ConfigStoreManager {
         return alertProperties.getLogMonitorUrl();
     }
 
+    @Override
+    public String getServerLogConsole() {
+        return alertProperties.getServerLogConsole();
+    }
+
     @Override
     public boolean alertEnable() {
-        return alertProperties.isEnable();
+        return DataUtils.getDefaultValue(alertProperties.isEnable(), false);
     }
 
     @Override
@@ -41,6 +48,11 @@ public class DefaultLocalConfigManager implements ConfigStoreManager {
         return alertType.get(alertMsgEnums);
     }
 
+    @Override
+    public Long getAlertIntervalMinutes() {
+        return TimeUnit.MINUTES.toMillis(DataUtils.getDefaultValue(alertProperties.getAlertIntervalMinutes(), 1L));
+    }
+
     @Override
     public AlertRuleConfigModel getAlertRuleConfigModel(MsgTypeEnums msgTypeEnums) {
         Map<MsgTypeEnums, AlertRuleConfigModel> alertRuleConfigMap = alertProperties.getAlertRuleConfigMap();

+ 10 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlConfigStoreManager.java

@@ -38,4 +38,14 @@ public class MysqlConfigStoreManager implements ConfigStoreManager {
     public AlertRuleConfigModel getAlertRuleConfigModel(MsgTypeEnums msgTypeEnums) {
         return null;
     }
+
+    @Override
+    public Long getAlertIntervalMinutes() {
+        return null;
+    }
+
+    @Override
+    public String getServerLogConsole() {
+        return null;
+    }
 }

+ 12 - 13
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlMQStoreProcess.java

@@ -1,6 +1,5 @@
 package com.jay.monitor.data.server.store.mysql;
 
-import com.cat.file.message.MessageManagerProcess;
 import com.cat.file.message.internal.DefaultMessageTree;
 import com.cat.file.message.internal.MessageTree;
 import com.jay.monitor.data.core.enums.MsgTypeEnums;
@@ -9,6 +8,7 @@ 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.store.AbstractStoreProcess;
+import com.jay.monitor.data.server.utils.PrefixUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -44,9 +44,6 @@ public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO, JayMoni
     @Qualifier("jayMonitorMqMapperExt")
     private JayMonitorMqMapperExt mqMapper;
 
-    @Autowired
-    private MessageManagerProcess messageManagerProcess;
-
     @Override
     public StoreType storeType() {
         return StoreType.MYSQL;
@@ -68,7 +65,7 @@ public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO, JayMoni
      * @param dataList
      */
     @Override
-    public void speedUpConsumerList(List<MQDataDTO> dataList) {
+    public List<JayMonitorMq> speedUpConsumerList(List<MQDataDTO> dataList) {
         List<JayMonitorMq> monitorList = new ArrayList<>();
 
         for (int i = 0; i < dataList.size(); i++) {
@@ -79,14 +76,7 @@ public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO, JayMoni
 
         mqMapper.batchPartitionInsert(getPartitionId(), monitorList);
 
-        for (int i = 0; i < monitorList.size(); i++) {
-            Integer id = monitorList.get(i).getId();
-            MQDataDTO dataDTO = dataList.get(i);
-            MessageTree messageTree = new DefaultMessageTree(dataDTO.getApplicationName(), dataDTO.getIp(), id, dataDTO.getCreateDate(), dataDTO.getJsonContent());
-            this.messageManagerProcess.insert(messageTree);
-            logger.debug("添加成功:" + messageTree.getMessageId());
-        }
-
+        return monitorList;
     }
 
     @Override
@@ -97,6 +87,15 @@ public class MysqlMQStoreProcess extends AbstractStoreProcess<MQDataDTO, JayMoni
         return this.messageManagerProcess.getMessage(messageId);
     }
 
+
+    @Override
+    public String searchErrorById(String date, String id) throws Exception {
+        JayMonitorMq jayMonitorMq = mqMapper.selectPartitionById(date, Integer.valueOf(id));
+        MessageTree messageTree = new DefaultMessageTree(PrefixUtils.prefixErrorMessage(jayMonitorMq.getApplicationName()), jayMonitorMq.getApplicationIp(), jayMonitorMq.getId(), jayMonitorMq.getCreatedTime(), null);
+        String messageId = messageTree.getMessageId();
+        return this.messageManagerProcess.getMessage(messageId);
+    }
+
     @Override
     public List<JayMonitorMq> searchDataByList(String date, Integer pageSize, JayMonitorMq entity) throws Exception {
         List<JayMonitorMq> resultList = mqMapper.selectPartitionByList(date, pageSize, entity);

+ 11 - 8
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/mysql/MysqlUrlStoreProcess.java

@@ -9,6 +9,7 @@ import com.jay.monitor.data.server.daos.JayMonitorUrlMapperExt;
 import com.jay.monitor.data.server.enums.StoreType;
 import com.jay.monitor.data.server.models.entity.JayMonitorUrl;
 import com.jay.monitor.data.server.store.AbstractStoreProcess;
+import com.jay.monitor.data.server.utils.PrefixUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -63,7 +64,15 @@ public class MysqlUrlStoreProcess extends AbstractStoreProcess<URLDataDTO, JayMo
     }
 
     @Override
-    public void speedUpConsumerList(List<URLDataDTO> requestList) {
+    public String searchErrorById(String date, String id) throws Exception {
+        JayMonitorUrl monitorData = urlMapper.selectPartitionById(date, Integer.valueOf(id));
+        MessageTree messageTree = new DefaultMessageTree(PrefixUtils.prefixErrorMessage(monitorData.getApplicationName()), monitorData.getApplicationIp(), monitorData.getId(), monitorData.getCreatedTime(), null);
+        String messageId = messageTree.getMessageId();
+        return this.messageManagerProcess.getMessage(messageId);
+    }
+
+    @Override
+    public List<JayMonitorUrl> speedUpConsumerList(List<URLDataDTO> requestList) {
         List<JayMonitorUrl> monitorList = new ArrayList<>();
         for (int i = 0; i < requestList.size(); i++) {
 
@@ -92,13 +101,7 @@ public class MysqlUrlStoreProcess extends AbstractStoreProcess<URLDataDTO, JayMo
 
         urlMapper.batchPartitionInsert(getPartitionId(), monitorList);
 
-        for (int i = 0; i < monitorList.size(); i++) {
-            Integer id = monitorList.get(i).getId();
-            URLDataDTO dataDTO = requestList.get(i);
-            MessageTree messageTree = new DefaultMessageTree(dataDTO.getApplicationName(), dataDTO.getIp(), id, dataDTO.getCreateDate(), dataDTO.getJsonContent());
-            this.messageManagerProcess.insert(messageTree);
-            logger.debug("添加成功:" + messageTree.getMessageId());
-        }
+        return monitorList;
     }
 
     @Override

+ 29 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/utils/DataUtils.java

@@ -1,5 +1,9 @@
 package com.jay.monitor.data.server.utils;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.cat.file.message.internal.DefaultMessageTree;
+import com.jay.monitor.data.core.model.serializable.base.BaseDTO;
+import com.jay.monitor.data.core.model.serializable.base.CommonDataDTO;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.core.annotation.AnnotationUtils;
@@ -34,6 +38,13 @@ public class DataUtils {
         return value;
     }
 
+    public static <T> T getDefaultValue(T value, T defaultValue) {
+        if (ObjectUtil.isEmpty(value)) {
+            return defaultValue;
+        }
+        return value;
+    }
+
     /**
      * 格式化成特定的日期字符串
      *
@@ -48,7 +59,6 @@ public class DataUtils {
     }
 
 
-
     public static Map<String, Object> parseFieldAnnotation(Object obj, Class<? extends Annotation> annotation, String annotationName) {
         Map<String, Object> fieldMap = new LinkedHashMap<>();
         try {
@@ -69,4 +79,22 @@ public class DataUtils {
         return fieldMap;
     }
 
+    public static DefaultMessageTree getJsonContentMessageTree(BaseDTO baseDTO, Integer id) {
+        if (baseDTO instanceof CommonDataDTO) {
+            CommonDataDTO commonDataDTO = (CommonDataDTO) baseDTO;
+            DefaultMessageTree messageTree = new DefaultMessageTree(commonDataDTO.getApplicationName(), commonDataDTO.getIp(), id, commonDataDTO.getCreateDate(), commonDataDTO.getJsonContent());
+            return messageTree;
+        }
+        return null;
+    }
+
+    public static DefaultMessageTree getErrorMessageTree(BaseDTO baseDTO, Integer id) {
+        if (baseDTO instanceof CommonDataDTO) {
+            CommonDataDTO commonDataDTO = (CommonDataDTO) baseDTO;
+            DefaultMessageTree messageTree = new DefaultMessageTree(PrefixUtils.prefixErrorMessage(commonDataDTO.getApplicationName()), commonDataDTO.getIp(), id, commonDataDTO.getCreateDate(), commonDataDTO.getErrorStackTrace());
+            return messageTree;
+        }
+        return null;
+    }
+
 }

+ 18 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/utils/PrefixUtils.java

@@ -0,0 +1,18 @@
+package com.jay.monitor.data.server.utils;
+
+/**
+ * @Module 工具类
+ * @Description 前缀工具类
+ * @Author liukaixiong
+ * @Date 2021/1/19 16:34
+ */
+public class PrefixUtils {
+
+    public static String prefixJsonContent(String application) {
+        return application;
+    }
+
+    public static String prefixErrorMessage(String application) {
+        return application + "-error";
+    }
+}

+ 3 - 1
jay-monitor-data-server/src/main/resources/application-com.yml

@@ -36,6 +36,8 @@ spring:
         max-time: 1000
         status-list: [ -1 ]
     log-monitor-url: http://106.14.4.198:2281/cat/r/m/
-    console-url: http://47.103.148.74:5800/index.html
+    console-url: ${spring.alert.server-domain}/index.html
+    server-domain: http://47.103.148.74:5800
+      server-log-console: ${spring.alert.server-domain}/api/log/console
 logging:
   config: logback/logback.xml

+ 3 - 1
jay-monitor-data-server/src/main/resources/application-dev.yml

@@ -38,7 +38,9 @@ spring:
         max-time: 1000
         status-list: [ -1 ]
     log-monitor-url: http://192.168.0.90:2281/cat/r/m/
-    console-url: http://127.0.0.1:5800/index.html
+    server-domain: http://127.0.0.1:5800
+    console-url: ${spring.alert.server-domain}/index.html
+    server-log-console: ${spring.alert.server-domain}/api/log/console
 logging:
   level:
     com.jay.monitor.data.server: DEBUG

+ 5 - 2
jay-monitor-data-server/src/main/resources/application-test.yml

@@ -27,7 +27,7 @@ spring:
   alert:
     alert-type:
       dingding:
-        url: https://oapi.dingtalk.com/robot/send?access_token=e60c210c07708843b8e991e47daee84bfe43af6d91d660d613104d910e1c4e1f
+        url: https://oapi.dingtalk.com/robot/send?access_token=a41b7fc3e6b004e0641db86e737558a8caf8b3f678393bc64ec27eb047e67f9f
     alert-rule-config-map:
       URL:
         max-time: 5000
@@ -36,7 +36,10 @@ spring:
         max-time: 1000
         status-list: [ -1 ]
     log-monitor-url: http://192.168.0.90:2281/cat/r/m/
-    console-url: http://101.133.210.230:5800/index.html
+    console-url: ${spring.alert.server-domain}/index.html
+    server-domain: http://101.133.210.230:5800
+    server-log-console: ${spring.alert.server-domain}/api/log/console
+
 #logging:
 #  level:
 #    com.jay.monitor.data.server: debug

+ 4 - 3
jay-monitor-data-server/src/main/resources/application-uat.yml

@@ -25,7 +25,7 @@ spring:
   alert:
     alert-type:
       dingding:
-        url: https://oapi.dingtalk.com/robot/send?access_token=e60c210c07708843b8e991e47daee84bfe43af6d91d660d613104d910e1c4e1f
+        url: https://oapi.dingtalk.com/robot/send?access_token=a41b7fc3e6b004e0641db86e737558a8caf8b3f678393bc64ec27eb047e67f9f
     alert-rule-config-map:
       URL:
         max-time: 5000
@@ -34,7 +34,8 @@ spring:
         max-time: 1000
         status-list: [ -1 ]
     log-monitor-url: http://106.14.4.198:2281/cat/r/m/
-    console-url: http://101.132.100.169:5800/index.html
-
+    console-url: ${spring.alert.server-domain}/index.html
+    server-domain: http://101.132.100.169:5800
+    server-log-console: ${spring.alert.server-domain}/api/log/console
 logging:
   config: classpath:logback/logback.xml

+ 23 - 0
jay-monitor-data-server/src/main/resources/templates/base/json.html

@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>JSON 数据预览页面</title>
+    <script src="/js/jquery-3.3.1.min.js"></script>
+    <script src="/lib/json-viewer/jquery.json-viewer.js"></script>
+    <link href="/lib/json-viewer/jquery.json-viewer.css" type="text/css" rel="stylesheet">
+</head>
+<body>
+<pre id="json-renderer">
+    [(${jsonData})]
+</pre>
+</body>
+
+<script>
+    var jsonData = '[(${jsonData})]';
+    if (jsonData != null && jsonData != '') {
+        var jsonConfig = {collapsed: false, withQuotes: true, withLinks: false};
+        $('#json-renderer').jsonViewer(JSON.parse(jsonData), jsonConfig);
+    }
+</script>
+</html>

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

@@ -121,7 +121,7 @@
 </div>
 
 <script code="text/html" id="toolbarDemo">
-    // <!-- <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;

File diff suppressed because it is too large
+ 17 - 0
jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/process/MQUserProcessTest.java


+ 6 - 3
jay-monitor-data-server/src/test/resources/application-dev.yml

@@ -11,14 +11,15 @@ spring:
 #    url: jdbc:mysql://192.168.0.13:3306/elab_db?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior
 #    username: root
 #    password: elab@123
-    url: jdbc:mysql://106.14.4.198/jay_monitor_prod?characterEncoding=UTF-8&connectTimeout=60000&socketTimeout=60000
+    url: jdbc:mysql://106.14.4.198/jay_monitor?characterEncoding=UTF-8&connectTimeout=60000&socketTimeout=60000
     username: jay_monitor
     password: jayzhou
   alert:
     enable: true
     alert-type:
       dingding:
-        url: https://oapi.dingtalk.com/robot/send?access_token=c2d694e28fd5de8c0b4f42be2e253bb3e4ef1fbb7d589ac377015e738713b995
+#        url: https://oapi.dingtalk.com/robot/send?access_token=c2d694e28fd5de8c0b4f42be2e253bb3e4ef1fbb7d589ac377015e738713b995
+        url: https://oapi.dingtalk.com/robot/send?access_token=f68223b00613967e969a33b5200667bd054a0f5289fa77e8ec062294625892e4
     alert-rule-config-map:
       URL:
         max-time: 5000
@@ -27,7 +28,9 @@ spring:
         max-time: 1000
         status-list: [ -1 ]
     log-monitor-url: http://192.168.0.90:2281/cat/r/m/
-    console-url: http://127.0.0.1:5800/index.html
+    server-domain: http://127.0.0.1:5800
+    console-url: ${spring.alert.server-domain}/index.html
+    server-log-console: ${spring.alert.server-domain}/api/log/console
   oss:
     access-key-id: LTAImNZed054h0YV
     access-key-secret: 8hmhlhiQ2ikmVeLKujwMNWsktFpSzm