Browse Source

告警分组的核心代码

liukx 3 years ago
parent
commit
682946596f
29 changed files with 749 additions and 132 deletions
  1. 106 0
      jay-monitor-data-server/README.md
  2. 22 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlaformNodelModel.java
  3. 64 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlatformAVueModel.java
  4. 20 25
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertRuleAVueModel.java
  5. 33 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/MapAVueModel.java
  6. 30 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/componts/ElasticSearchPartitionImpl.java
  7. 4 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/BeanConfig.java
  8. 10 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/props/MonitorProperties.java
  9. 7 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertPlatformController.java
  10. 24 4
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertRuleController.java
  11. 15 3
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/BaseSimpleCrudController.java
  12. 1 1
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/factory/thread/DefaultThreadFactory.java
  13. 3 4
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/entity/es/AlertPlatformConfigIndex.java
  14. 8 6
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/entity/es/AlertRuleConfigIndex.java
  15. 3 4
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/store/AlertPlatformConfig.java
  16. 32 0
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/store/AlertPlatformNode.java
  17. 6 5
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/store/AlertRuleConfig.java
  18. 26 21
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/AlertSendProcess.java
  19. 36 26
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/ConfigAlertRule.java
  20. 44 8
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/config/ExpressionValueCondition.java
  21. 3 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/ISimpleCrudProcess.java
  22. 17 2
      jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/es/AbstractCRUDElasticSearch.java
  23. 1 1
      jay-monitor-data-server/src/main/resources/application-test.yml
  24. 8 7
      jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/process/MQUserProcessTest.java
  25. 96 0
      jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/report/alert/rule/config/ExpressionValueConditionTest.java
  26. 0 1
      jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/store/es/ElasticAlertRuleProcessTest.java
  27. 46 0
      jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/utils/ClassFieldPrintCase.java
  28. 83 7
      jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/utils/ExpressionUtilsTest.java
  29. 1 0
      jay-monitor-data-server/src/test/resources/application-dev.yml

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

@@ -0,0 +1,106 @@
+# 数据收集器
+
+负责收集应用中的数据,经过筛选之后存储到`ElasticSearch` 中,主要核心功能是为了弥补CAT中的日志搜索能力较弱的短板,另外还会对CAT的拓展做增强,比如监控告警等等,更加满足实际业务的需要。
+
+## 核心功能
+
+1. 日志搜索
+
+提供控制台进行日志能力的搜索,涵盖消息队列、SQL执行、网关请求等等,后续会继续新增更多的模块;
+
+2. 分组告警
+
+提供多平台规则定义告警,将关注的异常信息告警到特定的讨论组中。
+
+3. 前后端分离
+
+将控制台录入通过端点提供访问,让特定的引擎根据规则参数进行渲染。
+
+4. 存储层
+   - 表拆分: 由于监控的数据量较大,会按照天的纬度进行划分到不同的表中。
+   - 可拓展: 由于前期设计是`Msql`存储,但搜索能力太弱。切换到`ElasticSearch`了。底层可以来回切换成`Mysql`或者`ElasticSearch`.
+   - 支持本地文件存储大文本文件,前期是为了弥补`Mysql`对大文本存储能力较弱,占用内存的情况。
+5. 配置层
+
+目前是按照本地配置走,支持`ElasticSearch`或`MySQL`切换,但目前都未实现,可以自行实现。
+
+
+
+## 核心代码梳理
+
+
+
+### 1. 模块分层
+
+- jay-monitor-data-client : 客户端层,由客户端引入之后提供发送数据的能力。
+- jay-monitor-data-core: 核心模块,全局类公共类定义
+- jay-monitor-data-server : 服务端,负责接收客户端的数据进行分析、告警、存储
+
+
+
+### 2. 功能描述
+
+#### 1. 数据传输
+
+`MonitorDataServer` : 服务端数据接收的入口类,通过Spring注入之后调用`Start()`方法启动一个端口: 9420(默认),负责接收客户端发送过来的数据。
+
+具体参考:
+
+`com.jay.monitor.data.server.config.BeanConfig#boltServer` : 会将所有实现`UserProcessor`接口的类作为消费类,负责消费客户端传递过来的数据。
+
+这些消费类存储在包: `com.jay.monitor.data.server.process` 中涵盖
+
+- MQ
+- SQL
+- URL
+
+#### 2.告警模块
+
+在数据传输的过程中,会对每条数据进行分析,根据告警的规则来判定这条数据是否属于要告警的数据。
+
+`RealtimeAlertProcess` : 实时告警处理器,负责接收数据传输的模块进行回调分析并且交由`ConfigAlertRule`处理。
+
+`ConfigAlertRule` : 配置告警,负责读取配置与传输数据进行匹配。满足则告警
+
+`MatchValueCondition` : 告警的配置规则定义,比如表达式、或者其他的一些规则详情。目前较推荐和灵活的是`ExpressionValueCondition`,根据Spring的表达式,非常灵活的匹配传输数据是否合理。
+
+
+
+`AlertSendProcess` : 告警发送模型,负责调用各个平台实现的接口进行匹配发送到特定的平台。接口是`AlertRealTimeMsg`,目前实现有`钉钉` 如果想拓展可以实现比如微信、邮件、短信等等。
+
+`DingDingRealTimeAlertProcess` : 钉钉的实现。
+
+
+
+#### 3. 存储模块
+
+##### 配置存储
+
+`ConfigStoreManager` : 配置的定义
+
+- `DefaultLocalConfigManager` :  本地文件配置
+- `MysqlConfigStoreManager` : **Mysql**的配置
+
+
+
+##### **数据拆分**
+
+`DataIdFactory` : 按照纬度进行拆分表的尾缀值.
+
+- `DayIdGenerate` : 天纬度
+- `HourIdGenerate` : 小时纬度
+
+在表的创建和获取的时候通过工厂获取规则得到一个尾缀值,将数据找到对应的表,并且流入对应的表。
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 22 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/avue/template/AlertPlaformNodelModel.java

@@ -0,0 +1,22 @@
+package com.jay.monitor.data.server.avue.template;
+
+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 {
+
+    @AVueSelect(prop = "platformType", label = "告警平台类型", dicData = "AlertMsgEnums", cascaderItem = {"alertPlatformId"})
+    private AlertMsgEnums platformType = AlertMsgEnums.DingDing;
+
+    /**
+     * 告警编号
+     */
+    @AVueSelect(prop = "alertPlatformId", label = "选择告警组", dicUrl = AlertPlatformController.TYPE_LIST_URL, dicMethod = "post", props = "{'label':'alertName','value':'id'}", dicQuery = "{'platformType':'{{platformType}}'}")
+    private String alertPlatformId;
+}

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

