Browse Source

告警分组的核心代码

liukx 3 years ago
parent
commit
91c7e07306
35 changed files with 676 additions and 33 deletions
  1. 2 0
      jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/MonitorDataClient.java
  2. 4 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/enums/MonitorDataConstants.java
  3. 31 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/ServiceDataDTO.java
  4. 17 0
      jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/base/BaseDTO.java
  5. 2 0
      jay-monitor-data-server/README.md
  6. 2 2
      jay-monitor-data-server/pom.xml
  7. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/MonitorServerApplication.java
  8. 2 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/enums/StatusEnum.java
  9. 52 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/monitor/ServiceMonitorAVueModel.java
  10. 4 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlaformNodelModel.java
  11. 4 4
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertRuleAVueModel.java
  12. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlatformAVueModel.java
  13. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/MapAVueModel.java
  14. 10 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/ElasticSearchBeanConfig.java
  15. 4 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertPlatformController.java
  16. 27 9
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertRuleController.java
  17. 16 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/DebugController.java
  18. 33 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/ServiceTraceController.java
  19. 17 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/BaseSimpleCrudController.java
  20. 92 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/monitor/BaseLoadMonitorController.java
  21. 11 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/dto/alert/RealTimeAlert.java
  22. 128 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/entity/es/JayMonitorServiceIndex.java
  23. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/SQLRequest.java
  24. 24 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/ServiceRequest.java
  25. 21 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/response/trace/ServiceTraceResponse.java
  26. 44 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/process/ServiceUserProcess.java
  27. 3 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/AlertSendProcess.java
  28. 20 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/RuleCacheFactory.java
  29. 20 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/ConfigAlertRule.java
  30. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/AbstractStoreProcess.java
  31. 39 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/es/ElasticServiceStoreProcess.java
  32. 39 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/es/ServiceElasticSearchProcess.java
  33. 0 1
      jay-monitor-data-server/src/main/resources/application.yml
  34. 1 0
      jay-monitor-data-server/src/test/resources/application-dev.yml
  35. 2 2
      pom.xml

+ 2 - 0
jay-monitor-data-client/src/main/java/com/jay/monitor/data/client/MonitorDataClient.java

@@ -99,6 +99,8 @@ public class MonitorDataClient implements Runnable {
         }
 
         client.oneway(getAddr(), data, invokeContext);
+
+        // 如果存在关闭的情况,请打开。
         if (!isEnabledReceive()) {
             enabledReceive();
         }

+ 4 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/enums/MonitorDataConstants.java

@@ -28,4 +28,8 @@ public class MonitorDataConstants {
     public static final byte OFFLINE_NOTICE = 0x06;     // 通知下线
     public static final byte ACK = 0x07;     // Acknowledge
     public static final byte HEARTBEAT = 0x0f;     // Heartbeat
+
+
+    public static final String ES_SERVICE_STORE = "jay_monitor_service";
+
 }

+ 31 - 0
jay-monitor-data-core/src/main/java/com/jay/monitor/data/core/model/serializable/ServiceDataDTO.java

@@ -0,0 +1,31 @@
+package com.jay.monitor.data.core.model.serializable;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.serializable.base.CommonDataDTO;
+
+/**
+ * 业务数据处理模型
+ *
+ * @author liukaixiong
+ * @Email liukx@elab-plus.com
+ * @date 2021/9/26 - 10:13
+ */
+public class ServiceDataDTO extends CommonDataDTO {
+
+    public ServiceDataDTO() {
+        super(MsgTypeEnums.SERVICE);
+    }
+
+    /**
+     * 方法名称
+     */
+    private String methodName;
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    public void setMethodName(String methodName) {
+        this.methodName = methodName;
+    }
+}

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

@@ -34,6 +34,11 @@ public class BaseDTO implements Serializable {
      */
     private Integer status;
 
+    /**
+     * 作者名称
+     */
+    private String[] author;
+
     /**
      * 拓展参数
      */
@@ -66,4 +71,16 @@ public class BaseDTO implements Serializable {
     public void setStatus(Integer status) {
         this.status = status;
     }
+
+    public void setType(MsgTypeEnums type) {
+        this.type = type;
+    }
+
+    public String[] getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String[] author) {
+        this.author = author;
+    }
 }

+ 2 - 0
jay-monitor-data-server/README.md

@@ -44,6 +44,8 @@
 
 `MonitorDataServer` : 服务端数据接收的入口类,通过Spring注入之后调用`Start()`方法启动一个端口: 9420(默认),负责接收客户端发送过来的数据。
 
+底层的默认传输是基于Netty,框架应用的蚂蚁金服的`bolt` 。
+
 具体参考:
 
 `com.jay.monitor.data.server.config.BeanConfig#boltServer` : 会将所有实现`UserProcessor`接口的类作为消费类,负责消费客户端传递过来的数据。

+ 2 - 2
jay-monitor-data-server/pom.xml

