BizObjMetricsServiceImpl.java 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915
  1. package com.jjt.biz.service.impl;
  2. import com.alibaba.fastjson2.JSONArray;
  3. import com.alibaba.fastjson2.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.jjt.biz.domain.*;
  6. import com.jjt.biz.mapper.AlarmRecordMapper;
  7. import com.jjt.biz.mapper.BizObjMetricsDataMapper;
  8. import com.jjt.biz.mapper.BizObjMetricsMapper;
  9. import com.jjt.biz.service.*;
  10. import com.jjt.common.exception.ServiceException;
  11. import com.jjt.common.utils.DateUtils;
  12. import com.jjt.common.utils.StringUtils;
  13. import com.jjt.hl.domain.HlEvent;
  14. import com.jjt.hl.mapper.HlEventMapper;
  15. import com.jjt.hl.service.IHlEventService;
  16. import com.jjt.system.service.ISysConfigService;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.apache.ibatis.session.ExecutorType;
  19. import org.apache.ibatis.session.SqlSession;
  20. import org.apache.ibatis.session.SqlSessionFactory;
  21. import org.springframework.stereotype.Service;
  22. import javax.annotation.Resource;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.time.LocalDateTime;
  26. import java.util.*;
  27. import java.util.stream.Collectors;
  28. /**
  29. * 业务对象指标Service业务层处理
  30. *
  31. * @author jjt
  32. * @date 2024-08-09
  33. */
  34. @Service
  35. @Slf4j
  36. public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
  37. @Resource
  38. private BizObjMetricsMapper bizObjMetricsMapper;
  39. @Resource
  40. private IMetricsTplDetailService detailService;
  41. @Resource
  42. private IBizObjPpService ppService;
  43. @Resource
  44. private IBizObjService objService;
  45. @Resource
  46. private IBizObjAppService appService;
  47. @Resource
  48. private IPinpointService pinpointService;
  49. @Resource
  50. private IPrometheusService prometheusService;
  51. @Resource
  52. private IBizObjTplService objTplService;
  53. @Resource
  54. private SqlSessionFactory factory;
  55. @Resource
  56. private IAlarmRecordService alarmRecordService;
  57. @Resource
  58. private IBizObjMetricsDataService metricsDataService;
  59. @Resource
  60. private IHlEventService eventService;
  61. @Resource
  62. private ISysConfigService configService;
  63. @Resource
  64. private IBizObjMcService mcService;
  65. /**
  66. * 查询业务对象指标
  67. *
  68. * @param objMetricsId 业务对象指标主键
  69. * @return 业务对象指标
  70. */
  71. @Override
  72. public BizObjMetrics selectBizObjMetricsByObjMetricsId(Long objMetricsId) {
  73. return bizObjMetricsMapper.selectBizObjMetricsByObjMetricsId(objMetricsId);
  74. }
  75. /**
  76. * 查询业务对象指标列表
  77. *
  78. * @param bizObjMetrics 业务对象指标
  79. * @return 业务对象指标
  80. */
  81. @Override
  82. public List<BizObjMetrics> selectBizObjMetricsList(BizObjMetrics bizObjMetrics) {
  83. return bizObjMetricsMapper.selectBizObjMetricsList(bizObjMetrics);
  84. }
  85. /**
  86. * 新增业务对象指标
  87. *
  88. * @param bizObjMetrics 业务对象指标
  89. * @return 结果
  90. */
  91. @Override
  92. public int insertBizObjMetrics(BizObjMetrics bizObjMetrics) {
  93. bizObjMetrics.setCreateTime(DateUtils.getNowDate());
  94. return bizObjMetricsMapper.insertBizObjMetrics(bizObjMetrics);
  95. }
  96. /**
  97. * 修改业务对象指标
  98. *
  99. * @param bizObjMetrics 业务对象指标
  100. * @return 结果
  101. */
  102. @Override
  103. public int updateBizObjMetrics(BizObjMetrics bizObjMetrics) {
  104. //插入数据记录表
  105. bizObjMetrics.setUpdateTime(DateUtils.getNowDate());
  106. return bizObjMetricsMapper.updateBizObjMetrics(bizObjMetrics);
  107. }
  108. /**
  109. * 批量删除业务对象指标
  110. *
  111. * @param objMetricsIds 需要删除的业务对象指标主键
  112. * @return 结果
  113. */
  114. @Override
  115. public int deleteBizObjMetricsByObjMetricsIds(Long[] objMetricsIds) {
  116. return bizObjMetricsMapper.deleteBizObjMetricsByObjMetricsIds(objMetricsIds);
  117. }
  118. /**
  119. * 删除业务对象指标信息
  120. *
  121. * @param objMetricsId 业务对象指标主键
  122. * @return 结果
  123. */
  124. @Override
  125. public int deleteBizObjMetricsByObjMetricsId(Long objMetricsId) {
  126. return bizObjMetricsMapper.deleteBizObjMetricsByObjMetricsId(objMetricsId);
  127. }
  128. /**
  129. * 选择指标,除去当前对象已选择的
  130. *
  131. * @param objId 对象ID
  132. * @return 结果
  133. */
  134. @Override
  135. public List<MetricsDef> selectMetricsDefList(Long objId) {
  136. return bizObjMetricsMapper.selectMetricsDefList(objId);
  137. }
  138. /**
  139. * 添加指标
  140. *
  141. * @param objId 对象ID
  142. * @param metricsIds 指标IDS
  143. * @return 结果
  144. */
  145. @Override
  146. public int insertMetricsDetails(Long objId, Long[] metricsIds) {
  147. BizObj obj = objService.selectBizObjByObjId(objId);
  148. String suffix = "/" + obj.getObjAddr() + ":" + obj.getObjPort();
  149. return bizObjMetricsMapper.insertMetricsDetails(objId, suffix, metricsIds);
  150. }
  151. /**
  152. * 通过objId查询列表
  153. *
  154. * @param objId 对象ID
  155. * @return 结果
  156. */
  157. @Override
  158. public List<BizObjMetrics> selectBizObjMetricsListByObjId(Long objId) {
  159. BizObjMetrics obj = new BizObjMetrics();
  160. obj.setObjId(objId);
  161. return selectBizObjMetricsList(obj);
  162. }
  163. /**
  164. * 通过对象和模板ID删除指标
  165. *
  166. * @param objId 对象ID
  167. * @param tplId 模板ID
  168. */
  169. @Override
  170. public void delete(Long objId, Long tplId) {
  171. QueryWrapper<BizObjMetrics> wrapper = new QueryWrapper<>();
  172. wrapper.eq("obj_id", objId);
  173. wrapper.eq("tpl_id", tplId);
  174. bizObjMetricsMapper.delete(wrapper);
  175. }
  176. /**
  177. * 通过模板ID批量插入指标
  178. * * @param objId 对象ID
  179. *
  180. * @param tplId 模板ID
  181. */
  182. @Override
  183. public void insertBatch(Long objId, Long tplId) {
  184. BizObj obj = objService.selectBizObjByObjId(objId);
  185. MetricsTplDetail query = new MetricsTplDetail();
  186. query.setTplId(tplId);
  187. List<MetricsTplDetail> list = detailService.selectMetricsTplDetailList(query);
  188. List<BizObjMetrics> objMetrics = new ArrayList<>();
  189. list.forEach(d -> {
  190. if ("1".equals(d.getMetricsDef().getMetricsType()) && !d.getMetricsDef().getMetricsCode().startsWith("pp.jvm.")) {
  191. //如果是pinpoint,并且不是jvm参数
  192. // 1.获取对象pinpoint组成
  193. List<BizObjPp> pps = ppService.selectBizObjPpListByObjId(objId);
  194. for (BizObjPp pp : pps) {
  195. BizObjMetrics ms = new BizObjMetrics();
  196. ms.setObjId(objId);
  197. ms.setTplId(tplId);
  198. ms.setMetricsId(d.getMetricsId());
  199. ms.setMetricsName(pp.getPpType() + "/" + d.getMetricsDef().getMetricsName());
  200. ms.setMetricsCode(d.getMetricsCode());
  201. ms.setDataExp(ms.getMetricsCode());
  202. ms.setAlarmLow(d.getAlarmLow());
  203. ms.setAlarmMid(d.getAlarmMid());
  204. ms.setAlarmHigh(d.getAlarmHigh());
  205. ms.setEvent(d.getEvent());
  206. if ("REDIS".equals(pp.getPpType())) {
  207. //redis需要将1s换成100ms 3s换成300ms 5s换成500ms
  208. if (d.getMetricsCode().endsWith("1s")) {
  209. ms.setMetricsName(ms.getMetricsName().replace("1s", "100ms"));
  210. ms.setMetricsCode(ms.getMetricsCode().replace("1s", "100ms"));
  211. }
  212. if (d.getMetricsCode().endsWith("3s")) {
  213. ms.setMetricsName(ms.getMetricsName().replace("3s", "300ms"));
  214. ms.setMetricsCode(ms.getMetricsCode().replace("3s", "300ms"));
  215. }
  216. if (d.getMetricsCode().endsWith("5s")) {
  217. ms.setMetricsName(ms.getMetricsName().replace("5s", "500ms"));
  218. ms.setMetricsCode(ms.getMetricsCode().replace("5s", "500ms"));
  219. }
  220. }
  221. objMetrics.add(ms);
  222. }
  223. } else {
  224. BizObjMetrics ms = new BizObjMetrics();
  225. ms.setObjId(objId);
  226. ms.setTplId(tplId);
  227. ms.setMetricsId(d.getMetricsId());
  228. ms.setMetricsName(d.getMetricsDef().getMetricsName());
  229. ms.setMetricsCode(d.getMetricsCode());
  230. ms.setAlarmLow(d.getAlarmLow());
  231. ms.setAlarmMid(d.getAlarmMid());
  232. ms.setAlarmHigh(d.getAlarmHigh());
  233. ms.setEvent(d.getEvent());
  234. if ("1".equals(d.getMetricsDef().getMetricsType())) {
  235. ms.setDataExp(d.getMetricsCode());
  236. } else {
  237. //如果是普罗米修斯,则需要处理公式
  238. ms.setDataExp(d.getDataExp().replace("${instance}", obj.getObjAddr()));
  239. if ("Y".equals(d.getFindFlag())) {
  240. //如果是自动发现
  241. cn.hutool.json.JSONObject jsonObject = prometheusService.find(d.getFindRule());
  242. cn.hutool.json.JSONArray metric = jsonObject.getByPath("data.result", cn.hutool.json.JSONArray.class);
  243. for (int i = 0; i < metric.size(); i++) {
  244. String v = metric.getJSONObject(i).getByPath("metric." + d.getFindKey(), String.class);
  245. String name = d.getMetricsDef().getMetricsName() + "{" + d.getFindKey() + "=" + v + "}";
  246. String dataExp = ms.getDataExp().replace("${key}", v);
  247. ms.setDataExp(dataExp);
  248. ms.setMetricsName(name);
  249. objMetrics.add(ms);
  250. }
  251. } else {
  252. objMetrics.add(ms);
  253. }
  254. }
  255. }
  256. });
  257. try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
  258. BizObjMetricsMapper mapper = sqlSession.getMapper(BizObjMetricsMapper.class);
  259. objMetrics.forEach(mapper::insertBizObjMetrics);
  260. sqlSession.commit();
  261. }
  262. }
  263. /**
  264. * 根据模板指标修改
  265. *
  266. * @param detail 模板指标
  267. */
  268. @Override
  269. public void update(MetricsTplDetail detail) {
  270. BizObjMetrics om = new BizObjMetrics();
  271. om.setMetricsId(detail.getMetricsId());
  272. om.setTplId(detail.getTplId());
  273. List<BizObjMetrics> list = selectBizObjMetricsList(om);
  274. // if (list.size() > 0) {
  275. list.forEach(obj -> {
  276. //如果有则更新,没有则插入
  277. obj.setAlarmMid(detail.getAlarmMid());
  278. obj.setAlarmLow(detail.getAlarmLow());
  279. obj.setAlarmHigh(detail.getAlarmHigh());
  280. obj.setEvent(detail.getEvent());
  281. bizObjMetricsMapper.updateBizObjMetrics(obj);
  282. });
  283. // } else {
  284. // om.setAlarmLow(detail.getAlarmLow());
  285. // om.setAlarmMid(detail.getAlarmMid());
  286. // om.setAlarmHigh(detail.getAlarmHigh());
  287. // om.setEvent(detail.getEvent());
  288. // insertBizObjMetrics(om);
  289. // }
  290. }
  291. /**
  292. * 根据模板指标删除
  293. *
  294. * @param detail 模板指标
  295. */
  296. @Override
  297. public void del(MetricsTplDetail detail) {
  298. QueryWrapper<BizObjMetrics> wrapper = new QueryWrapper<>();
  299. wrapper.eq("metrics_id", detail.getMetricsId());
  300. wrapper.eq("tpl_id", detail.getTplId());
  301. bizObjMetricsMapper.delete(wrapper);
  302. }
  303. /**
  304. * 根据objId获取指标值
  305. *
  306. * @param objId 对象ID
  307. * @param date 数据时间
  308. */
  309. @Override
  310. public void pinpointMetricsValue(Long objId, Date date) {
  311. BizObj bizObj = objService.selectBizObjByObjId(objId);
  312. if ("1".equals(bizObj.getObjType())) {
  313. // 获取应用程序的code
  314. BizObjApp app = appService.selectBizObjAppByAppId(bizObj.getAppId());
  315. String appName = app.getAppCode();
  316. Long time = Long.parseLong(configService.selectConfigByKey("pp.api.time"));
  317. LocalDateTime endTime = LocalDateTime.now();
  318. LocalDateTime startTime = endTime.minusMinutes(time);
  319. Map<String, String> appMap = pinpointService.getApps();
  320. String appType = appMap.get(appName);
  321. // 获取监控数据
  322. Float tps = pinpointService.tps(appName, startTime, endTime);
  323. int openFiles = pinpointService.openFile(appName, startTime, endTime);
  324. Map<String, Object> jvmInfo = pinpointService.jvmMemory(appName, startTime, endTime);
  325. float heapUsage = (float) jvmInfo.get("usage");
  326. int gcCount = (int) jvmInfo.get("gc");
  327. JSONObject linkData = pinpointService.link(appName, appType, startTime, endTime);
  328. JSONArray nodeDataArray = linkData.getJSONObject("applicationMapData").getJSONArray("nodeDataArray");
  329. List<PinpointVO> pinpointVOList = new ArrayList<>();
  330. for (int i = 0; i < nodeDataArray.size(); i++) {
  331. JSONObject obj = nodeDataArray.getJSONObject(i);
  332. PinpointVO vo = new PinpointVO(obj);
  333. if (vo.getApplicationName().equals(appName)) {
  334. bizObj.setAccessTimes(vo.getTot());
  335. objService.updateBizObj(bizObj);
  336. } else {
  337. pinpointVOList.add(vo);
  338. }
  339. }
  340. // 1.更新 BIZ_OBJ_PP 表
  341. updateBizObjPpTable(objId, pinpointVOList);
  342. // 2.更新业务对象指标表
  343. updateBizObjMetrics(objId, tps, openFiles, heapUsage, gcCount, pinpointVOList, date);
  344. }
  345. }
  346. /**
  347. * 根据objId获取prometheus指标值
  348. *
  349. * @param objId 对象ID
  350. * @param date 时间
  351. */
  352. @Override
  353. public void prometheusMetricsValue(Long objId, Date date) {
  354. List<BizObjMetrics> mList = getAllMetricsForObjIdList(objId);
  355. List<BizObjMetrics> metricsToUpdate = new ArrayList<>();
  356. List<BizObjMetricsData> dataList = new ArrayList<>();
  357. List<AlarmRecord> addRList = new ArrayList<>();
  358. List<AlarmRecord> updateRList = new ArrayList<>();
  359. List<HlEvent> addEList = new ArrayList<>();
  360. List<HlEvent> updateEList = new ArrayList<>();
  361. //查询当前对象所有正在告警列表
  362. Map<Long, AlarmRecord> recordMap = alarmRecordService.selectAlarmRecordListCurr(objId);
  363. //查询当前对象未结束事件列表
  364. Map<Long, HlEvent> eventMap = eventService.selectHlEventListCurr(objId);
  365. mList.stream().filter(om -> !"1".equals(om.getMetricsDef().getMetricsType())).forEach(om -> {
  366. if (StringUtils.isNotEmpty(om.getDataExp())) {
  367. //非pinpoint
  368. Float value = prometheusService.query(om.getDataExp());
  369. if (value != null) {
  370. om.setDValue(BigDecimal.valueOf(value));
  371. BizObjMetricsData data = new BizObjMetricsData();
  372. data.setObjMetricsId(om.getObjMetricsId());
  373. data.setdValue(om.getDValue());
  374. data.setCreateTime(date);
  375. dataList.add(data);
  376. metricsToUpdate.add(om);
  377. //处理告警
  378. Map<String, AlarmRecord> aMap = alarmRecordService.process(om, recordMap, date);
  379. if (aMap.get("add") != null) {
  380. addRList.add(aMap.get("add"));
  381. }
  382. if (aMap.get("update") != null) {
  383. updateRList.add(aMap.get("update"));
  384. }
  385. //处理事件
  386. Map<String, HlEvent> eMap = eventService.process(om, eventMap, date);
  387. if (eMap.get("add") != null) {
  388. addEList.add(eMap.get("add"));
  389. }
  390. if (eMap.get("update") != null) {
  391. updateEList.add(eMap.get("update"));
  392. }
  393. }
  394. }
  395. });
  396. batchUpdate(metricsToUpdate, dataList, addRList, updateRList, addEList, updateEList);
  397. }
  398. /**
  399. * 使用模拟数据
  400. *
  401. * @param objId 对象ID
  402. * @param date 数据时间
  403. */
  404. @Override
  405. // @Async("threadPoolTaskExecutor")
  406. public void imitate(Long objId, Date date) {
  407. List<BizObjMetrics> mList = getAllMetricsForObjIdList(objId);
  408. List<BizObjMetrics> metricsToUpdate = new ArrayList<>();
  409. List<BizObjMetricsData> dataList = new ArrayList<>();
  410. List<AlarmRecord> addRList = new ArrayList<>();
  411. List<AlarmRecord> updateRList = new ArrayList<>();
  412. List<HlEvent> addEList = new ArrayList<>();
  413. List<HlEvent> updateEList = new ArrayList<>();
  414. //查询当前对象所有正在告警列表
  415. Map<Long, AlarmRecord> recordMap = alarmRecordService.selectAlarmRecordListCurr(objId);
  416. //查询当前对象未结束事件列表
  417. Map<Long, HlEvent> eventMap = eventService.selectHlEventListCurr(objId);
  418. Random random = new Random();
  419. mList.stream().forEach(om -> {
  420. double oldV = 100d;
  421. if (om.getDValue() != null) {
  422. oldV = om.getDValue().floatValue();
  423. }
  424. double modifier = oldV * 0.1;
  425. double randomValue = random.nextDouble() * 2 - 1; // 生成-1到1之间的随机数
  426. double value = oldV + modifier * randomValue;
  427. BigDecimal dv = BigDecimal.valueOf(value).setScale(2, RoundingMode.HALF_UP);
  428. // int xxx = (int) (om.getObjMetricsId() % 70);
  429. // float value = (float) random.nextInt(100 - xxx) + xxx;
  430. if (dv.doubleValue() < 10) {
  431. dv = dv.add(BigDecimal.valueOf(10));
  432. }
  433. if ("1".equals(om.getMetricsDef().getMetricsType())) {
  434. dv = dv.setScale(0, RoundingMode.HALF_UP);
  435. }
  436. if (om.getMetricsCode().endsWith("pp.tot")) {
  437. if (dv.doubleValue() < 50) {
  438. dv = dv.add(BigDecimal.valueOf(50));
  439. }
  440. }
  441. if (om.getMetricsCode().endsWith("pp.error")) {
  442. if (dv.doubleValue() > 50) {
  443. dv = dv.subtract(BigDecimal.valueOf(50));
  444. }
  445. }
  446. om.setDValue(dv);
  447. BizObjMetricsData data = new BizObjMetricsData();
  448. data.setObjMetricsId(om.getObjMetricsId());
  449. data.setdValue(om.getDValue());
  450. data.setCreateTime(date);
  451. // metricsDataService.insertBizObjMetricsData(data);
  452. dataList.add(data);
  453. metricsToUpdate.add(om);
  454. //处理告警
  455. Map<String, AlarmRecord> aMap = alarmRecordService.process(om, recordMap, date);
  456. if (aMap.get("add") != null) {
  457. addRList.add(aMap.get("add"));
  458. }
  459. if (aMap.get("update") != null) {
  460. updateRList.add(aMap.get("update"));
  461. }
  462. //处理事件
  463. Map<String, HlEvent> eMap = eventService.process(om, eventMap, date);
  464. if (eMap.get("add") != null) {
  465. addEList.add(eMap.get("add"));
  466. }
  467. if (eMap.get("update") != null) {
  468. updateEList.add(eMap.get("update"));
  469. }
  470. });
  471. batchUpdate(metricsToUpdate, dataList, addRList, updateRList, addEList, updateEList);
  472. }
  473. /**
  474. * 更新公式
  475. *
  476. * @param metricsList 指标列表
  477. * @param userName 用户名
  478. * @return 列表
  479. */
  480. @Override
  481. public String importMetrics(List<BizObjMetrics> metricsList, String userName) {
  482. if (StringUtils.isNull(metricsList) || metricsList.size() == 0) {
  483. throw new ServiceException("导入指标不能为空!");
  484. }
  485. int successNum = 0;
  486. int failureNum = 0;
  487. StringBuilder successMsg = new StringBuilder();
  488. StringBuilder failureMsg = new StringBuilder();
  489. for (BizObjMetrics om : metricsList) {
  490. String metricsName = om.getMetricsName();
  491. try {
  492. om.setUpdateBy(userName);
  493. updateBizObjMetrics(om);
  494. successNum++;
  495. successMsg.append("<br/>" + successNum + "、 " + om.getMetricsName() + " 更新成功");
  496. } catch (Exception e) {
  497. failureNum++;
  498. String msg = "<br/>" + failureNum + "、 " + om.getMetricsName() + " 导入失败:";
  499. failureMsg.append(msg + e.getMessage());
  500. log.error(msg, e);
  501. }
  502. }
  503. if (failureNum > 0) {
  504. failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
  505. throw new ServiceException(failureMsg.toString());
  506. } else {
  507. successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
  508. }
  509. return successMsg.toString();
  510. }
  511. /**
  512. * 插入自定义指标
  513. *
  514. * @param objId 对象ID
  515. */
  516. @Override
  517. public boolean insertMc(Long objId) {
  518. BizObj obj = objService.selectBizObjByObjId(objId);
  519. BizObjMc query = new BizObjMc();
  520. query.setObjId(objId);
  521. List<BizObjMc> list = mcService.selectBizObjMcList(query);
  522. List<BizObjMetrics> objMetrics = new ArrayList<>();
  523. for (BizObjMc d : list) {
  524. BizObjMetrics ms = new BizObjMetrics();
  525. ms.setObjId(objId);
  526. ms.setTplId(-1L);
  527. ms.setMetricsId(d.getMetricsId());
  528. ms.setMetricsName(d.getMetricsName());
  529. ms.setMetricsCode(d.getMetricsCode());
  530. ms.setAlarmLow(d.getAlarmLow());
  531. ms.setAlarmMid(d.getAlarmMid());
  532. ms.setAlarmHigh(d.getAlarmHigh());
  533. ms.setEvent(d.getEvent());
  534. if (StringUtils.isEmpty(d.getDataExp())) {
  535. return false;
  536. }
  537. //如果是普罗米修斯,则需要处理公式
  538. ms.setDataExp(d.getDataExp().replace("${instance}", obj.getObjAddr()));
  539. if ("Y".equals(d.getFindFlag())) {
  540. //如果是自动发现
  541. cn.hutool.json.JSONObject jsonObject = prometheusService.find(d.getFindRule());
  542. cn.hutool.json.JSONArray metric = jsonObject.getByPath("data.result", cn.hutool.json.JSONArray.class);
  543. for (int i = 0; i < metric.size(); i++) {
  544. String v = metric.getJSONObject(i).getByPath("metric." + d.getFindKey(), String.class);
  545. String name = d.getMetricsName() + "{" + d.getFindKey() + "=" + v + "}";
  546. String dataExp = ms.getDataExp().replace("${key}", v);
  547. ms.setDataExp(dataExp);
  548. ms.setMetricsName(name);
  549. objMetrics.add(ms);
  550. }
  551. } else {
  552. objMetrics.add(ms);
  553. }
  554. }
  555. try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
  556. BizObjMetricsMapper mapper = sqlSession.getMapper(BizObjMetricsMapper.class);
  557. objMetrics.forEach(mapper::insertBizObjMetrics);
  558. sqlSession.commit();
  559. }
  560. return true;
  561. }
  562. /**
  563. * 更新BIZ_OBJ_PP
  564. *
  565. * @param objId 对象ID
  566. * @param pinpointVOList PP组成
  567. */
  568. private void updateBizObjPpTable(Long objId, List<PinpointVO> pinpointVOList) {
  569. List<BizObjPp> existingPpList = ppService.selectBizObjPpListByObjId(objId);
  570. Set<String> existingNames = existingPpList.stream()
  571. .map(BizObjPp::getPpName)
  572. .collect(Collectors.toSet());
  573. pinpointVOList.stream()
  574. .filter(vo -> !existingNames.contains(vo.getApplicationName()))
  575. .forEach(vo -> {
  576. BizObjPp pp = new BizObjPp();
  577. pp.setObjId(objId);
  578. pp.setPpKey(vo.getKey());
  579. pp.setPpName(vo.getApplicationName());
  580. pp.setPpType(vo.getCategory());
  581. ppService.insertBizObjPp(pp);
  582. // 根据模板更新业务对象指标表
  583. updateBizObjMetricsFromTemplate(objId, pp);
  584. existingPpList.add(pp);
  585. });
  586. }
  587. /**
  588. * 根据模板更新业务对象指标表
  589. *
  590. * @param objId 对象ID
  591. * @param pp pp对象
  592. */
  593. private void updateBizObjMetricsFromTemplate(Long objId, BizObjPp pp) {
  594. List<BizObjTpl> templateList = objTplService.selectTplList4objId(objId);
  595. templateList.forEach(template -> insertOrUpdateMetricsFromTemplate(objId, template.getTplId(), pp));
  596. }
  597. /**
  598. * 更新模板中的pinpoint指标到业务对象指标
  599. *
  600. * @param objId 对象ID
  601. * @param tplId 模板ID
  602. * @param pp pinpoint组成
  603. */
  604. private void insertOrUpdateMetricsFromTemplate(Long objId, Long tplId, BizObjPp pp) {
  605. MetricsTplDetail query = new MetricsTplDetail();
  606. query.setTplId(tplId);
  607. List<MetricsTplDetail> list = detailService.selectMetricsTplDetailList(query);
  608. List<BizObjMetrics> objMetrics = new ArrayList<>();
  609. list.forEach(d -> {
  610. if ("1".equals(d.getMetricsDef().getMetricsType()) && !d.getMetricsDef().getMetricsCode().startsWith("pp.jvm.")) {
  611. //如果是pinpoint,需要
  612. // 1.获取对象pinpoint组成
  613. BizObjMetrics ms = new BizObjMetrics();
  614. ms.setObjId(objId);
  615. ms.setTplId(tplId);
  616. ms.setMetricsId(d.getMetricsId());
  617. ms.setMetricsName(pp.getPpName() + "/" + d.getMetricsDef().getMetricsName());
  618. ms.setMetricsCode(pp.getPpName() + "/" + d.getMetricsCode());
  619. if (pp.getPpType().equals("REDIS")) {
  620. //redis需要将1s换成100ms 3s换成300ms 5s换成500ms
  621. if (d.getMetricsCode().endsWith("1s")) {
  622. ms.setMetricsName(ms.getMetricsName().replace("1s", "100ms"));
  623. ms.setMetricsCode(ms.getMetricsCode().replace("1s", "100ms"));
  624. }
  625. if (d.getMetricsCode().endsWith("3s")) {
  626. ms.setMetricsName(ms.getMetricsName().replace("3s", "300ms"));
  627. ms.setMetricsCode(ms.getMetricsCode().replace("3s", "300ms"));
  628. }
  629. if (d.getMetricsCode().endsWith("5s")) {
  630. ms.setMetricsName(ms.getMetricsName().replace("5s", "500ms"));
  631. ms.setMetricsCode(ms.getMetricsCode().replace("5s", "500ms"));
  632. }
  633. }
  634. ms.setDataExp(ms.getMetricsCode());
  635. ms.setAlarmLow(d.getAlarmLow());
  636. ms.setAlarmMid(d.getAlarmMid());
  637. ms.setAlarmHigh(d.getAlarmHigh());
  638. objMetrics.add(ms);
  639. }
  640. });
  641. bizObjMetricsMapper.batchInsert(objMetrics);
  642. }
  643. /**
  644. * 更新指标
  645. *
  646. * @param objId 对象ID
  647. * @param tps 系统压力
  648. * @param openFiles 打开文件数量
  649. * @param heapUsage 堆内存使用率
  650. * @param gcCount gc次数
  651. * @param pinpointVOList 链路列表数据
  652. * @param date 时间
  653. */
  654. private void updateBizObjMetrics(Long objId, Float tps, int openFiles, float heapUsage, int gcCount, List<PinpointVO> pinpointVOList, Date date) {
  655. updateJvmMetrics(objId, tps, heapUsage, openFiles, gcCount, date);
  656. updateLinkMetrics(objId, pinpointVOList, date);
  657. }
  658. /**
  659. * 更新jvm指标
  660. *
  661. * @param objId 对象ID
  662. * @param tps 系统压力
  663. * @param openFiles 打开文件数量
  664. * @param heapUsage 堆内存使用率
  665. * @param gcCount gc次数
  666. * @param date 数据时间
  667. */
  668. private void updateJvmMetrics(Long objId, Float tps, float heapUsage, int openFiles, int gcCount, Date date) {
  669. BizObjMetrics jvmMetrics = new BizObjMetrics();
  670. jvmMetrics.setObjId(objId);
  671. //查询当前对象所有正在告警列表
  672. Map<Long, AlarmRecord> recordMap = alarmRecordService.selectAlarmRecordListCurr(objId);
  673. //查询当前对象未结束事件列表
  674. Map<Long, HlEvent> eventMap = eventService.selectHlEventListCurr(objId);
  675. jvmMetrics.setMetricsCode("pp.jvm.");
  676. List<BizObjMetrics> omList = selectBizObjMetricsList(jvmMetrics);
  677. updateMetricsValues(omList, "tps", BigDecimal.valueOf(tps), date, recordMap, eventMap);
  678. updateMetricsValues(omList, "heap.usage", BigDecimal.valueOf(heapUsage), date, recordMap, eventMap);
  679. updateMetricsValues(omList, "open", BigDecimal.valueOf(openFiles), date, recordMap, eventMap);
  680. updateMetricsValues(omList, "gc", BigDecimal.valueOf(gcCount), date, recordMap, eventMap);
  681. }
  682. /**
  683. * jvm指标更新
  684. *
  685. * @param omList jvm指标列表
  686. * @param metricSuffix 指标后缀
  687. * @param value 值
  688. * @param date 数据时间
  689. */
  690. private void updateMetricsValues(List<BizObjMetrics> omList, String metricSuffix, BigDecimal value, Date date, Map<Long, AlarmRecord> recordMap, Map<Long, HlEvent> eventMap) {
  691. List<BizObjMetricsData> dataList = new ArrayList<>();
  692. List<AlarmRecord> addRList = new ArrayList<>();
  693. List<AlarmRecord> updateRList = new ArrayList<>();
  694. List<HlEvent> addEList = new ArrayList<>();
  695. List<HlEvent> updateEList = new ArrayList<>();
  696. omList.stream()
  697. .filter(om -> om.getMetricsCode().endsWith(metricSuffix))
  698. .forEach(om -> {
  699. om.setDValue(value);
  700. updateBizObjMetrics(om);
  701. BizObjMetricsData data = new BizObjMetricsData();
  702. data.setObjMetricsId(om.getObjMetricsId());
  703. data.setCreateTime(date);
  704. data.setdValue(om.getDValue());
  705. dataList.add(data);
  706. //处理告警
  707. Map<String, AlarmRecord> aMap = alarmRecordService.process(om, recordMap, date);
  708. if (aMap.get("add") != null) {
  709. addRList.add(aMap.get("add"));
  710. }
  711. if (aMap.get("update") != null) {
  712. updateRList.add(aMap.get("update"));
  713. }
  714. //处理事件
  715. Map<String, HlEvent> eMap = eventService.process(om, eventMap, date);
  716. if (eMap.get("add") != null) {
  717. addEList.add(eMap.get("add"));
  718. }
  719. if (eMap.get("update") != null) {
  720. updateEList.add(eMap.get("update"));
  721. }
  722. });
  723. batchUpdate(null, dataList, addRList, updateRList, addEList, updateEList);
  724. }
  725. private void batchUpdate(List<BizObjMetrics> metricsToUpdate, List<BizObjMetricsData> dataList, List<AlarmRecord> addRList, List<AlarmRecord> updateRList, List<HlEvent> addEList, List<HlEvent> updateEList) {
  726. // 更新所有需要更新的BizObjMetrics对象
  727. try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
  728. BizObjMetricsMapper mapper = sqlSession.getMapper(BizObjMetricsMapper.class);
  729. if (metricsToUpdate != null && metricsToUpdate.size() > 0) {
  730. metricsToUpdate.forEach(mapper::updateBizObjMetrics);
  731. }
  732. if (dataList != null && dataList.size() > 0) {
  733. BizObjMetricsDataMapper dataMapper = sqlSession.getMapper(BizObjMetricsDataMapper.class);
  734. dataList.forEach(dataMapper::insertBizObjMetricsData);
  735. }
  736. AlarmRecordMapper recordMapper = sqlSession.getMapper(AlarmRecordMapper.class);
  737. if (addRList != null && addRList.size() > 0) {
  738. addRList.forEach(recordMapper::insertAlarmRecord);
  739. }
  740. if (updateRList != null && updateRList.size() > 0) {
  741. updateRList.forEach(recordMapper::updateAlarmRecord);
  742. }
  743. HlEventMapper eventMapper = sqlSession.getMapper(HlEventMapper.class);
  744. if (addEList != null && addEList.size() > 0) {
  745. addEList.forEach(eventMapper::insertHlEvent);
  746. }
  747. if (updateEList != null && updateEList.size() > 0) {
  748. updateEList.forEach(eventMapper::updateHlEvent);
  749. }
  750. sqlSession.commit();
  751. }
  752. }
  753. /**
  754. * 更新链路指标
  755. *
  756. * @param objId 对象ID
  757. * @param pinpointVOList 链路列表
  758. * @param date 时间
  759. */
  760. private void updateLinkMetrics(Long objId, List<PinpointVO> pinpointVOList, Date date) {
  761. Map<String, List<BizObjMetrics>> metricsMap = getAllMetricsForObjId(objId);
  762. pinpointVOList.forEach(vo -> updateMetricsValues(metricsMap, vo, date));
  763. }
  764. /**
  765. * 更新指标
  766. *
  767. * @param metricsMap 指标map
  768. * @param vo pp链路对象
  769. * @param date 时间
  770. */
  771. private void updateMetricsValues(Map<String, List<BizObjMetrics>> metricsMap, PinpointVO vo, Date date) {
  772. for (String code : metricsMap.keySet()) {
  773. List<BizObjMetrics> list = metricsMap.get(code);
  774. list.forEach(om -> {
  775. if (om.getMetricsCode().startsWith(vo.getApplicationName() + "/")) {
  776. if (vo.getTot() != 0) {
  777. updateMetric(om, "pp.1s", vo.getTime1s(), date);
  778. updateMetric(om, "pp.3s", vo.getTime3s(), date);
  779. updateMetric(om, "pp.5s", vo.getTime5s(), date);
  780. updateMetric(om, "pp.100ms", vo.getTime100ms(), date);
  781. updateMetric(om, "pp.300ms", vo.getTime300ms(), date);
  782. updateMetric(om, "pp.500ms", vo.getTime500ms(), date);
  783. updateMetric(om, "pp.tot", vo.getTot(), date);
  784. updateMetric(om, "pp.sum", vo.getSum(), date);
  785. updateMetric(om, "pp.max", vo.getMax(), date);
  786. updateMetric(om, "pp.avg", vo.getAvg(), date);
  787. updateMetric(om, "pp.slow", vo.getSlow(), date);
  788. updateMetric(om, "pp.error", vo.getError(), date);
  789. BigDecimal rate = BigDecimal.valueOf(vo.getTime1s()).divide(BigDecimal.valueOf(vo.getTot()), 2, RoundingMode.HALF_UP);
  790. updateMetric(om, "pp.rate", rate, date);
  791. }
  792. }
  793. });
  794. }
  795. // metricsMap.values().stream()
  796. // .filter(om -> om.getMetricsCode().startsWith(vo.getApplicationName() + "/"))
  797. // .forEach(om -> {
  798. // updateMetric(om, "pp.1s", vo.getTime1s(), date);
  799. // updateMetric(om, "pp.3s", vo.getTime3s(), date);
  800. // updateMetric(om, "pp.5s", vo.getTime5s(), date);
  801. // updateMetric(om, "pp.100ms", vo.getTime100ms(), date);
  802. // updateMetric(om, "pp.300ms", vo.getTime300ms(), date);
  803. // updateMetric(om, "pp.500ms", vo.getTime500ms(), date);
  804. // updateMetric(om, "pp.tot", vo.getTot(), date);
  805. // updateMetric(om, "pp.sum", vo.getSum(), date);
  806. // updateMetric(om, "pp.max", vo.getMax(), date);
  807. // updateMetric(om, "pp.avg", vo.getAvg(), date);
  808. // updateMetric(om, "pp.slow", vo.getSlow(), date);
  809. // updateMetric(om, "pp.error", vo.getError(), date);
  810. // });
  811. }
  812. /**
  813. * 调用更新方法
  814. *
  815. * @param om 对象
  816. * @param suffix 前缘
  817. * @param value 值
  818. * @param date 时间
  819. */
  820. private void updateMetric(BizObjMetrics om, String suffix, Number value, Date date) {
  821. if (om.getMetricsCode().endsWith(suffix) && value != null) {
  822. om.setDValue(BigDecimal.valueOf(value.doubleValue()));
  823. updateBizObjMetrics(om);
  824. BizObjMetricsData data = new BizObjMetricsData();
  825. data.setObjMetricsId(om.getObjMetricsId());
  826. data.setdValue(om.getDValue());
  827. data.setCreateTime(date);
  828. metricsDataService.insertBizObjMetricsData(data);
  829. }
  830. }
  831. /**
  832. * 获取所有指标对象,并以code转换成map
  833. *
  834. * @param objId 对象ID
  835. * @return map
  836. */
  837. private Map<String, List<BizObjMetrics>> getAllMetricsForObjId(Long objId) {
  838. return getAllMetricsForObjIdList(objId).stream().collect(Collectors.groupingBy(BizObjMetrics::getMetricsCode));
  839. }
  840. /**
  841. * 根据对象ID获取所有指标
  842. *
  843. * @param objId 对象ID
  844. * @return
  845. */
  846. private List<BizObjMetrics> getAllMetricsForObjIdList(Long objId) {
  847. BizObjMetrics search = new BizObjMetrics();
  848. search.setObjId(objId);
  849. return selectBizObjMetricsList(search);
  850. }
  851. }