Bläddra i källkod

获取指标值,判断告警并入库

wukai 9 månader sedan
förälder
incheckning
76ed7239d8

+ 25 - 1
jjt-admin/src/test/java/com/test/HttpTest.java

@@ -3,11 +3,13 @@ package com.test;
 import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.jjt.common.utils.http.HttpUtils;
+import org.yaml.snakeyaml.util.UriEncoder;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
+import java.util.Date;
 
 /**
  * HttpTest$
@@ -22,11 +24,13 @@ public class HttpTest {
 //
 //        System.err.println(f==0f);
 ////        apps();
-        link();
+//        link();
 //        tps();
 //        jvmGC();
 //        fileDesc();
 //        System.err.println(array);
+        query();
+
     }
 
     public static void apps() {
@@ -125,4 +129,24 @@ public class HttpTest {
 //            }
 //        }
     }
+
+    public static void query() {
+        String param = "sort_desc(sum by(instance,job)(node_filesystem_size_bytes{ job=\"master\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}-node_filesystem_free_bytes{ job=\"master\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}) *100/ sum by(instance,job)(node_filesystem_avail_bytes { job=\"master\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}+(node_filesystem_size_bytes{ job=\"master\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"}-node_filesystem_free_bytes{ job=\"master\",fstype=~\"ext.*|xfs\",mountpoint !~\".*pod.*\"})))";
+        String uri = "http://192.168.188.66:9090/api/v1/query?query=";
+        uri += UriEncoder.encode(param);
+        String result = HttpUtils.sendGet(uri);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        System.err.println(jsonObject);
+        JSONArray array = jsonObject.getJSONObject("data").getJSONArray("result");
+        JSONArray value = array.getJSONObject(0).getJSONArray("value");
+        System.err.println(new Date(value.getLongValue(0)*1000));
+        System.err.println(value.getFloat(1));
+//        for (int i = 0; i < array.size(); i++) {
+//            JSONArray arr = array.getJSONArray(i);
+//            float v = arr.getFloat(2);
+//            if (v != 0f) {
+//                System.err.println(v);
+//            }
+//        }
+    }
 }

+ 4 - 1
jjt-biz/src/main/java/com/jjt/biz/controller/MetricsDefController.java

@@ -74,7 +74,10 @@ public class MetricsDefController extends BaseController {
     @Log(title = "指标定义", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody MetricsDef metricsDef) {
-        return toAjax(metricsDefService.insertMetricsDef(metricsDef));
+        int r = metricsDefService.insertMetricsDef(metricsDef);
+        metricsDef.setMetricsCode("D_" + (10000 + metricsDef.getMetricsId()));
+        metricsDefService.updateMetricsDef(metricsDef);
+        return toAjax(r);
     }
 
     /**

+ 4 - 1
jjt-biz/src/main/java/com/jjt/biz/domain/BizObjMetrics.java

@@ -72,6 +72,9 @@ public class BizObjMetrics extends BaseEntity {
     @ApiModelProperty("指标定义")
     private MetricsDef metricsDef;
     @ApiModelProperty("指标当前值")
-    @Excel(name = "指标当前值")
     private BigDecimal dValue;
+    @ApiModelProperty("数据接口")
+    private String dataExp;
+
+
 }

+ 4 - 3
jjt-biz/src/main/java/com/jjt/biz/service/IPrometheusService.java

@@ -10,16 +10,17 @@ import com.alibaba.fastjson2.JSONObject;
  */
 public interface IPrometheusService {
     /**
-     * pinpoint接口查询
+     * 即时查询
      *
+     * @param param 查询参数
      * @return 结果
      */
-    public JSONObject pinpoint();
+    Float query(String param);
 
     /**
      * 普罗米修斯接口
      *
      * @return 结果
      */
-    public JSONObject prometheus();
+    JSONObject range();
 }

+ 73 - 3
jjt-biz/src/main/java/com/jjt/biz/service/impl/BizObjMetricsServiceImpl.java

@@ -8,6 +8,8 @@ import com.jjt.biz.domain.*;
 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 org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -44,9 +46,13 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
     @Resource
     private IPinpointService pinpointService;
     @Resource
+    private IPrometheusService prometheusService;
+    @Resource
     private IBizObjTplService objTplService;
     @Resource
     private SqlSessionFactory factory;
