Skip to content

Commit

Permalink
Merge pull request #1761 from bavarianbidi/new_kube_endpoint_address_…
Browse files Browse the repository at this point in the history
…metrics

add new kube_endpoint_address metric
  • Loading branch information
k8s-ci-robot authored Jun 22, 2022
2 parents 8024d3e + 6082c03 commit 8d8df11
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 4 deletions.
1 change: 1 addition & 0 deletions docs/endpoint-metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
| kube_endpoint_labels | Gauge | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; <br> `label_ENDPOINT_LABEL`=&lt;ENDPOINT_LABEL&gt; | STABLE |
| kube_endpoint_created | Gauge | `endpoint`=&lt;endpoint-name&gt; <br> `namespace`=&lt;endpoint-namespace&gt; | STABLE |
| 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 |
| 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 |
28 changes: 28 additions & 0 deletions internal/store/endpoint.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,34 @@ func endpointMetricFamilies(allowAnnotationsList, allowLabelsList []string) []ge
}
}),
),
*generator.NewFamilyGenerator(
"kube_endpoint_address",
"Information about Endpoint available and non available addresses.",
metric.Gauge,
"",
wrapEndpointFunc(func(e *v1.Endpoints) *metric.Family {
ms := []*metric.Metric{}
for _, s := range e.Subsets {
for _, available := range s.Addresses {
ms = append(ms, &metric.Metric{
LabelValues: []string{available.IP, "true"},
LabelKeys: []string{"ip", "ready"},
Value: 1,
})
}
for _, notReadyAddresses := range s.NotReadyAddresses {
ms = append(ms, &metric.Metric{
LabelValues: []string{notReadyAddresses.IP, "false"},
LabelKeys: []string{"ip", "ready"},
Value: 1,
})
}
}
return &metric.Family{
Metrics: ms,
}
}),
),
*generator.NewFamilyGenerator(
"kube_endpoint_ports",
"Information about the Endpoint ports.",
Expand Down
42 changes: 38 additions & 4 deletions internal/store/endpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ func TestEndpointStore(t *testing.T) {
# TYPE kube_endpoint_labels gauge
# HELP kube_endpoint_ports Information about the Endpoint ports.
# TYPE kube_endpoint_ports gauge
# HELP kube_endpoint_address Information about Endpoint available and non available addresses.
# TYPE kube_endpoint_address gauge
`
cases := []generateMetricsTestCase{
{
Expand All @@ -61,6 +63,9 @@ func TestEndpointStore(t *testing.T) {
Addresses: []v1.EndpointAddress{
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
},
NotReadyAddresses: []v1.EndpointAddress{
{IP: "10.0.0.10"},
},
Ports: []v1.EndpointPort{
{Port: 8080, Name: "http", Protocol: v1.ProtocolTCP}, {Port: 8081, Name: "app", Protocol: v1.ProtocolTCP},
},
Expand All @@ -86,7 +91,7 @@ func TestEndpointStore(t *testing.T) {
Want: metadata + `
kube_endpoint_annotations{endpoint="test-endpoint",namespace="default"} 1
kube_endpoint_address_available{endpoint="test-endpoint",namespace="default"} 6
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 4
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 6
kube_endpoint_created{endpoint="test-endpoint",namespace="default"} 1.5e+09
kube_endpoint_info{endpoint="test-endpoint",namespace="default"} 1
kube_endpoint_labels{endpoint="test-endpoint",namespace="default"} 1
Expand All @@ -96,6 +101,12 @@ func TestEndpointStore(t *testing.T) {
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="prometheus",port_protocol="TCP",port_number="9090"} 1
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog",port_protocol="UDP",port_number="1234"} 1
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog-tcp",port_protocol="TCP",port_number="5678"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="172.22.23.202",ready="true"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.1.3",ready="false"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.2.2",ready="false"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
`,
},
{
Expand All @@ -113,6 +124,9 @@ func TestEndpointStore(t *testing.T) {
Addresses: []v1.EndpointAddress{
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
},
NotReadyAddresses: []v1.EndpointAddress{
{IP: "10.0.0.10"},
},
Ports: []v1.EndpointPort{
{Port: 8080, Protocol: v1.ProtocolTCP},
},
Expand All @@ -122,11 +136,14 @@ func TestEndpointStore(t *testing.T) {
Want: metadata + `
kube_endpoint_annotations{endpoint="single-port-endpoint",namespace="default"} 1
kube_endpoint_address_available{endpoint="single-port-endpoint",namespace="default"} 2
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 0
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 1
kube_endpoint_created{endpoint="single-port-endpoint",namespace="default"} 1.5e+09
kube_endpoint_info{endpoint="single-port-endpoint",namespace="default"} 1
kube_endpoint_labels{endpoint="single-port-endpoint",namespace="default"} 1
kube_endpoint_ports{endpoint="single-port-endpoint",namespace="default",port_name="",port_number="8080",port_protocol="TCP"} 1
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
`,
},
}
Expand Down Expand Up @@ -157,6 +174,8 @@ func TestEndpointStoreWithLabels(t *testing.T) {
# TYPE kube_endpoint_labels gauge
# HELP kube_endpoint_ports Information about the Endpoint ports.
# TYPE kube_endpoint_ports gauge
# HELP kube_endpoint_address Information about Endpoint available and non available addresses.
# TYPE kube_endpoint_address gauge
`
cases := []generateMetricsTestCase{
{
Expand All @@ -177,6 +196,9 @@ func TestEndpointStoreWithLabels(t *testing.T) {
Addresses: []v1.EndpointAddress{
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
},
NotReadyAddresses: []v1.EndpointAddress{
{IP: "10.0.0.10"},
},
Ports: []v1.EndpointPort{
{Port: 8080, Name: "http", Protocol: v1.ProtocolTCP}, {Port: 8081, Name: "app", Protocol: v1.ProtocolTCP},
},
Expand All @@ -201,7 +223,7 @@ func TestEndpointStoreWithLabels(t *testing.T) {
},
Want: metadata + `
kube_endpoint_address_available{endpoint="test-endpoint",namespace="default"} 6
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 4
kube_endpoint_address_not_ready{endpoint="test-endpoint",namespace="default"} 6
kube_endpoint_annotations{endpoint="test-endpoint",annotation_app="foobar",namespace="default"} 1
kube_endpoint_created{endpoint="test-endpoint",namespace="default"} 1.5e+09
kube_endpoint_info{endpoint="test-endpoint",namespace="default"} 1
Expand All @@ -212,6 +234,12 @@ func TestEndpointStoreWithLabels(t *testing.T) {
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="prometheus",port_protocol="TCP",port_number="9090"} 1
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog",port_protocol="UDP",port_number="1234"} 1
kube_endpoint_ports{endpoint="test-endpoint",namespace="default",port_name="syslog-tcp",port_protocol="TCP",port_number="5678"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="172.22.23.202",ready="true"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.1.3",ready="false"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="192.168.2.2",ready="false"} 1
kube_endpoint_address{endpoint="test-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
`,
},
{
Expand All @@ -232,6 +260,9 @@ func TestEndpointStoreWithLabels(t *testing.T) {
Addresses: []v1.EndpointAddress{
{IP: "127.0.0.1"}, {IP: "10.0.0.1"},
},
NotReadyAddresses: []v1.EndpointAddress{
{IP: "10.0.0.10"},
},
Ports: []v1.EndpointPort{
{Port: 8080, Protocol: v1.ProtocolTCP},
},
Expand All @@ -241,11 +272,14 @@ func TestEndpointStoreWithLabels(t *testing.T) {
Want: metadata + `
kube_endpoint_annotations{endpoint="single-port-endpoint",annotation_app="single-foobar",namespace="default"} 1
kube_endpoint_address_available{endpoint="single-port-endpoint",namespace="default"} 2
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 0
kube_endpoint_address_not_ready{endpoint="single-port-endpoint",namespace="default"} 1
kube_endpoint_created{endpoint="single-port-endpoint",namespace="default"} 1.5e+09
kube_endpoint_info{endpoint="single-port-endpoint",namespace="default"} 1
kube_endpoint_labels{endpoint="single-port-endpoint",label_app="single-foobar",namespace="default"} 1
kube_endpoint_ports{endpoint="single-port-endpoint",namespace="default",port_name="",port_number="8080",port_protocol="TCP"} 1
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="127.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.1",ready="true"} 1
kube_endpoint_address{endpoint="single-port-endpoint",namespace="default",ip="10.0.0.10",ready="false"} 1
`,
},
}
Expand Down

0 comments on commit 8d8df11

Please sign in to comment.