// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: MIT package cadvisor import ( "fmt" . "github.com/aws/amazon-cloudwatch-agent/internal/containerinsightscommon" "github.com/aws/amazon-cloudwatch-agent/plugins/inputs/cadvisor/extractors" ) func mergeMetrics(metrics []*extractors.CAdvisorMetric) []*extractors.CAdvisorMetric { var result []*extractors.CAdvisorMetric metricMap := make(map[string]*extractors.CAdvisorMetric) for _, metric := range metrics { if metricKey := getMetricKey(metric); metricKey != "" { if mergedMetric, ok := metricMap[metricKey]; ok { mergedMetric.Merge(metric) } else { metricMap[metricKey] = metric } } else { // this metric cannot be merged result = append(result, metric) } } for _, metric := range metricMap { result = append(result, metric) } return result } // return MetricKey for merge-able metrics func getMetricKey(metric *extractors.CAdvisorMetric) string { metricType := metric.GetMetricType() metricKey := "" switch metricType { case TypeInstance: // merge cpu, memory, net metric for type Instance metricKey = fmt.Sprintf("metricType:%s", TypeInstance) case TypeNode: // merge cpu, memory, net metric for type Node metricKey = fmt.Sprintf("metricType:%s", TypeNode) case TypePod: // merge cpu, memory, net metric for type Pod metricKey = fmt.Sprintf("metricType:%s,podId:%s", TypePod, metric.GetTags()[PodIdKey]) case TypeContainer: // merge cpu, memory metric for type Container metricKey = fmt.Sprintf("metricType:%s,podId:%s,containerName:%s", TypeContainer, metric.GetTags()[PodIdKey], metric.GetTags()[ContainerNamekey]) case TypeInstanceDiskIO: // merge io_serviced, io_service_bytes for type InstanceDiskIO metricKey = fmt.Sprintf("metricType:%s,device:%s", TypeInstanceDiskIO, metric.GetTags()[DiskDev]) case TypeNodeDiskIO: // merge io_serviced, io_service_bytes for type NodeDiskIO metricKey = fmt.Sprintf("metricType:%s,device:%s", TypeNodeDiskIO, metric.GetTags()[DiskDev]) default: metricKey = "" } return metricKey }