From dafd1632a236e7f2510a9acfac16f0a72a84a1d7 Mon Sep 17 00:00:00 2001 From: Simon Pasquier Date: Wed, 10 Apr 2019 14:21:42 +0200 Subject: [PATCH] discovery/kubernetes: add present labels for labels/annotations (#5443) Signed-off-by: Simon Pasquier --- discovery/kubernetes/endpoints_test.go | 30 ++++++++++++++----------- discovery/kubernetes/ingress.go | 24 +++++++++++--------- discovery/kubernetes/ingress_test.go | 10 +++++---- discovery/kubernetes/kubernetes.go | 1 + discovery/kubernetes/kubernetes_test.go | 2 ++ discovery/kubernetes/node.go | 20 ++++++++++------- discovery/kubernetes/node_test.go | 13 ++++++----- discovery/kubernetes/pod.go | 12 ++++++---- discovery/kubernetes/pod_test.go | 26 +++++++++++---------- discovery/kubernetes/service.go | 26 ++++++++++++--------- discovery/kubernetes/service_test.go | 10 +++++---- docs/configuration/configuration.md | 20 ++++++++++++----- 12 files changed, 117 insertions(+), 77 deletions(-) diff --git a/discovery/kubernetes/endpoints_test.go b/discovery/kubernetes/endpoints_test.go index 1be661c5f..04c0d01ff 100644 --- a/discovery/kubernetes/endpoints_test.go +++ b/discovery/kubernetes/endpoints_test.go @@ -387,10 +387,11 @@ func TestEndpointsDiscoveryWithService(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_namespace": "default", - "__meta_kubernetes_endpoints_name": "testendpoints", - "__meta_kubernetes_service_label_app": "test", - "__meta_kubernetes_service_name": "testendpoints", + "__meta_kubernetes_namespace": "default", + "__meta_kubernetes_endpoints_name": "testendpoints", + "__meta_kubernetes_service_label_app": "test", + "__meta_kubernetes_service_labelpresent_app": "true", + "__meta_kubernetes_service_name": "testendpoints", }, Source: "endpoints/default/testendpoints", }, @@ -452,11 +453,13 @@ func TestEndpointsDiscoveryWithServiceUpdate(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_namespace": "default", - "__meta_kubernetes_endpoints_name": "testendpoints", - "__meta_kubernetes_service_label_app": "svc", - "__meta_kubernetes_service_name": "testendpoints", - "__meta_kubernetes_service_label_component": "testing", + "__meta_kubernetes_namespace": "default", + "__meta_kubernetes_endpoints_name": "testendpoints", + "__meta_kubernetes_service_label_app": "svc", + "__meta_kubernetes_service_labelpresent_app": "true", + "__meta_kubernetes_service_name": "testendpoints", + "__meta_kubernetes_service_label_component": "testing", + "__meta_kubernetes_service_labelpresent_component": "true", }, Source: "endpoints/default/testendpoints", }, @@ -560,10 +563,11 @@ func TestEndpointsDiscoveryNamespaces(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_namespace": "ns1", - "__meta_kubernetes_endpoints_name": "testendpoints", - "__meta_kubernetes_service_label_app": "app1", - "__meta_kubernetes_service_name": "testendpoints", + "__meta_kubernetes_namespace": "ns1", + "__meta_kubernetes_endpoints_name": "testendpoints", + "__meta_kubernetes_service_label_app": "app1", + "__meta_kubernetes_service_labelpresent_app": "true", + "__meta_kubernetes_service_name": "testendpoints", }, Source: "endpoints/ns1/testendpoints", }, diff --git a/discovery/kubernetes/ingress.go b/discovery/kubernetes/ingress.go index b280c59d3..7d2fc32dc 100644 --- a/discovery/kubernetes/ingress.go +++ b/discovery/kubernetes/ingress.go @@ -131,12 +131,14 @@ func ingressSourceFromNamespaceAndName(namespace, name string) string { } const ( - ingressNameLabel = metaLabelPrefix + "ingress_name" - ingressLabelPrefix = metaLabelPrefix + "ingress_label_" - ingressAnnotationPrefix = metaLabelPrefix + "ingress_annotation_" - ingressSchemeLabel = metaLabelPrefix + "ingress_scheme" - ingressHostLabel = metaLabelPrefix + "ingress_host" - ingressPathLabel = metaLabelPrefix + "ingress_path" + ingressNameLabel = metaLabelPrefix + "ingress_name" + ingressLabelPrefix = metaLabelPrefix + "ingress_label_" + ingressLabelPresentPrefix = metaLabelPrefix + "ingress_labelpresent_" + ingressAnnotationPrefix = metaLabelPrefix + "ingress_annotation_" + ingressAnnotationPresentPrefix = metaLabelPrefix + "ingress_annotationpresent_" + ingressSchemeLabel = metaLabelPrefix + "ingress_scheme" + ingressHostLabel = metaLabelPrefix + "ingress_host" + ingressPathLabel = metaLabelPrefix + "ingress_path" ) func ingressLabels(ingress *v1beta1.Ingress) model.LabelSet { @@ -145,13 +147,15 @@ func ingressLabels(ingress *v1beta1.Ingress) model.LabelSet { ls[namespaceLabel] = lv(ingress.Namespace) for k, v := range ingress.Labels { - ln := strutil.SanitizeLabelName(ingressLabelPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(ingressLabelPrefix+ln)] = lv(v) + ls[model.LabelName(ingressLabelPresentPrefix+ln)] = presentValue } for k, v := range ingress.Annotations { - ln := strutil.SanitizeLabelName(ingressAnnotationPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(ingressAnnotationPrefix+ln)] = lv(v) + ls[model.LabelName(ingressAnnotationPresentPrefix+ln)] = presentValue } return ls } diff --git a/discovery/kubernetes/ingress_test.go b/discovery/kubernetes/ingress_test.go index 02bdb35ea..d7973e8b1 100644 --- a/discovery/kubernetes/ingress_test.go +++ b/discovery/kubernetes/ingress_test.go @@ -118,10 +118,12 @@ func expectedTargetGroups(ns string, tls TLSMode) map[string]*targetgroup.Group }, }, Labels: model.LabelSet{ - "__meta_kubernetes_ingress_name": "testingress", - "__meta_kubernetes_namespace": lv(ns), - "__meta_kubernetes_ingress_label_testlabel": "testvalue", - "__meta_kubernetes_ingress_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_ingress_name": "testingress", + "__meta_kubernetes_namespace": lv(ns), + "__meta_kubernetes_ingress_label_testlabel": "testvalue", + "__meta_kubernetes_ingress_labelpresent_testlabel": "true", + "__meta_kubernetes_ingress_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_ingress_annotationpresent_testannotation": "true", }, Source: key, }, diff --git a/discovery/kubernetes/kubernetes.go b/discovery/kubernetes/kubernetes.go index 775951b2d..eabb1e1da 100644 --- a/discovery/kubernetes/kubernetes.go +++ b/discovery/kubernetes/kubernetes.go @@ -43,6 +43,7 @@ const ( metaLabelPrefix = model.MetaLabelPrefix + "kubernetes_" namespaceLabel = metaLabelPrefix + "namespace" metricsNamespace = "prometheus_sd_kubernetes" + presentValue = model.LabelValue("true") ) var ( diff --git a/discovery/kubernetes/kubernetes_test.go b/discovery/kubernetes/kubernetes_test.go index 68ac18771..2270bc611 100644 --- a/discovery/kubernetes/kubernetes_test.go +++ b/discovery/kubernetes/kubernetes_test.go @@ -54,6 +54,7 @@ type k8sDiscoveryTest struct { } func (d k8sDiscoveryTest) Run(t *testing.T) { + t.Helper() ch := make(chan []*targetgroup.Group) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() @@ -124,6 +125,7 @@ Loop: } func requireTargetGroups(t *testing.T, expected, res map[string]*targetgroup.Group) { + t.Helper() b1, err := json.Marshal(expected) if err != nil { panic(err) diff --git a/discovery/kubernetes/node.go b/discovery/kubernetes/node.go index be0ae82df..439d76839 100644 --- a/discovery/kubernetes/node.go +++ b/discovery/kubernetes/node.go @@ -140,10 +140,12 @@ func nodeSourceFromName(name string) string { } const ( - nodeNameLabel = metaLabelPrefix + "node_name" - nodeLabelPrefix = metaLabelPrefix + "node_label_" - nodeAnnotationPrefix = metaLabelPrefix + "node_annotation_" - nodeAddressPrefix = metaLabelPrefix + "node_address_" + nodeNameLabel = metaLabelPrefix + "node_name" + nodeLabelPrefix = metaLabelPrefix + "node_label_" + nodeLabelPresentPrefix = metaLabelPrefix + "node_labelpresent_" + nodeAnnotationPrefix = metaLabelPrefix + "node_annotation_" + nodeAnnotationPresentPrefix = metaLabelPrefix + "node_annotationpresent_" + nodeAddressPrefix = metaLabelPrefix + "node_address_" ) func nodeLabels(n *apiv1.Node) model.LabelSet { @@ -152,13 +154,15 @@ func nodeLabels(n *apiv1.Node) model.LabelSet { ls[nodeNameLabel] = lv(n.Name) for k, v := range n.Labels { - ln := strutil.SanitizeLabelName(nodeLabelPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(nodeLabelPrefix+ln)] = lv(v) + ls[model.LabelName(nodeLabelPresentPrefix+ln)] = presentValue } for k, v := range n.Annotations { - ln := strutil.SanitizeLabelName(nodeAnnotationPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(nodeAnnotationPrefix+ln)] = lv(v) + ls[model.LabelName(nodeAnnotationPresentPrefix+ln)] = presentValue } return ls } diff --git a/discovery/kubernetes/node_test.go b/discovery/kubernetes/node_test.go index 148867b4a..2eaf49bf3 100644 --- a/discovery/kubernetes/node_test.go +++ b/discovery/kubernetes/node_test.go @@ -75,9 +75,11 @@ func TestNodeDiscoveryBeforeStart(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_node_name": "test", - "__meta_kubernetes_node_label_testlabel": "testvalue", - "__meta_kubernetes_node_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_node_name": "test", + "__meta_kubernetes_node_label_testlabel": "testvalue", + "__meta_kubernetes_node_labelpresent_testlabel": "true", + "__meta_kubernetes_node_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_node_annotationpresent_testannotation": "true", }, Source: "node/test", }, @@ -158,8 +160,9 @@ func TestNodeDiscoveryUpdate(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_node_label_Unschedulable": "true", - "__meta_kubernetes_node_name": "test0", + "__meta_kubernetes_node_label_Unschedulable": "true", + "__meta_kubernetes_node_labelpresent_Unschedulable": "true", + "__meta_kubernetes_node_name": "test0", }, Source: "node/test0", }, diff --git a/discovery/kubernetes/pod.go b/discovery/kubernetes/pod.go index 7dcba5963..baa531331 100644 --- a/discovery/kubernetes/pod.go +++ b/discovery/kubernetes/pod.go @@ -144,7 +144,9 @@ const ( podReadyLabel = metaLabelPrefix + "pod_ready" podPhaseLabel = metaLabelPrefix + "pod_phase" podLabelPrefix = metaLabelPrefix + "pod_label_" + podLabelPresentPrefix = metaLabelPrefix + "pod_labelpresent_" podAnnotationPrefix = metaLabelPrefix + "pod_annotation_" + podAnnotationPresentPrefix = metaLabelPrefix + "pod_annotationpresent_" podNodeNameLabel = metaLabelPrefix + "pod_node_name" podHostIPLabel = metaLabelPrefix + "pod_host_ip" podUID = metaLabelPrefix + "pod_uid" @@ -185,13 +187,15 @@ func podLabels(pod *apiv1.Pod) model.LabelSet { } for k, v := range pod.Labels { - ln := strutil.SanitizeLabelName(podLabelPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(podLabelPrefix+k)] = lv(v) + ls[model.LabelName(podLabelPresentPrefix+ln)] = presentValue } for k, v := range pod.Annotations { - ln := strutil.SanitizeLabelName(podAnnotationPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(podAnnotationPrefix+ln)] = lv(v) + ls[model.LabelName(podAnnotationPresentPrefix+ln)] = presentValue } return ls diff --git a/discovery/kubernetes/pod_test.go b/discovery/kubernetes/pod_test.go index 952c7357b..0548716a3 100644 --- a/discovery/kubernetes/pod_test.go +++ b/discovery/kubernetes/pod_test.go @@ -178,18 +178,20 @@ func TestPodDiscoveryBeforeRun(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_pod_name": "testpod", - "__meta_kubernetes_namespace": "default", - "__meta_kubernetes_pod_label_testlabel": "testvalue", - "__meta_kubernetes_pod_annotation_testannotation": "testannotationvalue", - "__meta_kubernetes_pod_node_name": "testnode", - "__meta_kubernetes_pod_ip": "1.2.3.4", - "__meta_kubernetes_pod_host_ip": "2.3.4.5", - "__meta_kubernetes_pod_ready": "true", - "__meta_kubernetes_pod_phase": "Running", - "__meta_kubernetes_pod_uid": "abc123", - "__meta_kubernetes_pod_controller_kind": "testcontrollerkind", - "__meta_kubernetes_pod_controller_name": "testcontrollername", + "__meta_kubernetes_pod_name": "testpod", + "__meta_kubernetes_namespace": "default", + "__meta_kubernetes_pod_label_testlabel": "testvalue", + "__meta_kubernetes_pod_labelpresent_testlabel": "true", + "__meta_kubernetes_pod_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_pod_annotationpresent_testannotation": "true", + "__meta_kubernetes_pod_node_name": "testnode", + "__meta_kubernetes_pod_ip": "1.2.3.4", + "__meta_kubernetes_pod_host_ip": "2.3.4.5", + "__meta_kubernetes_pod_ready": "true", + "__meta_kubernetes_pod_phase": "Running", + "__meta_kubernetes_pod_uid": "abc123", + "__meta_kubernetes_pod_controller_kind": "testcontrollerkind", + "__meta_kubernetes_pod_controller_name": "testcontrollername", }, Source: "pod/default/testpod", }, diff --git a/discovery/kubernetes/service.go b/discovery/kubernetes/service.go index 771fb2468..c19708796 100644 --- a/discovery/kubernetes/service.go +++ b/discovery/kubernetes/service.go @@ -135,13 +135,15 @@ func serviceSourceFromNamespaceAndName(namespace, name string) string { } const ( - serviceNameLabel = metaLabelPrefix + "service_name" - serviceLabelPrefix = metaLabelPrefix + "service_label_" - serviceAnnotationPrefix = metaLabelPrefix + "service_annotation_" - servicePortNameLabel = metaLabelPrefix + "service_port_name" - servicePortProtocolLabel = metaLabelPrefix + "service_port_protocol" - serviceClusterIPLabel = metaLabelPrefix + "service_cluster_ip" - serviceExternalNameLabel = metaLabelPrefix + "service_external_name" + serviceNameLabel = metaLabelPrefix + "service_name" + serviceLabelPrefix = metaLabelPrefix + "service_label_" + serviceLabelPresentPrefix = metaLabelPrefix + "service_labelpresent_" + serviceAnnotationPrefix = metaLabelPrefix + "service_annotation_" + serviceAnnotationPresentPrefix = metaLabelPrefix + "service_annotationpresent_" + servicePortNameLabel = metaLabelPrefix + "service_port_name" + servicePortProtocolLabel = metaLabelPrefix + "service_port_protocol" + serviceClusterIPLabel = metaLabelPrefix + "service_cluster_ip" + serviceExternalNameLabel = metaLabelPrefix + "service_external_name" ) func serviceLabels(svc *apiv1.Service) model.LabelSet { @@ -151,13 +153,15 @@ func serviceLabels(svc *apiv1.Service) model.LabelSet { ls[namespaceLabel] = lv(svc.Namespace) for k, v := range svc.Labels { - ln := strutil.SanitizeLabelName(serviceLabelPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(serviceLabelPrefix+ln)] = lv(v) + ls[model.LabelName(serviceLabelPresentPrefix+ln)] = presentValue } for k, v := range svc.Annotations { - ln := strutil.SanitizeLabelName(serviceAnnotationPrefix + k) - ls[model.LabelName(ln)] = lv(v) + ln := strutil.SanitizeLabelName(k) + ls[model.LabelName(serviceAnnotationPrefix+ln)] = lv(v) + ls[model.LabelName(serviceAnnotationPresentPrefix+ln)] = presentValue } return ls } diff --git a/discovery/kubernetes/service_test.go b/discovery/kubernetes/service_test.go index afa598326..585bbd49a 100644 --- a/discovery/kubernetes/service_test.go +++ b/discovery/kubernetes/service_test.go @@ -186,10 +186,12 @@ func TestServiceDiscoveryUpdate(t *testing.T) { }, }, Labels: model.LabelSet{ - "__meta_kubernetes_service_name": "testservice", - "__meta_kubernetes_namespace": "default", - "__meta_kubernetes_service_label_testlabel": "testvalue", - "__meta_kubernetes_service_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_service_name": "testservice", + "__meta_kubernetes_namespace": "default", + "__meta_kubernetes_service_label_testlabel": "testvalue", + "__meta_kubernetes_service_labelpresent_testlabel": "true", + "__meta_kubernetes_service_annotation_testannotation": "testannotationvalue", + "__meta_kubernetes_service_annotationpresent_testannotation": "true", }, Source: "svc/default/testservice", }, diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 3948eaaa9..2ee62cc6a 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -708,7 +708,9 @@ Available meta labels: * `__meta_kubernetes_node_name`: The name of the node object. * `__meta_kubernetes_node_label_`: Each label from the node object. +* `__meta_kubernetes_node_labelpresent_`: `true` for each label from the node object. * `__meta_kubernetes_node_annotation_`: Each annotation from the node object. +* `__meta_kubernetes_node_annotationpresent_`: `true` for each annotation from the node object. * `__meta_kubernetes_node_address_`: The first address for each node address type, if it exists. In addition, the `instance` label for the node will be set to the node name @@ -724,10 +726,12 @@ service port. Available meta labels: * `__meta_kubernetes_namespace`: The namespace of the service object. -* `__meta_kubernetes_service_annotation_`: The annotation of the service object. +* `__meta_kubernetes_service_annotation_`: Each annotation from the service object. +* `__meta_kubernetes_service_annotationpresent_`: "true" for each annotation of the service object. * `__meta_kubernetes_service_cluster_ip`: The cluster IP address of the service. (Does not apply to services of type ExternalName) * `__meta_kubernetes_service_external_name`: The DNS name of the service. (Applies to services of type ExternalName) -* `__meta_kubernetes_service_label_`: The label of the service object. +* `__meta_kubernetes_service_label_`: Each label from the service object. +* `__meta_kubernetes_service_labelpresent_`: `true` for each label of the service object. * `__meta_kubernetes_service_name`: The name of the service object. * `__meta_kubernetes_service_port_name`: Name of the service port for the target. * `__meta_kubernetes_service_port_number`: Number of the service port for the target. @@ -744,8 +748,10 @@ Available meta labels: * `__meta_kubernetes_namespace`: The namespace of the pod object. * `__meta_kubernetes_pod_name`: The name of the pod object. * `__meta_kubernetes_pod_ip`: The pod IP of the pod object. -* `__meta_kubernetes_pod_label_`: The label of the pod object. -* `__meta_kubernetes_pod_annotation_`: The annotation of the pod object. +* `__meta_kubernetes_pod_label_`: Each label from the pod object. +* `__meta_kubernetes_pod_labelpresent_`: `true`for each label from the pod object. +* `__meta_kubernetes_pod_annotation_`: Each annotation from the pod object. +* `__meta_kubernetes_pod_annotationpresent_`: `true` for each annotation from the pod object. * `__meta_kubernetes_pod_container_name`: Name of the container the target address points to. * `__meta_kubernetes_pod_container_port_name`: Name of the container port. * `__meta_kubernetes_pod_container_port_number`: Number of the container port. @@ -789,8 +795,10 @@ Available meta labels: * `__meta_kubernetes_namespace`: The namespace of the ingress object. * `__meta_kubernetes_ingress_name`: The name of the ingress object. -* `__meta_kubernetes_ingress_label_`: The label of the ingress object. -* `__meta_kubernetes_ingress_annotation_`: The annotation of the ingress object. +* `__meta_kubernetes_ingress_label_`: Each label from the ingress object. +* `__meta_kubernetes_ingress_labelpresent_`: `true` for each label from the ingress object. +* `__meta_kubernetes_ingress_annotation_`: Each annotation from the ingress object. +* `__meta_kubernetes_ingress_annotationpresent_`: `true` for each annotation from the ingress object. * `__meta_kubernetes_ingress_scheme`: Protocol scheme of ingress, `https` if TLS config is set. Defaults to `http`. * `__meta_kubernetes_ingress_path`: Path from ingress spec. Defaults to `/`.