diff --git a/docs/metrics/service/ingress-metrics.md b/docs/metrics/service/ingress-metrics.md
index 61faf115d3..ddbc67b820 100644
--- a/docs/metrics/service/ingress-metrics.md
+++ b/docs/metrics/service/ingress-metrics.md
@@ -9,3 +9,4 @@
| kube_ingress_metadata_resource_version | Gauge | | `ingress`=<ingress-name>
`namespace`=<ingress-namespace> | EXPERIMENTAL |
| kube_ingress_path | Gauge | | `ingress`=<ingress-name>
`namespace`=<ingress-namespace>
`host`=<ingress-host>
`path`=<ingress-path>
If path served by Service Backend
`service_name`=<service name for the path>
`service_port`=<service port for the path>
If path served by Resource Backend
`resource_api_group`=<resource backend api group>
`resource_kind`=<resource backend kind>
`resource_name`=<resource backend name> | STABLE |
| kube_ingress_tls | Gauge | | `ingress`=<ingress-name>
`namespace`=<ingress-namespace>
`tls_host`=<tls hostname>
`secret`=<tls secret name> | STABLE |
+| kube_ingress_status | Gauge | | `ingress`=<ingress-name>
`namespace`=<ingress-namespace>
`ip`=<ip>
`hostname`=<hostname>
`port`=<port>
`protocol`=<protocol> | STABLE |
diff --git a/internal/store/ingress.go b/internal/store/ingress.go
index ef04661689..80d2daa7ab 100644
--- a/internal/store/ingress.go
+++ b/internal/store/ingress.go
@@ -202,6 +202,28 @@ func ingressMetricFamilies(allowAnnotationsList, allowLabelsList []string) []gen
}
}),
),
+ *generator.NewFamilyGeneratorWithStability(
+ "kube_ingress_status",
+ "Ingress status.",
+ metric.Gauge,
+ basemetrics.STABLE,
+ "",
+ wrapIngressFunc(func(i *networkingv1.Ingress) *metric.Family {
+ ms := []*metric.Metric{}
+ for _, ingress := range i.Status.LoadBalancer.Ingress {
+ for _, port := range ingress.Ports {
+ ms = append(ms, &metric.Metric{
+ LabelKeys: []string{"ip", "hostname", "port", "protocol"},
+ LabelValues: []string{ingress.IP, ingress.Hostname, strconv.Itoa(int(port.Port)), string(port.Protocol)},
+ Value: 1,
+ })
+ }
+ }
+ return &metric.Family{
+ Metrics: ms,
+ }
+ }),
+ ),
}
}
diff --git a/internal/store/ingress_test.go b/internal/store/ingress_test.go
index c3902f7cbb..e95e9a4f1d 100644
--- a/internal/store/ingress_test.go
+++ b/internal/store/ingress_test.go
@@ -40,12 +40,14 @@ func TestIngressStore(t *testing.T) {
# HELP kube_ingress_metadata_resource_version Resource version representing a specific version of ingress.
# HELP kube_ingress_path [STABLE] Ingress host, paths and backend service information.
# HELP kube_ingress_tls [STABLE] Ingress TLS host and secret information.
+ # HELP kube_ingress_status [STABLE] Ingress status.
# TYPE kube_ingress_created gauge
# TYPE kube_ingress_info gauge
# TYPE kube_ingress_labels gauge
# TYPE kube_ingress_metadata_resource_version gauge
# TYPE kube_ingress_path gauge
# TYPE kube_ingress_tls gauge
+ # TYPE kube_ingress_status gauge
`
cases := []generateMetricsTestCase{
{
@@ -97,7 +99,7 @@ func TestIngressStore(t *testing.T) {
kube_ingress_created{namespace="ns2",ingress="ingress2"} 1.501569018e+09
kube_ingress_metadata_resource_version{namespace="ns2",ingress="ingress2"} 123456
`,
- MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
},
{
Obj: &networkingv1.Ingress{
@@ -113,7 +115,7 @@ func TestIngressStore(t *testing.T) {
kube_ingress_info{namespace="ns3",ingress="ingress3",ingressclass="_default"} 1
kube_ingress_created{namespace="ns3",ingress="ingress3"} 1.501569018e+09
`,
- MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
},
{
Obj: &networkingv1.Ingress{
@@ -167,7 +169,7 @@ func TestIngressStore(t *testing.T) {
kube_ingress_path{namespace="ns4",ingress="ingress4",host="somehost",path="/somepath",service_name="someservice",service_port="1234"} 1
kube_ingress_path{namespace="ns4",ingress="ingress4",host="somehost",path="/somepath2",resource_api_group="",resource_kind="somekind",resource_name="somename"} 1
`,
- MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
},
{
Obj: &networkingv1.Ingress{
@@ -193,7 +195,7 @@ func TestIngressStore(t *testing.T) {
kube_ingress_tls{namespace="ns5",ingress="ingress5",tls_host="somehost1",secret="somesecret"} 1
kube_ingress_tls{namespace="ns5",ingress="ingress5",tls_host="somehost2",secret="somesecret"} 1
`,
- MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
},
{
Obj: &networkingv1.Ingress{
@@ -212,7 +214,7 @@ func TestIngressStore(t *testing.T) {
kube_ingress_created{namespace="ns6",ingress="ingress6"} 1.501569018e+09
kube_ingress_metadata_resource_version{namespace="ns6",ingress="ingress6"} 123456
`,
- MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
},
{
Obj: &networkingv1.Ingress{
@@ -231,7 +233,42 @@ func TestIngressStore(t *testing.T) {
kube_ingress_created{namespace="ns7",ingress="ingress7"} 1.501569018e+09
kube_ingress_metadata_resource_version{namespace="ns7",ingress="ingress7"} 123456
`,
- MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
+ },
+ {
+ Obj: &networkingv1.Ingress{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "ingress8",
+ Namespace: "ns8",
+ CreationTimestamp: metav1StartTime,
+ ResourceVersion: "123456",
+ },
+ Status: networkingv1.IngressStatus{
+ LoadBalancer: networkingv1.IngressLoadBalancerStatus{
+ Ingress: []networkingv1.IngressLoadBalancerIngress{
+ {
+
+ IP: "1.2.3.4",
+ Hostname: "www.example.com",
+ Ports: []networkingv1.IngressPortStatus{
+ {
+ Port: 8888,
+ Protocol: "TCP",
+ Error: nil,
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ Want: metadata + `
+ kube_ingress_created{namespace="ns8",ingress="ingress8"} 1.501569018e+09
+ kube_ingress_info{namespace="ns8",ingress="ingress8",ingressclass="_default"} 1
+ kube_ingress_metadata_resource_version{namespace="ns8",ingress="ingress8"} 123456
+ kube_ingress_status{namespace="ns8",ingress="ingress8",ip="1.2.3.4",hostname="www.example.com",port="8888",protocol="TCP"} 1
+ `,
+ MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls", "kube_ingress_status"},
},
}
for i, c := range cases {