BizObjMetricsServiceImpl.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  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.BizObjMetricsMapper;
  7. import com.jjt.biz.service.*;
  8. import com.jjt.common.utils.DateUtils;
  9. import com.jjt.common.utils.IntervalUtil;
  10. import com.jjt.common.utils.StringUtils;
  11. import org.apache.ibatis.session.ExecutorType;
  12. import org.apache.ibatis.session.SqlSession;
  13. import org.apache.ibatis.session.SqlSessionFactory;
  14. import org.springframework.stereotype.Service;
  15. import javax.annotation.Resource;
  16. import java.math.BigDecimal;
  17. import java.time.LocalDateTime;
  18. import java.util.*;
  19. import java.util.function.Function;
  20. import java.util.stream.Collectors;
  21. /**
  22. * 业务对象指标Service业务层处理
  23. *
  24. * @author jjt
  25. * @date 2024-08-09
  26. */
  27. @Service
  28. public class BizObjMetricsServiceImpl implements IBizObjMetricsService {
  29. @Resource
  30. private BizObjMetricsMapper bizObjMetricsMapper;
  31. @Resource
  32. private IMetricsTplDetailService detailService;
  33. @Resource
  34. private IBizObjPpService ppService;
  35. @Resource
  36. private IBizObjService objService;
  37. @Resource
  38. private IBizObjAppService appService;
  39. @Resource
  40. private IPinpointService pinpointService;
  41. @Resource
  42. private IPrometheusService prometheusService;
  43. @Resource
  44. private IBizObjTplService objTplService;
  45. @Resource
  46. private SqlSessionFactory factory;
  47. @Resource
  48. private IAlarmRecordService alarmRecordService;
  49. @Resource
  50. private IBizObjMetricsDataService metricsDataService;
  51. /**
  52. * 查询业务对象指标
  53. *
  54. * @param objMetricsId 业务对象指标主键
  55. * @return 业务对象指标
  56. */
  57. @Override
  58. public BizObjMetrics selectBizObjMetricsByObjMetricsId(Long objMetricsId) {
  59. return bizObjMetricsMapper.selectBizObjMetricsByObjMetricsId(objMetricsId);
  60. }
  61. /**
  62. * 查询业务对象指标列表
  63. *
  64. * @param bizObjMetrics 业务对象指标
  65. * @return 业务对象指标
  66. */
  67. @Override
  68. public List<BizObjMetrics> selectBizObjMetricsList(BizObjMetrics bizObjMetrics) {
  69. return bizObjMetricsMapper.selectBizObjMetricsList(bizObjMetrics);
  70. }
  71. /**
  72. * 新增业务对象指标
  73. *
  74. * @param bizObjMetrics 业务对象指标
  75. * @return 结果
  76. */
  77. @Override
  78. public int insertBizObjMetrics(BizObjMetrics bizObjMetrics) {
  79. bizObjMetrics.setCreateTime(DateUtils.getNowDate());
  80. return bizObjMetricsMapper.insertBizObjMetrics(bizObjMetrics);
  81. }
  82. /**
  83. * 修改业务对象指标
  84. *
  85. * @param bizObjMetrics 业务对象指标
  86. * @return 结果
  87. */
  88. @Override
  89. public int updateBizObjMetrics(BizObjMetrics bizObjMetrics) {
  90. //插入数据记录表
  91. bizObjMetrics.setUpdateTime(DateUtils.getNowDate());
  92. return bizObjMetricsMapper.updateBizObjMetrics(bizObjMetrics);
  93. }
  94. /**
  95. * 批量删除业务对象指标
  96. *
  97. * @param objMetricsIds 需要删除的业务对象指标主键
  98. * @return 结果
  99. */
  100. @Override
  101. public int deleteBizObjMetricsByObjMetricsIds(Long[] objMetricsIds) {
  102. return bizObjMetricsMapper.deleteBizObjMetricsByObjMetricsIds(objMetricsIds);
  103. }
  104. /**
  105. * 删除业务对象指标信息
  106. *
  107. * @param objMetricsId 业务对象指标主键
  108. * @return 结果
  109. */
  110. @Override
  111. public int deleteBizObjMetricsByObjMetricsId(Long objMetricsId) {
  112. return bizObjMetricsMapper.deleteBizObjMetricsByObjMetricsId(objMetricsId);
  113. }
  114. /**
  115. * 选择指标,除去当前对象已选择的
  116. *
  117. * @param objId 对象ID
  118. * @return 结果
  119. */
  120. @Override
  121. public List<MetricsDef> selectMetricsDefList(Long objId) {
  122. return bizObjMetricsMapper.selectMetricsDefList(objId);
  123. }
  124. /**
  125. * 添加指标
  126. *
  127. * @param objId 对象ID
  128. * @param metricsIds 指标IDS
  129. * @return 结果
  130. */
  131. @Override
  132. public int insertMetricsDetails(Long objId, Long[] metricsIds) {
  133. BizObj obj = objService.selectBizObjByObjId(objId);
  134. String suffix = "/" + obj.getObjAddr() + ":" + obj.getObjPort();
  135. return bizObjMetricsMapper.insertMetricsDetails(objId, suffix, metricsIds);
  136. }
  137. /**
  138. * 通过objId查询列表
  139. *
  140. * @param objId 对象ID
  141. * @return 结果
  142. */
  143. @Override
  144. public List<BizObjMetrics> selectBizObjMetricsListByObjId(Long objId) {
  145. BizObjMetrics obj = new BizObjMetrics();
  146. obj.setObjId(objId);
  147. return selectBizObjMetricsList(obj);
  148. }
  149. /**
  150. * 通过对象和模板ID删除指标
  151. *
  152. * @param objId 对象ID
  153. * @param tplId 模板ID
  154. */
  155. @Override
  156. public void delete(Long objId, Long tplId) {
  157. QueryWrapper<BizObjMetrics> wrapper = new QueryWrapper<>();
  158. wrapper.eq("obj_id", objId);
  159. wrapper.eq("tpl_id", tplId);
  160. bizObjMetricsMapper.delete(wrapper);
  161. }
  162. /**
  163. * 通过模板ID批量插入指标
  164. * * @param objId 对象ID
  165. *
  166. * @param tplId 模板ID
  167. */
  168. @Override
  169. public void insertBatch(Long objId, Long tplId) {
  170. BizObj obj = objService.selectBizObjByObjId(objId);
  171. MetricsTplDetail query = new MetricsTplDetail();
  172. query.setTplId(tplId);
  173. List<MetricsTplDetail> list = detailService.selectMetricsTplDetailList(query);
  174. List<BizObjMetrics> objMetrics = new ArrayList<>();
  175. list.forEach(d -> {
  176. if ("1".equals(d.getMetricsDef().getMetricsType()) && !d.getMetricsDef().getMetricsCode().startsWith("pp.jvm.")) {
  177. //如果是pinpoint,并且不是jvm参数
  178. // 1.获取对象pinpoint组成
  179. List<BizObjPp> pps = ppService.selectBizObjPpListByObjId(objId);
  180. for (BizObjPp pp : pps) {
  181. BizObjMetrics ms = new BizObjMetrics();
  182. ms.setObjId(objId);
  183. ms.setTplId(tplId);
  184. ms.setMetricsId(d.getMetricsId());
  185. ms.setMetricsName(pp.getPpName() + "/" + d.getMetricsDef().getMetricsName());
  186. ms.setMetricsCode(pp.getPpName() + "/" + d.getMetricsCode());
  187. ms.setDataExp(ms.getMetricsCode());
  188. ms.setAlarmLow(d.getAlarmLow());
  189. ms.setAlarmMid(d.getAlarmMid());
  190. ms.setAlarmHigh(d.getAlarmHigh());
  191. if (pp.getPpType().equals("REDIS")) {
  192. //redis需要将1s换成100ms 3s换成300ms 5s换成500ms
  193. if (d.getMetricsCode().endsWith("1s")) {
  194. ms.setMetricsName(ms.getMetricsName().replace("1s", "100ms"));
  195. ms.setMetricsCode(ms.getMetricsCode().replace("1s", "100ms"));
  196. }
  197. if (d.getMetricsCode().endsWith("3s")) {
  198. ms.setMetricsName(ms.getMetricsName().replace("3s", "300ms"));
  199. ms.setMetricsCode(ms.getMetricsCode().replace("3s", "300ms"));
  200. }
  201. if (d.getMetricsCode().endsWith("5s")) {
  202. ms.setMetricsName(ms.getMetricsName().replace("5s", "500ms"));
  203. ms.setMetricsCode(ms.getMetricsCode().replace("5s", "500ms"));
  204. }
  205. }
  206. objMetrics.add(ms);
  207. }
  208. } else {
  209. BizObjMetrics ms = new BizObjMetrics();
  210. ms.setObjId(objId);
  211. ms.setTplId(tplId);
  212. ms.setMetricsId(d.getMetricsId());
  213. ms.setMetricsName(d.getMetricsDef().getMetricsName() + "/" + obj.getObjAddr() + ":" + obj.getObjPort());
  214. ms.setMetricsCode(d.getMetricsCode());
  215. if ("1".equals(d.getMetricsDef().getMetricsType())) {
  216. ms.setDataExp(d.getMetricsCode());
  217. }
  218. ms.setAlarmLow(d.getAlarmLow());
  219. ms.setAlarmMid(d.getAlarmMid());
  220. ms.setAlarmHigh(d.getAlarmHigh());
  221. objMetrics.add(ms);
  222. }
  223. });
  224. try (SqlSession sqlSession = factory.openSession(ExecutorType.BATCH, false)) {
  225. BizObjMetricsMapper mapper = sqlSession.getMapper(BizObjMetricsMapper.class);
  226. objMetrics.forEach(mapper::insertBizObjMetrics);
  227. sqlSession.commit();
  228. }
  229. }
  230. /**
  231. * 根据模板指标修改
  232. *
  233. * @param detail 模板指标
  234. */
  235. @Override
  236. public void update(MetricsTplDetail detail) {
  237. BizObjMetrics om = new BizObjMetrics();
  238. om.setMetricsId(detail.getMetricsId());
  239. om.setTplId(detail.getTplId());
  240. List<BizObjMetrics> list = selectBizObjMetricsList(om);
  241. if (list.size() > 0) {
  242. list.forEach(obj -> {
  243. //如果有则更新,没有则插入
  244. obj.setAlarmMid(detail.getAlarmMid());
  245. obj.setAlarmLow(detail.getAlarmLow());
  246. obj.setAlarmHigh(detail.getAlarmHigh());
  247. bizObjMetricsMapper.updateBizObjMetrics(obj);
  248. });
  249. } else {
  250. om.setAlarmLow(detail.getAlarmLow());
  251. om.setAlarmMid(detail.getAlarmMid());
  252. om.setAlarmHigh(detail.getAlarmHigh());
  253. insertBizObjMetrics(om);
  254. }
  255. }
  256. /**
  257. * 根据模板指标删除
  258. *
  259. * @param detail 模板指标
  260. */
  261. @Override
  262. public void del(MetricsTplDetail detail) {
  263. QueryWrapper<BizObjMetrics> wrapper = new QueryWrapper<>();
  264. wrapper.eq("metrics_id", detail.getMetricsId());
  265. wrapper.eq("tpl_id", detail.getTplId());
  266. bizObjMetricsMapper.delete(wrapper);
  267. }
  268. /**
  269. * 根据objId获取指标值
  270. *
  271. * @param objId 对象ID
  272. */
  273. @Override
  274. public void pinpointMetricsValue(Long objId) {
  275. BizObj bizObj = objService.selectBizObjByObjId(objId);
  276. if ("1".equals(bizObj.getObjType())) {
  277. // 获取应用程序的code
  278. BizObjApp app = appService.selectBizObjAppByAppId(bizObj.getAppId());
  279. String appName = app.getAppCode();
  280. LocalDateTime endTime = LocalDateTime.now();
  281. LocalDateTime startTime = endTime.minusDays(2);
  282. //TODO 暂时取2天的值,不然难得搞
  283. Map<String, String> appMap = pinpointService.getApps();
  284. String appType = appMap.get(appName);
  285. // 获取监控数据
  286. Float tps = pinpointService.tps(appName, startTime, endTime);
  287. int openFiles = pinpointService.openFile(appName, startTime, endTime);
  288. Map<String, Object> jvmInfo = pinpointService.jvmMemory(appName, startTime, endTime);
  289. float heapUsage = (float) jvmInfo.get("usage");
  290. int gcCount = (int) jvmInfo.get("gc");
  291. JSONObject linkData = pinpointService.link(appName, appType, startTime, endTime);
  292. JSONArray nodeDataArray = linkData.getJSONObject("applicationMapData").getJSONArray("nodeDataArray");
  293. List<PinpointVO> pinpointVOList = new ArrayList<>();
  294. for (int i = 0; i < nodeDataArray.size(); i++) {
  295. JSONObject obj = nodeDataArray.getJSONObject(i);
  296. PinpointVO vo = new PinpointVO(obj);
  297. if (vo.getApplicationName().equals(appName)) {
  298. bizObj.setAccessTimes(vo.getTot());
  299. objService.updateBizObj(bizObj);
  300. } else {
  301. pinpointVOList.add(vo);
  302. }
  303. }
  304. // 1.更新 BIZ_OBJ_PP 表
  305. updateBizObjPpTable(objId, pinpointVOList);
  306. // 2.更新业务对象指标表
  307. updateBizObjMetrics(objId, tps, openFiles, heapUsage, gcCount, pinpointVOList);
  308. }
  309. }
  310. /**
  311. * 根据objId获取prometheus指标值
  312. *
  313. * @param objId 对象ID
  314. */
  315. @Override
  316. public void prometheusMetricsValue(Long objId) {
  317. List<BizObjMetrics> mList = getAllMetricsForObjIdList(objId);
  318. List<BizObjMetrics> metricsToUpdate = new ArrayList<>();
  319. mList.stream().filter(om -> !"1".equals(om.getMetricsDef().getMetricsType())).forEach(om -> {
  320. //非pinpoint
  321. Float value = prometheusService.query(om.getDataExp());
  322. String alarmLevel = getAlarmLevel(value, om);
  323. om.setDValue(BigDecimal.valueOf(value));
  324. if (alarmLevel != null) {
  325. insertAlarm(om, alarmLevel);
  326. }
  327. BizObjMetricsData data = new BizObjMetricsData();
  328. data.setObjMetricsId(om.getObjMetricsId());
  329. data.setdValue(om.getDValue());
  330. metricsDataService.insertBizObjMetricsData(data);
  331. metricsToUpdate.add(om);
  332. });
  333. // 更新所有需要更新的BizObjMetrics对象
  334. metricsToUpdate.forEach(this::updateBizObjMetrics);
  335. }
  336. /**
  337. * 获取告警等级
  338. *
  339. * @param value 值
  340. * @param bizObjMetrics 指标对象
  341. * @return
  342. */
  343. private String getAlarmLevel(Float value, BizObjMetrics bizObjMetrics) {
  344. if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmLow()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmLow())) {
  345. return "low";
  346. } else if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmMid()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmMid())) {
  347. return "mid";
  348. } else if (StringUtils.isNotEmpty(bizObjMetrics.getAlarmHigh()) && IntervalUtil.inNumRange(value, bizObjMetrics.getAlarmHigh())) {
  349. return "high";
  350. }
  351. return null;
  352. }
  353. /**
  354. * 添加告警记录
  355. *
  356. * @param om 指标对象
  357. * @param alarmLevel 告警等级
  358. */
  359. private void insertAlarm(BizObjMetrics om, String alarmLevel) {
  360. AlarmRecord record = new AlarmRecord();
  361. record.setObjId(om.getObjId());
  362. record.setObjMetricsId(om.getObjMetricsId());
  363. record.setAlarmLevel(alarmLevel);
  364. record.setAlarmValue(om.getDValue());
  365. record.setAlarmTime(new Date());
  366. alarmRecordService.insertAlarmRecord(record);
  367. }
  368. /**
  369. * 更新BIZ_OBJ_PP
  370. *
  371. * @param objId 对象ID
  372. * @param pinpointVOList PP组成
  373. */
  374. private void updateBizObjPpTable(Long objId, List<PinpointVO> pinpointVOList) {
  375. List<BizObjPp> existingPpList = ppService.selectBizObjPpListByObjId(objId);
  376. Set<String> existingNames = existingPpList.stream()
  377. .map(BizObjPp::getPpName)
  378. .collect(Collectors.toSet());
  379. pinpointVOList.stream()
  380. .filter(vo -> !existingNames.contains(vo.getApplicationName()))
  381. .forEach(vo -> {
  382. BizObjPp pp = new BizObjPp();
  383. pp.setObjId(objId);
  384. pp.setPpKey(vo.getKey());
  385. pp.setPpName(vo.getApplicationName());
  386. pp.setPpType(vo.getCategory());
  387. ppService.insertBizObjPp(pp);
  388. // 根据模板更新业务对象指标表
  389. updateBizObjMetricsFromTemplate(objId, pp);
  390. existingPpList.add(pp);
  391. });
  392. }
  393. /**
  394. * 根据模板更新业务对象指标表
  395. *
  396. * @param objId 对象ID
  397. * @param pp pp对象
  398. */
  399. private void updateBizObjMetricsFromTemplate(Long objId, BizObjPp pp) {
  400. List<BizObjTpl> templateList = objTplService.selectTplList4objId(objId);
  401. templateList.forEach(template -> insertOrUpdateMetricsFromTemplate(objId, template.getTplId(), pp));
  402. }
  403. /**
  404. * 更新模板中的pinpoint指标到业务对象指标
  405. *
  406. * @param objId 对象ID
  407. * @param tplId 模板ID
  408. * @param pp pinpoint组成
  409. */
  410. private void insertOrUpdateMetricsFromTemplate(Long objId, Long tplId, BizObjPp pp) {
  411. MetricsTplDetail query = new MetricsTplDetail();
  412. query.setTplId(tplId);
  413. List<MetricsTplDetail> list = detailService.selectMetricsTplDetailList(query);
  414. List<BizObjMetrics> objMetrics = new ArrayList<>();
  415. list.forEach(d -> {
  416. if ("1".equals(d.getMetricsDef().getMetricsType()) && !d.getMetricsDef().getMetricsCode().startsWith("pp.jvm.")) {
  417. //如果是pinpoint,需要
  418. // 1.获取对象pinpoint组成
  419. BizObjMetrics ms = new BizObjMetrics();
  420. ms.setObjId(objId);
  421. ms.setTplId(tplId);
  422. ms.setMetricsId(d.getMetricsId());
  423. ms.setMetricsName(pp.getPpName() + "/" + d.getMetricsDef().getMetricsName());
  424. ms.setMetricsCode(pp.getPpName() + "/" + d.getMetricsCode());
  425. if (pp.getPpType().equals("REDIS")) {
  426. //redis需要将1s换成100ms 3s换成300ms 5s换成500ms
  427. if (d.getMetricsCode().endsWith("1s")) {
  428. ms.setMetricsName(ms.getMetricsName().replace("1s", "100ms"));
  429. ms.setMetricsCode(ms.getMetricsCode().replace("1s", "100ms"));
  430. }
  431. if (d.getMetricsCode().endsWith("3s")) {
  432. ms.setMetricsName(ms.getMetricsName().replace("3s", "300ms"));
  433. ms.setMetricsCode(ms.getMetricsCode().replace("3s", "300ms"));
  434. }
  435. if (d.getMetricsCode().endsWith("5s")) {
  436. ms.setMetricsName(ms.getMetricsName().replace("5s", "500ms"));
  437. ms.setMetricsCode(ms.getMetricsCode().replace("5s", "500ms"));
  438. }
  439. }
  440. ms.setDataExp(ms.getMetricsCode());
  441. ms.setAlarmLow(d.getAlarmLow());
  442. ms.setAlarmMid(d.getAlarmMid());
  443. ms.setAlarmHigh(d.getAlarmHigh());
  444. objMetrics.add(ms);
  445. }
  446. });
  447. bizObjMetricsMapper.batchInsert(objMetrics);
  448. }
  449. /**
  450. * 更新指标
  451. *
  452. * @param objId 对象ID
  453. * @param tps 系统压力
  454. * @param openFiles 打开文件数量
  455. * @param heapUsage 堆内存使用率
  456. * @param gcCount gc次数
  457. * @param pinpointVOList 链路列表数据
  458. */
  459. private void updateBizObjMetrics(Long objId, Float tps, int openFiles, float heapUsage, int gcCount, List<PinpointVO> pinpointVOList) {
  460. updateJvmMetrics(objId, tps, heapUsage, openFiles, gcCount);
  461. updateLinkMetrics(objId, pinpointVOList);
  462. }
  463. /**
  464. * 更新jvm指标
  465. *
  466. * @param objId 对象ID
  467. * @param tps 系统压力
  468. * @param openFiles 打开文件数量
  469. * @param heapUsage 堆内存使用率
  470. * @param gcCount gc次数
  471. */
  472. private void updateJvmMetrics(Long objId, Float tps, float heapUsage, int openFiles, int gcCount) {
  473. BizObjMetrics jvmMetrics = new BizObjMetrics();
  474. jvmMetrics.setObjId(objId);
  475. jvmMetrics.setMetricsCode("pp.jvm.");
  476. List<BizObjMetrics> omList = selectBizObjMetricsList(jvmMetrics);
  477. updateMetricsValues(omList, "tps", BigDecimal.valueOf(tps));
  478. updateMetricsValues(omList, "heap.usage", BigDecimal.valueOf(heapUsage));
  479. updateMetricsValues(omList, "open", BigDecimal.valueOf(openFiles));
  480. updateMetricsValues(omList, "gc", BigDecimal.valueOf(gcCount));
  481. }
  482. /**
  483. * jvm指标更新
  484. *
  485. * @param omList jvm指标列表
  486. * @param metricSuffix 指标后缀
  487. * @param value 值
  488. */
  489. private void updateMetricsValues(List<BizObjMetrics> omList, String metricSuffix, BigDecimal value) {
  490. omList.stream()
  491. .filter(om -> om.getMetricsCode().endsWith(metricSuffix))
  492. .forEach(om -> {
  493. String alarmLevel = getAlarmLevel(value.floatValue(), om);
  494. if (alarmLevel != null) {
  495. insertAlarm(om, alarmLevel);
  496. }
  497. om.setDValue(value);
  498. updateBizObjMetrics(om);
  499. BizObjMetricsData data = new BizObjMetricsData();
  500. data.setObjMetricsId(om.getObjMetricsId());
  501. data.setdValue(om.getDValue());
  502. metricsDataService.insertBizObjMetricsData(data);
  503. });
  504. }
  505. /**
  506. * 更新链路指标
  507. *
  508. * @param objId 对象ID
  509. * @param pinpointVOList 链路列表
  510. */
  511. private void updateLinkMetrics(Long objId, List<PinpointVO> pinpointVOList) {
  512. Map<String, BizObjMetrics> metricsMap = getAllMetricsForObjId(objId);
  513. pinpointVOList.forEach(vo -> updateMetricsValues(metricsMap, vo));
  514. }
  515. /**
  516. * 更新指标
  517. *
  518. * @param metricsMap 指标map
  519. * @param vo pp链路对象
  520. */
  521. private void updateMetricsValues(Map<String, BizObjMetrics> metricsMap, PinpointVO vo) {
  522. metricsMap.values().stream()
  523. .filter(om -> om.getMetricsCode().startsWith(vo.getApplicationName() + "/"))
  524. .forEach(om -> {
  525. updateMetric(om, "pp.1s", vo.getTime1s());
  526. updateMetric(om, "pp.3s", vo.getTime3s());
  527. updateMetric(om, "pp.5s", vo.getTime5s());
  528. updateMetric(om, "pp.100ms", vo.getTime100ms());
  529. updateMetric(om, "pp.300ms", vo.getTime300ms());
  530. updateMetric(om, "pp.500ms", vo.getTime500ms());
  531. updateMetric(om, "pp.tot", vo.getTot());
  532. updateMetric(om, "pp.sum", vo.getSum());
  533. updateMetric(om, "pp.max", vo.getMax());
  534. updateMetric(om, "pp.avg", vo.getAvg());
  535. updateMetric(om, "pp.slow", vo.getSlow());
  536. updateMetric(om, "pp.error", vo.getError());
  537. });
  538. }
  539. /**
  540. * 调用更新方法
  541. *
  542. * @param om 对象
  543. * @param suffix 前缘
  544. * @param value 值
  545. */
  546. private void updateMetric(BizObjMetrics om, String suffix, Number value) {
  547. if (om.getMetricsCode().endsWith(suffix) && value != null) {
  548. om.setDValue(BigDecimal.valueOf(value.doubleValue()));
  549. updateBizObjMetrics(om);
  550. BizObjMetricsData data = new BizObjMetricsData();
  551. data.setObjMetricsId(om.getObjMetricsId());
  552. data.setdValue(om.getDValue());
  553. metricsDataService.insertBizObjMetricsData(data);
  554. }
  555. }
  556. /**
  557. * 获取所有指标对象,并以code转换成map
  558. *
  559. * @param objId 对象ID
  560. * @return map
  561. */
  562. private Map<String, BizObjMetrics> getAllMetricsForObjId(Long objId) {
  563. return getAllMetricsForObjIdList(objId).stream()
  564. .collect(Collectors.toMap(BizObjMetrics::getMetricsCode, Function.identity()));
  565. }
  566. /**
  567. * 根据对象ID获取所有指标
  568. *
  569. * @param objId 对象ID
  570. * @return
  571. */
  572. private List<BizObjMetrics> getAllMetricsForObjIdList(Long objId) {
  573. BizObjMetrics search = new BizObjMetrics();
  574. search.setObjId(objId);
  575. return selectBizObjMetricsList(search);
  576. }
  577. }