Skip to content

Commit e14a9d7

Browse files
authored
Merge pull request #2503 from mrueg/issue-2408
feat: Move endpoint ports into address metric
2 parents 75fba81 + ea70345 commit e14a9d7

File tree

3 files changed

+66
-36
lines changed

3 files changed

+66
-36
lines changed

docs/metrics/service/endpoint-metrics.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
| kube_endpoint_info | Gauge | | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; | STABLE |
77
| kube_endpoint_labels | Gauge | Kubernetes labels converted to Prometheus labels controlled via [--metric-labels-allowlist](../../developer/cli-arguments.md) | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `label_ENDPOINT_LABEL`=&lt;ENDPOINT_LABEL&gt; | STABLE |
88
| kube_endpoint_created | Gauge | | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; | STABLE |
9-
| kube_endpoint_ports | Gauge | | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `port_name`=&lt;endpoint-port-name&gt; <br> `port_protocol`=&lt;endpoint-port-protocol&gt; <br> `port_number`=&lt;endpoint-port-number&gt; | STABLE |
10-
| kube_endpoint_address | Gauge | | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `ip`=&lt;endpoint-ip&gt; <br> `ready`=&lt;true if available, false if unavailalbe&gt; | STABLE |
9+
| kube_endpoint_ports | Gauge | | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `port_name`=&lt;endpoint-port-name&gt; <br> `port_protocol`=&lt;endpoint-port-protocol&gt; <br> `port_number`=&lt;endpoint-port-number&gt; | STABLE (Deprecated from 2.14.0) |
10+
| kube_endpoint_address | Gauge | | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `ip`=&lt;endpoint-ip&gt; <br> `port_name`=&lt;endpoint-port-name&gt; <br> `port_protocol`=&lt;endpoint-port-protocol&gt; <br> `port_number`=&lt;endpoint-port-number&gt;`ready`=&lt;true if available, false if unavailalbe&gt; | STABLE |

internal/store/endpoint.go