+    @Resource
+    private IAlarmRecordService alarmRecordService;
 
     /**
      * 查询业务对象指标
@@ -90,6 +96,7 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      */
     @Override
     public int updateBizObjMetrics(BizObjMetrics bizObjMetrics) {
+        //插入数据记录表
         bizObjMetrics.setUpdateTime(DateUtils.getNowDate());
         return bizObjMetricsMapper.updateBizObjMetrics(bizObjMetrics);
     }
@@ -317,7 +324,55 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      */
     @Override
     public void prometheusMetricsValue(Long objId) {
+        List<BizObjMetrics> mList = getAllMetricsForObjIdList(objId);
+        List<BizObjMetrics> metricsToUpdate = new ArrayList<>();
+        mList.stream().filter(om -> !"1".equals(om.getMetricsDef().getMetricsType())).forEach(om -> {
+            //非pinpoint
+            Float value = prometheusService.query(om.getDataExp());
+            String alarmLevel = getAlarmLevel(value, om);
+
+            if (alarmLevel != null) {
+                insertAlarm(om, alarmLevel);
+            }
+
+            om.setDValue(BigDecimal.valueOf(value));
+            metricsToUpdate.add(om);
+        });
+        // 更新所有需要更新的BizObjMetrics对象
+        metricsToUpdate.forEach(this::updateBizObjMetrics);
+
+    }
+
+    /**
+     * 获取告警等级
+     *
+     * @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;
+    }
 
+    /**
+     * 添加告警记录
+     *
+     * @param om         指标对象
+     * @param alarmLevel 告警等级
+     */
+    private void insertAlarm(BizObjMetrics om, String alarmLevel) {
+        AlarmRecord record = new AlarmRecord();
+        record.setObjId(om.getObjId());
+        record.setObjMetricsId(om.getObjMetricsId());
+        record.setAlarmLevel(alarmLevel);
+        alarmRecordService.insertAlarmRecord(record);
     }
 
     /**
@@ -452,6 +507,11 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
         omList.stream()
                 .filter(om -> om.getMetricsCode().endsWith(metricSuffix))
                 .forEach(om -> {
+                    String alarmLevel = getAlarmLevel(value.floatValue(), om);
+
+                    if (alarmLevel != null) {
+                        insertAlarm(om, alarmLevel);
+                    }
                     om.setDValue(value);
                     updateBizObjMetrics(om);
                 });
@@ -502,7 +562,7 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * @param value  值
      */
     private void updateMetric(BizObjMetrics om, String suffix, Number value) {
-        if (om.getMetricsCode().endsWith(suffix)) {
+        if (om.getMetricsCode().endsWith(suffix) && value != null) {
             om.setDValue(BigDecimal.valueOf(value.doubleValue()));
             updateBizObjMetrics(om);
         }
@@ -515,10 +575,20 @@ public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
      * @return map
      */
     private Map<String, BizObjMetrics> getAllMetricsForObjId(Long objId) {
+        return getAllMetricsForObjIdList(objId).stream()
+                .collect(Collectors.toMap(BizObjMetrics::getMetricsCode, Function.identity()));
+    }
+
+    /**
+     * 根据对象ID获取所有指标
+     *
+     * @param objId 对象ID
+     * @return
+     */
+    private List<BizObjMetrics> getAllMetricsForObjIdList(Long objId) {
         BizObjMetrics search = new BizObjMetrics();
         search.setObjId(objId);
-        return selectBizObjMetricsList(search).stream()
-                .collect(Collectors.toMap(BizObjMetrics::getMetricsCode, Function.identity()));
+        return selectBizObjMetricsList(search);
     }
 
 }

+ 36 - 5
jjt-biz/src/main/java/com/jjt/biz/service/impl/PrometheusServiceImpl.java

@@ -1,12 +1,17 @@
 package com.jjt.biz.service.impl;
 
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
-import com.jjt.biz.service.IPinpointService;
 import com.jjt.biz.service.IPrometheusService;
+import com.jjt.common.core.redis.RedisCache;
+import com.jjt.common.utils.http.HttpUtils;
 import com.jjt.system.service.ISysConfigService;
 import org.springframework.stereotype.Service;
+import org.yaml.snakeyaml.util.UriEncoder;
 
 import javax.annotation.Resource;
+import java.text.DecimalFormat;
+import java.util.Date;
 
 /**
  * 告警记录Service业务层处理
@@ -16,15 +21,41 @@ import javax.annotation.Resource;
  */
 @Service
 public class PrometheusServiceImpl implements IPrometheusService {
+    @Resource
+    private ISysConfigService configService;
+    @Resource
+    private RedisCache redisCache;
 
     /**
-     * pinpoint接口查询
+     * 获取接口地址
      *
+     * @return 接口地址
+     */
+    private String baseUri() {
+        return configService.selectConfigByKey("pm.url");
+    }
+    /**
+     * 即时查询
+     *
+     * @param param 查询参数
      * @return 结果
      */
     @Override
-    public JSONObject pinpoint() {
-        return null;
+    public Float query(String param) {
+        float v = 0f;
+        String uri = baseUri() + "/api/v1/query?query=";
+        uri += UriEncoder.encode(param);
+        String result = HttpUtils.sendGet(uri);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        JSONArray array = jsonObject.getJSONObject("data").getJSONArray("result");
+        try {
+            JSONArray value = array.getJSONObject(0).getJSONArray("value");
+            DecimalFormat df = new DecimalFormat("#0.00");
+            v = Float.parseFloat(df.format(value.getFloat(1)));
+
+        } catch (Exception ignored) {
+        }
+        return v;
     }
 
     /**
@@ -33,7 +64,7 @@ public class PrometheusServiceImpl implements IPrometheusService {
      * @return 结果
      */
     @Override
-    public JSONObject prometheus() {
+    public JSONObject range() {
         return null;
     }
 }

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

@@ -15,6 +15,7 @@
         <result property="alarmMid" column="ALARM_MID"/>
         <result property="alarmHigh" column="ALARM_HIGH"/>
         <result property="dValue" column="D_VALUE"/>
+        <result property="dataExp" column="DATA_EXP"/>
         <result property="createBy" column="CREATE_BY"/>
         <result property="createTime" column="CREATE_TIME"/>
         <result property="updateBy" column="UPDATE_BY"/>
@@ -40,6 +41,7 @@
                      a.METRICS_ID,
                      a.METRICS_NAME,
                      a.METRICS_CODE,
+                     a.DATA_EXP,
                      a.ALARM_LOW,
                      a.ALARM_MID,
                      a.ALARM_HIGH,
@@ -142,6 +144,8 @@
             </if>
             <if test="metricsCode != null">METRICS_CODE,
             </if>
+            <if test="dataExp != null">DATA_EXP,
+            </if>
             <if test="alarmLow != null">ALARM_LOW,
             </if>
             <if test="alarmMid != null">ALARM_MID,
@@ -172,6 +176,8 @@
             </if>
             <if test="metricsCode != null">#{metricsCode},
             </if>
+            <if test="dataExp != null">#{dataExp},
+            </if>
             <if test="alarmLow != null">#{alarmLow},
             </if>
             <if test="alarmMid != null">#{alarmMid},
@@ -221,6 +227,8 @@
             <if test="metricsCode != null">METRICS_CODE =
                 #{metricsCode},
             </if>
+            <if test="dataExp != null">DATA_EXP=#{dataExp},
+            </if>
             <if test="alarmLow != null">ALARM_LOW =
                 #{alarmLow},
             </if>

+ 5 - 5
jjt-common/src/main/java/com/jjt/common/utils/IntervalUtil.java

@@ -45,7 +45,7 @@ public class IntervalUtil {
      * @param numRange 开闭区间
      * @return boolean
      */
-    public static boolean inNumRange(int number, String numRange) {
+    public static boolean inNumRange(float number, String numRange) {
         Objects.requireNonNull(numRange);
 
         if (!isValidNumRange(numRange)) {
@@ -68,10 +68,10 @@ public class IntervalUtil {
     }
 
     public static void main(String[] args) {
-        System.out.println(inNumRange(1, "(0, 2]"));
-        System.out.println(inNumRange(1, "(, 2]"));
-        System.out.println(inNumRange(1, "(1, 4]"));
-        System.out.println(inNumRange(1, "(0, ]"));
+        System.out.println(inNumRange(1f, "(0, 2]"));
+        System.out.println(inNumRange(1f, "(, 2]"));
+        System.out.println(inNumRange(1f, "(1, 4]"));
+        System.out.println(inNumRange(1f, "(0, ]"));
     }
 
 }