Browse Source

告警和事件修改,并模拟数据

wukai 8 months ago
parent
commit
6cb6773586
24 changed files with 1731 additions and 220 deletions
  1. 85 85
      jjt-admin/pom.xml
  2. 2 0
      jjt-admin/src/main/java/com/jjt/JjtApplication.java
  3. 187 0
      jjt-admin/src/main/resources/application-prod.yml
  4. 80 0
      jjt-admin/src/test/java/com/test/DataTest.java
  5. 86 0
      jjt-admin/src/test/java/com/test/ModelAlarmConfigTest.java
  6. 2 2
      jjt-biz/src/main/java/com/jjt/biz/controller/IndexController.java
  7. 3 0
      jjt-biz/src/main/java/com/jjt/biz/controller/MetricsTplDetailController.java
  8. 2 0
      jjt-biz/src/main/java/com/jjt/biz/domain/BizObjMetrics.java
  9. 22 0
      jjt-biz/src/main/java/com/jjt/biz/service/IAlarmRecordService.java
  10. 14 2
      jjt-biz/src/main/java/com/jjt/biz/service/IBizObjMetricsService.java
  11. 116 0
      jjt-biz/src/main/java/com/jjt/biz/service/impl/AlarmRecordServiceImpl.java
  12. 5 6
      jjt-biz/src/main/java/com/jjt/biz/service/impl/BizObjMetricsDataServiceImpl.java
  13. 195 88
      jjt-biz/src/main/java/com/jjt/biz/service/impl/BizObjMetricsServiceImpl.java
  14. 114 0
      jjt-biz/src/main/java/com/jjt/hl/controller/HlEventController.java
  15. 72 0
      jjt-biz/src/main/java/com/jjt/hl/domain/HlEvent.java
  16. 62 0
      jjt-biz/src/main/java/com/jjt/hl/mapper/HlEventMapper.java
  17. 82 0
      jjt-biz/src/main/java/com/jjt/hl/service/IHlEventService.java
  18. 185 0
      jjt-biz/src/main/java/com/jjt/hl/service/impl/HlEventServiceImpl.java
  19. 19 33
      jjt-biz/src/main/java/com/jjt/risk/controller/RiskMsConfigController.java
  20. 151 0
      jjt-biz/src/main/java/com/jjt/risk/controller/RiskOtherController.java
  21. 7 4
      jjt-biz/src/main/java/com/jjt/task/AlarmTask.java
  22. 43 0
      jjt-biz/src/main/java/com/jjt/task/DataTask.java
  23. 188 0
      jjt-biz/src/main/resources/mapper/hl/HlEventMapper.xml
  24. 9 0
      jjt-biz/src/main/resources/mapper/obj/BizObjMetricsMapper.xml

+ 85 - 85
jjt-admin/pom.xml

@@ -76,13 +76,78 @@
 
     <build>
         <plugins>
+<!--            <plugin>-->
+<!--                <groupId>org.springframework.boot</groupId>-->
+<!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
+<!--                <version>2.5.15</version>-->
+<!--                <configuration>-->
+<!--                    <fork>true</fork> &lt;!&ndash; 如果没有该配置,devtools不会生效 &ndash;&gt;-->
+<!--                </configuration>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <goals>-->
+<!--                            <goal>repackage</goal>-->
+<!--                        </goals>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--            </plugin>-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-war-plugin</artifactId>
+                <version>3.1.0</version>
+                <configuration>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <warName>${project.artifactId}</warName>
+                </configuration>
+            </plugin>
+
+            <!--下面这段是分离打包-->
+
             <plugin>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <version>2.5.15</version>
                 <configuration>
                     <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
+                    <executable>true</executable>
+                    <layout>ZIP</layout>
+                    <!--这里是填写需要包含进去的jar,
+                         必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来
+                         如果没有则nothing ,表示不打包依赖 -->
+                    <includes>
+                        <!-- 定时任务-->
+                        <include>
+                            <groupId>com.jjt</groupId>
+                            <artifactId>jjt-quartz</artifactId>
+                        </include>
+                        <!-- 代码生成-->
+                        <include>
+                            <groupId>com.jjt</groupId>
+                            <artifactId>jjt-generator</artifactId>
+                        </include>
+                        <!-- 核心模块-->
+                        <include>
+                            <groupId>com.jjt</groupId>
+                            <artifactId>jjt-framework</artifactId>
+                        </include>
+                        <!-- 系统模块-->
+                        <include>
+                            <groupId>com.jjt</groupId>
+                            <artifactId>jjt-system</artifactId>
+                        </include>
+                        <!-- 通用工具-->
+                        <include>
+                            <groupId>com.jjt</groupId>
+                            <artifactId>jjt-common</artifactId>
+                        </include>
+                        <!-- 业务模块-->
+                        <include>
+                            <groupId>com.jjt</groupId>
+                            <artifactId>jjt-biz</artifactId>
+                        </include>
+                    </includes>
                 </configuration>
+
                 <executions>
                     <execution>
                         <goals>
@@ -90,95 +155,30 @@
                         </goals>
                     </execution>
                 </executions>
+
             </plugin>
+
+            <!--拷贝依赖到jar外面的lib目录-->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-                <version>3.1.0</version>
-                <configuration>
-                    <failOnMissingWebXml>false</failOnMissingWebXml>
-                    <warName>${project.artifactId}</warName>
-                </configuration>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>copy</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <!--指定的依赖路径-->
+                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
+                            <!--排除的ArtifactId-->
+                            <excludeArtifactIds>jjt-framework,jjt-system,jjt-quartz,jjt-generator,jjt-common,jjt-biz
+                            </excludeArtifactIds>
+                        </configuration>
+                    </execution>
+                </executions>
             </plugin>
-
-            <!--下面这段是分离打包-->
-
-            <!--            <plugin>-->
-            <!--                <groupId>org.springframework.boot</groupId>-->
-            <!--                <artifactId>spring-boot-maven-plugin</artifactId>-->
-            <!--                <version>2.5.15</version>-->
-            <!--                <configuration>-->
-            <!--                    <fork>true</fork> &lt;!&ndash; 如果没有该配置,devtools不会生效 &ndash;&gt;-->
-            <!--                    <executable>true</executable>-->
-            <!--                    <layout>ZIP</layout>-->
-            <!--                    &lt;!&ndash;这里是填写需要包含进去的jar,-->
-            <!--                         必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来-->
-            <!--                         如果没有则nothing ,表示不打包依赖 &ndash;&gt;-->
-            <!--                    <includes>-->
-            <!--                        &lt;!&ndash; 定时任务&ndash;&gt;-->
-            <!--                        <include>-->
-            <!--                            <groupId>com.jjt</groupId>-->
-            <!--                            <artifactId>jjt-quartz</artifactId>-->
-            <!--                        </include>-->
-            <!--                        &lt;!&ndash; 代码生成&ndash;&gt;-->
-            <!--                        <include>-->
-            <!--                            <groupId>com.jjt</groupId>-->
-            <!--                            <artifactId>jjt-generator</artifactId>-->
-            <!--                        </include>-->
-            <!--                        &lt;!&ndash; 核心模块&ndash;&gt;-->
-            <!--                        <include>-->
-            <!--                            <groupId>com.jjt</groupId>-->
-            <!--                            <artifactId>jjt-framework</artifactId>-->
-            <!--                        </include>-->
-            <!--                        &lt;!&ndash; 系统模块&ndash;&gt;-->
-            <!--                        <include>-->
-            <!--                            <groupId>com.jjt</groupId>-->
-            <!--                            <artifactId>jjt-system</artifactId>-->
-            <!--                        </include>-->
-            <!--                        &lt;!&ndash; 通用工具&ndash;&gt;-->
-            <!--                        <include>-->
-            <!--                            <groupId>com.jjt</groupId>-->
-            <!--                            <artifactId>jjt-common</artifactId>-->
-            <!--                        </include>-->
-            <!--                        &lt;!&ndash; 业务模块&ndash;&gt;-->
-            <!--                        <include>-->
-            <!--                            <groupId>com.jjt</groupId>-->
-            <!--                            <artifactId>jjt-biz</artifactId>-->
-            <!--                        </include>-->
-            <!--                    </includes>-->
-            <!--                </configuration>-->
-
-            <!--                <executions>-->
-            <!--                    <execution>-->
-            <!--                        <goals>-->
-            <!--                            <goal>repackage</goal>-->
-            <!--                        </goals>-->
-            <!--                    </execution>-->
-            <!--                </executions>-->
-
-            <!--            </plugin>-->
-
-            <!--            &lt;!&ndash;拷贝依赖到jar外面的lib目录&ndash;&gt;-->
-            <!--            <plugin>-->
-            <!--                <groupId>org.apache.maven.plugins</groupId>-->
-            <!--                <artifactId>maven-dependency-plugin</artifactId>-->
-            <!--                <executions>-->
-            <!--                    <execution>-->
-            <!--                        <id>copy</id>-->
-            <!--                        <phase>package</phase>-->
-            <!--                        <goals>-->
-            <!--                            <goal>copy-dependencies</goal>-->
-            <!--                        </goals>-->
-            <!--                        <configuration>-->
-            <!--                            &lt;!&ndash;指定的依赖路径&ndash;&gt;-->
-            <!--                            <outputDirectory>${project.build.directory}/lib</outputDirectory>-->
-            <!--                            &lt;!&ndash;排除的ArtifactId&ndash;&gt;-->
-            <!--                            <excludeArtifactIds>jjt-framework,jjt-system,jjt-quartz,jjt-generator,jjt-common,jjt-biz-->
-            <!--                            </excludeArtifactIds>-->
-            <!--                        </configuration>-->
-            <!--                    </execution>-->
-            <!--                </executions>-->
-            <!--            </plugin>-->
         </plugins>
         <finalName>jy2024</finalName>
     </build>

+ 2 - 0
jjt-admin/src/main/java/com/jjt/JjtApplication.java

