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的类对象的列表作为参数。
  • 方法利用StreamCollectors对指标数据进行分组和查找。
  • 方法根据指标数据生成服务监控信息,并返回一个包含服务监控信息的列表。

使用方法:

List<DimServiceDTO> dimServiceList = ...;
List<ServiceMonitorVO> serviceMonitorList = mergeMetrics(dimServiceList);
Java 方法:合并指标数据并生成服务监控信息

原文地址: https://www.cveoy.top/t/topic/nW0C 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录