@@ -0,0 +1,64 @@
+package com.jay.monitor.data.server.avue.template;
+
+import com.jay.monitor.data.server.controllers.AlertPlatformController;
+import com.jay.monitor.data.server.enums.AlertMsgEnums;
+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 = "alert-platform")
+@AVueTableOption(title = "告警平台配置管理", dialogDrag = true, pageRoot = "pageModel", pageData = "resultSet")
+@AVueConfig(list = AlertPlatformController.LIST_URL, update = AlertPlatformController.UPDATE_URL, save = AlertPlatformController.ADD_URL, del = AlertPlatformController.DEL_URL)
+public class AlertPlatformAVueModel {
+
+    @AVueInput(prop = "id", label = "主键", addDisplay = false, editDisplay = false)
+    private String id;
+    /**
+     * 告警名称
+     */
+    @AVueInput(prop = "alertName", label = "告警标题", search = true, required = true)
+    private String alertName;
+    /**
+     * 平台类型
+     */
+    @AVueSelect(prop = "platformType", label = "告警平台类型", dicData = "AlertMsgEnums", required = true)
+    private AlertMsgEnums platformType = AlertMsgEnums.DingDing;
+
+    /**
+     * 地址
+     */
+    @AVueTextarea(prop = "url",  label = "第三方URL", row = true, required = true,hide = true)
+    private String url;
+
+    @AVueTextarea(prop = "remark", label = "备注")
+    private String remark;
+    /**
+     * 拓展参数
+     */
+    @AVueJson(prop = "extJson", label = "拓展参数", labelTip = "请输入JSON类型的参数",hide = true)
+    private MapAVueModel extJson;
+    /**
+     * 状态
+     */
+    @AVueSelect(prop = "status", label = "状态", dicData = "StatusEnum", addDisplay = true)
+    private Integer status;
+
+    @AVueInput(prop = "creator", label = "创建人", addDisplay = false, editDisabled = true)
+    private String creator;
+    @AVueDatetime(prop = "createDate", label = "创建时间", format = "yyyy-MM-dd HH:mm:ss", addDisplay = false, editDisabled = true)
+    private Date createDate;
+    @AVueInput(prop = "updator", label = "修改人", addDisplay = false, editDisabled = true)
+    private String updator;
+    @AVueDatetime(prop = "updated", label = "修改时间", format = "yyyy-MM-dd HH:mm:ss", addDisplay = false, editDisabled = true)
+    private Date updated;
+}

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

@@ -1,13 +1,10 @@
 package com.jay.monitor.data.server.avue.template;
 
-import com.jay.monitor.data.server.controllers.AlertPlatformController;
+import com.jay.monitor.data.server.avue.enums.StatusEnum;
 import com.jay.monitor.data.server.controllers.AlertRuleController;
 import com.jay.monitor.data.server.enums.MatchRuleEnums;
-import com.ruoyi.client.annotation.AVueConfig;
-import com.ruoyi.client.annotation.AVueRouteKey;
-import com.ruoyi.client.annotation.AVueTableOption;
-import com.ruoyi.client.annotation.column.AVueInput;
-import com.ruoyi.client.annotation.column.AVueSelect;
+import com.ruoyi.client.annotation.*;
+import com.ruoyi.client.annotation.column.*;
 
 import java.util.Date;
 
@@ -20,7 +17,11 @@ import java.util.Date;
  */
 @AVueRouteKey(groupKey = "alert-rule")
 @AVueTableOption(title = "告警规则管理", dialogDrag = true, pageRoot = "pageModel", pageData = "resultSet")