+32-14
Original file line numberDiff line numberDiff line change
@@ -132,19 +132,37 @@ func endpointMetricFamilies(allowAnnotationsList, allowLabelsList []string) []ge
132132
wrapEndpointFunc(func(e *v1.Endpoints) *metric.Family {
133133
ms := []*metric.Metric{}
134134
for _, s := range e.Subsets {
135-
for _, available := range s.Addresses {
136-
ms = append(ms, &metric.Metric{
137-
LabelValues: []string{available.IP, "true"},
138-
LabelKeys: []string{"ip", "ready"},
139-
Value: 1,
140-
})
141-
}
142-
for _, notReadyAddresses := range s.NotReadyAddresses {
143-
ms = append(ms, &metric.Metric{
144-
LabelValues: []string{notReadyAddresses.IP, "false"},
145-
LabelKeys: []string{"ip", "ready"},
146-
Value: 1,
147-
})
135+
for _, port := range s.Ports {
136+
for _, available := range s.Addresses {
137+
labelValues := []string{string(port.Protocol), strconv.FormatInt(int64(port.Port), 10)}
138+
labelKeys := []string{"port_protocol", "port_number"}
139+
140+
if port.Name != "" {
141+
labelKeys = append(labelKeys, "port_name")
142+
labelValues = append(labelValues, port.Name)
143+
}
144+
145+
ms = append(ms, &metric.Metric{
146+
LabelValues: append(labelValues, available.IP, "true"),
147+
LabelKeys: append(labelKeys, "ip", "ready"),
148+
Value: 1,
149+
})
150+
}
151+
for _, notReadyAddresses := range s.NotReadyAddresses {
152+
labelValues := []string{string(port.Protocol), strconv.FormatInt(int64(port.Port), 10)}
153+
labelKeys := []string{"port_protocol", "port_number"}
154+
155+
if port.Name != "" {
156+
labelKeys = append(labelKeys, "port_name")
157+
labelValues = append(labelValues, port.Name)
158+
}
159+
160+
ms = append(ms, &metric.Metric{
161+
LabelValues: append(labelValues, notReadyAddresses.IP, "false"),
162+
LabelKeys: append(labelKeys, "ip", "ready"),
163+
Value: 1,
164+
})
165+
}
148166
}
149167
}
150168
return &metric.Family{
@@ -157,7 +175,7 @@ func endpointMetricFamilies(allowAnnotationsList, allowLabelsList []string) []ge
157175
"Information about the Endpoint ports.",
158176
metric.Gauge,
159177
basemetrics.STABLE,
160-
"",
178+
"v2.14.0",
161179
wrapEndpointFunc(func(e *v1.Endpoints) *metric.Family {
162180
ms := []*metric.Metric{}
163181
for _, s := range e.Subsets {

internal/store/endpoint_test.go

+32-20
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func TestEndpointStore(t *testing.T) {
3838
# TYPE kube_endpoint_info gauge
3939
# HELP kube_endpoint_labels [STABLE] Kubernetes labels converted to Prometheus labels.
4040
# TYPE kube_endpoint_labels gauge
41-
# HELP kube_endpoint_ports [STABLE] Information about the Endpoint ports.
41+
# HELP kube_endpoint_ports [STABLE] (Deprecated since v2.14.0) Information about the Endpoint ports.
4242
# TYPE kube_endpoint_ports gauge
4343
# HELP kube_endpoint_address [STABLE] Information about Endpoint available and non available addresses.
4444
# TYPE kube_endpoint_address gauge
@@ -87,18 +87,24 @@ func TestEndpointStore(t *testing.T) {
8787
Want: metadata + `
8888
kube_endpoint_created{endpoint="test-endpoint",namespace="default"} 1.5e+09
8989
kube_endpoint_info{endpoint="test-endpoint",namespace="default"} 1
90+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.1",namespace="default",port_name="app",port_number="8081",port_protocol="TCP",ready="true"} 1
91+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.1",namespace="default",port_name="http",port_number="8080",port_protocol="TCP",ready="true"} 1
92+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.10",namespace="default",port_name="app",port_number="8081",port_protocol="TCP",ready="false"} 1
93+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.10",namespace="default",port_name="http",port_number="8080",port_protocol="TCP",ready="false"} 1
94+
kube_endpoint_address{endpoint="test-endpoint",ip="127.0.0.1",namespace="default",port_name="app",port_number="8081",port_protocol="TCP",ready="true"} 1
95+
kube_endpoint_address{endpoint="test-endpoint",ip="127.0.0.1",namespace="default",port_name="http",port_number="8080",port_protocol="TCP",ready="true"} 1
96+
kube_endpoint_address{endpoint="test-endpoint",ip="172.22.23.202",namespace="default",port_name="https",port_number="8443",port_protocol="TCP",ready="true"} 1
97+
kube_endpoint_address{endpoint="test-endpoint",ip="172.22.23.202",namespace="default",port_name="prometheus",port_number="9090",port_protocol="TCP",ready="true"} 1
98+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.1.3",namespace="default",port_name="syslog",port_number="1234",port_protocol="UDP",ready="false"} 1
99+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.1.3",namespace="default",port_name="syslog-tcp",port_number="5678",port_protocol="TCP",ready="false"} 1
100+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.2.2",namespace="default",port_name="syslog",port_number="1234",port_protocol="UDP",ready="false"} 1
101+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.2.2",namespace="default",port_name="syslog-tcp",port_number="5678",port_protocol="TCP",ready="false"} 1
90102
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="http",port_protocol="TCP",port_number="8080"} 1
91103
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="app",port_protocol="TCP",port_number="8081"} 1
92104
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="https",port_protocol="TCP",port_number="8443"} 1
93105
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="prometheus",port_protocol="TCP",port_number="9090"} 1
94106
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog",port_protocol="UDP",port_number="1234"} 1
95107
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog-tcp",port_protocol="TCP",port_number="5678"} 1
96-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
97-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
98-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="172.22.23.202",ready="true"} 1
99-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.1.3",ready="false"} 1
100-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.2.2",ready="false"} 1
101-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
102108
`,
103109
},
104110
{
@@ -129,9 +135,9 @@ func TestEndpointStore(t *testing.T) {
129135
kube_endpoint_created{endpoint="single-port-endpoint",namespace="default"} 1.5e+09
130136
kube_endpoint_info{endpoint="single-port-endpoint",namespace="default"} 1
131137
kube_endpoint_ports{endpoint="single-port-endpoint",namespace="default",port_name="",port_number="8080",port_protocol="TCP"} 1
132-
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
133-
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
134-
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
138+
kube_endpoint_address{endpoint="single-port-endpoint",ip="10.0.0.1",namespace="default",port_number="8080",port_protocol="TCP",ready="true"} 1
139+
kube_endpoint_address{endpoint="single-port-endpoint",ip="10.0.0.10",namespace="default",port_number="8080",port_protocol="TCP",ready="false"} 1
140+
kube_endpoint_address{endpoint="single-port-endpoint",ip="127.0.0.1",namespace="default",port_number="8080",port_protocol="TCP",ready="true"} 1
135141
`,
136142
},
137143
}
@@ -156,7 +162,7 @@ func TestEndpointStoreWithLabels(t *testing.T) {
156162
# TYPE kube_endpoint_info gauge
157163
# HELP kube_endpoint_labels [STABLE] Kubernetes labels converted to Prometheus labels.
158164
# TYPE kube_endpoint_labels gauge
159-
# HELP kube_endpoint_ports [STABLE] Information about the Endpoint ports.
165+
# HELP kube_endpoint_ports [STABLE] (Deprecated since v2.14.0) Information about the Endpoint ports.
160166
# TYPE kube_endpoint_ports gauge
161167
# HELP kube_endpoint_address [STABLE] Information about Endpoint available and non available addresses.
162168
# TYPE kube_endpoint_address gauge
@@ -216,12 +222,18 @@ func TestEndpointStoreWithLabels(t *testing.T) {
216222
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="prometheus",port_protocol="TCP",port_number="9090"} 1
217223
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog",port_protocol="UDP",port_number="1234"} 1
218224
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog-tcp",port_protocol="TCP",port_number="5678"} 1
219-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
220-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
221-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="172.22.23.202",ready="true"} 1
222-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.1.3",ready="false"} 1
223-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.2.2",ready="false"} 1
224-
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
225+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.1",namespace="default",port_name="app",port_number="8081",port_protocol="TCP",ready="true"} 1
226+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.1",namespace="default",port_name="http",port_number="8080",port_protocol="TCP",ready="true"} 1
227+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.10",namespace="default",port_name="app",port_number="8081",port_protocol="TCP",ready="false"} 1
228+
kube_endpoint_address{endpoint="test-endpoint",ip="10.0.0.10",namespace="default",port_name="http",port_number="8080",port_protocol="TCP",ready="false"} 1
229+
kube_endpoint_address{endpoint="test-endpoint",ip="127.0.0.1",namespace="default",port_name="app",port_number="8081",port_protocol="TCP",ready="true"} 1
230+
kube_endpoint_address{endpoint="test-endpoint",ip="127.0.0.1",namespace="default",port_name="http",port_number="8080",port_protocol="TCP",ready="true"} 1
231+
kube_endpoint_address{endpoint="test-endpoint",ip="172.22.23.202",namespace="default",port_name="https",port_number="8443",port_protocol="TCP",ready="true"} 1
232+
kube_endpoint_address{endpoint="test-endpoint",ip="172.22.23.202",namespace="default",port_name="prometheus",port_number="9090",port_protocol="TCP",ready="true"} 1
233+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.1.3",namespace="default",port_name="syslog",port_number="1234",port_protocol="UDP",ready="false"} 1
234+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.1.3",namespace="default",port_name="syslog-tcp",port_number="5678",port_protocol="TCP",ready="false"} 1
235+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.2.2",namespace="default",port_name="syslog",port_number="1234",port_protocol="UDP",ready="false"} 1
236+
kube_endpoint_address{endpoint="test-endpoint",ip="192.168.2.2",namespace="default",port_name="syslog-tcp",port_number="5678",port_protocol="TCP",ready="false"} 1
225237
`,
226238
},
227239
{
@@ -257,9 +269,9 @@ func TestEndpointStoreWithLabels(t *testing.T) {
257269
kube_endpoint_info{endpoint="single-port-endpoint",namespace="default"} 1
258270
kube_endpoint_labels{endpoint="single-port-endpoint",label_app="single-foobar",namespace="default"} 1
259271
kube_endpoint_ports{endpoint="single-port-endpoint",namespace="default",port_name="",port_number="8080",port_protocol="TCP"} 1
260-
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
261-
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
262-
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
272+
kube_endpoint_address{endpoint="single-port-endpoint",ip="10.0.0.1",namespace="default",port_number="8080",port_protocol="TCP",ready="true"} 1
273+
kube_endpoint_address{endpoint="single-port-endpoint",ip="10.0.0.10",namespace="default",port_number="8080",port_protocol="TCP",ready="false"} 1
274+
kube_endpoint_address{endpoint="single-port-endpoint",ip="127.0.0.1",namespace="default",port_number="8080",port_protocol="TCP",ready="true"} 1
263275
`,
264276
},
265277
}

0 commit comments

Comments
 (0)