Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions docs/metrics/service/ingress-metrics.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# Ingress Metrics

| Metric name | Metric type | Description | Labels/tags | Status |
| -------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------ |
| kube_ingress_annotations | Gauge | Kubernetes annotations converted to Prometheus labels controlled via [--metric-annotations-allowlist](../../developer/cli-arguments.md) | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `annotation_INGRESS_ANNOTATION`=&lt;ANNOTATION_LABEL&gt; | EXPERIMENTAL |
| kube_ingress_info | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `ingressclass`=&lt;ingress-class&gt; or `_default` if not set | STABLE |
| kube_ingress_labels | Gauge | Kubernetes labels converted to Prometheus labels controlled via [--metric-labels-allowlist](../../developer/cli-arguments.md) | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `label_INGRESS_LABEL`=&lt;INGRESS_LABEL&gt; | STABLE |
| kube_ingress_created | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; | STABLE |
| kube_ingress_metadata_resource_version | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; | EXPERIMENTAL |
| kube_ingress_path | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `host`=&lt;ingress-host&gt; <br> `path`=&lt;ingress-path&gt; <br> `path_type`=&lt;ingress-path type&gt; <br> If path served by Service Backend <br> `service_name`=&lt;service name for the path&gt; <br> `service_port`=&lt;service port for the path&gt; <br> If path served by Resource Backend <br> `resource_api_group`=&lt;resource backend api group&gt; <br> `resource_kind`=&lt;resource backend kind&gt; <br> `resource_name`=&lt;resource backend name&gt; | STABLE |
| kube_ingress_tls | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `tls_host`=&lt;tls hostname&gt; <br> `secret`=&lt;tls secret name&gt; | STABLE |
| Metric name | Metric type | Description | Labels/tags | Status | Opt-in |
| -------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| ------------ | ------ |
| kube_ingress_annotations | Gauge | Kubernetes annotations converted to Prometheus labels controlled via [--metric-annotations-allowlist](../../developer/cli-arguments.md) | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `annotation_INGRESS_ANNOTATION`=&lt;ANNOTATION_LABEL&gt; | EXPERIMENTAL | - |
| kube_ingress_info | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `ingressclass`=&lt;ingress-class&gt; or `_default` if not set | STABLE | - |
| kube_ingress_labels | Gauge | Kubernetes labels converted to Prometheus labels controlled via [--metric-labels-allowlist](../../developer/cli-arguments.md) | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `label_INGRESS_LABEL`=&lt;INGRESS_LABEL&gt; | STABLE | - |
| kube_ingress_created | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; | STABLE | - |
| kube_ingress_metadata_resource_version | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; | EXPERIMENTAL | - |
| kube_ingress_path | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `host`=&lt;ingress-host&gt; <br> `path`=&lt;ingress-path&gt; <br> `path_type`=&lt;ingress-path type&gt; <br> If path served by Service Backend <br> `service_name`=&lt;service name for the path&gt; <br> `service_port`=&lt;service port for the path&gt; <br> If path served by Resource Backend <br> `resource_api_group`=&lt;resource backend api group&gt; <br> `resource_kind`=&lt;resource backend kind&gt; <br> `resource_name`=&lt;resource backend name&gt; | STABLE | - |
| kube_ingress_tls | Gauge | | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `tls_host`=&lt;tls hostname&gt; <br> `secret`=&lt;tls secret name&gt; | STABLE | - |
| kube_ingress_status_load_balancer | Gauge | Ingress load balancer status | `ingress`=&lt;ingress-name&gt; <br> `namespace`=&lt;ingress-namespace&gt; <br> `ip`=&lt;load balancer ip&gt; <br> `hostname`=&lt;load balancer hostname&gt; | EXPERIMENTAL | Opt-in |
28 changes: 28 additions & 0 deletions internal/store/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,34 @@ func ingressMetricFamilies(allowAnnotationsList, allowLabelsList []string) []gen
}
}),
),
*generator.NewOptInFamilyGenerator(
"kube_ingress_status_load_balancer",
"Ingress load balancer status.",
metric.Gauge,
basemetrics.ALPHA,
"",
wrapIngressFunc(func(i *networkingv1.Ingress) *metric.Family {
if len(i.Status.LoadBalancer.Ingress) == 0 {
return &metric.Family{

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a need for the early return?

If i.Status.LoadBalancer.Ingress is empty then ms will be equally empty and thus Metrics: ms, will be equal to Metrics: []*metric.Metric{} in this early return.

Metrics: []*metric.Metric{},
}
}

ms := make([]*metric.Metric, len(i.Status.LoadBalancer.Ingress))

for idx, ingress := range i.Status.LoadBalancer.Ingress {
ms[idx] = &metric.Metric{
LabelKeys: []string{"ip", "hostname"},
LabelValues: []string{ingress.IP, ingress.Hostname},
Value: 1,
}
}

return &metric.Family{
Metrics: ms,
}
}),
),
}
}

Expand Down
76 changes: 76 additions & 0 deletions internal/store/ingress_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,82 @@ func TestIngressStore(t *testing.T) {
`,
MetricNames: []string{"kube_ingress_info", "kube_ingress_metadata_resource_version", "kube_ingress_created", "kube_ingress_labels", "kube_ingress_path", "kube_ingress_tls"},
},
{

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A test case to verify no metric family is returned when no load balancer ingress exists will verify there is no unwanted behavior either.

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",
},
},
},
},
},
Want: `
# HELP kube_ingress_status_load_balancer Ingress load balancer status.
# TYPE kube_ingress_status_load_balancer gauge
kube_ingress_status_load_balancer{namespace="ns8",ingress="ingress8",ip="1.2.3.4",hostname="www.example.com"} 1
`,
MetricNames: []string{"kube_ingress_status_load_balancer"},
},
{
Obj: &networkingv1.Ingress{
ObjectMeta: metav1.ObjectMeta{
Name: "ingress9",
Namespace: "ns9",
CreationTimestamp: metav1StartTime,
ResourceVersion: "123456",
},
Status: networkingv1.IngressStatus{
LoadBalancer: networkingv1.IngressLoadBalancerStatus{
Ingress: []networkingv1.IngressLoadBalancerIngress{
{
IP: "1.2.3.4",
},
},
},
},
},
Want: `
# HELP kube_ingress_status_load_balancer Ingress load balancer status.
# TYPE kube_ingress_status_load_balancer gauge
kube_ingress_status_load_balancer{namespace="ns9",ingress="ingress9",ip="1.2.3.4",hostname=""} 1
`,
MetricNames: []string{"kube_ingress_status_load_balancer"},
},
{
Obj: &networkingv1.Ingress{
ObjectMeta: metav1.ObjectMeta{
Name: "ingress10",
Namespace: "ns10",
CreationTimestamp: metav1StartTime,
ResourceVersion: "123456",
},
Status: networkingv1.IngressStatus{
LoadBalancer: networkingv1.IngressLoadBalancerStatus{
Ingress: []networkingv1.IngressLoadBalancerIngress{
{
Hostname: "www.example.com",
},
},
},
},
},
Want: `
# HELP kube_ingress_status_load_balancer Ingress load balancer status.
# TYPE kube_ingress_status_load_balancer gauge
kube_ingress_status_load_balancer{namespace="ns10",ingress="ingress10",ip="",hostname="www.example.com"} 1
`,
MetricNames: []string{"kube_ingress_status_load_balancer"},
},
}
for i, c := range cases {
c.Func = generator.ComposeMetricGenFuncs(ingressMetricFamilies(c.AllowAnnotationsList, c.AllowLabelsList))
Expand Down