-@AVueConfig(list = AlertRuleController.LIST_URL, update = AlertRuleController.UPDATE_URL, save = AlertRuleController.ADD_URL)
+@AVueFromOption(successField = "success", successKeyword = "true", messageField = "message")
+@AVueConfig(list = AlertRuleController.LIST_URL, update = AlertRuleController.UPDATE_URL, save = AlertRuleController.ADD_URL, del = AlertRuleController.DEL_URL)
+@AVueEventButtons(tableTopLeftButtons = {
+    @AVueClickButton(methodName = "hrefClick", btnName = "使用介绍", type = "success", icon = "el-icon-setting", attrExt = {
+        @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)
@@ -28,55 +29,49 @@ public class AlertRuleAVueModel {
     /**
      * 规则名称
      */
-    @AVueInput(prop = "ruleName", label = "规则名称", search = true)
+    @AVueInput(prop = "ruleName", label = "规则名称", search = true, required = true)
     private String ruleName;
     /**
      * 项目名称 , ALL 应用所有项目
      */
-    @AVueInput(prop = "project", label = "项目名称", search = true)
+    @AVueInput(prop = "project", label = "项目名称", search = true, required = true)
     private String project;
     /**
      * 规则描述
      */
-    @AVueInput(prop = "title", label = "告警标题", search = true)
+    @AVueInput(prop = "title", label = "告警标题", search = true, required = true)
     private String title;
     /**
      * 规则类型, 该类型会基于字段值去做计算
      */
-    @AVueSelect(prop = "ruleType", label = "规则类型", dicData = "MatchRuleEnums", search = true)
+    @AVueSelect(prop = "ruleType", label = "规则类型", dicData = "MatchRuleEnums", search = true, required = true, hide = true)
     private MatchRuleEnums ruleType;
     /**
      * 字段名称
      */
-    @AVueInput(prop = "fieldName", label = "字段名称")
+    @AVueInput(prop = "fieldName", label = "字段名称", hide = true)
     private String fieldName;
     /**
      * 字段值
      */
-    @AVueInput(prop = "fieldValue", label = "字段值")
+    @AVueTextarea(prop = "fieldValue", label = "字段值", required = true, hide = true)
     private String fieldValue;
 
-    @AVueSelect(prop = "platformType", label = "告警平台类型", dicData = "AlertMsgEnums", cascaderItem = {"alertPlatformId"})
-    private String platformType;
-
-    /**
-     * 告警编号
-     */
-    @AVueSelect(prop = "alertPlatformId", label = "选择告警组", dicUrl = AlertPlatformController.TYPE_LIST_URL, dicMethod = "post", props = "{'label':'alertName','value':'id'}", dicQuery = "{'platformType':'{{platformType}}'}")
-    private String alertPlatformId;
+    @AVueDynamic(prop = "alertPlatformList", label = "告警组", required = true, hide = true)
+    private AlertPlaformNodelModel alertPlatformList;
 
     /**
      * 状态
      */
     @AVueSelect(prop = "status", label = "状态", dicData = "StatusEnum", addDisplay = true)
-    private Integer status;
+    private Integer status = (Integer)StatusEnum.valid.getCode();
 
     @AVueInput(prop = "creator", label = "创建人", addDisplay = false, editDisabled = true)
     private String creator;
-    @AVueInput(prop = "created", label = "创建时间", addDisplay = false, editDisabled = true)
-    private Date created;
+    @AVueDatetime(prop = "createDate", label = "创建时间", format = "yyyy-MM-dd HH:mm:ss", addDisplay = false, editDisabled = true)
+    private Date createDate;
     @AVueInput(prop = "updator", label = "修改人", addDisplay = false, editDisabled = true)
     private String updator;
-    @AVueInput(prop = "updated", label = "修改时间", addDisplay = false, editDisabled = true)
+    @AVueDatetime(prop = "updated", label = "修改时间", format = "yyyy-MM-dd HH:mm:ss", addDisplay = false, editDisabled = true)
     private Date updated;
 }

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

@@ -0,0 +1,33 @@
+package com.jay.monitor.data.server.avue.template;
+
+import com.ruoyi.client.annotation.column.AVueInput;
+
+/**
+ * @author liukaixiong
+ * @Email liukx@elab-plus.com
+ * @date 2021/9/14 - 16:31
+ */
+
+public class MapAVueModel {
+
+    @AVueInput(prop = "keyName",label = "属性名称")
+    private String keyName;
+    @AVueInput(prop = "keyValue",label = "属性值")
+    private String keyValue;
+
+    public String getKeyName() {
+        return keyName;
+    }
+
+    public void setKeyName(String keyName) {
+        this.keyName = keyName;
+    }
+
+    public String getKeyValue() {
+        return keyValue;
+    }
+
+    public void setKeyValue(String keyValue) {
+        this.keyValue = keyValue;
+    }
+}

+ 30 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/componts/ElasticSearchPartitionImpl.java

@@ -1,10 +1,13 @@
 package com.jay.monitor.data.server.componts;
 
+import com.alibaba.fastjson.JSON;
 import com.jay.monitor.data.server.utils.DataUtils;
 import com.jay.monitor.data.server.utils.ESUtils;
 import org.elasticsearch.action.DocWriteResponse;
 import org.elasticsearch.action.bulk.BulkRequest;
 import org.elasticsearch.action.bulk.BulkResponse;
+import org.elasticsearch.action.delete.DeleteRequest;
+import org.elasticsearch.action.delete.DeleteResponse;
 import org.elasticsearch.action.get.GetRequest;
 import org.elasticsearch.action.get.GetResponse;
 import org.elasticsearch.action.index.IndexRequest;
@@ -195,6 +198,32 @@ public class ElasticSearchPartitionImpl<T, M> extends ElasticsearchTemplateImpl<
         return savePartition(t, null, null);
     }
 
+    @Override
+    public boolean deleteById(M id, Class<T> clazz) throws Exception {
+        return deleteByIdPartition(id, clazz);
+    }
+
+    public boolean deleteByIdPartition(M id, Class<T> clazz) throws Exception {
+        MetaData metaData = IndexTools.getIndexType(clazz);
+        String indexname = metaData.getIndexname();
+        String indextype = metaData.getIndextype();
+        if (StringUtils.isEmpty(id)) {
+            throw new Exception("ID cannot be empty");
+        }
+
+        indexname = getIndexName(indexname);
+
+        DeleteRequest deleteRequest = new DeleteRequest(indexname, indextype, id.toString());
+        DeleteResponse deleteResponse = null;
+        deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
+        if (deleteResponse.getResult() == DocWriteResponse.Result.DELETED) {
+            logger.info("INDEX DELETE SUCCESS");
+        } else {
+            return false;
+        }
+        return true;
+    }
+
     @Override
     public BulkResponse[] saveBatchPartition(List<T> list, String indexName) throws Exception {
         indexName = getIndexName(indexName);
@@ -268,7 +297,7 @@ public class ElasticSearchPartitionImpl<T, M> extends ElasticsearchTemplateImpl<
             throw new Exception("nested对象更新,请使用覆盖更新");
         }
         UpdateRequest updateRequest = new UpdateRequest(indexname, indextype, id);
-        updateRequest.doc(Tools.getFieldValue(t));
+        updateRequest.doc(JSON.toJSONString(t), XContentType.JSON);
         UpdateResponse updateResponse = null;
         updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
         if (updateResponse.getResult() == DocWriteResponse.Result.CREATED) {

+ 4 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/config/BeanConfig.java

@@ -1,7 +1,6 @@
 package com.jay.monitor.data.server.config;
 
 import com.alipay.remoting.rpc.protocol.UserProcessor;
-import com.jay.monitor.data.core.enums.MonitorDataConstants;
 import com.jay.monitor.data.server.MonitorDataServer;
 import com.jay.monitor.data.server.config.props.AlertProperties;
 import com.jay.monitor.data.server.config.props.JayServerProperties;
@@ -41,9 +40,12 @@ public class BeanConfig {
 
     private Logger logger = LoggerFactory.getLogger(getClass());
 
+    @Autowired
+    private MonitorProperties monitorProperties;
+
     @Bean
     public MonitorDataServer boltServer(List<UserProcessor<?>> userProcessorList) {
-        MonitorDataServer monitorDataServer = new MonitorDataServer(MonitorDataConstants.DEFAULT_PORT);
+        MonitorDataServer monitorDataServer = new MonitorDataServer(monitorProperties.getTransferPort());
         monitorDataServer.registerUserProcessor(userProcessorList);
         if (monitorDataServer.start()) {
             logger.info(" 监控数据传输器启动完成 : " + monitorDataServer.getPort());

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

@@ -1,5 +1,6 @@
 package com.jay.monitor.data.server.config.props;
 
+import com.jay.monitor.data.core.enums.MonitorDataConstants;
 import com.jay.monitor.data.server.enums.DataSplitType;
 import com.jay.monitor.data.server.enums.StoreType;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -16,6 +17,7 @@ import java.util.Map;
 @ConfigurationProperties(prefix = "spring.monitor-server")
 public class MonitorProperties {
 
+    private Integer transferPort = MonitorDataConstants.DEFAULT_PORT;
 
     private StoreType storeType;
     /**
@@ -40,6 +42,14 @@ public class MonitorProperties {
         this.storeType = storeType;
     }
 
+    public Integer getTransferPort() {
+        return transferPort;
+    }
+
+    public void setTransferPort(Integer transferPort) {
+        this.transferPort = transferPort;
+    }
+
     public static class StoreInfo {
 
         /**

+ 7 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertPlatformController.java

@@ -27,8 +27,6 @@ import java.util.List;
 @RequestMapping(value = "/alert/platform")
 public class AlertPlatformController extends BaseSimpleCrudController<AlertPlatformConfig> {
 
-    @Autowired
-    private IAlertPlatformProcess alertPlatformProcess;
     public final static String PREFIX_URL = "/alert/platform";
     public final static String LIST_URL = PREFIX_URL + "/pageList";
     public final static String ADD_URL = PREFIX_URL + "/add";
@@ -36,6 +34,9 @@ public class AlertPlatformController extends BaseSimpleCrudController<AlertPlatf
     public final static String DEL_URL = PREFIX_URL + "/del";
     public final static String TYPE_LIST_URL = PREFIX_URL + "/typeList";
 
+    @Autowired
+    private IAlertPlatformProcess alertPlatformProcess;
+
     @Override
     public ISimpleCrudProcess getCrudProcess() {
         return alertPlatformProcess;
@@ -62,4 +63,8 @@ public class AlertPlatformController extends BaseSimpleCrudController<AlertPlatf
         return alertPlatformProcess.queryList(config);
     }
 
+    @Override
+    protected void addBefore(AlertPlatformConfig req) {
+
+    }
 }

+ 24 - 4
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/AlertRuleController.java

@@ -3,7 +3,7 @@ package com.jay.monitor.data.server.controllers;//package com.jay.monitor.data.s
 import com.jay.monitor.data.core.model.response.PageResponseModel;
 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.store.IAlertPlatformProcess;
+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;
 import org.springframework.beans.BeanUtils;
@@ -35,13 +35,12 @@ public class AlertRuleController extends BaseSimpleCrudController<AlertRuleConfi
 
     @Autowired
     private IAlertRuleProcess alertRuleProcess;
-
     @Autowired
-    private IAlertPlatformProcess alertPlatformProcess;
+    private ExpressionValueCondition expressionValueCondition;
 
     @Override
     public ISimpleCrudProcess getCrudProcess() {
-        return alertPlatformProcess;
+        return alertRuleProcess;
     }
 
     @RequestMapping(value = "/pageList", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
@@ -55,4 +54,25 @@ public class AlertRuleController extends BaseSimpleCrudController<AlertRuleConfi
         return pageResponseModel;
     }
 
+    @Override
+    protected void addBefore(AlertRuleConfig req) {
+        checkExpression(req);
+    }
+
+    @Override
+    protected void updateBefore(AlertRuleConfig req) {
+        checkExpression(req);
+    }
+
+    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表达式解析有误!");
+//            }
+//        }
+    }
 }

+ 15 - 3
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/controllers/BaseSimpleCrudController.java

@@ -1,5 +1,6 @@
 package com.jay.monitor.data.server.controllers;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.jay.monitor.data.core.model.response.ResponseCommonModel;
 import com.jay.monitor.data.core.utils.ResponseUtils;
 import com.jay.monitor.data.server.store.ISimpleCrudProcess;
@@ -19,7 +20,7 @@ public abstract class BaseSimpleCrudController<T> {
 
     @RequestMapping(value = "/add", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
     @ResponseBody
-    public ResponseCommonModel ruleAdd(@RequestBody T request) throws Exception {
+    public ResponseCommonModel addMapping(@RequestBody T request) throws Exception {
         addBefore(request);
         boolean save = getCrudProcess().save(request);
         return ResponseUtils.trues();
@@ -31,18 +32,29 @@ public abstract class BaseSimpleCrudController<T> {
      * @param req
      */
     protected void addBefore(T req) {
-
     }
 
     protected void updateBefore(T req) {
 
     }
 
+    protected void deleteBefore(T req) {
+    }
+
     @RequestMapping(value = "/update", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
     @ResponseBody
-    public ResponseCommonModel ruleUpdate(@RequestBody T request) throws Exception {
+    public ResponseCommonModel updateMapping(@RequestBody T request) throws Exception {
         updateBefore(request);
         boolean update = getCrudProcess().update(request);
         return ResponseUtils.trues();
     }
+
+    @RequestMapping(value = "/del", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")
+    @ResponseBody
+    public ResponseCommonModel delMapping(@RequestBody T request) throws Exception {
+        deleteBefore(request);
+        Object id = BeanUtil.getFieldValue(request, "id");
+        boolean update = getCrudProcess().delete(id.toString());
+        return ResponseUtils.trues();
+    }
 }

+ 1 - 1
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/factory/thread/DefaultThreadFactory.java

@@ -3,7 +3,7 @@ package com.jay.monitor.data.server.factory.thread;
 import java.util.concurrent.CompletableFuture;
 
 /**
- * @Module TODO
+ * @Module 线程工厂
  * @Description TODO
  * @Author liukaixiong
  * @Date 2020/11/27 14:57

+ 3 - 4
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/entity/es/AlertPlatformConfigIndex.java

@@ -5,7 +5,6 @@ import org.zxp.esclientrhl.annotation.ESID;
 import org.zxp.esclientrhl.annotation.ESMetaData;
 
 import java.util.Date;
-import java.util.Map;
 
 /**
  * 告警类型配置 平台
@@ -38,7 +37,7 @@ public class AlertPlatformConfigIndex {
     /**
      * 拓展参数
      */
-    private Map<String, String> extJson;
+    private String extJson;
 
     /**
      * 状态
@@ -125,11 +124,11 @@ public class AlertPlatformConfigIndex {
         this.url = url;
     }
 
-    public Map<String, String> getExtJson() {
+    public String getExtJson() {
         return extJson;
     }
 
-    public void setExtJson(Map<String, String> extJson) {
+    public void setExtJson(String extJson) {
         this.extJson = extJson;
     }
 }

+ 8 - 6
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/entity/es/AlertRuleConfigIndex.java

@@ -1,10 +1,12 @@
 package com.jay.monitor.data.server.models.entity.es;
 
 import com.jay.monitor.data.server.enums.MatchRuleEnums;
+import com.jay.monitor.data.server.models.store.AlertPlatformNode;
 import org.zxp.esclientrhl.annotation.ESID;
 import org.zxp.esclientrhl.annotation.ESMetaData;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author liukaixiong
@@ -42,9 +44,9 @@ public class AlertRuleConfigIndex {
     private MatchRuleEnums ruleType;
 
     /**
-     * 告警编号
+     * 子告警组
      */
-    private String alertPlatformId;
+    private List<AlertPlatformNode> alertPlatformList;
 
     /**
      * 状态
@@ -99,12 +101,12 @@ public class AlertRuleConfigIndex {
         this.updated = updated;
     }
 
-    public String getAlertPlatformId() {
-        return alertPlatformId;
+    public List<AlertPlatformNode> getAlertPlatformList() {
+        return alertPlatformList;
     }
 
-    public void setAlertPlatformId(String alertPlatformId) {
-        this.alertPlatformId = alertPlatformId;
+    public void setAlertPlatformList(List<AlertPlatformNode> alertPlatformList) {
+        this.alertPlatformList = alertPlatformList;
     }
 
     public MatchRuleEnums getRuleType() {

+ 3 - 4
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/store/AlertPlatformConfig.java

@@ -4,7 +4,6 @@ import com.jay.monitor.data.server.enums.AlertMsgEnums;
 import org.zxp.esclientrhl.annotation.ESMetaData;
 
 import java.util.Date;
-import java.util.Map;
 
 /**
  * 告警类型配置 平台
@@ -36,7 +35,7 @@ public class AlertPlatformConfig {
     /**
      * 拓展参数
      */
-    private Map<String, String> extJson;
+    private String extJson;
 
     private String remark;
 
@@ -133,11 +132,11 @@ public class AlertPlatformConfig {
         this.url = url;
     }
 
-    public Map<String, String> getExtJson() {
+    public String getExtJson() {
         return extJson;
     }
 
-    public void setExtJson(Map<String, String> extJson) {
+    public void setExtJson(String extJson) {
         this.extJson = extJson;
     }
 }

+ 32 - 0
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/store/AlertPlatformNode.java

@@ -0,0 +1,32 @@
+package com.jay.monitor.data.server.models.store;
+
+import com.jay.monitor.data.server.enums.AlertMsgEnums;
+
+/**
+ *
+ * @author liukaixiong
+ * @Email liukx@elab-plus.com
+ * @date 2021/9/16 - 17:08
+ */
+public class AlertPlatformNode {
+
+    private AlertMsgEnums platformType;
+
+    private String alertPlatformId;
+
+    public AlertMsgEnums getPlatformType() {
+        return platformType;
+    }
+
+    public void setPlatformType(AlertMsgEnums platformType) {
+        this.platformType = platformType;
+    }
+
+    public String getAlertPlatformId() {
+        return alertPlatformId;
+    }
+
+    public void setAlertPlatformId(String alertPlatformId) {
+        this.alertPlatformId = alertPlatformId;
+    }
+}

+ 6 - 5
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/models/store/AlertRuleConfig.java

@@ -3,6 +3,7 @@ package com.jay.monitor.data.server.models.store;
 import com.jay.monitor.data.server.enums.MatchRuleEnums;
 
 import java.util.Date;
+import java.util.List;
 
 /**
  * @author liukaixiong
@@ -40,7 +41,7 @@ public class AlertRuleConfig {
     /**
      * 告警编号
      */
-    private String alertPlatformId;
+    private List<AlertPlatformNode> alertPlatformList;
 
     /**
      * 状态
@@ -95,12 +96,12 @@ public class AlertRuleConfig {
         this.updated = updated;
     }
 
-    public String getAlertPlatformId() {
-        return alertPlatformId;
+    public List<AlertPlatformNode> getAlertPlatformList() {
+        return alertPlatformList;
     }
 
-    public void setAlertPlatformId(String alertPlatformId) {
-        this.alertPlatformId = alertPlatformId;
+    public void setAlertPlatformList(List<AlertPlatformNode> alertPlatformList) {
+        this.alertPlatformList = alertPlatformList;
     }
 
     public MatchRuleEnums getRuleType() {

+ 26 - 21
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/AlertSendProcess.java

@@ -7,6 +7,7 @@ import com.jay.monitor.data.server.factory.AbstractThreadProcess;
 import com.jay.monitor.data.server.models.dto.alert.AlertDto;
 import com.jay.monitor.data.server.models.dto.alert.RealTimeAlert;
 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 org.slf4j.Logger;
@@ -46,36 +47,40 @@ public class AlertSendProcess extends AbstractThreadProcess<AlertDto> implements
         // 查出规则
         AlertRuleConfig alertRuleConfig = ruleCacheFactory.getCacheRuleId(ruleId);
 
-        String alertPlatformId = alertRuleConfig.getAlertPlatformId();
+        List<AlertPlatformNode> alertPlatformList = alertRuleConfig.getAlertPlatformList();
 
-        AlertPlatformConfig cacheAlertPlatform = ruleCacheFactory.getCacheAlertPlatform(alertPlatformId);
+        // AlertPlatformConfig cacheAlertPlatform = ruleCacheFactory.getCacheAlertPlatform(alertPlatformId);
+        for (int i = 0; i < alertPlatformList.size(); i++) {
+            AlertPlatformNode alertPlatformNode = alertPlatformList.get(i);
 
-        AlertMsgEnums platformType = cacheAlertPlatform.getPlatformType();
+            String alertPlatformId = alertPlatformNode.getAlertPlatformId();
+            AlertMsgEnums platformType = alertPlatformNode.getPlatformType();
 
-        AlertRealTimeMsg alertRealTimeMsg =
-            GroupFactory.getINSTANCE().getObject(prefix_alert, platformType.name(), AlertRealTimeMsg.class);
+            AlertPlatformConfig cacheAlertPlatform = ruleCacheFactory.getCacheAlertPlatform(alertPlatformId);
+            AlertRealTimeMsg alertRealTimeMsg =
+                GroupFactory.getINSTANCE().getObject(prefix_alert, platformType.name(), AlertRealTimeMsg.class);
 
-        // 关键告警原因
-        String title = alertRuleConfig.getTitle();
-        String fieldName = alertRuleConfig.getFieldName();
-        String fieldValue = alertRuleConfig.getFieldValue();
+            // 关键告警原因
+            String title = alertRuleConfig.getTitle();
+            String fieldName = alertRuleConfig.getFieldName();
+            String fieldValue = alertRuleConfig.getFieldValue();
 
-        realTimeAlert.setTitle(title);
+            realTimeAlert.setTitle(title);
 
-        Map<String, Object> extMap = new LinkedHashMap<>();
-        extMap.put(fieldName, fieldValue);
-        extMap.put("规则", alertRuleConfig.getRuleName());
+            Map<String, Object> extMap = new LinkedHashMap<>();
+            extMap.put(fieldName, fieldValue);
+            extMap.put("规则", alertRuleConfig.getRuleName());
 
-        realTimeAlert.setExtMap(extMap);
-        realTimeAlert.setUniqueMark(alertRuleConfig.getId());
+            realTimeAlert.setExtMap(extMap);
+            realTimeAlert.setUniqueMark(alertRuleConfig.getId());
 
-        if (!alertRealTimeMsg.isSkipAlert(realTimeAlert)) {
-            logger.debug("[[[[[[[[触发告警]]]]]]]]");
-            alertRealTimeMsg.send(AlertRuleEnums.CONFIG_RULE, cacheAlertPlatform, realTimeAlert);
-        } else {
-            logger.debug("该项目处于告警休眠期,不告警。");
+            if (!alertRealTimeMsg.isSkipAlert(realTimeAlert)) {
+                logger.debug("[[[[[[[[触发告警]]]]]]]]");
+                alertRealTimeMsg.send(AlertRuleEnums.CONFIG_RULE, cacheAlertPlatform, realTimeAlert);
+            } else {
+                logger.debug("该项目处于告警休眠期,不告警。");
+            }
         }
-
     }
 
     @Override

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

@@ -43,52 +43,62 @@ public class ConfigAlertRule implements CommonDataTriggerRule, InitializingBean
     @Override
     public void alert(CommonDataDTO commonDataDTO) {
         try {
-            // 查找规则列表
-            List<AlertRuleConfig> alertRuleConfigList =
-                ruleCacheFactory.getCacheRuleList(commonDataDTO.getApplicationName());
 
             // 将对象转换成Map方便定位属性
             Map baseMap = BeanUtils.describe(commonDataDTO);
 
-            // 遍历规则与属性匹配是否满足
-            for (int i = 0; i < alertRuleConfigList.size(); i++) {
+            // 所有项目
+            List<AlertRuleConfig> allAlertRuleConfigList = ruleCacheFactory.getCacheRuleList("all");
 
-                AlertRuleConfig alertRuleConfig = alertRuleConfigList.get(i);
+            processRule(commonDataDTO, allAlertRuleConfigList, baseMap);
 
-                String fieldName = alertRuleConfig.getFieldName();
+            // 查找具体项目规则列表
+            List<AlertRuleConfig> projectRuleConfigList =
+                ruleCacheFactory.getCacheRuleList(commonDataDTO.getApplicationName());
 
-                Object value = baseMap.get(fieldName);
+            // 执行规则匹配
+            processRule(commonDataDTO, projectRuleConfigList, baseMap);
+        } catch (Exception e) {
+            logger.error("配置告警异常", e);
+        }
+    }
 
-                if (fieldName.equals("all") || fieldName.equals(MatchRuleEnums.expression.name())) {
-                    value = commonDataDTO;
-                }
+    private void processRule(CommonDataDTO commonDataDTO, List<AlertRuleConfig> alertRuleConfigList, Map baseMap) {
+        // 遍历规则与属性匹配是否满足
+        for (int i = 0; i < alertRuleConfigList.size(); i++) {
 
-                if (value != null) {
+            AlertRuleConfig alertRuleConfig = alertRuleConfigList.get(i);
 
-                    MatchRuleEnums ruleType = alertRuleConfig.getRuleType();
+            String fieldName = alertRuleConfig.getFieldName();
+            MatchRuleEnums ruleType = alertRuleConfig.getRuleType();
 
-                    String fieldValue = alertRuleConfig.getFieldValue();
+            Object value = baseMap.get(fieldName);
 
-                    MatchValueCondition matchValueCondition =
-                        GroupFactory.getINSTANCE().getObject(prefixCache, ruleType.name(), MatchValueCondition.class);
+            if (fieldName.equals("all") || MatchRuleEnums.expression == ruleType) {
+                value = commonDataDTO;
+            }
+
+            if (value != null) {
+
+                String fieldValue = alertRuleConfig.getFieldValue();
 
-                    boolean match = matchValueCondition.match(value, fieldValue);
+                MatchValueCondition matchValueCondition =
+                    GroupFactory.getINSTANCE().getObject(prefixCache, ruleType.name(), MatchValueCondition.class);
 
-                    // 符合告警规则
-                    if (match) {
+                boolean match = matchValueCondition.match(value, fieldValue);
 
-                        RealTimeAlert realTimeAlert = new RealTimeAlert();
+                // 符合告警规则
+                if (match) {
 
-                        org.springframework.beans.BeanUtils.copyProperties(commonDataDTO, realTimeAlert);
+                    RealTimeAlert realTimeAlert = new RealTimeAlert();
 
-                        AlertDto alertDto = new AlertDto(alertRuleConfig.getId(), realTimeAlert);
+                    org.springframework.beans.BeanUtils.copyProperties(commonDataDTO, realTimeAlert);
 
-                        alertSendProcess.send(alertDto);
-                    }
+                    AlertDto alertDto = new AlertDto(alertRuleConfig.getId(), realTimeAlert);
+
+                    alertSendProcess.send(alertDto);
                 }
             }
-        } catch (Exception e) {
-            logger.error("配置告警异常", e);
         }
     }
 

+ 44 - 8
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/report/alert/rule/config/ExpressionValueCondition.java

@@ -2,28 +2,64 @@ package com.jay.monitor.data.server.report.alert.rule.config;
 
 import com.jay.monitor.data.server.enums.MatchRuleEnums;
 import com.jay.monitor.data.server.report.alert.rule.MatchValueCondition;
+import org.springframework.context.expression.MapAccessor;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.ParserContext;
+import org.springframework.expression.PropertyAccessor;
+import org.springframework.expression.common.TemplateParserContext;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.ReflectivePropertyAccessor;
+import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
+ * 支持Spring的Expression表达式
+ * <p>
+ * 具体的使用方式可以参考:
+ * - 表达式语法 : {@link 'org.springframework.expression.spel.standard.TokenKind'}
+ *
  * @author liukaixiong
  * @Email liukx@elab-plus.com
  * @date 2021/9/8 - 14:07
  */
+@Component
 public class ExpressionValueCondition implements MatchValueCondition {
 
+    private final ExpressionParser PARSER = new SpelExpressionParser();
+
+    private final StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
+
+    private final ParserContext templateParserContext = new TemplateParserContext("${", "}");
+
+    private List<PropertyAccessor> propertyAccessors;
+
+    public ExpressionValueCondition() {
+        this.propertyAccessors = new ArrayList<>();
+        propertyAccessors.add(new ReflectivePropertyAccessor());
+        propertyAccessors.add(new MapAccessor());
+        standardEvaluationContext.setPropertyAccessors(propertyAccessors);
+    }
+
+    public void setPropertyAccessors(List<PropertyAccessor> propertyAccessors) {
+        this.propertyAccessors = propertyAccessors;
+    }
+
     @Override
     public MatchRuleEnums matchRule() {
         return MatchRuleEnums.expression;
     }
 
+    public Expression getExpression(String matchValue) {
+        return PARSER.parseExpression(matchValue, templateParserContext);
+    }
+
     @Override
     public boolean match(Object value, String matchValue) {
-
-        try {
-            throw new Exception("还未实现");
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return false;
+        Expression expression = PARSER.parseExpression(matchValue, templateParserContext);
+        return expression.getValue(standardEvaluationContext, value, Boolean.class);
     }
 }

+ 3 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/ISimpleCrudProcess.java

@@ -18,6 +18,7 @@ public interface ISimpleCrudProcess<T> {
 
     public T queryById(String id);
 
-    public PageResponseModel<T> searchDataByList(Integer pageNo, Integer pageSize, T query)
-        throws Exception;
+    public boolean delete(String id);
+
+    public PageResponseModel<T> searchDataByList(Integer pageNo, Integer pageSize, T query) throws Exception;
 }

+ 17 - 2
jay-monitor-data-server/src/main/java/com/jay/monitor/data/server/store/es/AbstractCRUDElasticSearch.java

@@ -1,5 +1,6 @@
 package com.jay.monitor.data.server.store.es;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.jay.monitor.data.core.model.response.PageResponseModel;
 import com.jay.monitor.data.server.componts.ElasticSearchPartition;
 import com.jay.monitor.data.server.utils.ESUtils;
@@ -17,6 +18,7 @@ import org.zxp.esclientrhl.util.MetaData;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -51,6 +53,10 @@ public abstract class AbstractCRUDElasticSearch<ENTITY, REQ> {
     public boolean save(REQ req) {
         try {
             ENTITY entity = convertEntity(req);
+            // 初始化值
+            BeanUtil.setFieldValue(entity, "createDate", new Date());
+            BeanUtil.setFieldValue(entity, "id", null);
+
             return elasticSearchPartition.save(entity);
         } catch (Exception e) {
             logger.error("es 保存失败", e);
@@ -58,9 +64,19 @@ public abstract class AbstractCRUDElasticSearch<ENTITY, REQ> {
         return false;
     }
 
+    public boolean delete(String id) {
+        try {
+            return elasticSearchPartition.deleteById(id, getEntityClazz());
+        } catch (Exception e) {
+            e.printStackTrace();
+        } return false;
+    }
+
     public boolean update(REQ req) {
         try {
             ENTITY entity = convertEntity(req);
+            // 初始化值
+            BeanUtil.setFieldValue(entity, "updated", new Date());
             return elasticSearchPartition.update(entity);
         } catch (Exception e) {
             logger.error("es 修改失败", e);
@@ -108,8 +124,7 @@ public abstract class AbstractCRUDElasticSearch<ENTITY, REQ> {
         return list;
     }
 
-    public PageResponseModel<REQ> searchDataByList(Integer pageNo, Integer pageSize, REQ query)
-        throws Exception {
+    public PageResponseModel<REQ> searchDataByList(Integer pageNo, Integer pageSize, REQ query) throws Exception {
         ENTITY entity = convertEntity(query);
         MetaData metaData = IndexTools.getIndexType(getEntityClazz());
         PageList pageList = elasticSearchPartition

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

@@ -50,7 +50,7 @@ spring:
 #  level:
 #    com.jay.monitor.data.server: debug
 elasticsearch:
-  host: 101.133.210.230:9200
+  host: 172.19.189.149:9200
   enable-env-prefix: true
   max_connect_total: 30
   max_connect_per_route: 30

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


+ 96 - 0
jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/report/alert/rule/config/ExpressionValueConditionTest.java

@@ -0,0 +1,96 @@
+package com.jay.monitor.data.server.report.alert.rule.config;
+
+import com.jay.monitor.data.core.enums.MsgTypeEnums;
+import com.jay.monitor.data.core.model.serializable.MQDataDTO;
+import com.jay.monitor.data.core.model.serializable.SQLMonitorDTO;
+import com.jay.monitor.data.core.model.serializable.URLDataDTO;
+import com.jay.monitor.data.core.model.serializable.base.CommonDataDTO;
+import org.junit.Test;
+import org.springframework.expression.Expression;
+import org.springframework.expression.spel.SpelNode;
+import org.springframework.expression.spel.ast.PropertyOrFieldReference;
+import org.springframework.expression.spel.standard.SpelExpression;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.function.Consumer;
+
+public class ExpressionValueConditionTest {
+    private ExpressionValueCondition condition = new ExpressionValueCondition();
+
+    @Test
+    public void commonTest() {
+        String conditionString = "${applicationName == 'elab-markeing-gateway' && status == -1 || requestTime > 5000}";
+
+        CommonDataDTO commonDataDTO = new CommonDataDTO(MsgTypeEnums.MQ);
+        commonDataDTO.setStatus(-1);
+        commonDataDTO.setApplicationName("elab-markeing-gateway");
+        boolean match = condition.match(commonDataDTO, conditionString);
+        System.out.println(match);
+    }
+
+    @Test
+    public void test() {
+        Map<String, Object> propSet = new HashMap();
+        printClazz(MQDataDTO.class, true, (filed) -> {
+            propSet.put(filed.getName(), null);
+        });
+        printClazz(SQLMonitorDTO.class, true, (filed) -> {
+            propSet.put(filed.getName(), null);
+        });
+        printClazz(URLDataDTO.class, true, (filed) -> {
+            propSet.put(filed.getName(), null);
+        });
+        String conditionString =
+            "${applicationName == 'elab-markeing-gateway' && status == -1 || requestTime > 5000}";
+
+        Expression expression = condition.getExpression(conditionString);
+        //        SpelExpressionParser PARSER = new SpelExpressionParser();
+
+        int index = 0;
+        Map<String, Class> inputMap = new HashMap<>();
+        SpelNode ast = ((SpelExpression)expression).getAST();
+        checkExpression(ast, inputMap);
+        System.out.println(inputMap);
+        boolean match = condition.match(propSet, conditionString);
+        System.out.println(match);
+    }
+
+    private void checkExpression(SpelNode node, Map<String, Class> inputMap) {
+        if (node instanceof PropertyOrFieldReference) {
+            String name = ((PropertyOrFieldReference)node).getName();
+            System.out.println(name);
+            inputMap.put(name, null);
+        } else {
+            try {
+                SpelNode leftChild = node.getChild(0);
+                checkExpression(leftChild, inputMap);
+                SpelNode rightChild = node.getChild(1);
+                checkExpression(rightChild, inputMap);
+            } catch (Exception e) {
+                // 查询不到值了.
+            }
+        }
+    }
+
+    private void printClazz(Class clazz, boolean isFindSuper, Consumer<Field> consumer) {
+
+        if (isFindSuper && clazz.getSuperclass() != null) {
+            printClazz(clazz.getSuperclass(), true, consumer);
+        }
+
+        Field[] declaredFields = clazz.getDeclaredFields();
+        Map<String, String> fieldMap = new LinkedHashMap<>();
+        for (int i = 0; i < declaredFields.length; i++) {
+            Field declaredField = declaredFields[i];
+            String name = declaredField.getName();
+            Class<?> type = declaredField.getType();
+            fieldMap.put(name, type.getSimpleName());
+            consumer.accept(declaredField);
+        }
+
+        fieldMap.forEach((K, V) -> {
+            System.out.println(clazz.getSimpleName() + "\t" + K + "\t" + V);
+        });
+    }
+}

+ 0 - 1
jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/store/es/ElasticAlertRuleProcessTest.java

@@ -39,7 +39,6 @@ public class ElasticAlertRuleProcessTest extends SpringRunCase {
         String platformId = "KFpExHsBIcT-h3qq6woY";
 
         AlertRuleConfig alertRuleConfig = elasticAlertRuleProcess.queryById("J1o6xHsBIcT-h3qqYQrt");
-        alertRuleConfig.setAlertPlatformId(platformId);
         alertRuleConfig.setCreateDate(new Date());
         alertRuleConfig.setProject("elab-marketing-notify");
 

+ 46 - 0
jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/utils/ClassFieldPrintCase.java

@@ -0,0 +1,46 @@
+package com.jay.monitor.data.server.utils;
+
+import com.jay.monitor.data.core.model.serializable.MQDataDTO;
+import com.jay.monitor.data.core.model.serializable.SQLMonitorDTO;
+import com.jay.monitor.data.core.model.serializable.URLDataDTO;
+import org.junit.Test;
+
+import java.lang.reflect.Field;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author liukaixiong
+ * @Email liukx@elab-plus.com
+ * @date 2021/9/17 - 10:55
+ */
+public class ClassFieldPrintCase {
+
+    @Test
+    public void printTest() {
+        printClazz(MQDataDTO.class, true);
+        printClazz(SQLMonitorDTO.class, false);
+        printClazz(URLDataDTO.class, false);
+    }
+
+    private void printClazz(Class clazz, boolean isFindSuper) {
+
+        if (isFindSuper && clazz.getSuperclass() != null) {
+            printClazz(clazz.getSuperclass(), true);
+        }
+
+        Field[] declaredFields = clazz.getDeclaredFields();
+        Map<String, String> fieldMap = new LinkedHashMap<>();
+        for (int i = 0; i < declaredFields.length; i++) {
+            Field declaredField = declaredFields[i];
+            String name = declaredField.getName();
+            Class<?> type = declaredField.getType();
+            fieldMap.put(name, type.getSimpleName());
+        }
+
+        fieldMap.forEach((K, V) -> {
+            System.out.println(clazz.getSimpleName() + "\t" + K + "\t" + V);
+        });
+    }
+
+}

+ 83 - 7
jay-monitor-data-server/src/test/java/com/jay/monitor/data/server/utils/ExpressionUtilsTest.java

@@ -1,30 +1,106 @@
 package com.jay.monitor.data.server.utils;
 
+import com.jay.monitor.data.server.models.request.login.LoginRequest;
 import org.junit.Test;
-import org.springframework.expression.EvaluationContext;
+import org.springframework.context.expression.MapAccessor;
+import org.springframework.expression.Expression;
 import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.PropertyAccessor;
 import org.springframework.expression.common.TemplateParserContext;
 import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.expression.spel.support.ReflectivePropertyAccessor;
 import org.springframework.expression.spel.support.StandardEvaluationContext;
 
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 public class ExpressionUtilsTest {
+    private TemplateParserContext templateParserContext = new TemplateParserContext("${", "}");
 
     @Test
     public void test1() {
-        ExpressionParser parser = new SpelExpressionParser();
-        EvaluationContext ctx = new StandardEvaluationContext();
+
+        StandardEvaluationContext ctx = new StandardEvaluationContext();
+
+        List<PropertyAccessor> propertyAccessors = new ArrayList<>();
+        propertyAccessors.add(new ReflectivePropertyAccessor());
+        propertyAccessors.add(new MapAccessor());
+
+        ctx.setPropertyAccessors(propertyAccessors);
         Map<String, Object> variableMap = new HashMap<>();
+
+        LoginRequest loginRequest = new LoginRequest();
+        loginRequest.setUsername("lkx");
+        loginRequest.setPassword("123456");
+
         variableMap.put("name", "某某某");
         variableMap.put("sex", "男");
         variableMap.put("like", "jay");
 
-        ctx.setVariable("obj", variableMap);
-        Object value = parser.parseExpression("#{obj.name}",new TemplateParserContext()).getValue(ctx);
+        Map<String, Object> vMap = new HashMap<>();
+        vMap.put("obj", variableMap);
+        vMap.put("login", loginRequest);
+        // 设置
+        ctx.setRootObject(vMap);
+        //        ctx.setVariables(variableMap);
+        //                ctx.setVariable("obj", variableMap);
+        //        ctx.setVariable("login", loginRequest);
+
+        ExpressionParser parser = new SpelExpressionParser();
+        //        Expression expression = parser.parseExpression("#obj");
+        //        printLog(ctx, expression);
+
+        Expression expression =
+            parser.parseExpression("${login.username == 'lkx' && login.password == '123456'}", templateParserContext);
+        String content = expression.getValue(ctx, String.class);
+        System.out.println(content);
+    }
+
+    @Test
+    public void testExpressionMap() {
+//        standExpression("${login.username == 'lkx' && login.password == '123456'}");
+//        standExpression("${obj.age == 16}");
+//        standExpression("${obj.age < 18}");
+        standExpression("${obj.age + 10 * 10}");
+    }
+
+    private void standExpression(String expressionStr) {
+        StandardEvaluationContext ctx = new StandardEvaluationContext();
+
+        List<PropertyAccessor> propertyAccessors = new ArrayList<>();
+        propertyAccessors.add(new ReflectivePropertyAccessor());
+        propertyAccessors.add(new MapAccessor());
+
+        ctx.setPropertyAccessors(propertyAccessors);
+
+        Map<String, Object> defaultValue = getDefaultValue();
+
+        ExpressionParser parser = new SpelExpressionParser();
+        Expression expression = parser.parseExpression(expressionStr, templateParserContext);
+        Object value = expression.getValue(ctx, defaultValue);
         System.out.println(value);
+    }
+
+    private Map<String, Object> getDefaultValue() {
+        LoginRequest loginRequest = new LoginRequest();
+        loginRequest.setUsername("lkx");
+        loginRequest.setPassword("123456");
+
+        Map<String, Object> variableMap = new HashMap<>();
+        variableMap.put("name", "某某某");
+        variableMap.put("sex", "男");
+        variableMap.put("like", "jay");
+        variableMap.put("age", 16);
+        variableMap.put("testList", Arrays.asList(10, 20, 30, 40, 50));
+
+        Map<String, Object> vMap = new HashMap<>();
+        vMap.put("obj", variableMap);
+        vMap.put("login", loginRequest);
+        return vMap;
+    }
 
+    private void printLog(StandardEvaluationContext ctx, Expression loginExpression) {
+        Object value1 = loginExpression.getValue(ctx);
+        System.out.println(value1);
     }
 
 }

+ 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
+    transfer-port: 9421
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     driver-class-name: com.mysql.jdbc.Driver