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
This commit is contained in:
Bryan Boreham 2017-08-28 19:27:38 +00:00
parent 7100d00491
commit c193bbc7c2
2 changed files with 32 additions and 16 deletions

View File

@ -78,21 +78,29 @@ func init() {
} }
func containerLabels(c *cadvisorapi.ContainerInfo) map[string]string { 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 { if len(c.Aliases) > 0 {
set[metrics.LabelName] = c.Aliases[0] name = c.Aliases[0]
}
if image := c.Spec.Image; len(image) > 0 {
set[metrics.LabelImage] = image
} }
image = c.Spec.Image
if v, ok := c.Spec.Labels[types.KubernetesPodNameLabel]; ok { if v, ok := c.Spec.Labels[types.KubernetesPodNameLabel]; ok {
set["pod_name"] = v podName = v
} }
if v, ok := c.Spec.Labels[types.KubernetesPodNamespaceLabel]; ok { if v, ok := c.Spec.Labels[types.KubernetesPodNamespaceLabel]; ok {
set["namespace"] = v namespace = v
} }
if v, ok := c.Spec.Labels[types.KubernetesContainerNameLabel]; ok { 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 return set
} }

View File

@ -813,21 +813,29 @@ func (a prometheusHostAdapter) GetMachineInfo() (*cadvisorapi.MachineInfo, error
// containerPrometheusLabels maps cAdvisor labels to prometheus labels. // containerPrometheusLabels maps cAdvisor labels to prometheus labels.
func containerPrometheusLabels(c *cadvisorapi.ContainerInfo) map[string]string { 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 { if len(c.Aliases) > 0 {
set[metrics.LabelName] = c.Aliases[0] name = c.Aliases[0]
}
if image := c.Spec.Image; len(image) > 0 {
set[metrics.LabelImage] = image
} }
image = c.Spec.Image
if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNameLabel]; ok { if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNameLabel]; ok {
set["pod_name"] = v podName = v
} }
if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNamespaceLabel]; ok { if v, ok := c.Spec.Labels[kubelettypes.KubernetesPodNamespaceLabel]; ok {
set["namespace"] = v namespace = v
} }
if v, ok := c.Spec.Labels[kubelettypes.KubernetesContainerNameLabel]; ok { 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 return set
} }