Java 方法:合并指标数据并生成服务监控信息
private List<ServiceMonitorVO> mergeMetrics(List<? extends DimServiceDTO> dimServiceList) {
if (CollectionUtils.isEmpty(dimServiceList)) return null;
List<Map<String, Object>> metricList = ReportCollectBase.queryMetricList(serviceMetricExpressionMap, indicatorService, Arrays.asList('instance', 'serviceUrl'));
Map<String, List<Map<String, Object>>> objectGroup = metricList.stream().collect(Collectors.groupingBy(map -> String.valueOf(map.get('m8_object_id'))));
List<ServiceMonitorVO> result = new ArrayList<>(dimServiceList.size());
for (DimServiceDTO dim : dimServiceList) {
ServiceMonitorVO serviceMonitorVO = new ServiceMonitorVO();
BeanUtils.copyProperties(dim, serviceMonitorVO);
if (StringUtils.isEmpty(dim.getM8ObjectUrl())) {
serviceMonitorVO.setServiceTotal(0);
} else {
String[] urls = dim.getM8ObjectUrl().split(',');
serviceMonitorVO.setServiceTotal(urls.length);
}
List<ServiceMonitorVO.ServiceMonitorItemVO> items = new ArrayList<>();
if (objectGroup == null) {
serviceMonitorVO.setServiceNormal(0);
if (StringUtils.isNotEmpty(dim.getM8ObjectUrl())) {
String[] urls = dim.getM8ObjectUrl().split(',');
for (String url : urls) {
items.add(new ServiceMonitorVO.ServiceMonitorItemVO(url, '0'));
}
}
} else {
List<Map<String, Object>> list = objectGroup.getOrDefault(dim.getM8ObjectId(), new ArrayList<>());
String[] urls = dim.getM8ObjectUrl().split(',');
if (CollectionUtils.isEmpty(list)) {
serviceMonitorVO.setServiceNormal(0);
for (String url : urls) {
items.add(new ServiceMonitorVO.ServiceMonitorItemVO(url, '0'));
}
} else {
long normal = 0;
for (String url : urls) {
Map<String, Object> obj = list.stream().filter(o -> Objects.equals(o.getOrDefault('serviceUrl', ''), url)).findAny().orElse(null);
if (obj == null) {
items.add(new ServiceMonitorVO.ServiceMonitorItemVO(url, '0'));
} else {
String serviceAvailable = String.valueOf(obj.getOrDefault('m8_service_available', '0'));
if (Objects.equals(serviceAvailable, '1')) normal++;
items.add(new ServiceMonitorVO.ServiceMonitorItemVO(String.valueOf(obj.get('serviceUrl')), serviceAvailable));
}
}
serviceMonitorVO.setServiceNormal(Integer.parseInt(String.valueOf(normal)));
}
}
// m8JobStatus: 是否启用采集=监控状态
// m8ServiceState:服务监测状态:0-异常,1-正常(总状态,只要items中有一个正常即正常)
serviceMonitorVO.setServiceState(serviceMonitorVO.getServiceNormal() > 0 ? '1' : '0');
serviceMonitorVO.setItems(items);
result.add(serviceMonitorVO);
}
return result;
}
该方法接受一个DimServiceDTO对象的列表作为参数,并返回一个包含服务监控信息的ServiceMonitorVO对象列表。方法首先通过ReportCollectBase.queryMetricList方法获取指标数据,然后根据m8_object_id对指标数据进行分组。接着,方法遍历DimServiceDTO对象列表,并根据每个DimServiceDTO对象的m8ObjectId从分组后的指标数据中查找相应的指标数据。最后,方法根据指标数据生成ServiceMonitorVO对象,并将所有ServiceMonitorVO对象添加到一个列表中并返回。
方法特点:
- 方法使用泛型参数,可以接受任何继承自DimServiceDTO的类对象的列表作为参数。
- 方法利用
Stream和Collectors对指标数据进行分组和查找。 - 方法根据指标数据生成服务监控信息,并返回一个包含服务监控信息的列表。
使用方法:
List<DimServiceDTO> dimServiceList = ...;
List<ServiceMonitorVO> serviceMonitorList = mergeMetrics(dimServiceList);
原文地址: https://www.cveoy.top/t/topic/nW0C 著作权归作者所有。请勿转载和采集!