From c193bbc7c2e6463e0425b9a57c5a42853a7c3eb6 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 28 Aug 2017 19:27:38 +0000 Subject: [PATCH] Make Prometheus cAdvisor metrics labels consistent Prometheus requires that all metrics in the same family have the same labels, so we arrange to supply blank strings for missing labels See https://github.com/google/cadvisor/issues/1704 --- pkg/kubelet/cadvisor/cadvisor_linux.go | 24 ++++++++++++++++-------- pkg/kubelet/server/server.go | 24 ++++++++++++++++-------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/pkg/kubelet/cadvisor/cadvisor_linux.go b/pkg/kubelet/cadvisor/cadvisor_linux.go index 5734540ccce..bcde373dcfc 100644 --- a/pkg/kubelet/cadvisor/cadvisor_linux.go +++ b/pkg/kubelet/cadvisor/cadvisor_linux.go @@ -78,21 +78,29 @@ func init() { } func containerLabels(c *cadvisorapi.ContainerInfo) map[string]string { - set := map[string]string{metrics.LabelID: c.Name} + // Prometheus requires that all metrics in the same family have the same labels, + // so we arrange to supply blank strings for missing labels + var name, image, podName, namespace, containerName string if len(c.Aliases) > 0 { - set[metrics.LabelName] = c.Aliases[0] - } - if image := c.Spec.Image; len(image) > 0 { - set[metrics.LabelImage] = image + name = c.Aliases[0] } + image = c.Spec.Image if v, ok := c.Spec.Labels[types.KubernetesPodNameLabel]; ok { - set["pod_name"] = v + podName = v } if v, ok := c.Spec.Labels[types.KubernetesPodNamespaceLabel]; ok { - set["namespace"] = v + namespace = v } if v, ok := c.Spec.Labels[types.KubernetesContainerNameLabel]; ok { - set["container_name"] = v + containerName = v + } + set := map[string]string{ + metrics.LabelID: c.Name, + metrics.LabelName: name, + metrics.LabelImage: image, + "pod_name": podName, + "namespace": namespace, + "container_name": containerName, } return set } diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go index 74a5036828a..6fdb9bc2755 100644 --- a/pkg/kubelet/server/server.go +++ b/pkg/kubelet/server/server.go @@ -813,21 +813,29 @@ func (a prometheusHostAdapter) GetMachineInfo() (*cadvisorapi.MachineInfo, error // containerPrometheusLabels maps cAdvisor labels to prometheus labels. func containerPrometheusLabels(c *cadvisorapi.ContainerInfo) map[string]string { - set := map[string]string{metrics.LabelID: c.Name} + // Prometheus requires that all metrics in the same family have the same labels, + // so we arrange to supply blank strings for missing labels + var name, image, podName, namespace, containerName string if len(c.Aliases) > 0 { - set[metrics.LabelName] = c.Aliases[0] - } - if image := c.Spec.Image; len(image) > 0 { - set[metrics.LabelImage] = image + name = c.Aliases[0] } + image = c.Spec.Image if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNameLabel]; ok { - set["pod_name"] = v + podName = v } if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNamespaceLabel]; ok { - set["namespace"] = v + namespace = v } if v, ok := c.Spec.Labels[kubelettypes.KubernetesContainerNameLabel]; ok { - set["container_name"] = v + containerName = v + } + set := map[string]string{ + metrics.LabelID: c.Name, + metrics.LabelName: name, + metrics.LabelImage: image, + "pod_name": podName, + "namespace": namespace, + "container_name": containerName, } return set }