From 25bdd670c886009cced162afe40c9e15e84380bd Mon Sep 17 00:00:00 2001 From: Darren Foo Date: Tue, 28 Nov 2023 14:57:37 -0800 Subject: [PATCH] add external_ip label to kube_node_info metric --- docs/node-metrics.md | 2 +- internal/store/node.go | 9 +++++++++ internal/store/node_test.go | 8 +++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/node-metrics.md b/docs/node-metrics.md index 4af8460dec..0b8f9b20dc 100644 --- a/docs/node-metrics.md +++ b/docs/node-metrics.md @@ -3,7 +3,7 @@ | Metric name | Metric type | Description | Unit (where applicable) | Labels/tags | Status | | ---------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | | kube_node_annotations | Gauge | Kubernetes annotations converted to Prometheus labels controlled via [--metric-annotations-allowlist](./cli-arguments.md) | | `node`=<node-address>
`annotation_NODE_ANNOTATION`=<NODE_ANNOTATION> | EXPERIMENTAL | -| kube_node_info | Gauge | Information about a cluster node | | `node`=<node-address>
`kernel_version`=<kernel-version>
`os_image`=<os-image-name>
`container_runtime_version`=<container-runtime-and-version-combination>
`kubelet_version`=<kubelet-version>
`kubeproxy_version`=<kubeproxy-version>
`pod_cidr`=<pod-cidr>
`provider_id`=<provider-id>
`system_uuid`=<system-uuid>
`internal_ip`=<internal-ip> | STABLE | +| kube_node_info | Gauge | Information about a cluster node | | `node`=<node-address>
`kernel_version`=<kernel-version>
`os_image`=<os-image-name>
`container_runtime_version`=<container-runtime-and-version-combination>
`kubelet_version`=<kubelet-version>
`kubeproxy_version`=<kubeproxy-version>
`pod_cidr`=<pod-cidr>
`provider_id`=<provider-id>
`system_uuid`=<system-uuid>
`internal_ip`=<internal-ip>
`external_ip`=<external-ip> | STABLE | | kube_node_labels | Gauge | Kubernetes labels converted to Prometheus labels controlled via [--metric-labels-allowlist](./cli-arguments.md) | | `node`=<node-address>
`label_NODE_LABEL`=<NODE_LABEL> | STABLE | | kube_node_role | Gauge | The role of a cluster node | | `node`=<node-address>
`role`=<NODE_ROLE> | EXPERIMENTAL | | kube_node_spec_unschedulable | Gauge | Whether a node can schedule new pods | | `node`=<node-address> | STABLE | diff --git a/internal/store/node.go b/internal/store/node.go index 1d4d6bee4f..5dd1f28c41 100644 --- a/internal/store/node.go +++ b/internal/store/node.go @@ -143,6 +143,15 @@ func createNodeInfoFamilyGenerator() generator.FamilyGenerator { labelKeys = append(labelKeys, "internal_ip") labelValues = append(labelValues, internalIP) + externalIP := "" + for _, address := range n.Status.Addresses { + if address.Type == "ExternalIP" { + externalIP = address.Address + } + } + labelKeys = append(labelKeys, "external_ip") + labelValues = append(labelValues, externalIP) + return &metric.Family{ Metrics: []*metric.Metric{ { diff --git a/internal/store/node_test.go b/internal/store/node_test.go index a28f39c2f7..d25c2ec9af 100644 --- a/internal/store/node_test.go +++ b/internal/store/node_test.go @@ -46,6 +46,7 @@ func TestNodeStore(t *testing.T) { }, Addresses: []v1.NodeAddress{ {Type: "InternalIP", Address: "1.2.3.4"}, + {Type: "ExternalIP", Address: "5.6.7.8"}, }, }, Spec: v1.NodeSpec{ @@ -60,7 +61,7 @@ func TestNodeStore(t *testing.T) { # TYPE kube_node_info gauge # TYPE kube_node_labels gauge # TYPE kube_node_spec_unschedulable gauge - kube_node_info{container_runtime_version="rkt",kernel_version="kernel",kubelet_version="kubelet",kubeproxy_version="kubeproxy",node="127.0.0.1",os_image="osimage",pod_cidr="172.24.10.0/24",provider_id="provider://i-uniqueid",internal_ip="1.2.3.4",system_uuid="6a934e21-5207-4a84-baea-3a952d926c80"} 1 + kube_node_info{container_runtime_version="rkt",kernel_version="kernel",kubelet_version="kubelet",kubeproxy_version="kubeproxy",node="127.0.0.1",os_image="osimage",pod_cidr="172.24.10.0/24",provider_id="provider://i-uniqueid",internal_ip="1.2.3.4",external_ip="5.6.7.8",system_uuid="6a934e21-5207-4a84-baea-3a952d926c80"} 1 kube_node_spec_unschedulable{node="127.0.0.1"} 0 `, MetricNames: []string{"kube_node_spec_unschedulable", "kube_node_labels", "kube_node_info"}, @@ -75,7 +76,7 @@ func TestNodeStore(t *testing.T) { Want: ` # HELP kube_node_info [STABLE] Information about a cluster node. # TYPE kube_node_info gauge - kube_node_info{container_runtime_version="",kernel_version="",kubelet_version="",kubeproxy_version="",node="",os_image="",pod_cidr="",provider_id="",internal_ip="",system_uuid=""} 1 + kube_node_info{container_runtime_version="",kernel_version="",kubelet_version="",kubeproxy_version="",node="",os_image="",pod_cidr="",provider_id="",internal_ip="",external_ip="",system_uuid=""} 1 `, MetricNames: []string{"kube_node_info"}, }, @@ -105,6 +106,7 @@ func TestNodeStore(t *testing.T) { }, Addresses: []v1.NodeAddress{ {Type: "InternalIP", Address: "1.2.3.4"}, + {Type: "ExternalIP", Address: "5.6.7.8"}, }, Capacity: v1.ResourceList{ v1.ResourceCPU: resource.MustParse("4.3"), @@ -140,7 +142,7 @@ func TestNodeStore(t *testing.T) { # TYPE kube_node_status_allocatable gauge # TYPE kube_node_status_capacity gauge kube_node_created{node="127.0.0.1"} 1.5e+09 - kube_node_info{container_runtime_version="rkt",kernel_version="kernel",kubelet_version="kubelet",kubeproxy_version="kubeproxy",node="127.0.0.1",os_image="osimage",pod_cidr="172.24.10.0/24",provider_id="provider://i-randomidentifier",internal_ip="1.2.3.4",system_uuid="6a934e21-5207-4a84-baea-3a952d926c80"} 1 + kube_node_info{container_runtime_version="rkt",kernel_version="kernel",kubelet_version="kubelet",kubeproxy_version="kubeproxy",node="127.0.0.1",os_image="osimage",pod_cidr="172.24.10.0/24",provider_id="provider://i-randomidentifier",internal_ip="1.2.3.4",external_ip="5.6.7.8",system_uuid="6a934e21-5207-4a84-baea-3a952d926c80"} 1 kube_node_role{node="127.0.0.1",role="master"} 1 kube_node_spec_unschedulable{node="127.0.0.1"} 1 kube_node_status_allocatable{node="127.0.0.1",resource="cpu",unit="core"} 3