@@ -3,6 +3,7 @@ package com.jjt;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
 
 /**
  * 启动程序
@@ -10,6 +11,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  * @author jjt
  */
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@EnableAsync
 public class JjtApplication {
     public static void main(String[] args) {
         // System.setProperty("spring.devtools.restart.enabled", "false");

+ 187 - 0
jjt-admin/src/main/resources/application-prod.yml

@@ -0,0 +1,187 @@
+# 项目相关配置
+jjt:
+  # 名称
+  name: jjt
+  # 版本
+  version: 3.8.7
+  # 版权年份
+  copyrightYear: 2024
+  # 文件路径 示例( Windows配置D:/jjt/uploadPath,Linux配置 /home/jjt/uploadPath)
+  profile: /app/upload
+  # 获取ip地址开关
+  addressEnabled: false
+  # 验证码类型 math 数字计算 char 字符验证
+  captchaType: math
+
+# 开发环境配置
+server:
+  # 服务器的HTTP端口,默认为8080
+  port: 18081
+  servlet:
+    # 应用的访问路径
+    context-path: /
+  tomcat:
+    # tomcat的URI编码
+    uri-encoding: UTF-8
+    # 连接数满后的排队数,默认为100
+    accept-count: 1000
+    threads:
+      # tomcat最大线程数,默认为200
+      max: 800
+      # Tomcat启动初始化的线程数,默认值10
+      min-spare: 100
+
+# 日志配置
+logging:
+  level:
+    com.jjt: debug
+    org.springframework: warn
+
+# 用户配置
+user:
+  password:
+    # 密码最大错误次数
+    maxRetryCount: 5
+    # 密码锁定时间(默认10分钟)
+    lockTime: 10
+
+# Spring配置
+spring:
+  # 数据源配置
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 主库数据源
+      master:
+        url: jdbc:mysql://25.214.216.196:13306/jy2024?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
+        username: jy
+        password: ABcd@1234
+      # 从库数据源
+      slave:
+        # 从数据源开关/默认关闭
+        enabled: false
+        url:
+        username:
+        password:
+      # 初始连接数
+      initialSize: 5
+      # 最小连接池数量
+      minIdle: 10
+      # 最大连接池数量
+      maxActive: 20
+      # 配置获取连接等待超时的时间
+      maxWait: 60000
+      # 配置连接超时时间
+      connectTimeout: 30000
+      # 配置网络超时时间
+      socketTimeout: 60000
+      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+      timeBetweenEvictionRunsMillis: 60000
+      # 配置一个连接在池中最小生存的时间,单位是毫秒
+      minEvictableIdleTimeMillis: 300000
+      # 配置一个连接在池中最大生存的时间,单位是毫秒
+      maxEvictableIdleTimeMillis: 900000
+      # 配置检测连接是否有效
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 设置白名单,不填则允许所有访问
+        allow:
+        url-pattern: /druid/*
+        # 控制台管理用户名和密码
+        login-username: jjt
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 慢SQL记录
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+  # 资源信息
+  messages:
+    # 国际化资源文件路径
+    basename: i18n/messages
+  # 文件上传
+  servlet:
+    multipart:
+      # 单个文件大小
+      max-file-size: 10MB
+      # 设置总上传的文件大小
+      max-request-size: 20MB
+  # 服务模块
+  devtools:
+    restart:
+      # 热部署开关
+      enabled: true
+  # redis 配置
+  redis:
+    # 地址
+    host: 25.214.216.246
+    # 端口,默认为6379
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码
+    password: Abcd@1234
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: JJT@basic!2024.
+  # 令牌有效期(默认30分钟)
+  expireTime: 30
+
+# MyBatis Plus配置
+mybatis-plus:
+  # 搜索指定包别名
+  typeAliasesPackage: com.jjt.**.domain
+  # 配置mapper的扫描,找到所有的mapper.xml映射文件
+  mapperLocations: classpath*:mapper/**/*Mapper.xml
+  # 加载全局的配置文件
+  configLocation: classpath:mybatis/mybatis-config.xml
+
+# PageHelper分页插件
+pagehelper:
+  helperDialect: mysql
+  supportMethodsArguments: true
+  params: count=countSql
+
+# Swagger配置
+swagger:
+  # 是否开启swagger
+  enabled: true
+  # 请求前缀
+  pathMapping: /dev-api
+
+# 防止XSS攻击
+xss:
+  # 过滤开关
+  enabled: true
+  # 排除链接(多个用逗号分隔)
+  excludes: /system/notice
+  # 匹配链接
+  urlPatterns: /system/*,/monitor/*,/tool/*

+ 80 - 0
jjt-admin/src/test/java/com/test/DataTest.java

@@ -0,0 +1,80 @@
+package com.test;
+
+import com.jjt.JjtApplication;
+import com.jjt.biz.domain.BizObj;
+import com.jjt.biz.service.IBizObjMetricsService;
+import com.jjt.biz.service.IBizObjService;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ *
+ */
+@SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("test")
+public class DataTest {
+    @Resource
+    private IBizObjMetricsService metricsService;
+    @Resource
+    private IBizObjService objService;
+
+    public static void main(String[] args) {
+    }
+
+
+    @Test
+    void imitate() throws InterruptedException {
+        ExecutorService executor = Executors.newFixedThreadPool(20);
+        Date s = new Date();
+        List<BizObj> list = objService.selectBizObjList(new BizObj());
+        LocalDateTime ed = LocalDateTime.now();
+        LocalDateTime st = ed.minusDays(30);
+        do {
+            Date date = Date.from(st.atZone(ZoneId.systemDefault()).toInstant());
+            CountDownLatch latch = new CountDownLatch(list.size());
+
+            list.forEach(obj -> executor.submit(() -> {
+                metricsService.imitate(obj.getObjId(), date);
+                latch.countDown();
+            }));
+            // Wait for all threads to finish
+            latch.await();
+            st = st.plusMinutes(15);
+        } while (!st.isAfter(ed));
+        executor.shutdown();
+        Date e = new Date();
+        System.err.println(e.getTime() - s.getTime());
+
+    }
+
+    @Test
+    void single() {
+        Date s = new Date();
+        List<BizObj> list = objService.selectBizObjList(new BizObj());
+        LocalDateTime ed = LocalDateTime.now();
+        LocalDateTime st = ed.minusDays(1);
+        do {
+            Date date = Date.from(st.atZone(ZoneId.systemDefault()).toInstant());
+
+            list.forEach(obj -> {
+                metricsService.imitate(obj.getObjId(), date);
+            });
+            // Wait for all threads to finish
+            st = st.plusMinutes(15);
+        } while (!st.isAfter(ed));
+        Date e = new Date();
+        System.err.println(e.getTime() - s.getTime());
+
+    }
+
+}

+ 86 - 0
jjt-admin/src/test/java/com/test/ModelAlarmConfigTest.java

@@ -0,0 +1,86 @@
+package com.test;
+
+import com.jjt.JjtApplication;
+import com.jjt.biz.domain.AlarmRecord;
+import com.jjt.biz.domain.BizObjMetrics;
+import com.jjt.biz.domain.MetricsTplDetail;
+import com.jjt.biz.mapper.AlarmRecordMapper;
+import com.jjt.biz.mapper.MetricsTplDetailMapper;
+import com.jjt.biz.service.IAlarmRecordService;
+import com.jjt.biz.service.IBizObjMetricsService;
+import com.jjt.biz.service.IMetricsTplDetailService;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ */
+@SpringBootTest(classes = JjtApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@ActiveProfiles("test")
+public class ModelAlarmConfigTest {
+    @Resource
+    private IBizObjMetricsService objMetricsService;
+    @Resource
+    private IMetricsTplDetailService metricsTplDetailService;
+    @Resource
+    private SqlSessionFactory factory;
+
+    public static void main(String[] args) {
+        String[][] rules = {
+                {"(80,90)", "[90,95]", "(95,)", "(50,80]"},
+                {"(30,50)", "[50,75]", "(75,)", "(20,30]"},
+                {"[50,70)", "[70,85)", "[85,)", "(30,50)"},
+                {"[40,60)", "[60,85)", "[85,)", ""},
+                {"[20,30)", "[30,55)", "[55,)", "(10,20)"},
+                {"(80,90)", "[90,95]", "(95,)", "(50,80]"},
+                {"(80,85)", "[85,95]", "(95,)", "(60,80]"}
+        };
+
+        Random r = new Random();
+        int min = r.nextInt(30) + 20;
+        int max = r.nextInt(50) + 50;
+
+        System.err.println(min + "," + max);
+    }
+
+    @Test
+    void data() {
+        String[][] rules = {
+                {"(80,90)", "[90,95]", "(95,)", "(50,80]"},
+                {"(30,50)", "[50,75]", "(75,)", "(20,30]"},
+                {"[50,70)", "[70,85)", "[85,)", "(30,50)"},
+                {"[40,60)", "[60,85)", "[85,)", ""},
+                {"[20,30)", "[30,55)", "[55,)", "(10,20)"},
+                {"(80,90)", "[90,95]", "(95,)", "(50,80]"},
+                {"(80,85)", "[85,95]", "(95,)", "(60,80]"}
+        };
+        Random r = new Random();
+        List<MetricsTplDetail> list = metricsTplDetailService.selectMetricsTplDetailList(new MetricsTplDetail());
+        for (MetricsTplDetail detail : list) {
+            int d = r.nextInt(rules.length);
+            String[] data = rules[d];
+            detail.setAlarmLow(data[0]);
+            detail.setAlarmMid(data[1]);
+            detail.setAlarmHigh(data[2]);
+            detail.setEvent(data[3]);
+        }
+        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+            MetricsTplDetailMapper mapper = sqlSession.getMapper(MetricsTplDetailMapper.class);
+            list.forEach(mapper::updateMetricsTplDetail);
+            list.forEach(objMetricsService::update);
+            sqlSession.commit();
+        }
+
+
+    }
+
+}

+ 2 - 2
jjt-biz/src/main/java/com/jjt/biz/controller/IndexController.java

@@ -200,7 +200,7 @@ public class IndexController extends BaseController {
     public AjaxResult msChat(@PathVariable("objMetricsId") Long objMetricsId) {
         List<Map<String, Object>> trendList = new ArrayList<>();
         LocalDateTime ed = LocalDateTime.now();
-        LocalDateTime st = ed.minusDays(7);
+        LocalDateTime st = ed.minusDays(8);
         Random r = new Random();
         DecimalFormat df = new DecimalFormat("#0.00");
         do {
@@ -209,7 +209,7 @@ public class IndexController extends BaseController {
             map.put("time", time);
             float f = r.nextFloat() * 100;
             map.put("value", Float.parseFloat(df.format(f)));
-            st = st.plusMinutes(5);
+            st = st.plusDays(1);
             trendList.add(map);
         } while (!st.isAfter(ed));
         return AjaxResult.success(trendList);

+ 3 - 0
jjt-biz/src/main/java/com/jjt/biz/controller/MetricsTplDetailController.java

@@ -113,6 +113,9 @@ public class MetricsTplDetailController extends BaseController {
         if (metricsTplDetail.getAlarmHigh() != null) {
             metricsTplDetail.setAlarmHigh(metricsTplDetail.getAlarmHigh().trim());
         }
+        if (metricsTplDetail.getEvent() != null) {
+            metricsTplDetail.setEvent(metricsTplDetail.getEvent().trim());
+        }
         omService.update(metricsTplDetail);
         return toAjax(metricsTplDetailService.updateMetricsTplDetail(metricsTplDetail));
     }

+ 2 - 0
jjt-biz/src/main/java/com/jjt/biz/domain/BizObjMetrics.java

@@ -75,6 +75,8 @@ public class BizObjMetrics extends BaseEntity {
     private String alarmMid;
     @ApiModelProperty("告警-高")
     private String alarmHigh;
+    @ApiModelProperty("事件")
+    private String event;
 
     @ApiModelProperty("指标定义")
     private MetricsDef metricsDef;

+ 22 - 0
jjt-biz/src/main/java/com/jjt/biz/service/IAlarmRecordService.java

@@ -1,7 +1,9 @@
 package com.jjt.biz.service;
 
 import com.jjt.biz.domain.AlarmRecord;
+import com.jjt.biz.domain.BizObjMetrics;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -62,6 +64,7 @@ public interface IAlarmRecordService {
 
     /**
      * 告警等级排行
+     *
      * @param alarmRecord 对象
      * @return 结果
      */
@@ -69,8 +72,27 @@ public interface IAlarmRecordService {
 
     /**
      * 按小时告警趋势
+     *
      * @param alarmRecord 对象
      * @return 结果
      */
     List<Map<String, Object>> listHours(AlarmRecord alarmRecord);
+
+    /**
+     * 处理告警和事件
+     *
+     * @param om        指标对象
+     * @param recordMap 正在告警的列表
+     * @param date      时间
+     * @return 结果
+     */
+    Map<String, AlarmRecord> process(BizObjMetrics om, Map<Long, AlarmRecord> recordMap, Date date);
+
+    /**
+     * 通过对象ID查询当前正在告警的列表,并转换成map
+     *
+     * @param objId 对象ID
+     * @return 结果
+     */
+    Map<Long, AlarmRecord> selectAlarmRecordListCurr(Long objId);
 }

+ 14 - 2
jjt-biz/src/main/java/com/jjt/biz/service/IBizObjMetricsService.java

@@ -4,6 +4,7 @@ import com.jjt.biz.domain.BizObjMetrics;
 import com.jjt.biz.domain.MetricsDef;
 import com.jjt.biz.domain.MetricsTplDetail;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -120,12 +121,23 @@ public interface IBizObjMetricsService {
      * 根据objId获取pinpoint指标值
      *
      * @param objId 对象ID
+     * @param date  数据时间
      */
-    void pinpointMetricsValue(Long objId);
+    void pinpointMetricsValue(Long objId, Date date);
+
     /**
      * 根据objId获取prometheus指标值
      *
      * @param objId 对象ID
+     * @param date  数据时间
+     */
+    void prometheusMetricsValue(Long objId, Date date);
+
+    /**
+     * 使用模拟数据
+     *
+     * @param objId 对象ID
+     * @param date  数据时间
      */
-    void prometheusMetricsValue(Long objId);
+    void imitate(Long objId, Date date);
 }

+ 116 - 0
jjt-biz/src/main/java/com/jjt/biz/service/impl/AlarmRecordServiceImpl.java

@@ -1,14 +1,21 @@
 package com.jjt.biz.service.impl;
 
 import com.jjt.biz.domain.AlarmRecord;
+import com.jjt.biz.domain.BizObjMetrics;
 import com.jjt.biz.mapper.AlarmRecordMapper;
 import com.jjt.biz.service.IAlarmRecordService;
 import com.jjt.common.utils.DateUtils;
+import com.jjt.common.utils.IntervalUtil;
+import com.jjt.common.utils.StringUtils;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * 告警记录Service业务层处理
@@ -110,4 +117,113 @@ public class AlarmRecordServiceImpl implements IAlarmRecordService {
     public List<Map<String, Object>> listHours(AlarmRecord alarmRecord) {
         return alarmRecordMapper.listHours(alarmRecord);
     }
+
+    /**
+     * 处理告警和事件
+     *
+     * @param om        指标对象
+     * @param recordMap 正在告警的列表
+     * @param date      时间
+     * @return 结果
+     */
+    @Override
+    public Map<String, AlarmRecord> process(BizObjMetrics om, Map<Long, AlarmRecord> recordMap, Date date) {
+        Map<String, AlarmRecord> result = new HashMap<>(16);
+        // 需要查询是否已经有告警记录
+        // 1.当前没有告警,但之前有未结束的告警。
+        // 2.如果该指标有告警,且告警等级相同,则不用管
+        // 3.如果该指标有告警,但告警等级不同,则上一次告警结束,新增一条告警。
+        // 4.如果之前没有告警,当前告警,则新增告警。
+        AlarmRecord record = recordMap.get(om.getObjMetricsId());
+        String alarmLevel = getAlarmLevel(om.getDValue().floatValue(), om);
+        if (alarmLevel == null) {
+            //如果没有告警,且之前有告警记录,则结束之前告警
+            if (record != null) {
+                record.setAlarmType("2");
+                record.setEndTime(date);
+                result.put("update", record);
+//                updateAlarmRecord(record);
+            }
+            return result;
+        }
+
+        if (record != null) {
+            if (alarmLevel.equals(record.getAlarmLevel())) {
+                //如果有相同告警,则本次不处理
+                return result;
+            } else {
+                //有告警记录,但告警等级不一样
+                //结束上一次告警
+                record.setAlarmType("2");
+                record.setEndTime(date);
+                result.put("update", record);
+
+//                updateAlarmRecord(record);
+            }
+        }
+        record = new AlarmRecord();
+        record.setObjId(om.getObjId());
+        record.setObjMetricsId(om.getObjMetricsId());
+        record.setAlarmLevel(alarmLevel);
+        record.setAlarmValue(om.getDValue());
+        record.setAlarmType("1");
+        record.setAlarmTime(date);
+        result.put("add", record);
+        return result;
+//        insertAlarmRecord(record);
+    }
+
+    /**
+     * 通过对象ID查询当前正在告警的列表,并转换成map
+     *
+     * @param objId 对象ID
+     * @return 结果
+     */
+    @Override
+    public Map<Long, AlarmRecord> selectAlarmRecordListCurr(Long objId) {
+        AlarmRecord search = new AlarmRecord();
+        search.setObjId(objId);
+        search.setAlarmType("1");
+        List<AlarmRecord> list = selectAlarmRecordList(search);
+        return list.stream().collect(Collectors.toMap(AlarmRecord::getObjMetricsId, Function.identity()));
+    }
+
+    /**
+     * 查询是否正在告警?
+     *
+     * @param metricsId 指标对象
+     * @return 结果
+     */
+//    private AlarmRecord exists(Long metricsId) {
+//        AlarmRecord search = new AlarmRecord();
+//        search.setObjMetricsId(metricsId);
+//        search.setAlarmType("1");
+//
+//        List<AlarmRecord> list = selectAlarmRecordList(search);
+//        if (list.size() > 0) {
+//            return list.get(0);
+//        } else {
+//            return null;
+//        }
+//    }
+
+    /**
+     * 获取告警等级
+     *
+     * @param value         值
+     * @param bizObjMetrics 指标对象
+     * @return
+     */
+    private String getAlarmLevel(Float value, BizObjMetrics bizObjMetrics) {
+        if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmLow()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmLow())) {
+            return "low";
+        } else if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmMid()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmMid())) {
+            return "mid";
+        } else if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmHigh()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmHigh())) {
+            return "high";
+        }
+        return null;
+    }
+
+
 }

+ 5 - 6
jjt-biz/src/main/java/com/jjt/biz/service/impl/BizObjMetricsDataServiceImpl.java

@@ -1,12 +1,12 @@
 package com.jjt.biz.service.impl;
 
-import java.util.List;
-        import com.jjt.common.utils.DateUtils;
-import org.springframework.stereotype.Service;
-import com.jjt.biz.mapper.BizObjMetricsDataMapper;
 import com.jjt.biz.domain.BizObjMetricsData;
+import com.jjt.biz.mapper.BizObjMetricsDataMapper;
 import com.jjt.biz.service.IBizObjMetricsDataService;
+import org.springframework.stereotype.Service;
+
 import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * 业务对象指标数据Service业务层处理
@@ -49,8 +49,7 @@ public class BizObjMetricsDataServiceImpl implements IBizObjMetricsDataService {
      */
     @Override
     public int insertBizObjMetricsData(BizObjMetricsData bizObjMetricsData) {
-                bizObjMetricsData.setCreateTime(DateUtils.getNowDate());
-            return bizObjMetricsDataMapper.insertBizObjMetricsData(bizObjMetricsData);
+        return bizObjMetricsDataMapper.insertBizObjMetricsData(bizObjMetricsData);
     }
 
     /**

+ 195 - 88
jjt-biz/src/main/java/com/jjt/biz/service/impl/BizObjMetricsServiceImpl.java

@@ -4,11 +4,15 @@ import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.jjt.biz.domain.*;
+import com.jjt.biz.mapper.AlarmRecordMapper;
+import com.jjt.biz.mapper.BizObjMetricsDataMapper;
 import com.jjt.biz.mapper.BizObjMetricsMapper;
 import com.jjt.biz.service.*;
 import com.jjt.common.utils.DateUtils;
-import com.jjt.common.utils.IntervalUtil;
 import com.jjt.common.utils.StringUtils;
+import com.jjt.hl.domain.HlEvent;
+import com.jjt.hl.mapper.HlEventMapper;
+import com.jjt.hl.service.IHlEventService;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -51,6 +55,8 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
     private IAlarmRecordService alarmRecordService;
     @Resource
     private IBizObjMetricsDataService metricsDataService;
+    @Resource
+    private IHlEventService eventService;
 
     /**
      * 查询业务对象指标
@@ -203,6 +209,7 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
                     ms.setAlarmLow(d.getAlarmLow());
                     ms.setAlarmMid(d.getAlarmMid());
                     ms.setAlarmHigh(d.getAlarmHigh());
+                    ms.setEvent(d.getEvent());
 
                     if (pp.getPpType().equals("REDIS")) {
                         //redis需要将1s换成100ms 3s换成300ms 5s换成500ms
@@ -234,6 +241,7 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
                 ms.setAlarmLow(d.getAlarmLow());
                 ms.setAlarmMid(d.getAlarmMid());
                 ms.setAlarmHigh(d.getAlarmHigh());
+                ms.setEvent(d.getEvent());
                 objMetrics.add(ms);
             }
         });
@@ -256,20 +264,22 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
         om.setTplId(detail.getTplId());
 
         List<BizObjMetrics> list = selectBizObjMetricsList(om);
-        if (list.size() > 0) {
-            list.forEach(obj -> {
-                //如果有则更新,没有则插入
-                obj.setAlarmMid(detail.getAlarmMid());
-                obj.setAlarmLow(detail.getAlarmLow());
-                obj.setAlarmHigh(detail.getAlarmHigh());
-                bizObjMetricsMapper.updateBizObjMetrics(obj);
-            });
-        } else {
-            om.setAlarmLow(detail.getAlarmLow());
-            om.setAlarmMid(detail.getAlarmMid());
-            om.setAlarmHigh(detail.getAlarmHigh());
-            insertBizObjMetrics(om);
-        }
+//        if (list.size() > 0) {
+        list.forEach(obj -> {
+            //如果有则更新,没有则插入
+            obj.setAlarmMid(detail.getAlarmMid());
+            obj.setAlarmLow(detail.getAlarmLow());
+            obj.setAlarmHigh(detail.getAlarmHigh());
+            obj.setEvent(detail.getEvent());
+            bizObjMetricsMapper.updateBizObjMetrics(obj);
+        });
+//        } else {
+//            om.setAlarmLow(detail.getAlarmLow());
+//            om.setAlarmMid(detail.getAlarmMid());
+//            om.setAlarmHigh(detail.getAlarmHigh());
+//            om.setEvent(detail.getEvent());
+//            insertBizObjMetrics(om);
+//        }
 
     }
 
@@ -290,9 +300,10 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * 根据objId获取指标值
      *
      * @param objId 对象ID
+     * @param date  数据时间
      */
     @Override
-    public void pinpointMetricsValue(Long objId) {
+    public void pinpointMetricsValue(Long objId, Date date) {
         BizObj bizObj = objService.selectBizObjByObjId(objId);
 
         if ("1".equals(bizObj.getObjType())) {
@@ -333,7 +344,7 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
             updateBizObjPpTable(objId, pinpointVOList);
 
             // 2.更新业务对象指标表
-            updateBizObjMetrics(objId, tps, openFiles, heapUsage, gcCount, pinpointVOList);
+            updateBizObjMetrics(objId, tps, openFiles, heapUsage, gcCount, pinpointVOList, date);
         }
     }
 
@@ -341,70 +352,108 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * 根据objId获取prometheus指标值
      *
      * @param objId 对象ID
+     * @param date  时间
      */
     @Override
-    public void prometheusMetricsValue(Long objId) {
+    public void prometheusMetricsValue(Long objId, Date date) {
         List<BizObjMetrics> mList = getAllMetricsForObjIdList(objId);
         List<BizObjMetrics> metricsToUpdate = new ArrayList<>();
+        List<BizObjMetricsData> dataList = new ArrayList<>();
+        List<AlarmRecord> addRList = new ArrayList<>();
+        List<AlarmRecord> updateRList = new ArrayList<>();
+        List<HlEvent> addEList = new ArrayList<>();
+        List<HlEvent> updateEList = new ArrayList<>();
+        //查询当前对象所有正在告警列表
+        Map<Long, AlarmRecord> recordMap = alarmRecordService.selectAlarmRecordListCurr(objId);
+        //查询当前对象未结束事件列表
+        Map<Long, HlEvent> eventMap = eventService.selectHlEventListCurr(objId);
         mList.stream().filter(om -> !"1".equals(om.getMetricsDef().getMetricsType())).forEach(om -> {
             if (StringUtils.isNotEmpty(om.getDataExp())) {
                 //非pinpoint
                 Float value = prometheusService.query(om.getDataExp());
                 if (value != null) {
-                    String alarmLevel = getAlarmLevel(value, om);
                     om.setDValue(BigDecimal.valueOf(value));
-
-                    if (alarmLevel != null) {
-                        insertAlarm(om, alarmLevel);
-                    }
                     BizObjMetricsData data = new BizObjMetricsData();
                     data.setObjMetricsId(om.getObjMetricsId());
                     data.setdValue(om.getDValue());
-                    metricsDataService.insertBizObjMetricsData(data);
+                    dataList.add(data);
                     metricsToUpdate.add(om);
+                    //处理告警
+                    Map<String, AlarmRecord> aMap = alarmRecordService.process(om, recordMap, date);
+                    if (aMap.get("add") != null) {
+                        addRList.add(aMap.get("add"));
+                    }
+                    if (aMap.get("update") != null) {
+                        updateRList.add(aMap.get("update"));
+                    }
+
+                    //处理事件
+                    Map<String, HlEvent> eMap = eventService.process(om, eventMap, date);
+                    if (eMap.get("add") != null) {
+                        addEList.add(eMap.get("add"));
+                    }
+                    if (eMap.get("update") != null) {
+                        updateEList.add(eMap.get("update"));
+                    }
                 }
             }
         });
-        // 更新所有需要更新的BizObjMetrics对象
-        metricsToUpdate.forEach(this::updateBizObjMetrics);
+        batchUpdate(metricsToUpdate, dataList, addRList, updateRList, addEList, updateEList);
 
     }
 
     /**
-     * 获取告警等级
+     * 使用模拟数据
      *
-     * @param value         值
-     * @param bizObjMetrics 指标对象
-     * @return
+     * @param objId 对象ID
+     * @param date  数据时间
      */
-    private String getAlarmLevel(Float value, BizObjMetrics bizObjMetrics) {
-        if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmLow()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmLow())) {
-            return "low";
-        } else if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmMid()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmMid())) {
-            return "mid";
-        } else if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmHigh()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmHigh())) {
-            return "high";
-        }
-        return null;
-    }
+    @Override
+//    @Async("threadPoolTaskExecutor")
+    public void imitate(Long objId, Date date) {
+        List<BizObjMetrics> mList = getAllMetricsForObjIdList(objId);
+        List<BizObjMetrics> metricsToUpdate = new ArrayList<>();
+        List<BizObjMetricsData> dataList = new ArrayList<>();
+        List<AlarmRecord> addRList = new ArrayList<>();
+        List<AlarmRecord> updateRList = new ArrayList<>();
+        List<HlEvent> addEList = new ArrayList<>();
+        List<HlEvent> updateEList = new ArrayList<>();
+        //查询当前对象所有正在告警列表
+        Map<Long, AlarmRecord> recordMap = alarmRecordService.selectAlarmRecordListCurr(objId);
+        //查询当前对象未结束事件列表
+        Map<Long, HlEvent> eventMap = eventService.selectHlEventListCurr(objId);
+
+        mList.stream().forEach(om -> {
+            Random random = new Random();
+            int xxx = (int) (om.getObjMetricsId() % 70);
+            float value = (float) random.nextInt(100 - xxx) + xxx;
+            om.setDValue(BigDecimal.valueOf(value));
+            BizObjMetricsData data = new BizObjMetricsData();
+            data.setObjMetricsId(om.getObjMetricsId());
+            data.setdValue(om.getDValue());
+            data.setCreateTime(date);
+//            metricsDataService.insertBizObjMetricsData(data);
+            dataList.add(data);
+            metricsToUpdate.add(om);
+            //处理告警
+            Map<String, AlarmRecord> aMap = alarmRecordService.process(om, recordMap, date);
+            if (aMap.get("add") != null) {
+                addRList.add(aMap.get("add"));
+            }
+            if (aMap.get("update") != null) {
+                updateRList.add(aMap.get("update"));
+            }
 
-    /**
-     * 添加告警记录
-     *
-     * @param om         指标对象
-     * @param alarmLevel 告警等级
-     */
-    private void insertAlarm(BizObjMetrics om, String alarmLevel) {
-        //TODO 需要查询是否已经有告警记录
-        // 1.如果该指标有告警,且告警等级相同,则不用管
-        // 2.如果该指标有告警,但告警等级不同,则上一次告警结束,新增一条告警。
-        AlarmRecord record = new AlarmRecord();
-        record.setObjId(om.getObjId());
-        record.setObjMetricsId(om.getObjMetricsId());
-        record.setAlarmLevel(alarmLevel);
-        record.setAlarmValue(om.getDValue());
-        record.setAlarmTime(new Date());
-        alarmRecordService.insertAlarmRecord(record);
+            //处理事件
+            Map<String, HlEvent> eMap = eventService.process(om, eventMap, date);
+            if (eMap.get("add") != null) {
+                addEList.add(eMap.get("add"));
+            }
+            if (eMap.get("update") != null) {
+                updateEList.add(eMap.get("update"));
+            }
+        });
+        batchUpdate(metricsToUpdate, dataList, addRList, updateRList, addEList, updateEList);
     }
 
     /**
@@ -503,10 +552,11 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * @param heapUsage      堆内存使用率
      * @param gcCount        gc次数
      * @param pinpointVOList 链路列表数据
+     * @param date           时间
      */
-    private void updateBizObjMetrics(Long objId, Float tps, int openFiles, float heapUsage, int gcCount, List<PinpointVO> pinpointVOList) {
-        updateJvmMetrics(objId, tps, heapUsage, openFiles, gcCount);
-        updateLinkMetrics(objId, pinpointVOList);
+    private void updateBizObjMetrics(Long objId, Float tps, int openFiles, float heapUsage, int gcCount, List<PinpointVO> pinpointVOList, Date date) {
+        updateJvmMetrics(objId, tps, heapUsage, openFiles, gcCount, date);
+        updateLinkMetrics(objId, pinpointVOList, date);
     }
 
     /**
@@ -517,16 +567,21 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * @param openFiles 打开文件数量
      * @param heapUsage 堆内存使用率
      * @param gcCount   gc次数
+     * @param date      数据时间
      */
-    private void updateJvmMetrics(Long objId, Float tps, float heapUsage, int openFiles, int gcCount) {
+    private void updateJvmMetrics(Long objId, Float tps, float heapUsage, int openFiles, int gcCount, Date date) {
         BizObjMetrics jvmMetrics = new BizObjMetrics();
         jvmMetrics.setObjId(objId);
+        //查询当前对象所有正在告警列表
+        Map<Long, AlarmRecord> recordMap = alarmRecordService.selectAlarmRecordListCurr(objId);
+        //查询当前对象未结束事件列表
+        Map<Long, HlEvent> eventMap = eventService.selectHlEventListCurr(objId);
         jvmMetrics.setMetricsCode("pp.jvm.");
         List<BizObjMetrics> omList = selectBizObjMetricsList(jvmMetrics);
-        updateMetricsValues(omList, "tps", BigDecimal.valueOf(tps));
-        updateMetricsValues(omList, "heap.usage", BigDecimal.valueOf(heapUsage));
-        updateMetricsValues(omList, "open", BigDecimal.valueOf(openFiles));
-        updateMetricsValues(omList, "gc", BigDecimal.valueOf(gcCount));
+        updateMetricsValues(omList, "tps", BigDecimal.valueOf(tps), date, recordMap, eventMap);
+        updateMetricsValues(omList, "heap.usage", BigDecimal.valueOf(heapUsage), date, recordMap, eventMap);
+        updateMetricsValues(omList, "open", BigDecimal.valueOf(openFiles), date, recordMap, eventMap);
+        updateMetricsValues(omList, "gc", BigDecimal.valueOf(gcCount), date, recordMap, eventMap);
     }
 
     /**
@@ -535,23 +590,71 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * @param omList       jvm指标列表
      * @param metricSuffix 指标后缀
      * @param value        值
+     * @param date         数据时间
      */
-    private void updateMetricsValues(List<BizObjMetrics> omList, String metricSuffix, BigDecimal value) {
+    private void updateMetricsValues(List<BizObjMetrics> omList, String metricSuffix, BigDecimal value, Date date, Map<Long, AlarmRecord> recordMap, Map<Long, HlEvent> eventMap) {
+        List<BizObjMetricsData> dataList = new ArrayList<>();
+        List<AlarmRecord> addRList = new ArrayList<>();
+        List<AlarmRecord> updateRList = new ArrayList<>();
+        List<HlEvent> addEList = new ArrayList<>();
+        List<HlEvent> updateEList = new ArrayList<>();
         omList.stream()
                 .filter(om -> om.getMetricsCode().endsWith(metricSuffix))
                 .forEach(om -> {
-                    //TODO 独立出一个告警处理方法出来
-                    String alarmLevel = getAlarmLevel(value.floatValue(), om);
-                    if (alarmLevel != null) {
-                        insertAlarm(om, alarmLevel);
-                    }
                     om.setDValue(value);
                     updateBizObjMetrics(om);
                     BizObjMetricsData data = new BizObjMetricsData();
                     data.setObjMetricsId(om.getObjMetricsId());
                     data.setdValue(om.getDValue());
-                    metricsDataService.insertBizObjMetricsData(data);
+                    dataList.add(data);
+                    //处理告警
+                    Map<String, AlarmRecord> aMap = alarmRecordService.process(om, recordMap, date);
+                    if (aMap.get("add") != null) {
+                        addRList.add(aMap.get("add"));
+                    }
+                    if (aMap.get("update") != null) {
+                        updateRList.add(aMap.get("update"));
+                    }
+
+                    //处理事件
+                    Map<String, HlEvent> eMap = eventService.process(om, eventMap, date);
+                    if (eMap.get("add") != null) {
+                        addEList.add(eMap.get("add"));
+                    }
+                    if (eMap.get("update") != null) {
+                        updateEList.add(eMap.get("update"));
+                    }
                 });
+        batchUpdate(null, dataList, addRList, updateRList, addEList, updateEList);
+    }
+
+    private void batchUpdate(List<BizObjMetrics> metricsToUpdate, List<BizObjMetricsData> dataList, List<AlarmRecord> addRList, List<AlarmRecord> updateRList, List<HlEvent> addEList, List<HlEvent> updateEList) {
+        // 更新所有需要更新的BizObjMetrics对象
+        try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
+            BizObjMetricsMapper mapper = sqlSession.getMapper(BizObjMetricsMapper.class);
+            if (metricsToUpdate != null && metricsToUpdate.size() > 0) {
+                metricsToUpdate.forEach(mapper::updateBizObjMetrics);
+            }
+            if (dataList != null && dataList.size() > 0) {
+                BizObjMetricsDataMapper dataMapper = sqlSession.getMapper(BizObjMetricsDataMapper.class);
+                dataList.forEach(dataMapper::insertBizObjMetricsData);
+            }
+            AlarmRecordMapper recordMapper = sqlSession.getMapper(AlarmRecordMapper.class);
+            if (addRList != null && addRList.size() > 0) {
+                addRList.forEach(recordMapper::insertAlarmRecord);
+            }
+            if (updateRList != null && updateRList.size() > 0) {
+                updateRList.forEach(recordMapper::updateAlarmRecord);
+            }
+            HlEventMapper eventMapper = sqlSession.getMapper(HlEventMapper.class);
+            if (addEList != null && addEList.size() > 0) {
+                addEList.forEach(eventMapper::insertHlEvent);
+            }
+            if (updateEList != null && updateEList.size() > 0) {
+                updateEList.forEach(eventMapper::updateHlEvent);
+            }
+            sqlSession.commit();
+        }
     }
 
     /**
@@ -559,10 +662,11 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      *
      * @param objId          对象ID
      * @param pinpointVOList 链路列表
+     * @param date           时间
      */
-    private void updateLinkMetrics(Long objId, List<PinpointVO> pinpointVOList) {
+    private void updateLinkMetrics(Long objId, List<PinpointVO> pinpointVOList, Date date) {
         Map<String, BizObjMetrics> metricsMap = getAllMetricsForObjId(objId);
-        pinpointVOList.forEach(vo -> updateMetricsValues(metricsMap, vo));
+        pinpointVOList.forEach(vo -> updateMetricsValues(metricsMap, vo, date));
     }
 
 
@@ -571,23 +675,24 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      *
      * @param metricsMap 指标map
      * @param vo         pp链路对象
+     * @param date       时间
      */
-    private void updateMetricsValues(Map<String, BizObjMetrics> metricsMap, PinpointVO vo) {
+    private void updateMetricsValues(Map<String, BizObjMetrics> metricsMap, PinpointVO vo, Date date) {
         metricsMap.values().stream()
                 .filter(om -> om.getMetricsCode().startsWith(vo.getApplicationName() + "/"))
                 .forEach(om -> {
-                    updateMetric(om, "pp.1s", vo.getTime1s());
-                    updateMetric(om, "pp.3s", vo.getTime3s());
-                    updateMetric(om, "pp.5s", vo.getTime5s());
-                    updateMetric(om, "pp.100ms", vo.getTime100ms());
-                    updateMetric(om, "pp.300ms", vo.getTime300ms());
-                    updateMetric(om, "pp.500ms", vo.getTime500ms());
-                    updateMetric(om, "pp.tot", vo.getTot());
-                    updateMetric(om, "pp.sum", vo.getSum());
-                    updateMetric(om, "pp.max", vo.getMax());
-                    updateMetric(om, "pp.avg", vo.getAvg());
-                    updateMetric(om, "pp.slow", vo.getSlow());
-                    updateMetric(om, "pp.error", vo.getError());
+                    updateMetric(om, "pp.1s", vo.getTime1s(), date);
+                    updateMetric(om, "pp.3s", vo.getTime3s(), date);
+                    updateMetric(om, "pp.5s", vo.getTime5s(), date);
+                    updateMetric(om, "pp.100ms", vo.getTime100ms(), date);
+                    updateMetric(om, "pp.300ms", vo.getTime300ms(), date);
+                    updateMetric(om, "pp.500ms", vo.getTime500ms(), date);
+                    updateMetric(om, "pp.tot", vo.getTot(), date);
+                    updateMetric(om, "pp.sum", vo.getSum(), date);
+                    updateMetric(om, "pp.max", vo.getMax(), date);
+                    updateMetric(om, "pp.avg", vo.getAvg(), date);
+                    updateMetric(om, "pp.slow", vo.getSlow(), date);
+                    updateMetric(om, "pp.error", vo.getError(), date);
                 });
     }
 
@@ -597,14 +702,16 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * @param om     对象
      * @param suffix 前缘
      * @param value  值
+     * @param date   时间
      */
-    private void updateMetric(BizObjMetrics om, String suffix, Number value) {
+    private void updateMetric(BizObjMetrics om, String suffix, Number value, Date date) {
         if (om.getMetricsCode().endsWith(suffix) && value != null) {
             om.setDValue(BigDecimal.valueOf(value.doubleValue()));
             updateBizObjMetrics(om);
             BizObjMetricsData data = new BizObjMetricsData();
             data.setObjMetricsId(om.getObjMetricsId());
             data.setdValue(om.getDValue());
+            data.setCreateTime(date);
             metricsDataService.insertBizObjMetricsData(data);
         }
     }

+ 114 - 0
jjt-biz/src/main/java/com/jjt/hl/controller/HlEventController.java

@@ -0,0 +1,114 @@
+package com.jjt.hl.controller;
+
+import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.jjt.common.annotation.Log;
+import com.jjt.common.core.controller.BaseController;
+import com.jjt.common.core.domain.AjaxResult;
+import com.jjt.common.enums.BusinessType;
+import com.jjt.hl.domain.HlEvent;
+import com.jjt.hl.service.IHlEventService;
+import com.jjt.common.utils.poi.ExcelUtil;
+import com.jjt.common.core.page.TableDataInfo;
+
+/**
+ * 健康度事件记录Controller
+ *
+ * @author jjt
+ * @date 2024-09-16
+ */
+@Api(tags="健康度事件记录")
+@RestController
+@RequestMapping("/hl/event")
+public class HlEventController extends BaseController
+{
+    @Resource
+    private IHlEventService hlEventService;
+
+    /**
+     * 查询健康度事件记录列表
+     */
+    @ApiOperation("查询健康度事件记录列表")
+    @PreAuthorize("@ss.hasPermi('hl:event:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(HlEvent hlEvent)
+    {
+        startPage();
+        List<HlEvent> list = hlEventService.selectHlEventList(hlEvent);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出健康度事件记录列表
+     */
+    @ApiOperation("导出健康度事件记录列表")
+    @PreAuthorize("@ss.hasPermi('hl:event:export')")
+    @Log(title = "健康度事件记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, HlEvent hlEvent)
+    {
+        List<HlEvent> list = hlEventService.selectHlEventList(hlEvent);
+        ExcelUtil<HlEvent> util = new ExcelUtil<HlEvent>(HlEvent.class);
+        util.exportExcel(response, list, "健康度事件记录数据");
+    }
+
+    /**
+     * 获取健康度事件记录详细信息
+     */
+    @ApiOperation("获取健康度事件记录详细信息")
+    @PreAuthorize("@ss.hasPermi('hl:event:query')")
+    @GetMapping(value = "/{eventId}")
+    public AjaxResult getInfo(@PathVariable("eventId") Long eventId)
+    {
+        return success(hlEventService.selectHlEventByEventId(eventId));
+    }
+
+    /**
+     * 新增健康度事件记录
+     */
+    @ApiOperation("新增健康度事件记录")
+    @PreAuthorize("@ss.hasPermi('hl:event:add')")
+    @Log(title = "健康度事件记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody HlEvent hlEvent)
+    {
+        return toAjax(hlEventService.insertHlEvent(hlEvent));
+    }
+
+    /**
+     * 修改健康度事件记录
+     */
+    @ApiOperation("修改健康度事件记录")
+    @PreAuthorize("@ss.hasPermi('hl:event:edit')")
+    @Log(title = "健康度事件记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody HlEvent hlEvent)
+    {
+        return toAjax(hlEventService.updateHlEvent(hlEvent));
+    }
+
+    /**
+     * 删除健康度事件记录
+     */
+    @ApiOperation("删除健康度事件记录")
+    @PreAuthorize("@ss.hasPermi('hl:event:remove')")
+    @Log(title = "健康度事件记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{eventIds}")
+    public AjaxResult remove(@PathVariable Long[] eventIds)
+    {
+        return toAjax(hlEventService.deleteHlEventByEventIds(eventIds));
+    }
+}

+ 72 - 0
jjt-biz/src/main/java/com/jjt/hl/domain/HlEvent.java

@@ -0,0 +1,72 @@
+package com.jjt.hl.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jjt.common.annotation.Excel;
+import com.jjt.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 健康度事件记录对象 hl_event
+ *
+ * @author jjt
+ * @date 2024-09-16
+ */
+@ApiModel(value = "HlEvent", description = "健康度事件记录")
+@Data
+public class HlEvent extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 事件ID
+     */
+    @ApiModelProperty("事件ID")
+    @TableId
+    private Long eventId;
+
+    /**
+     * 对象ID
+     */
+    @ApiModelProperty("对象ID")
+    @Excel(name = "对象ID")
+    private Long objId;
+
+    /**
+     * 指标ID
+     */
+    @ApiModelProperty("指标ID")
+    @Excel(name = "指标ID")
+    private Long objMetricsId;
+
+    /**
+     * 事件开始时间
+     */
+    @ApiModelProperty("事件开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "事件开始时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date startTime;
+
+    /**
+     * 事件结束时间
+     */
+    @ApiModelProperty("事件结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "事件结束时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date endTime;
+
+    /**
+     * 事件状态
+     */
+    @ApiModelProperty("事件状态")
+    @Excel(name = "事件状态")
+    private String eventStatus;
+    @ApiModelProperty("事件产生时值")
+    @Excel(name = "事件产生时值")
+    private BigDecimal eventValue;
+
+}

+ 62 - 0
jjt-biz/src/main/java/com/jjt/hl/mapper/HlEventMapper.java

@@ -0,0 +1,62 @@
+package com.jjt.hl.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jjt.hl.domain.HlEvent;
+
+/**
+ * 健康度事件记录Mapper接口
+ * 
+ * @author jjt
+ * @date 2024-09-16
+ */
+public interface HlEventMapper extends BaseMapper<HlEvent>
+{
+    /**
+     * 查询健康度事件记录
+     * 
+     * @param eventId 健康度事件记录主键
+     * @return 健康度事件记录
+     */
+    public HlEvent selectHlEventByEventId(Long eventId);
+
+    /**
+     * 查询健康度事件记录列表
+     * 
+     * @param hlEvent 健康度事件记录
+     * @return 健康度事件记录集合
+     */
+    public List<HlEvent> selectHlEventList(HlEvent hlEvent);
+
+    /**
+     * 新增健康度事件记录
+     * 
+     * @param hlEvent 健康度事件记录
+     * @return 结果
+     */
+    public int insertHlEvent(HlEvent hlEvent);
+
+    /**
+     * 修改健康度事件记录
+     * 
+     * @param hlEvent 健康度事件记录
+     * @return 结果
+     */
+    public int updateHlEvent(HlEvent hlEvent);
+
+    /**
+     * 删除健康度事件记录
+     * 
+     * @param eventId 健康度事件记录主键
+     * @return 结果
+     */
+    public int deleteHlEventByEventId(Long eventId);
+
+    /**
+     * 批量删除健康度事件记录
+     * 
+     * @param eventIds 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteHlEventByEventIds(Long[] eventIds);
+}

+ 82 - 0
jjt-biz/src/main/java/com/jjt/hl/service/IHlEventService.java

@@ -0,0 +1,82 @@
+package com.jjt.hl.service;
+
+import com.jjt.biz.domain.BizObjMetrics;
+import com.jjt.hl.domain.HlEvent;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 健康度事件记录Service接口
+ *
+ * @author jjt
+ * @date 2024-09-16
+ */
+public interface IHlEventService {
+    /**
+     * 查询健康度事件记录
+     *
+     * @param eventId 健康度事件记录主键
+     * @return 健康度事件记录
+     */
+    public HlEvent selectHlEventByEventId(Long eventId);
+
+    /**
+     * 查询健康度事件记录列表
+     *
+     * @param hlEvent 健康度事件记录
+     * @return 健康度事件记录集合
+     */
+    public List<HlEvent> selectHlEventList(HlEvent hlEvent);
+
+    /**
+     * 新增健康度事件记录
+     *
+     * @param hlEvent 健康度事件记录
+     * @return 结果
+     */
+    public int insertHlEvent(HlEvent hlEvent);
+
+    /**
+     * 修改健康度事件记录
+     *
+     * @param hlEvent 健康度事件记录
+     * @return 结果
+     */
+    public int updateHlEvent(HlEvent hlEvent);
+
+    /**
+     * 批量删除健康度事件记录
+     *
+     * @param eventIds 需要删除的健康度事件记录主键集合
+     * @return 结果
+     */
+    public int deleteHlEventByEventIds(Long[] eventIds);
+
+    /**
+     * 删除健康度事件记录信息
+     *
+     * @param eventId 健康度事件记录主键
+     * @return 结果
+     */
+    public int deleteHlEventByEventId(Long eventId);
+
+    /**
+     * 处理事件
+     *
+     * @param om       指标对象
+     * @param eventMap 当前事件列表
+     * @param date     时间
+     * @return 结果
+     */
+    Map<String, HlEvent> process(BizObjMetrics om, Map<Long, HlEvent> eventMap, Date date);
+
+    /**
+     * 通过对象ID查询当前事件的列表,并转换成map
+     *
+     * @param objId 对象ID
+     * @return 结果
+     */
+    Map<Long, HlEvent> selectHlEventListCurr(Long objId);
+}

+ 185 - 0
jjt-biz/src/main/java/com/jjt/hl/service/impl/HlEventServiceImpl.java

@@ -0,0 +1,185 @@
+package com.jjt.hl.service.impl;
+
+import com.jjt.biz.domain.BizObjMetrics;
+import com.jjt.common.utils.DateUtils;
+import com.jjt.common.utils.IntervalUtil;
+import com.jjt.common.utils.StringUtils;
+import com.jjt.hl.domain.HlEvent;
+import com.jjt.hl.mapper.HlEventMapper;
+import com.jjt.hl.service.IHlEventService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 健康度事件记录Service业务层处理
+ *
+ * @author jjt
+ * @date 2024-09-16
+ */
+@Service
+public class HlEventServiceImpl implements IHlEventService {
+    @Resource
+    private HlEventMapper hlEventMapper;
+
+    /**
+     * 查询健康度事件记录
+     *
+     * @param eventId 健康度事件记录主键
+     * @return 健康度事件记录
+     */
+    @Override
+    public HlEvent selectHlEventByEventId(Long eventId) {
+        return hlEventMapper.selectHlEventByEventId(eventId);
+    }
+
+    /**
+     * 查询健康度事件记录列表
+     *
+     * @param hlEvent 健康度事件记录
+     * @return 健康度事件记录
+     */
+    @Override
+    public List<HlEvent> selectHlEventList(HlEvent hlEvent) {
+        return hlEventMapper.selectHlEventList(hlEvent);
+    }
+
+    /**
+     * 新增健康度事件记录
+     *
+     * @param hlEvent 健康度事件记录
+     * @return 结果
+     */
+    @Override
+    public int insertHlEvent(HlEvent hlEvent) {
+        hlEvent.setCreateTime(DateUtils.getNowDate());
+        return hlEventMapper.insertHlEvent(hlEvent);
+    }
+
+    /**
+     * 修改健康度事件记录
+     *
+     * @param hlEvent 健康度事件记录
+     * @return 结果
+     */
+    @Override
+    public int updateHlEvent(HlEvent hlEvent) {
+        hlEvent.setUpdateTime(DateUtils.getNowDate());
+        return hlEventMapper.updateHlEvent(hlEvent);
+    }
+
+    /**
+     * 批量删除健康度事件记录
+     *
+     * @param eventIds 需要删除的健康度事件记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteHlEventByEventIds(Long[] eventIds) {
+        return hlEventMapper.deleteHlEventByEventIds(eventIds);
+    }
+
+    /**
+     * 删除健康度事件记录信息
+     *
+     * @param eventId 健康度事件记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteHlEventByEventId(Long eventId) {
+        return hlEventMapper.deleteHlEventByEventId(eventId);
+    }
+
+    /**
+     * 处理事件
+     *
+     * @param om       指标对象
+     * @param eventMap 当前事件列表
+     * @param date     数据时间
+     * @return
+     */
+    @Override
+    public Map<String, HlEvent> process(BizObjMetrics om, Map<Long, HlEvent> eventMap, Date date) {
+        Map<String, HlEvent> result = new HashMap<>(16);
+        if (StringUtils.isEmpty(om.getEvent())) {
+            //如果没有设置事件,则不做任何处理
+            return result;
+        }
+        //当前是否产生事件
+        boolean eventFlag = isEvent(om.getDValue().floatValue(), om.getEvent());
+        //之前是否有事件
+        HlEvent hlEvent = eventMap.get(om.getObjMetricsId());
+        if (eventFlag) {
+            //如果之前有事件,不管
+            //如果没有事件,则添加事件
+            if (hlEvent == null) {
+                hlEvent = new HlEvent();
+                hlEvent.setObjId(om.getObjId());
+                hlEvent.setObjMetricsId(om.getObjMetricsId());
+                hlEvent.setEventStatus("1");
+                hlEvent.setEventValue(om.getDValue());
+                hlEvent.setStartTime(date);
+                result.put("add", hlEvent);
+//                insertHlEvent(hlEvent);
+            }
+        } else if (hlEvent != null) {
+            //如果现在没有,之前有,需要结束上一次事件
+            hlEvent.setEventStatus("2");
+            hlEvent.setEndTime(date);
+            result.put("update", hlEvent);
+//            updateHlEvent(hlEvent);
+        }
+        return result;
+    }
+
+    /**
+     * 通过对象ID查询当前事件的列表,并转换成map
+     *
+     * @param objId 对象ID
+     * @return 结果
+     */
+    @Override
+    public Map<Long, HlEvent> selectHlEventListCurr(Long objId) {
+        HlEvent eventSearch = new HlEvent();
+        eventSearch.setObjId(objId);
+        eventSearch.setEventStatus("1");
+        List<HlEvent> events = selectHlEventList(eventSearch);
+        return events.stream().collect(Collectors.toMap(HlEvent::getObjMetricsId, Function.identity()));
+    }
+
+    /**
+     * 查询是否已经有事件产生
+     *
+     * @param metricsId 指标ID
+     * @return 结果
+     */
+//    private HlEvent exists(Long metricsId) {
+//        HlEvent search = new HlEvent();
+//        search.setObjMetricsId(metricsId);
+//        search.setEventStatus("1");
+//
+//        List<HlEvent> list = selectHlEventList(search);
+//        if (list.size() > 0) {
+//            return list.get(0);
+//        } else {
+//            return null;
+//        }
+//    }
+
+    /**
+     * 获取告警等级
+     *
+     * @param value 值
+     * @param event 事件表达式
+     * @return 结果
+     */
+    private boolean isEvent(Float value, String event) {
+        return IntervalUtil.inNumRange(value, event);
+    }
+}

+ 19 - 33
jjt-biz/src/main/java/com/jjt/risk/controller/RiskMsConfigController.java

@@ -1,28 +1,21 @@
 package com.jjt.risk.controller;
 
-import java.util.List;
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
 import com.jjt.common.annotation.Log;
 import com.jjt.common.core.controller.BaseController;
 import com.jjt.common.core.domain.AjaxResult;
+import com.jjt.common.core.page.TableDataInfo;
 import com.jjt.common.enums.BusinessType;
+import com.jjt.common.utils.poi.ExcelUtil;
 import com.jjt.risk.domain.RiskMsConfig;
 import com.jjt.risk.service.IRiskMsConfigService;
-import com.jjt.common.utils.poi.ExcelUtil;
-import com.jjt.common.core.page.TableDataInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
 
 /**
  * 风险管理指标配置Controller
@@ -30,11 +23,10 @@ import com.jjt.common.core.page.TableDataInfo;
  * @author jjt
  * @date 2024-09-12
  */
-@Api(tags="风险管理指标配置")
+@Api(tags = "风险管理指标配置")
 @RestController
 @RequestMapping("/risk/config")
-public class RiskMsConfigController extends BaseController
-{
+public class RiskMsConfigController extends BaseController {
     @Resource
     private IRiskMsConfigService riskMsConfigService;
 
@@ -44,8 +36,7 @@ public class RiskMsConfigController extends BaseController
     @ApiOperation("查询风险管理指标配置列表")
     @PreAuthorize("@ss.hasPermi('risk:config:list')")
     @GetMapping("/list")
-    public TableDataInfo list(RiskMsConfig riskMsConfig)
-    {
+    public TableDataInfo list(RiskMsConfig riskMsConfig) {
         startPage();
         List<RiskMsConfig> list = riskMsConfigService.selectRiskMsConfigList(riskMsConfig);
         return getDataTable(list);
@@ -58,8 +49,7 @@ public class RiskMsConfigController extends BaseController
     @PreAuthorize("@ss.hasPermi('risk:config:export')")
     @Log(title = "风险管理指标配置", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, RiskMsConfig riskMsConfig)
-    {
+    public void export(HttpServletResponse response, RiskMsConfig riskMsConfig) {
         List<RiskMsConfig> list = riskMsConfigService.selectRiskMsConfigList(riskMsConfig);
         ExcelUtil<RiskMsConfig> util = new ExcelUtil<RiskMsConfig>(RiskMsConfig.class);
         util.exportExcel(response, list, "风险管理指标配置数据");
@@ -71,8 +61,7 @@ public class RiskMsConfigController extends BaseController
     @ApiOperation("获取风险管理指标配置详细信息")
     @PreAuthorize("@ss.hasPermi('risk:config:query')")
     @GetMapping(value = "/{hcId}")
-    public AjaxResult getInfo(@PathVariable("hcId") Long hcId)
-    {
+    public AjaxResult getInfo(@PathVariable("hcId") Long hcId) {
         return success(riskMsConfigService.selectRiskMsConfigByHcId(hcId));
     }
 
@@ -83,8 +72,7 @@ public class RiskMsConfigController extends BaseController
     @PreAuthorize("@ss.hasPermi('risk:config:add')")
     @Log(title = "风险管理指标配置", businessType = BusinessType.INSERT)
     @PostMapping
-    public AjaxResult add(@RequestBody RiskMsConfig riskMsConfig)
-    {
+    public AjaxResult add(@RequestBody RiskMsConfig riskMsConfig) {
         return toAjax(riskMsConfigService.insertRiskMsConfig(riskMsConfig));
     }
 
@@ -95,8 +83,7 @@ public class RiskMsConfigController extends BaseController
     @PreAuthorize("@ss.hasPermi('risk:config:edit')")
     @Log(title = "风险管理指标配置", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody RiskMsConfig riskMsConfig)
-    {
+    public AjaxResult edit(@RequestBody RiskMsConfig riskMsConfig) {
         return toAjax(riskMsConfigService.updateRiskMsConfig(riskMsConfig));
     }
 
@@ -106,9 +93,8 @@ public class RiskMsConfigController extends BaseController
     @ApiOperation("删除风险管理指标配置")
     @PreAuthorize("@ss.hasPermi('risk:config:remove')")
     @Log(title = "风险管理指标配置", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{hcIds}")
-    public AjaxResult remove(@PathVariable Long[] hcIds)
-    {
+    @DeleteMapping("/{hcIds}")
+    public AjaxResult remove(@PathVariable Long[] hcIds) {
         return toAjax(riskMsConfigService.deleteRiskMsConfigByHcIds(hcIds));
     }
 }

+ 151 - 0
jjt-biz/src/main/java/com/jjt/risk/controller/RiskOtherController.java

@@ -0,0 +1,151 @@
+package com.jjt.risk.controller;
+
+import com.jjt.biz.domain.BizModel;
+import com.jjt.biz.service.IBizModelService;
+import com.jjt.biz.vo.ScoreVO;
+import com.jjt.common.core.controller.BaseController;
+import com.jjt.common.core.domain.AjaxResult;
+import com.jjt.risk.domain.RiskMsConfig;
+import com.jjt.risk.service.IRiskAnalysisService;
+import com.jjt.risk.service.IRiskModelService;
+import com.jjt.risk.service.IRiskMsConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.text.DecimalFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.util.*;
+
+/**
+ * 风险分析结果Controller
+ *
+ * @author jjt
+ * @date 2024-09-12
+ */
+@Api(tags = "其他风险分析")
+@RestController
+@RequestMapping("/risk/other")
+public class RiskOtherController extends BaseController {
+    @Resource
+    private IRiskAnalysisService riskAnalysisService;
+    @Resource
+    private IRiskModelService riskModelService;
+    @Resource
+    private IBizModelService bizModelService;
+    @Resource
+    private IRiskMsConfigService riskMsConfigService;
+
+    @ApiOperation("模型列表")
+    @GetMapping(value = "/model/list")
+    public AjaxResult modelList() {
+        List<BizModel> list = bizModelService.selectBizModelList(new BizModel());
+        return success(list);
+    }
+
+    @ApiOperation("业务主机分析")
+    @GetMapping(value = "/host/{modelId}")
+    public AjaxResult host(@PathVariable("modelId") Long modelId) {
+        BizModel model = bizModelService.selectBizModelByModelId(modelId);
+        RiskMsConfig q = new RiskMsConfig();
+        q.setConfigType("host");
+        List<RiskMsConfig> configs = riskMsConfigService.selectRiskMsConfigList(q);
+        String[] objs = {"ecs1", "ecs2", "ecs3", "ecs4", "ecs5", "ecs6", "ecs7"};
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (RiskMsConfig config : configs) {
+            Map<String, Object> map = new HashMap<>(16);
+            map.put("title", config.getViewName());
+            List<Map<String, Object>> dataList = new ArrayList<>();
+            for (String obj : objs) {
+                Map<String, Object> dataMap = new HashMap<>(16);
+                String name = model.getModelName() + "-" + obj;
+                dataMap.put("objName", name);
+                dataMap.put("value", new Random().nextInt(100));
+                if ("2".equals(config.getRankingBased())) {
+                    dataMap.put("alarms", new Random().nextInt(50));
+                }
+                dataList.add(dataMap);
+            }
+            map.put("data", dataList);
+            result.add(map);
+        }
+
+        return success(result);
+    }
+
+    @ApiOperation("网络状况分析")
+    @GetMapping(value = "/network/{modelId}/{metricsId}")
+    public AjaxResult network(@PathVariable("modelId") Long modelId, @PathVariable("metricsId") Long metricsId) {
+        BizModel model = bizModelService.selectBizModelByModelId(modelId);
+        RiskMsConfig q = new RiskMsConfig();
+        q.setConfigType("host");
+        List<Map<String, Object>> result = new ArrayList<>();
+        String[] objs = {"node1", "node2", "node3", "ecs4", "业务对象5", "虚拟主机6", "cluster7"};
+        for (String obj : objs) {
+            Map<String, Object> map = new HashMap<>(16);
+            map.put("name", obj);
+
+            List<Map<String, Object>> dataList = new ArrayList<>();
+
+            LocalDateTime ed = LocalDateTime.now();
+            LocalDateTime st = ed.minusDays(30);
+            Random r = new Random();
+            DecimalFormat df = new DecimalFormat("#0.00");
+            do {
+                Map<String, Object> dataMap = new HashMap<>(16);
+                long time = st.toEpochSecond(ZoneOffset.ofHours(8)) * 1000;
+                dataMap.put("time", time);
+                float f = r.nextFloat() * 100;
+                dataMap.put("value", Float.parseFloat(df.format(f)));
+                st = st.plusDays(1);
+                dataList.add(dataMap);
+            } while (!st.isAfter(ed));
+            map.put("data", dataList);
+
+            result.add(map);
+        }
+        return success(result);
+    }
+
+    @ApiOperation("可持续性服务评估")
+    @GetMapping(value = "/server")
+    public AjaxResult server() {
+        Map<String, Object> result = new HashMap<>(16);
+        List<ScoreVO> list = new ArrayList<>();
+        List<Map<String, Object>> topList = new ArrayList<>();
+        String[] names = {"市场服务", "市场出清", "信息发布", "市场合规", "市场结算"};
+        for (int i = 0; i < names.length; i++) {
+            Map<String, Object> map = new HashMap<>(16);
+            map.put("name", names[i]);
+            map.put("score", Float.valueOf(new Random().nextInt(50) + 50));
+            topList.add(map);
+            ScoreVO vo = new ScoreVO();
+            List<String> xData = new ArrayList<>();
+            List<Float> scores = new ArrayList<>();
+            LocalDate time = LocalDate.now().minusDays(31);
+            for (int j = 0; j < 30; j++) {
+                time = time.plusDays(1);
+                xData.add(time.getMonthValue() + "-" + time.getDayOfMonth());
+                Float score = Float.valueOf(new Random().nextInt(50) + 50);
+                scores.add(score);
+            }
+
+            vo.setModelId((long) (i + 1));
+            vo.setModelName(names[i]);
+            vo.setScores(scores);
+            vo.setXData(xData);
+            list.add(vo);
+        }
+        topList.sort(Comparator.comparing(map -> (Float) map.get("score")));
+
+        result.put("trend", list);
+        result.put("top", topList);
+        return success(result);
+    }
+}

+ 7 - 4
jjt-biz/src/main/java/com/jjt/task/AlarmTask.java

@@ -7,6 +7,7 @@ import com.jjt.common.utils.StringUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.Date;
 
 /**
  * 定时任务调度测试
@@ -21,14 +22,16 @@ public class AlarmTask {
     private IBizObjService objService;
 
     public void metrics() {
+        Date date = new Date();
         objService.selectBizObjList(new BizObj()).forEach(obj -> {
-            metricsService.pinpointMetricsValue(obj.getObjId());
-            metricsService.prometheusMetricsValue(obj.getObjId());
+            metricsService.pinpointMetricsValue(obj.getObjId(),date);
+            metricsService.prometheusMetricsValue(obj.getObjId(),date);
         });
     }
     public void test() {
-        metricsService.pinpointMetricsValue(2L);
-        metricsService.prometheusMetricsValue(15L);
+        Date date = new Date();
+        metricsService.pinpointMetricsValue(2L,date);
+        metricsService.prometheusMetricsValue(15L,date);
     }
 
     public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) {

+ 43 - 0
jjt-biz/src/main/java/com/jjt/task/DataTask.java

@@ -0,0 +1,43 @@
+package com.jjt.task;
+
+import com.jjt.biz.domain.BizObj;
+import com.jjt.biz.service.IBizObjMetricsService;
+import com.jjt.biz.service.IBizObjService;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Date;
+
+/**
+ * 定时任务调度测试
+ *
+ * @author jjt
+ */
+@Component("dataTask")
+public class DataTask {
+    @Resource
+    private IBizObjMetricsService metricsService;
+    @Resource
+    private IBizObjService objService;
+
+    public void imitate() {
+        Date s = new Date();
+        objService.selectBizObjList(new BizObj()).forEach(obj -> {
+            metricsService.imitate(obj.getObjId(),new Date());
+        });
+        Date e = new Date();
+        System.err.println(e.getTime()-s.getTime());
+        LocalDateTime ed = LocalDateTime.now();
+        LocalDateTime st = ed.minusDays(1);
+        do {
+            Date date = Date.from(st.atZone(ZoneId.systemDefault()).toInstant());
+            objService.selectBizObjList(new BizObj()).forEach(obj -> {
+                metricsService.imitate(obj.getObjId(), date);
+            });
+            st = st.plusMinutes(15);
+        } while (!st.isAfter(ed));
+    }
+
+}

+ 188 - 0
jjt-biz/src/main/resources/mapper/hl/HlEventMapper.xml

@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jjt.hl.mapper.HlEventMapper">
+
+    <resultMap type="HlEvent" id="HlEventResult">
+        <result property="eventId" column="EVENT_ID"/>
+        <result property="objId" column="OBJ_ID"/>
+        <result property="objMetricsId" column="OBJ_METRICS_ID"/>
+        <result property="startTime" column="START_TIME"/>
+        <result property="endTime" column="END_TIME"/>
+        <result property="eventStatus" column="EVENT_STATUS"/>
+        <result property="eventValue" column="EVENT_VALUE"/>
+        <result property="createBy" column="CREATE_BY"/>
+        <result property="createTime" column="CREATE_TIME"/>
+        <result property="updateBy" column="UPDATE_BY"/>
+        <result property="updateTime" column="UPDATE_TIME"/>
+        <result property="remark" column="REMARK"/>
+    </resultMap>
+
+    <sql id="selectHlEventVo">
+        select EVENT_ID,
+               OBJ_ID,
+               OBJ_METRICS_ID,
+               START_TIME,
+               END_TIME,
+               EVENT_STATUS,
+               EVENT_VALUE,
+               CREATE_BY,
+               CREATE_TIME,
+               UPDATE_BY,
+               UPDATE_TIME,
+               REMARK
+        from hl_event
+    </sql>
+
+    <select id="selectHlEventList" parameterType="HlEvent" resultMap="HlEventResult">
+        <include refid="selectHlEventVo"/>
+        <where>
+            <if test="objId != null ">
+                and OBJ_ID = #{objId}
+            </if>
+            <if test="objMetricsId != null ">
+                and OBJ_METRICS_ID = #{objMetricsId}
+            </if>
+            <if test="params.beginStartTime != null and params.beginStartTime != '' and params.endStartTime != null and params.endStartTime != ''">
+                and START_TIME between #{params.beginStartTime} and #{params.endStartTime}
+            </if>
+            <if test="params.beginEndTime != null and params.beginEndTime != '' and params.endEndTime != null and params.endEndTime != ''">
+                and END_TIME between #{params.beginEndTime} and #{params.endEndTime}
+            </if>
+            <if test="eventStatus != null  and eventStatus != ''">
+                and EVENT_STATUS = #{eventStatus}
+            </if>
+            <if test="eventValue != null ">
+                and EVENT_VALUE = #{eventValue}
+            </if>
+            <if test="createBy != null  and createBy != ''">
+                and CREATE_BY = #{createBy}
+            </if>
+            <if test="createTime != null ">
+                and CREATE_TIME = #{createTime}
+            </if>
+            <if test="updateBy != null  and updateBy != ''">
+                and UPDATE_BY = #{updateBy}
+            </if>
+            <if test="updateTime != null ">
+                and UPDATE_TIME = #{updateTime}
+            </if>
+            <if test="remark != null  and remark != ''">
+                and REMARK = #{remark}
+            </if>
+        </where>
+    </select>
+
+    <select id="selectHlEventByEventId" parameterType="Long"
+            resultMap="HlEventResult">
+        <include refid="selectHlEventVo"/>
+        where EVENT_ID = #{eventId}
+    </select>
+
+    <insert id="insertHlEvent" parameterType="HlEvent" useGeneratedKeys="true"
+            keyProperty="eventId">
+        insert into hl_event
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="objId != null">OBJ_ID,
+            </if>
+            <if test="objMetricsId != null">OBJ_METRICS_ID,
+            </if>
+            <if test="startTime != null">START_TIME,
+            </if>
+            <if test="endTime != null">END_TIME,
+            </if>
+            <if test="eventStatus != null">EVENT_STATUS,
+            </if>
+            <if test="eventValue != null">EVENT_VALUE,
+            </if>
+            <if test="createBy != null">CREATE_BY,
+            </if>
+            <if test="createTime != null">CREATE_TIME,
+            </if>
+            <if test="updateBy != null">UPDATE_BY,
+            </if>
+            <if test="updateTime != null">UPDATE_TIME,
+            </if>
+            <if test="remark != null">REMARK,
+            </if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="objId != null">#{objId},
+            </if>
+            <if test="objMetricsId != null">#{objMetricsId},
+            </if>
+            <if test="startTime != null">#{startTime},
+            </if>
+            <if test="endTime != null">#{endTime},
+            </if>
+            <if test="eventStatus != null">#{eventStatus},
+            </if>
+            <if test="eventValue != null">#{eventValue},
+            </if>
+            <if test="createBy != null">#{createBy},
+            </if>
+            <if test="createTime != null">#{createTime},
+            </if>
+            <if test="updateBy != null">#{updateBy},
+            </if>
+            <if test="updateTime != null">#{updateTime},
+            </if>
+            <if test="remark != null">#{remark},
+            </if>
+        </trim>
+    </insert>
+
+    <update id="updateHlEvent" parameterType="HlEvent">
+        update hl_event
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="objId != null">OBJ_ID =
+                #{objId},
+            </if>
+            <if test="objMetricsId != null">OBJ_METRICS_ID =
+                #{objMetricsId},
+            </if>
+            <if test="startTime != null">START_TIME =
+                #{startTime},
+            </if>
+            <if test="endTime != null">END_TIME =
+                #{endTime},
+            </if>
+            <if test="eventStatus != null">EVENT_STATUS =
+                #{eventStatus},
+            </if>
+            <if test="eventValue != null">EVENT_VALUE =
+                #{eventValue},
+            </if>
+            <if test="createBy != null">CREATE_BY =
+                #{createBy},
+            </if>
+            <if test="createTime != null">CREATE_TIME =
+                #{createTime},
+            </if>
+            <if test="updateBy != null">UPDATE_BY =
+                #{updateBy},
+            </if>
+            <if test="updateTime != null">UPDATE_TIME =
+                #{updateTime},
+            </if>
+            <if test="remark != null">REMARK =
+                #{remark},
+            </if>
+        </trim>
+        where EVENT_ID = #{eventId}
+    </update>
+
+    <delete id="deleteHlEventByEventId" parameterType="Long">
+        delete
+        from hl_event
+        where EVENT_ID = #{eventId}
+    </delete>
+
+    <delete id="deleteHlEventByEventIds" parameterType="String">
+        delete from hl_event where EVENT_ID in
+        <foreach item="eventId" collection="array" open="(" separator="," close=")">
+            #{eventId}
+        </foreach>
+    </delete>
+</mapper>

+ 9 - 0
jjt-biz/src/main/resources/mapper/obj/BizObjMetricsMapper.xml

@@ -16,6 +16,7 @@
         <result property="alarmLow" column="ALARM_LOW"/>
         <result property="alarmMid" column="ALARM_MID"/>
         <result property="alarmHigh" column="ALARM_HIGH"/>
+        <result property="event" column="EVENT"/>
         <result property="dValue" column="D_VALUE"/>
         <result property="dataExp" column="DATA_EXP"/>
         <result property="createBy" column="CREATE_BY"/>
@@ -47,6 +48,7 @@
                      a.ALARM_LOW,
                      a.ALARM_MID,
                      a.ALARM_HIGH,
+                     a.EVENT,
                      a.D_VALUE,
                      a.CREATE_BY,
                      a.CREATE_TIME,
@@ -161,6 +163,8 @@
             </if>
             <if test="alarmHigh != null">ALARM_HIGH,
             </if>
+            <if test="event != null">EVENT,
+            </if>
             <if test="dValue != null">D_VALUE,
             </if>
             <if test="createBy != null">CREATE_BY,
@@ -193,6 +197,8 @@
             </if>
             <if test="alarmHigh != null">#{alarmHigh},
             </if>
+            <if test="event != null">#{event},
+            </if>
             <if test="dValue != null">#{dValue},
             </if>
             <if test="createBy != null">#{createBy},
@@ -247,6 +253,9 @@
             <if test="alarmHigh != null">ALARM_HIGH =
                 #{alarmHigh},
             </if>
+            <if test="event != null">EVENT =
+                #{event},
+            </if>
             <if test="dValue != null">D_VALUE =
                 #{dValue},
             </if>