Skip to content

Commit 8d8df11

Browse files
authored
Merge pull request #1761 from bavarianbidi/new_kube_endpoint_address_metrics
add new kube_endpoint_address metric
2 parents 8024d3e + 6082c03 commit 8d8df11

File tree

3 files changed

+67
-4
lines changed

3 files changed

+67
-4
lines changed

docs/endpoint-metrics.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@
99
| kube_endpoint_labels | Gauge | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `label_ENDPOINT_LABEL`=&lt;ENDPOINT_LABEL&gt; | STABLE |
1010
| kube_endpoint_created | Gauge | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; | STABLE |
1111
| 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; | EXPERIMENTAL |
12+
| 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; | EXPERIMENTAL |

internal/store/endpoint.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,34 @@ func endpointMetricFamilies(allowAnnotationsList, allowLabelsList []string) []ge
151151
}
152152
}),
153153
),
154+
*generator.NewFamilyGenerator(
155+
"kube_endpoint_address",
156+
"Information about Endpoint available and non available addresses.",
157+
metric.Gauge,
158+
"",
159+
wrapEndpointFunc(func(e *v1.Endpoints) *metric.Family {
160+
ms := []*metric.Metric{}
161+
for _, s := range e.Subsets {
162+
for _, available := range s.Addresses {
163+
ms = append(ms, &metric.Metric{
164+
LabelValues: []string{available.IP, "true"},
165+
LabelKeys: []string{"ip", "ready"},
166+
Value: 1,
167+
})
168+
}
169+
for _, notReadyAddresses := range s.NotReadyAddresses {
170+
ms = append(ms, &metric.Metric{
171+
LabelValues: []string{notReadyAddresses.IP, "false"},
172+
LabelKeys: []string{"ip", "ready"},
173+
Value: 1,
174+
})
175+
}
176+
}
177+
return &metric.Family{
178+
Metrics: ms,
179+
}
180+
}),
181+
),
154182
*generator.NewFamilyGenerator(
155183
"kube_endpoint_ports",
156184
"Information about the Endpoint ports.",

internal/store/endpoint_test.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ func TestEndpointStore(t *testing.T) {
4444
# TYPE kube_endpoint_labels gauge
4545
# HELP kube_endpoint_ports Information about the Endpoint ports.
4646
# TYPE kube_endpoint_ports gauge
47+
# HELP kube_endpoint_address Information about Endpoint available and non available addresses.
48+
# TYPE kube_endpoint_address gauge
4749
`
4850
cases := []generateMetricsTestCase{
4951
{
@@ -61,6 +63,9 @@ func TestEndpointStore(t *testing.T) {
6163
Addresses: []v1.EndpointAddress{
6264
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
6365
},
66+
NotReadyAddresses: []v1.EndpointAddress{
67+
{IP: "10.0.0.10"},
68+
},
6469
Ports: []v1.EndpointPort{
6570
{Port: 8080, Name: "http", Protocol: v1.ProtocolTCP}, {Port: 8081, Name: "app", Protocol: v1.ProtocolTCP},
6671
},
@@ -86,7 +91,7 @@ func TestEndpointStore(t *testing.T) {
8691
Want: metadata + `
8792
kube_endpoint_annotations{endpoint="test-endpoint",namespace="default"} 1
8893
kube_endpoint_address_available{endpoint="test-endpoint",namespace="default"} 6
89-
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 4
94+
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 6
9095
kube_endpoint_created{endpoint="test-endpoint",namespace="default"} 1.5e+09
9196
kube_endpoint_info{endpoint="test-endpoint",namespace="default"} 1
9297
kube_endpoint_labels{endpoint="test-endpoint",namespace="default"} 1
@@ -96,6 +101,12 @@ func TestEndpointStore(t *testing.T) {
96101
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="prometheus",port_protocol="TCP",port_number="9090"} 1
97102
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog",port_protocol="UDP",port_number="1234"} 1
98103
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog-tcp",port_protocol="TCP",port_number="5678"} 1
104+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
105+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
106+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="172.22.23.202",ready="true"} 1
107+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.1.3",ready="false"} 1
108+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.2.2",ready="false"} 1
109+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
99110
`,
100111
},
101112
{
@@ -113,6 +124,9 @@ func TestEndpointStore(t *testing.T) {
113124
Addresses: []v1.EndpointAddress{
114125
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
115126
},
127+
NotReadyAddresses: []v1.EndpointAddress{
128+
{IP: "10.0.0.10"},
129+
},
116130
Ports: []v1.EndpointPort{
117131
{Port: 8080, Protocol: v1.ProtocolTCP},
118132
},
@@ -122,11 +136,14 @@ func TestEndpointStore(t *testing.T) {
122136
Want: metadata + `
123137
kube_endpoint_annotations{endpoint="single-port-endpoint",namespace="default"} 1
124138
kube_endpoint_address_available{endpoint="single-port-endpoint",namespace="default"} 2
125-
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 0
139+
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 1
126140
kube_endpoint_created{endpoint="single-port-endpoint",namespace="default"} 1.5e+09
127141
kube_endpoint_info{endpoint="single-port-endpoint",namespace="default"} 1
128142
kube_endpoint_labels{endpoint="single-port-endpoint",namespace="default"} 1
129143
kube_endpoint_ports{endpoint="single-port-endpoint",namespace="default",port_name="",port_number="8080",port_protocol="TCP"} 1
144+
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
145+
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
146+
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
130147
`,
131148
},
132149
}
@@ -157,6 +174,8 @@ func TestEndpointStoreWithLabels(t *testing.T) {
157174
# TYPE kube_endpoint_labels gauge
158175
# HELP kube_endpoint_ports Information about the Endpoint ports.
159176
# TYPE kube_endpoint_ports gauge
177+
# HELP kube_endpoint_address Information about Endpoint available and non available addresses.
178+
# TYPE kube_endpoint_address gauge
160179
`
161180
cases := []generateMetricsTestCase{
162181
{
@@ -177,6 +196,9 @@ func TestEndpointStoreWithLabels(t *testing.T) {
177196
Addresses: []v1.EndpointAddress{
178197
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
179198
},
199+
NotReadyAddresses: []v1.EndpointAddress{
200+
{IP: "10.0.0.10"},
201+
},
180202
Ports: []v1.EndpointPort{
181203
{Port: 8080, Name: "http", Protocol: v1.ProtocolTCP}, {Port: 8081, Name: "app", Protocol: v1.ProtocolTCP},
182204
},
@@ -201,7 +223,7 @@ func TestEndpointStoreWithLabels(t *testing.T) {
201223
},
202224
Want: metadata + `
203225
kube_endpoint_address_available{endpoint="test-endpoint",namespace="default"} 6
204-
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 4
226+
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 6
205227
kube_endpoint_annotations{endpoint="test-endpoint",annotation_app="foobar",namespace="default"} 1
206228
kube_endpoint_created{endpoint="test-endpoint",namespace="default"} 1.5e+09
207229
kube_endpoint_info{endpoint="test-endpoint",namespace="default"} 1
@@ -212,6 +234,12 @@ func TestEndpointStoreWithLabels(t *testing.T) {
212234
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="prometheus",port_protocol="TCP",port_number="9090"} 1
213235
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog",port_protocol="UDP",port_number="1234"} 1
214236
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog-tcp",port_protocol="TCP",port_number="5678"} 1
237+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
238+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
239+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="172.22.23.202",ready="true"} 1
240+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.1.3",ready="false"} 1
241+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.2.2",ready="false"} 1
242+
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
215243
`,
216244
},
217245
{
@@ -232,6 +260,9 @@ func TestEndpointStoreWithLabels(t *testing.T) {
232260
Addresses: []v1.EndpointAddress{
233261
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
234262
},
263+
NotReadyAddresses: []v1.EndpointAddress{
264+
{IP: "10.0.0.10"},
265+
},
235266
Ports: []v1.EndpointPort{
236267
{Port: 8080, Protocol: v1.ProtocolTCP},
237268
},
@@ -241,11 +272,14 @@ func TestEndpointStoreWithLabels(t *testing.T) {
241272
Want: metadata + `
242273
kube_endpoint_annotations{endpoint="single-port-endpoint",annotation_app="single-foobar",namespace="default"} 1
243274
kube_endpoint_address_available{endpoint="single-port-endpoint",namespace="default"} 2
244-
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 0
275+
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 1
245276
kube_endpoint_created{endpoint="single-port-endpoint",namespace="default"} 1.5e+09
246277
kube_endpoint_info{endpoint="single-port-endpoint",namespace="default"} 1
247278
kube_endpoint_labels{endpoint="single-port-endpoint",label_app="single-foobar",namespace="default"} 1
248279
kube_endpoint_ports{endpoint="single-port-endpoint",namespace="default",port_name="",port_number="8080",port_protocol="TCP"} 1
280+
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
281+
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
282+
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
249283
`,
250284
},
251285
}

0 commit comments

Comments
 (0)