Răsfoiți Sursa

搞定预测分析接口

wukai 8 luni în urmă
părinte
comite
108eb54a0a

+ 0 - 1
jjt-biz/src/main/java/com/jjt/hl/mapper/HlMetricsMapper.java

@@ -81,7 +81,6 @@ public interface HlMetricsMapper extends BaseMapper<HlMetrics> {
     List<HlMetricsVO> hlMetricsList(Long hlClassId);
     /**
      * 根据日期和模型查询所有存在单次扣分的指标
-     * 并按metricsId分组
      *
      * @param modelId 健康度分类ID
      * @param date    日期

+ 80 - 33
jjt-biz/src/main/java/com/jjt/risk/controller/RiskAnalysisController.java

@@ -1,7 +1,8 @@
 package com.jjt.risk.controller;
 
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
 import com.jjt.biz.domain.BizObj;
-import com.jjt.biz.domain.BizObjData;
 import com.jjt.biz.domain.BizObjMetrics;
 import com.jjt.biz.domain.BizObjMetricsData;
 import com.jjt.biz.service.IBizObjMetricsDataService;
@@ -12,12 +13,14 @@ 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.http.HttpUtils;
 import com.jjt.common.utils.poi.ExcelUtil;
 import com.jjt.risk.domain.RiskAnalysis;
 import com.jjt.risk.domain.RiskModel;
 import com.jjt.risk.domain.RiskObj;
 import com.jjt.risk.service.IRiskAnalysisService;
 import com.jjt.risk.service.IRiskModelService;
+import com.jjt.system.service.ISysConfigService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -26,6 +29,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.io.UnsupportedEncodingException;
 import java.text.DecimalFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
@@ -55,6 +59,8 @@ public class RiskAnalysisController extends BaseController {
     private IBizObjMetricsService objMetricsService;
     @Resource
     private IBizObjMetricsDataService dataService;
+    @Resource
+    private ISysConfigService configService;
 
     /**
      * 查询风险分析结果列表
@@ -94,35 +100,55 @@ public class RiskAnalysisController extends BaseController {
 
     @ApiOperation("立即分析")
     @GetMapping(value = "/atOnce/{riskId}")
-    public AjaxResult atOnce(@PathVariable("riskId") Long riskId) {
+    public AjaxResult atOnce(@PathVariable("riskId") Long riskId) throws UnsupportedEncodingException {
+        String uri = configService.selectConfigByKey("risk.api.uri");
         RiskModel rm = riskModelService.selectRiskModelByRiskId(riskId);
-
-
-        String sql = "SELECT img_path FROM risk_analysis WHERE result_id=?";
-        String ra_1 = jdbcTemplate.queryForObject(sql, String.class, -1L);
-        String ra_2 = jdbcTemplate.queryForObject(sql, String.class, -2L);
         List<Long> objIds = new ArrayList<>();
+        //找到对象
         if ("1".equals(rm.getObjType())) {
+            //1.所有对象
             List<BizObj> list = objService.selectBizObjListByMetricsId(rm.getMetricsId());
             if (list != null) {
                 objIds = list.stream().map(BizObj::getObjId).collect(Collectors.toList());
             }
         } else {
+            //2.选择的对象
             List<RiskObj> objList = rm.getRiskObjList();
             if (objList != null) {
                 objIds = objList.stream().map(RiskObj::getObjId).collect(Collectors.toList());
             }
         }
 
+        BizObjMetrics queryOm = new BizObjMetrics();
+        queryOm.setMetricsId(rm.getMetricsId());
+        List<BizObjMetrics> allMetrics = objMetricsService.selectBizObjMetricsList(queryOm);
+        Map<Long, List<BizObjMetrics>> objMap = allMetrics.stream().collect(Collectors.groupingBy(BizObjMetrics::getObjId));
         Date time = new Date();
 //        rm.getRiskObjList()
         Random r = new Random();
         if ("3".equals(rm.getRiskType())) {
-//            if()
+            List<Long> finalObjIds = objIds;
+            List<BizObjMetrics> list = allMetrics.stream().filter(om -> finalObjIds.contains(om.getObjId())).collect(Collectors.toList());
+            list = list.stream().sorted(Comparator.comparing(BizObjMetrics::getDValue).reversed()).collect(Collectors.toList());
+            JSONObject jsonObject = new JSONObject();
+            JSONArray dataArr = new JSONArray();
+            JSONArray inputArr = new JSONArray();
+            list.forEach(bom -> {
+                dataArr.add(bom.getDValue().floatValue());
+                JSONObject temp = new JSONObject();
+                temp.put("id", bom.getObjMetricsId());
+                temp.put("name", bom.getObjName() + "-" + bom.getMetricsName());
+                temp.put("num", bom.getDValue().floatValue());
+                inputArr.add(temp);
+            });
+            jsonObject.put("data", dataArr);
+            JSONObject result = JSONObject.parseObject(HttpUtils.dataPost(uri + "/api/sas/diff", jsonObject));
             RiskAnalysis ra = new RiskAnalysis();
             ra.setRiskId(riskId);
             ra.setAnalyseTime(time);
-            ra.setImgPath(ra_2);
+            // 假设jsonArray是已有的JSONArray对象
+            ra.setInput(inputArr.toString());
+            ra.setImgPath("data:image/png;base64," + result.getJSONObject("data").getString("diff"));
             riskAnalysisService.insertRiskAnalysis(ra);
             return type3info(ra.getResultId());
         } else {
@@ -135,36 +161,67 @@ public class RiskAnalysisController extends BaseController {
             endTime = beginTime;
             beginTime = endTime.minusDays(7);
             Map<String, Object> lastParams = new HashMap<>(16);
-            currParams.put("beginTime", beginTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-            currParams.put("endTime", endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            lastParams.put("beginTime", beginTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            lastParams.put("endTime", endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
 
             for (Long objId : objIds) {
-                BizObjMetrics queryOm = new BizObjMetrics();
-                queryOm.setMetricsId(rm.getMetricsId());
-                queryOm.setObjId(objId);
-                List<BizObjMetrics> list = objMetricsService.selectBizObjMetricsList(queryOm);
+                List<BizObjMetrics> list = objMap.get(objId);
 
                 list.forEach(om -> {
                     //查询2周的数据,调用python接口,并且存储?
                     BizObjMetricsData currQ = new BizObjMetricsData();
+                    currQ.setObjMetricsId(om.getObjMetricsId());
                     currQ.setParams(currParams);
                     BizObjMetricsData lastQ = new BizObjMetricsData();
+                    lastQ.setObjMetricsId(om.getObjMetricsId());
                     lastQ.setParams(lastParams);
                     List<BizObjMetricsData> currList = dataService.selectBizObjMetricsDataList(currQ);
                     List<BizObjMetricsData> lastList = dataService.selectBizObjMetricsDataList(lastQ);
-                    // "level":rm.getConfidenceLevel().floatValue();
 
+
+                    JSONArray currArr = new JSONArray();
+                    JSONArray lastArr = new JSONArray();
+                    JSONArray sortArr = new JSONArray();
+                    //用于补数据,因为需要本周的长度与上周相等
+                    int dataSize = currList.size();
+                    if (lastList.size() > dataSize) {
+                        dataSize = lastList.size();
+                    }
+
+                    for (int i = 0; i < dataSize; i++) {
+                        int currIndex = i;
+                        int lastIndex = i;
+                        if (currIndex >= currList.size()) {
+                            currIndex = currIndex - currList.size();
+                        }
+                        if (lastIndex >= lastList.size()) {
+                            lastIndex = lastIndex - lastList.size();
+                        }
+                        BizObjMetricsData curr = currList.get(currIndex);
+                        currArr.add(curr.getdValue().floatValue());
+
+                        BizObjMetricsData last = lastList.get(lastIndex);
+                        lastArr.add(last.getdValue().floatValue());
+                        sortArr.add(i + 1);
+                    }
+
+                    JSONObject jsonObject = new JSONObject();
+                    jsonObject.put("level", rm.getConfidenceLevel().floatValue());
+                    jsonObject.put("curr", currArr);
+                    jsonObject.put("last", lastArr);
+                    jsonObject.put("sort", sortArr);
+                    JSONObject result = JSONObject.parseObject(HttpUtils.dataPost(uri + "/api/sas/trend", jsonObject));
+                    JSONObject data = result.getJSONObject("data");
                     RiskAnalysis ra = new RiskAnalysis();
                     ra.setRiskId(riskId);
                     ra.setObjId(om.getObjMetricsId());
-                    ra.setResult("趋势好转");
-                    ra.setAvgValue("98,88");
-                    ra.setNormalValid("通过");
-                    ra.setVarianceValid("通过");
+                    ra.setInput(jsonObject.toString());
+                    ra.setResult(data.getString("trend"));
+                    ra.setAvgValue(data.getString("ttest"));
+                    ra.setNormalValid(data.getString("shapiro"));
+                    ra.setVarianceValid(data.getString("levene"));
                     ra.setConfidenceLevel(rm.getConfidenceLevel().toString());
-                    ra.setPValue(r.nextInt(100) + "");
                     ra.setAnalyseTime(time);
-                    ra.setImgPath(ra_1);
                     riskAnalysisService.insertRiskAnalysis(ra);
                 });
 //                rm.getMetricsId()
@@ -180,19 +237,9 @@ public class RiskAnalysisController extends BaseController {
     public AjaxResult type3info(@PathVariable("resultId") Long resultId) {
         Map<String, Object> result = new HashMap<>(16);
         RiskAnalysis analysis = riskAnalysisService.selectRiskAnalysisByResultId(resultId);
-        List<Map<String, Object>> list = new ArrayList();
-        String[] names = {"基础支撑", "运行环境", "ES搜索服务", "nginx", "redis"};
-        for (int i = 0; i < names.length; i++) {
-            Map<String, Object> map = new HashMap<>(16);
-            map.put("id", (i + 1));
-            map.put("name", names[i]);
-            long num = Long.valueOf(new Random().nextInt(200) + 10);
-            map.put("num", num);
-            list.add(map);
-        }
 
         result.put("imgPath", analysis.getImgPath());
-        result.put("top", list);
+        result.put("top", JSONArray.parseArray(analysis.getInput()));
         return success(result);
     }
 

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

@@ -65,6 +65,7 @@ public class RiskOtherController extends BaseController {
             for (String obj : objs) {
                 Map<String, Object> dataMap = new HashMap<>(16);
                 String name = model.getModelName() + "-" + obj;
+                dataMap.put("id", new Random().nextInt(30) + 1);
                 dataMap.put("objName", name);
                 dataMap.put("value", new Random().nextInt(100));
                 if ("2".equals(config.getRankingBased())) {
@@ -79,6 +80,25 @@ public class RiskOtherController extends BaseController {
         return success(result);
     }
 
+    @ApiOperation("业务主机分析趋势")
+    @GetMapping(value = "/host/trend/{id}")
+    public AjaxResult hostTrend(@PathVariable("id") Long id) {
+        Map<String, Object> result = new HashMap<>(16);
+        List<String> xData = new ArrayList<>();
+        List<Float> curr = 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);
+            curr.add(score);
+        }
+
+        result.put("time", xData);
+        result.put("data", curr);
+        return success(result);
+    }
+
     @ApiOperation("网络状况分析")
     @GetMapping(value = "/network/{modelId}/{metricsId}")
     public AjaxResult network(@PathVariable("modelId") Long modelId, @PathVariable("metricsId") Long metricsId) {
@@ -110,6 +130,7 @@ public class RiskOtherController extends BaseController {
 
             result.add(map);
         }
+
         return success(result);
     }
 

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

@@ -56,6 +56,8 @@ public class RiskAnalysis extends BaseEntity {
     @ApiModelProperty("分析结果")
     @Excel(name = "分析结果")
     private String result;
+    @ApiModelProperty("输入参数")
+    private String input;
 
     /**
      * 均值比较

+ 1 - 1
jjt-biz/src/main/resources/mapper/obj/BizObjMetricsDataMapper.xml

@@ -31,8 +31,8 @@
             <if test="params.beginTime != null and params.beginTime != '' and params.endTime != null and params.endTime != ''">
                 and CREATE_TIME between #{params.beginTime} and #{params.endTime}
             </if>
-            order by create_time
         </where>
+        order by create_time
     </select>
 
     <select id="selectBizObjMetricsDataByDataId" parameterType="Long"

+ 9 - 0
jjt-biz/src/main/resources/mapper/risk/RiskAnalysisMapper.xml

@@ -9,6 +9,7 @@
         <result property="riskId" column="RISK_ID"/>
         <result property="riskType" column="RISK_TYPE"/>
         <result property="result" column="RESULT"/>
+        <result property="input" column="INPUT"/>
         <result property="avgValue" column="AVG_VALUE"/>
         <result property="normalValid" column="NORMAL_VALID"/>
         <result property="varianceValid" column="VARIANCE_VALID"/>
@@ -28,6 +29,7 @@
         FROM (SELECT A.RESULT_ID,
                      A.RISK_ID,
                      A.RESULT,
+                     A.INPUT,
                      A.RISK_TYPE,
                      A.AVG_VALUE,
                      A.NORMAL_VALID,
@@ -130,6 +132,8 @@
             </if>
             <if test="result != null">RESULT,
             </if>
+            <if test="input != null">INPUT,
+            </if>
             <if test="avgValue != null">AVG_VALUE,
             </if>
             <if test="normalValid != null">NORMAL_VALID,
@@ -162,6 +166,8 @@
             </if>
             <if test="result != null">#{result},
             </if>
+            <if test="input != null">#{input},
+            </if>
             <if test="avgValue != null">#{avgValue},
             </if>
             <if test="normalValid != null">#{normalValid},
@@ -198,6 +204,9 @@
             <if test="result != null">RESULT =
                 #{result},
             </if>
+             <if test="input != null">INPUT =
+                #{input},
+            </if>
             <if test="avgValue != null">AVG_VALUE =
                 #{avgValue},
             </if>

+ 62 - 0
jjt-common/src/main/java/com/jjt/common/utils/http/HttpUtils.java

@@ -1,5 +1,6 @@
 package com.jjt.common.utils.http;
 
+import com.alibaba.fastjson2.JSONObject;
 import com.jjt.common.constant.Constants;
 import com.jjt.common.utils.StringUtils;
 import org.slf4j.Logger;
@@ -92,6 +93,67 @@ public class HttpUtils {
     /**
      * 向指定 URL 发送POST方法的请求
      *
+     * @param url 发送请求的 URL
+     * @param obj 请求参数,请求参数应该是JSONObject 的形式。
+     * @return 所代表远程资源的响应结果
+     */
+    public static String dataPost(String url, JSONObject obj) {
+        OutputStreamWriter out = null;
+        BufferedReader in = null;
+        StringBuilder result = new StringBuilder();
+        try {
+            String urlNameString = url;
+            log.info("sendPost - {}", urlNameString);
+            URL realUrl = new URL(urlNameString);
+            URLConnection conn = realUrl.openConnection();
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("Content-Type", "application/json");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Accept-Charset", "utf-8");
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            String json = obj.toJSONString();
+
+            //发送post请求
+            out = new OutputStreamWriter(conn.getOutputStream(), "utf-8");
+            out.write(json);
+            out.flush();
+
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result.append(line);
+            }
+            log.info("recv - {}", result);
+        } catch (ConnectException e) {
+            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",obj=" + obj, e);
+        } catch (SocketTimeoutException e) {
+            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",obj=" + obj, e);
+        } catch (IOException e) {
+            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",obj=" + obj, e);
+        } catch (Exception e) {
+            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",obj=" + obj, e);
+        } finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                log.error("调用in.close Exception, url=" + url + ",obj=" + obj, ex);
+            }
+        }
+        return result.toString();
+    }
+
+
+    /**
+     * 向指定 URL 发送POST方法的请求
+     *
      * @param url   发送请求的 URL
      * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
      * @return 所代表远程资源的响应结果