@@ -16,8 +16,8 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.ruoyi</groupId>
-            <artifactId>ruoyi-client</artifactId>
+            <groupId>com.ruoyi.avue</groupId>
+            <artifactId>ruoyi-avue-client</artifactId>
         </dependency>
         <dependency>
             <groupId>com.jay.monitor.data</groupId>

+ 1 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/MonitorServerApplication.java

@@ -7,7 +7,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 
 @SpringBootApplication
 @EnableScheduling
-@EnableAVue(basePackages = "com.jay.monitor.data.server.avue.template", enumsPackages = {
+@EnableAVue(basePackages = "com.jay.monitor.data.server.avue.template.*", enumsPackages = {
     "com.jay.monitor.data.server.enums", "com.jay.monitor.data.server.avue.enums"})
 public class MonitorServerApplication {
 

+ 2 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/enums/StatusEnum.java

@@ -9,8 +9,8 @@ import com.ruoyi.client.enums.DicEnumData;
  */
 public enum StatusEnum implements DicEnumData {
 
-    valid(1, "有效"),
-    invalid(-1, "无效");
+    invalid(-1, "无效"),
+    valid(1, "有效");
 
     private int code;
 

+ 52 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/monitor/ServiceMonitorAVueModel.java

@@ -0,0 +1,52 @@
+package com.jay.monitor.data.server.avue.template.monitor;
+
+import com.jay.monitor.data.server.controllers.ServiceTraceController;
+import com.ruoyi.client.annotation.AVueConfig;
+import com.ruoyi.client.annotation.AVueRouteKey;
+import com.ruoyi.client.annotation.AVueTableOption;
+import com.ruoyi.client.annotation.column.*;
+
+import java.util.Date;
+
+/**
+ * 业务数据展现模版
+ *
+ * @author liukaixiong
+ * @Email liukx@elab-plus.com
+ * @date 2021/8/17 - 13:02
+ */
+@AVueRouteKey(groupKey = "m-service")
+@AVueTableOption(title = "业务监控数据查询", dialogDrag = true, pageRoot = "pageModel", pageData = "resultSet", addBtn = false, editBtn = false, delBtn = false)
+@AVueConfig(list = ServiceTraceController.LIST_URL, update = ServiceTraceController.UPDATE_URL, save = ServiceTraceController.ADD_URL, del = ServiceTraceController.DEL_URL)
+public class ServiceMonitorAVueModel {
+
+    @AVueInput(prop = "id", label = "主键", addDisplay = false, editDisplay = false)
+    private String id;
+
+    @AVueDatetime(prop = "date", label = "日期", search = true, searchRequired = true, hide = true, format = "yyyy-MM-dd")
+    private Date date = new Date();
+
+    @AVueTime(prop = "rangTime", label = "时间范围", tip = "排序方式默认是按照创建时间倒序需要注意!", search = true, searchRequired = true, hide = true, format = "HH:mm:ss", valueFormat = "HH:mm:ss", searchRange = true)
+    private String rangTime;
+
+    @AVueInput(prop = "applicationName", label = "应用名称", search = true, required = true)
+    private String applicationName;
+    @AVueInput(prop = "ip", label = "应用ip", required = true, row = true, search = true)
+    private String ip;
+    @AVueInput(prop = "groupName", label = "组名称", required = true, hide = true, search = true)
+    private String groupName;
+    @AVueInput(prop = "groupKeyName", label = "组的标识", search = true)
+    private String groupKeyName;
+    @AVueInput(prop = "dataId", label = "组的值", search = true, row = true)
+    private String dataId;
+    @AVueNumber(prop = "requestTime", label = "请求时长", search = true)
+    private Long requestTime;
+    @AVueInput(prop = "logId", label = "日志编号")
+    private String logId;
+    @AVueSelect(prop = "status", label = "状态", dicData = "StatusEnum", search = true, row = true)
+    private Integer status;
+    @AVueDatetime(prop = "createDate", label = "创建时间", format = "yyyy-MM-dd HH:mm:ss", addDisplay = false, editDisabled = true)
+    private Date createDate;
+    @AVueTextarea(prop = "jsonContent", label = "请求参数", labelTip = "该数据用于记录请求参数,可基于模糊搜索", hide = true, search = true, minRows = 3)
+    private String jsonContent;
+}

+ 4 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlaformNodelModel.java

@@ -1,15 +1,17 @@
-package com.jay.monitor.data.server.avue.template;
+package com.jay.monitor.data.server.avue.template.rule;
 
 import com.jay.monitor.data.server.controllers.AlertPlatformController;
 import com.jay.monitor.data.server.enums.AlertMsgEnums;
 import com.ruoyi.client.annotation.column.AVueSelect;
 
 /**
+ * 多平台节点实体
+ *
  * @author liukaixiong
  * @Email liukx@elab-plus.com
  * @date 2021/9/16 - 15:48
  */
-public class AlertPlaformNodelModel {
+public class AlertPlatformNodeModel {
 
     @AVueSelect(prop = "platformType", label = "告警平台类型", dicData = "AlertMsgEnums", cascaderItem = {"alertPlatformId"})
     private AlertMsgEnums platformType = AlertMsgEnums.DingDing;

+ 4 - 4
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertRuleAVueModel.java

@@ -1,4 +1,4 @@
-package com.jay.monitor.data.server.avue.template;
+package com.jay.monitor.data.server.avue.template.rule;
 
 import com.jay.monitor.data.server.avue.enums.StatusEnum;
 import com.jay.monitor.data.server.controllers.AlertRuleController;
@@ -24,7 +24,7 @@ import java.util.Date;
         @AVueAttr(name = "url", value = "https://www.yuque.com/docs/share/573f3b55-2814-4e41-b6c9-8eeb7812d76c")})})
 public class AlertRuleAVueModel {
 
-    @AVueInput(prop = "id", label = "主键", addDisplay = false, editDisplay = false)
+    @AVueInput(prop = "id", label = "主键", addDisplay = false, editDisplay = false, search = true)
     private String id;
     /**
      * 规则名称
@@ -58,12 +58,12 @@ public class AlertRuleAVueModel {
     private String fieldValue;
 
     @AVueDynamic(prop = "alertPlatformList", label = "告警组", required = true, hide = true)
-    private AlertPlaformNodelModel alertPlatformList;
+    private AlertPlatformNodeModel alertPlatformList;
 
     /**
      * 状态
      */
-    @AVueSelect(prop = "status", label = "状态", dicData = "StatusEnum", addDisplay = true)
+    @AVueSwitch(prop = "status", label = "状态", dicData = "StatusEnum", addDisplay = true)
     private Integer status = (Integer)StatusEnum.valid.getCode();
 
     @AVueInput(prop = "creator", label = "创建人", addDisplay = false, editDisabled = true)

+ 1 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlatformAVueModel.java

@@ -1,4 +1,4 @@
-package com.jay.monitor.data.server.avue.template;
+package com.jay.monitor.data.server.avue.template.rulePlatform;
 
 import com.jay.monitor.data.server.controllers.AlertPlatformController;
 import com.jay.monitor.data.server.enums.AlertMsgEnums;

+ 1 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/MapAVueModel.java

@@ -1,4 +1,4 @@
-package com.jay.monitor.data.server.avue.template;
+package com.jay.monitor.data.server.avue.template.rulePlatform;
 
 import com.ruoyi.client.annotation.column.AVueInput;
 

+ 10 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/ElasticSearchBeanConfig.java

@@ -34,11 +34,21 @@ public class ElasticSearchBeanConfig {
         return new ElasticURLStoreProcess();
     }
 
+    @Bean
+    public ElasticServiceStoreProcess elasticServiceStoreProcess() {
+        return new ElasticServiceStoreProcess();
+    }
+
     @Bean
     public MQElasticSearchProcess mqElasticSearchProcess() {
         return new MQElasticSearchProcess();
     }
 
+    @Bean
+    public ServiceElasticSearchProcess serviceElasticSearchProcess() {
+        return new ServiceElasticSearchProcess();
+    }
+
     @Bean
     public SQLElasticSearchProcess sqlElasticSearchProcess() {
         return new SQLElasticSearchProcess();

+ 4 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertPlatformController.java

@@ -1,6 +1,7 @@
 package com.jay.monitor.data.server.controllers;//package com.jay.monitor.data.server.controllers;
 
 import com.jay.monitor.data.core.model.response.PageResponseModel;
+import com.jay.monitor.data.server.controllers.crud.BaseSimpleCrudController;
 import com.jay.monitor.data.server.models.request.alert.AlertPlatformConfigRequest;
 import com.jay.monitor.data.server.models.store.AlertPlatformConfig;
 import com.jay.monitor.data.server.store.IAlertPlatformProcess;
@@ -15,6 +16,8 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.List;
 
+import static com.jay.monitor.data.server.controllers.AlertPlatformController.PREFIX_URL;
+
 //import com.jay.monitor.data.server.services.impl.DefaultBackstageRouteService;
 
 /**
@@ -24,7 +27,7 @@ import java.util.List;
  * @Date 2019-02-28 15:16
  */
 @Controller
-@RequestMapping(value = "/alert/platform")
+@RequestMapping(value = PREFIX_URL)
 public class AlertPlatformController extends BaseSimpleCrudController<AlertPlatformConfig> {
 
     public final static String PREFIX_URL = "/alert/platform";

+ 27 - 9
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertRuleController.java

@@ -1,8 +1,10 @@
 package com.jay.monitor.data.server.controllers;//package com.jay.monitor.data.server.controllers;
 
 import com.jay.monitor.data.core.model.response.PageResponseModel;
+import com.jay.monitor.data.server.controllers.crud.BaseSimpleCrudController;
 import com.jay.monitor.data.server.models.request.alert.AlertRuleRequest;
 import com.jay.monitor.data.server.models.store.AlertRuleConfig;
+import com.jay.monitor.data.server.report.alert.RuleCacheFactory;
 import com.jay.monitor.data.server.report.alert.rule.config.ExpressionValueCondition;
 import com.jay.monitor.data.server.store.IAlertRuleProcess;
 import com.jay.monitor.data.server.store.ISimpleCrudProcess;
@@ -35,6 +37,10 @@ public class AlertRuleController extends BaseSimpleCrudController<AlertRuleConfi
 
     @Autowired
     private IAlertRuleProcess alertRuleProcess;
+
+    @Autowired
+    private RuleCacheFactory ruleCacheFactory;
+
     @Autowired
     private ExpressionValueCondition expressionValueCondition;
 
@@ -59,20 +65,32 @@ public class AlertRuleController extends BaseSimpleCrudController<AlertRuleConfi
         checkExpression(req);
     }
 
+    @Override
+    protected void addAfter(AlertRuleConfig req, boolean result) {
+        // todo 后续考虑直接刷新单个id,而非全表
+        ruleCacheFactory.refreshCache();
+    }
+
     @Override
     protected void updateBefore(AlertRuleConfig req) {
         checkExpression(req);
     }
 
+    @Override
+    protected void updateAfter(AlertRuleConfig req, boolean result) {
+        // todo 后续考虑直接刷新单个id,而非全表
+        ruleCacheFactory.refreshCache();
+    }
+
     private void checkExpression(AlertRuleConfig req) {
-//        CommonDataDTO commonDataDTO = new CommonDataDTO(MsgTypeEnums.MQ);
-//        MatchRuleEnums ruleType = req.getRuleType();
-//        if (MatchRuleEnums.expression == ruleType) {
-//            try {
-//                boolean match = expressionValueCondition.match(commonDataDTO, req.getFieldValue());
-//            } catch (SpelParseException e) {
-//                ResponseUtils.checkNull(null, "expression表达式解析有误!");
-//            }
-//        }
+        //        CommonDataDTO commonDataDTO = new CommonDataDTO(MsgTypeEnums.MQ);
+        //        MatchRuleEnums ruleType = req.getRuleType();
+        //        if (MatchRuleEnums.expression == ruleType) {
+        //            try {
+        //                boolean match = expressionValueCondition.match(commonDataDTO, req.getFieldValue());
+        //            } catch (SpelParseException e) {
+        //                ResponseUtils.checkNull(null, "expression表达式解析有误!");
+        //            }
+        //        }
     }
 }

+ 16 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/DebugController.java

@@ -1,9 +1,12 @@
 package com.jay.monitor.data.server.controllers;
 
 import com.alibaba.fastjson.JSON;
+import com.jay.monitor.data.core.model.response.ResponseCommonModel;
+import com.jay.monitor.data.core.utils.ResponseUtils;
 import com.jay.monitor.data.server.enums.DataSplitType;
 import com.jay.monitor.data.server.factory.IdGenerateService;
 import com.jay.monitor.data.server.factory.generate.DayIdGenerate;
+import com.jay.monitor.data.server.report.alert.RuleCacheFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -15,6 +18,8 @@ import java.util.List;
 import java.util.Map;
 
 /**
+ * 方便调试的暴露API指标
+ *
  * @author : liukx
  * @describe :首页
  * @time : 2019/3/1 - 16:31
@@ -28,6 +33,9 @@ public class DebugController {
     @Autowired
     private List<IdGenerateService> idGenerateServiceList;
 
+    @Autowired
+    private RuleCacheFactory ruleCacheFactory;
+
     @RequestMapping(value = "/restartTimeStrap", method = RequestMethod.GET)
     @ResponseBody
     public String index() throws Exception {
@@ -46,4 +54,12 @@ public class DebugController {
         });
         return JSON.toJSONString(debugMap);
     }
+
+    @RequestMapping(value = "/refreshCacheFactory", method = RequestMethod.GET)
+    @ResponseBody
+    public ResponseCommonModel refreshCacheFactory() throws Exception {
+        ruleCacheFactory.refreshCache();
+        return ResponseUtils.trues();
+    }
+
 }

+ 33 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/ServiceTraceController.java

@@ -0,0 +1,33 @@
+package com.jay.monitor.data.server.controllers;//package com.jay.monitor.data.server.controllers;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.server.controllers.monitor.BaseLoadMonitorController;
+import com.jay.monitor.data.server.models.request.trace.ServiceRequest;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import static com.jay.monitor.data.server.controllers.ServiceTraceController.PREFIX_URL;
+
+/**
+ * 业务监控数据查询处理
+ *
+ * @author liukx
+ * @Date 2019-02-28 15:16
+ */
+@Controller
+@RequestMapping(value = PREFIX_URL)
+public class ServiceTraceController extends BaseLoadMonitorController<ServiceRequest> {
+
+    ///////////////////////////////////////////// API ////////////////////////////////////////////
+    public final static String PREFIX_URL = "/m/service";
+    public final static String LIST_URL = PREFIX_URL + "/pageList";
+    public static final String UPDATE_URL = "/";
+    public static final String ADD_URL = "/";
+    public static final String DEL_URL = "/";
+
+    @Override
+    public MsgTypeEnums type() {
+        return MsgTypeEnums.SERVICE;
+    }
+
+}

+ 17 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/BaseSimpleCrudController.java

@@ -1,4 +1,4 @@
-package com.jay.monitor.data.server.controllers;
+package com.jay.monitor.data.server.controllers.crud;
 
 import cn.hutool.core.bean.BeanUtil;
 import com.jay.monitor.data.core.model.response.ResponseCommonModel;
@@ -23,6 +23,7 @@ public abstract class BaseSimpleCrudController<T> {
     public ResponseCommonModel addMapping(@RequestBody T request) throws Exception {
         addBefore(request);
         boolean save = getCrudProcess().save(request);
+        addAfter(request, save);
         return ResponseUtils.trues();
     }
 
@@ -32,13 +33,27 @@ public abstract class BaseSimpleCrudController<T> {
      * @param req
      */
     protected void addBefore(T req) {
+
+    }
+
+    protected void addAfter(T req, boolean result) {
+
     }
 
     protected void updateBefore(T req) {
 
     }
 
+    protected void updateAfter(T req, boolean result) {
+
+    }
+
     protected void deleteBefore(T req) {
+
+    }
+
+    protected void deleteAfter(T req, boolean result) {
+
     }
 
     @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@@ -46,6 +61,7 @@ public abstract class BaseSimpleCrudController<T> {
     public ResponseCommonModel updateMapping(@RequestBody T request) throws Exception {
         updateBefore(request);
         boolean update = getCrudProcess().update(request);
+        updateAfter(request, update);
         return ResponseUtils.trues();
     }
 

+ 92 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/monitor/BaseLoadMonitorController.java

@@ -0,0 +1,92 @@
+package com.jay.monitor.data.server.controllers.monitor;
+
+import cn.hutool.core.date.DateUtil;
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.response.PageResponseModel;
+import com.jay.monitor.data.server.models.request.trace.PageRequest;
+import com.jay.monitor.data.server.store.TranceJsonManager;
+import com.jay.monitor.data.server.utils.DataUtils;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+/**
+ * 基础加载监控数据路由
+ *
+ * @author liukaixiong
+ * @Email liukx@elab-plus.com
+ * @date 2021/9/26 - 10:47
+ */
+public abstract class BaseLoadMonitorController<T extends PageRequest> {
+
+    @Autowired
+    private TranceJsonManager tranceJsonManager;
+
+    /**
+     * 监控数据类型,需要实现类回填
+     *
+     * @return
+     */
+    public abstract MsgTypeEnums type();
+
+    @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public PageResponseModel pageList(@RequestBody T request) throws Exception {
+        String date = DataUtils.parseDayString(request.getDate());
+
+        formatDate(request);
+
+        processBefore(request);
+
+        // 将参数对应的全部匹配赋值
+        PageResponseModel pageResponseModel =
+            tranceJsonManager.searchDataByList(type(), date, request.getPageNo(), request.getPageSize(), request);
+
+        processAfter(request, pageResponseModel);
+
+        return pageResponseModel;
+    }
+
+    /**
+     * 执行之前
+     *
+     * @param req
+     */
+    protected void processBefore(T req) {
+
+    }
+
+    /**
+     * 执行之后
+     *
+     * @param req
+     */
+    protected void processAfter(T req, PageResponseModel pageResponseModel) {
+
+    }
+
+    protected void formatDate(PageRequest request) {
+        String day = DateUtil.formatDate(request.getDate());
+        String rangTime = request.getRangTime();
+        if (StringUtils.isNotEmpty(rangTime)) {
+            String[] range = rangTime.split(",");
+            if (range.length == 1) {
+                String startDate = range[0];
+                String s = day + " " + startDate;
+                request.setEndDate(DateUtil.parseDateTime(s).toJdkDate());
+            } else {
+                String startDate = range[0];
+                String s = day + " " + startDate;
+                String endDate = range[1];
+                String e = day + " " + endDate;
+                request.setStartDate(DateUtil.parseDateTime(s).toJdkDate());
+                request.setEndDate(DateUtil.parseDateTime(e).toJdkDate());
+            }
+
+        }
+    }
+
+}

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

@@ -32,6 +32,8 @@ public class RealTimeAlert implements ApplicationData, SearchIndexData, RequestD
     private String applicationName;
     @JSONField(name = "服务器ip", ordinal = 5)
     private String ip;
+    @JSONField(name = "作者名称", ordinal = 5)
+    private String[] author;
     @JSONField(name = "请求url", ordinal = 6)
     private String url;
     @JSONField(name = "用户编号", ordinal = 7)
@@ -69,13 +71,21 @@ public class RealTimeAlert implements ApplicationData, SearchIndexData, RequestD
     private String errorMessage;
     @JSONField(name = "创建时间", format = "yyyy-MM-dd HH:mm:ss", ordinal = 1000)
     private Date createDate;
-    @JSONField(name = "其他补充",   ordinal = 1001)
+    @JSONField(name = "其他补充", ordinal = 1001)
     private Map<String, Object> extMap;
 
     private transient String errorStackTrace;
 
     private transient String logId;
 
+    public String[] getAuthor() {
+        return author;
+    }
+
+    public void setAuthor(String[] author) {
+        this.author = author;
+    }
+
     public String getUniqueMark() {
         return uniqueMark;
     }

+ 128 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/entity/es/JayMonitorServiceIndex.java

@@ -0,0 +1,128 @@
+package com.jay.monitor.data.server.models.entity.es;
+
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
+import org.zxp.esclientrhl.annotation.ESID;
+import org.zxp.esclientrhl.annotation.ESMetaData;
+
+import java.util.Date;
+
+@ESMetaData(indexName = MonitorDataConstants.ES_SERVICE_STORE, number_of_shards = 5, number_of_replicas = 0, printLog = true)
+public class JayMonitorServiceIndex {
+
+    @ESID
+    private String id;
+
+    private String ip;
+
+    private String applicationName;
+
+    private String groupName;
+
+    private String groupKeyName;
+
+    private String dataId;
+
+    private String logId;
+
+    private String jsonContent;
+
+    private Long requestTime;
+
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public String getApplicationName() {
+        return applicationName;
+    }
+
+    public void setApplicationName(String applicationName) {
+        this.applicationName = applicationName;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getGroupKeyName() {
+        return groupKeyName;
+    }
+
+    public void setGroupKeyName(String groupKeyName) {
+        this.groupKeyName = groupKeyName;
+    }
+
+    public String getDataId() {
+        return dataId;
+    }
+
+    public void setDataId(String dataId) {
+        this.dataId = dataId;
+    }
+
+    public String getLogId() {
+        return logId;
+    }
+
+    public void setLogId(String logId) {
+        this.logId = logId;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getJsonContent() {
+        return jsonContent;
+    }
+
+    public void setJsonContent(String jsonContent) {
+        this.jsonContent = jsonContent;
+    }
+
+    public Long getRequestTime() {
+        return requestTime;
+    }
+
+    public void setRequestTime(Long requestTime) {
+        this.requestTime = requestTime;
+    }
+
+    public Date getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Date createDate) {
+        this.createDate = createDate;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+}

+ 1 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/SQLRequest.java

@@ -4,7 +4,7 @@ import com.jay.monitor.data.server.anno.ESSearch;
 import com.jay.monitor.data.server.enums.ESQuerySyntax;
 
 /**
- * @Module mq请求参数
+ * @Module sql请求参数
  * @Description mq请求参数
  * @Author liukaixiong
  * @Date 2021/1/12 16:46

+ 24 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/request/trace/ServiceRequest.java

@@ -0,0 +1,24 @@
+package com.jay.monitor.data.server.models.request.trace;
+
+/**
+ * @Module service请求参数
+ * @Description mq请求参数
+ * @Author liukaixiong
+ * @Date 2021/1/12 16:46
+ */
+public class ServiceRequest extends PageRequest {
+
+    /**
+     * 主键名称
+     */
+    private Integer id;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+}

+ 21 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/response/trace/ServiceTraceResponse.java

@@ -0,0 +1,21 @@
+package com.jay.monitor.data.server.models.response.trace;
+
+import com.jay.monitor.data.core.model.serializable.ServiceDataDTO;
+
+/**
+ * 描述: service 出参查询
+ *
+ * @author liukx
+ * @date 2021/9/26 10:41
+ */
+public class ServiceTraceResponse extends ServiceDataDTO {
+    private String id;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+}

+ 44 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/process/ServiceUserProcess.java

@@ -0,0 +1,44 @@
+package com.jay.monitor.data.server.process;
+
+import com.alibaba.fastjson.JSON;
+import com.alipay.remoting.BizContext;
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.serializable.ServiceDataDTO;
+import com.jay.monitor.data.server.store.StoreDataManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @Module 消息处理
+ * @Description 消息队列过来的请求参数
+ * @Author liukaixiong
+ * @Date 2020/10/23 15:52
+ */
+@Component
+public class ServiceUserProcess extends AbstractUserProcess<ServiceDataDTO> {
+
+    private Logger logger = LoggerFactory.getLogger(ServiceUserProcess.class);
+
+    @Autowired
+    private StoreDataManager storeDataManager;
+
+    @Override
+    public Object handleRequest0(BizContext bizCtx, ServiceDataDTO request) throws Exception {
+        logger.debug("接收到的 Service 传输对象:" + JSON.toJSONString(request));
+        return storeDataManager.store(MsgTypeEnums.SERVICE, request);
+    }
+
+    @Override
+    public List<String> multiInterest() {
+        return getNamesList(ServiceDataDTO.class);
+    }
+
+    @Override
+    public ExecutorSelector getExecutorSelector() {
+        return super.getExecutorSelector();
+    }
+}

+ 3 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/AlertSendProcess.java

@@ -10,6 +10,7 @@ import com.jay.monitor.data.server.models.store.AlertPlatformConfig;
 import com.jay.monitor.data.server.models.store.AlertPlatformNode;
 import com.jay.monitor.data.server.models.store.AlertRuleConfig;
 import com.jay.monitor.data.server.report.alert.notify.AlertRealTimeMsg;
+import com.jay.monitor.data.server.utils.DataUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.InitializingBean;
@@ -61,15 +62,15 @@ public class AlertSendProcess extends AbstractThreadProcess<AlertDto> implements
                 GroupFactory.getINSTANCE().getObject(prefix_alert, platformType.name(), AlertRealTimeMsg.class);
 
             // 关键告警原因
-            String title = alertRuleConfig.getTitle();
+            String title = DataUtils.getDefaultValue(realTimeAlert.getTitle(), alertRuleConfig.getTitle());
             String fieldName = alertRuleConfig.getFieldName();
             String fieldValue = alertRuleConfig.getFieldValue();
 
             realTimeAlert.setTitle(title);
 
             Map<String, Object> extMap = new LinkedHashMap<>();
+            extMap.put("规则名称", alertRuleConfig.getRuleName());
             extMap.put(fieldName, fieldValue);
-            extMap.put("规则", alertRuleConfig.getRuleName());
 
             realTimeAlert.setExtMap(extMap);
             realTimeAlert.setUniqueMark(alertRuleConfig.getId());

+ 20 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/RuleCacheFactory.java

@@ -23,7 +23,9 @@ import java.util.concurrent.ConcurrentHashMap;
  */
 @Component
 public class RuleCacheFactory {
+
     private Logger logger = LoggerFactory.getLogger(getClass());
+
     @Autowired
     protected IAlertPlatformProcess alertPlatformProcess;
 
@@ -51,6 +53,23 @@ public class RuleCacheFactory {
         return alertRuleConfigList == null ? new ArrayList<>() : alertRuleConfigList;
     }
 
+    /**
+     * 强制关闭某些规则
+     *
+     * @param ruleId 规则编号
+     */
+    public synchronized void forceCloseRule(String ruleId) {
+        AlertRuleConfig cacheRuleId = getCacheRuleId(ruleId);
+        if (cacheRuleId != null) {
+            cacheMap.remove(prefix_rule_id + ruleId);
+            AlertRuleConfig config = new AlertRuleConfig();
+            config.setStatus(-1);
+            config.setId(ruleId);
+            alertRuleProcess.update(config);
+            logger.warn("强制停止告警规则 id : " + ruleId + " \t 规则名称 : " + cacheRuleId.getTitle());
+        }
+    }
+
     public AlertRuleConfig searchRuleCacheId(String id) {
         // 查找相关的项目
         return alertRuleProcess.queryById(id);
@@ -125,6 +144,7 @@ public class RuleCacheFactory {
             });
             // 将强制刷新的数据应用到缓存中
             this.cacheMap = forceUpdateMap;
+            logger.info("触发刷新规则缓存!");
         } catch (Throwable e) {
             logger.error("缓存异常", e);
         }

+ 20 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/ConfigAlertRule.java

@@ -64,6 +64,7 @@ public class ConfigAlertRule implements CommonDataTriggerRule, InitializingBean
     }
 
     private void processRule(CommonDataDTO commonDataDTO, List<AlertRuleConfig> alertRuleConfigList, Map baseMap) {
+        assert commonDataDTO != null;
         // 遍历规则与属性匹配是否满足
         for (int i = 0; i < alertRuleConfigList.size(); i++) {
 
@@ -84,8 +85,26 @@ public class ConfigAlertRule implements CommonDataTriggerRule, InitializingBean
 
                 MatchValueCondition matchValueCondition =
                     GroupFactory.getINSTANCE().getObject(prefixCache, ruleType.name(), MatchValueCondition.class);
+                boolean match = false;
+                try {
+                    // 由于表达式录入的时候没有强制的验证一定符合数据内容,所以一旦产生异常不要影响主流程。
+                    match = matchValueCondition.match(value, fieldValue);
+                } catch (Exception e) {
+                    e.printStackTrace();
 
-                boolean match = matchValueCondition.match(value, fieldValue);
+                    // 停止并修改该规则的应用
+                    ruleCacheFactory.forceCloseRule(alertRuleConfig.getId());
+
+                    RealTimeAlert realTimeAlert = new RealTimeAlert();
+                    realTimeAlert.setTitle("表达式异常");
+                    realTimeAlert.setErrorMessage(e.getMessage() + " -> " + fieldValue);
+                    realTimeAlert.setDataId(alertRuleConfig.getId());
+                    realTimeAlert.setGroupKeyName(alertRuleConfig.getRuleName());
+                    realTimeAlert.setGroupName(alertRuleConfig.getTitle());
+
+                    AlertDto alertDto = new AlertDto(alertRuleConfig.getId(), realTimeAlert);
+                    alertSendProcess.send(alertDto);
+                }
 
                 // 符合告警规则
                 if (match) {

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

@@ -314,7 +314,7 @@ public abstract class AbstractStoreProcess<T extends BaseDTO, E> implements Task
         Map<String, DataSplitType> tableRuleMap = MonitorPropertiesUtil.getTableRuleMap(monitorProperties, storeType());
 
         if (tableRuleMap != null) {
-            DataSplitType dataSplitType = tableRuleMap.get(tableName());
+            DataSplitType dataSplitType = tableRuleMap.getOrDefault(tableName(), DataSplitType.DAY);
             if (dataSplitType != null) {
                 return dataIdFactory.getCurrentId(dataSplitType);
             }

+ 39 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/es/ElasticServiceStoreProcess.java

@@ -0,0 +1,39 @@
+package com.jay.monitor.data.server.store.es;
+
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.serializable.ServiceDataDTO;
+import com.jay.monitor.data.server.models.entity.es.JayMonitorServiceIndex;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * 描述: 业务埋点存储器
+ *
+ * @author liukx
+ * @date 2021/9/26 10:35
+ */
+public class ElasticServiceStoreProcess
+    extends AbstractElasticSearchStoreProcess<ServiceDataDTO, JayMonitorServiceIndex> {
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    public String tableName() {
+        return MonitorDataConstants.ES_SERVICE_STORE;
+    }
+
+    @Override
+    public MsgTypeEnums msgTypeEnums() {
+        return MsgTypeEnums.SERVICE;
+    }
+
+    @Override
+    protected JayMonitorServiceIndex builderJayMonitor(ServiceDataDTO request) {
+        JayMonitorServiceIndex index = new JayMonitorServiceIndex();
+        BeanUtils.copyProperties(request, index);
+        return index;
+    }
+
+}

+ 39 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/es/ServiceElasticSearchProcess.java

@@ -0,0 +1,39 @@
+package com.jay.monitor.data.server.store.es;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.server.models.entity.es.JayMonitorServiceIndex;
+import com.jay.monitor.data.server.models.request.trace.ServiceRequest;
+import com.jay.monitor.data.server.models.response.trace.ServiceTraceResponse;
+import org.springframework.beans.BeanUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ServiceElasticSearchProcess
+    extends AbstractTraceElasticSearch<ServiceRequest, ServiceTraceResponse, JayMonitorServiceIndex> {
+
+    @Override
+    public Class getIndexClass() {
+        return JayMonitorServiceIndex.class;
+    }
+
+    @Override
+    public MsgTypeEnums msgTypeEnums() {
+        return MsgTypeEnums.SERVICE;
+    }
+
+    @Override
+    public List<ServiceTraceResponse> builderResponseList(List<JayMonitorServiceIndex> list) {
+        List<ServiceTraceResponse> traceResponses = new ArrayList<>();
+        if (list != null && list.size() > 0) {
+            for (int i = 0; i < list.size(); i++) {
+                JayMonitorServiceIndex jayMonitorSQLIndex = list.get(i);
+                ServiceTraceResponse traceResponse = new ServiceTraceResponse();
+                BeanUtils.copyProperties(jayMonitorSQLIndex, traceResponse);
+                traceResponses.add(traceResponse);
+            }
+        }
+        return traceResponses;
+    }
+
+}

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

@@ -52,4 +52,3 @@ swagger2:
   version: 1.0.0
   enable: true
   docUrl: /v2/api-docs
-

+ 1 - 0
jay-monitor-data-server/src/test/resources/application-dev.yml

@@ -7,6 +7,7 @@ spring:
           jay_monitor_mq: day
           jay_monitor_url: day
           jay_monitor_sql: day
+          jay_monitor_service: day
     transfer-port: 9421
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource

+ 2 - 2
pom.xml

@@ -38,8 +38,8 @@
     <dependencyManagement>
         <dependencies>
             <dependency>
-                <groupId>com.ruoyi</groupId>
-                <artifactId>ruoyi-client</artifactId>
+                <groupId>com.ruoyi.avue</groupId>
+                <artifactId>ruoyi-avue-client</artifactId>
                 <version>3.6.0</version>
             </dependency>
             <dependency>