From 3eb7aa445185336d3f4008eab2c99954c5510dd4 Mon Sep 17 00:00:00 2001 From: Tanguy Falconnet Date: Fri, 29 Apr 2022 12:23:41 +0200 Subject: [PATCH 1/6] feat(hpa): status current target Signed-off-by: Tanguy Falconnet --- docs/horizontalpodautoscaler-metrics.md | 1 + internal/store/horizontalpodautoscaler.go | 62 +++++++++++++++++++ .../store/horizontalpodautoscaler_test.go | 19 +++++- 3 files changed, 80 insertions(+), 2 deletions(-) diff --git a/docs/horizontalpodautoscaler-metrics.md b/docs/horizontalpodautoscaler-metrics.md index d8ac5c4f9a..79b59945da 100644 --- a/docs/horizontalpodautoscaler-metrics.md +++ b/docs/horizontalpodautoscaler-metrics.md @@ -9,6 +9,7 @@ | kube_horizontalpodautoscaler_spec_max_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_spec_min_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_spec_target_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | +| kube_horizontalpodautoscaler_status_current_target_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | | kube_horizontalpodautoscaler_status_condition | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`condition`=<hpa-condition>
`status`=<true\|false\|unknown> | STABLE | | kube_horizontalpodautoscaler_status_current_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_status_desired_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | diff --git a/internal/store/horizontalpodautoscaler.go b/internal/store/horizontalpodautoscaler.go index 6531866d7f..04b99a8be8 100644 --- a/internal/store/horizontalpodautoscaler.go +++ b/internal/store/horizontalpodautoscaler.go @@ -183,6 +183,68 @@ func hpaMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat } return &metric.Family{Metrics: ms} }), + ),, + *generator.NewFamilyGenerator( + "kube_horizontalpodautoscaler_status_current_target_metric", + "The metric current status used by this autoscaler when calculating the desired replica count.", + metric.Gauge, + "", + wrapHPAFunc(func(a *autoscaling.HorizontalPodAutoscaler) *metric.Family { + ms := make([]*metric.Metric, 0, len(a.Status.Metrics)) + for _, m := range a.Status.CurrentMetrics { + var metricName string + + // The variable maps the type of metric to the corresponding value + metricMap := make(map[metricTargetType]float64) + + switch m.Type { + case autoscaling.ObjectMetricSourceType: + metricName = m.Object.Metric.Name + + if m.Object.Current.Value != nil { + metricMap[value] = float64(m.Object.Current.Value.MilliValue()) / 1000 + } + if m.Object.Current.AverageValue != nil { + metricMap[average] = float64(m.Object.Current.AverageValue.MilliValue()) / 1000 + } + case autoscaling.PodsMetricSourceType: + metricName = m.Pods.Metric.Name + + metricMap[average] = float64(m.Pods.Current.AverageValue.MilliValue()) / 1000 + case autoscaling.ResourceMetricSourceType: + metricName = string(m.Resource.Name) + + if m.Resource.Current.AverageUtilization != nil { + metricMap[utilization] = float64(*m.Resource.Current.AverageUtilization) + } + + if m.Resource.Current.AverageValue != nil { + metricMap[average] = float64(m.Resource.Current.AverageValue.MilliValue()) / 1000 + } + case autoscaling.ExternalMetricSourceType: + metricName = m.External.Metric.Name + + if m.External.Current.Value != nil { + metricMap[value] = float64(m.External.Current.Value.MilliValue()) / 1000 + } + if m.External.Current.AverageValue != nil { + metricMap[average] = float64(m.External.Current.AverageValue.MilliValue()) / 1000 + } + default: + // Skip unsupported metric type + continue + } + + for metricTypeIndex, metricValue := range metricMap { + ms = append(ms, &metric.Metric{ + LabelKeys: targetMetricLabels, + LabelValues: []string{metricName, metricTypeIndex.String()}, + Value: metricValue, + }) + } + } + return &metric.Family{Metrics: ms} + }), ), *generator.NewFamilyGenerator( "kube_horizontalpodautoscaler_status_current_replicas", diff --git a/internal/store/horizontalpodautoscaler_test.go b/internal/store/horizontalpodautoscaler_test.go index 9192e19035..baa035b178 100644 --- a/internal/store/horizontalpodautoscaler_test.go +++ b/internal/store/horizontalpodautoscaler_test.go @@ -42,6 +42,7 @@ func TestHPAStore(t *testing.T) { # HELP kube_horizontalpodautoscaler_spec_max_replicas Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. # HELP kube_horizontalpodautoscaler_spec_min_replicas Lower limit for the number of pods that can be set by the autoscaler, default 1. # HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. + # HELP kube_horizontalpodautoscaler_status_current_target_metric The metric current status used by this autoscaler when calculating the desired replica count. # HELP kube_horizontalpodautoscaler_status_condition The condition of this autoscaler. # HELP kube_horizontalpodautoscaler_status_current_replicas Current number of replicas of pods managed by this autoscaler. # HELP kube_horizontalpodautoscaler_status_desired_replicas Desired number of replicas of pods managed by this autoscaler. @@ -52,6 +53,7 @@ func TestHPAStore(t *testing.T) { # TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge # TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge # TYPE kube_horizontalpodautoscaler_spec_target_metric gauge + # TYPE kube_horizontalpodautoscaler_status_current_target_metric gauge # TYPE kube_horizontalpodautoscaler_status_condition gauge # TYPE kube_horizontalpodautoscaler_status_current_replicas gauge # TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge @@ -179,7 +181,7 @@ func TestHPAStore(t *testing.T) { Name: "cpu", Current: autoscaling.MetricValueStatus{ AverageValue: resourcePtr(resource.MustParse("7m")), - AverageUtilization: new(int32), + AverageUtilization: int32ptr(80), }, }, }, @@ -189,7 +191,7 @@ func TestHPAStore(t *testing.T) { Name: "memory", Current: autoscaling.MetricValueStatus{ AverageValue: resourcePtr(resource.MustParse("26335914666m")), - AverageUtilization: new(int32), + AverageUtilization: int32ptr(80), }, }, }, @@ -213,6 +215,10 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="sqs_jobs",metric_target_type="value",namespace="ns1"} 30 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="transactions_processed",metric_target_type="average",namespace="ns1"} 33 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.007 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 80 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 26335914.666 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="true"} 1 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="unknown"} 0 @@ -225,6 +231,7 @@ func TestHPAStore(t *testing.T) { "kube_horizontalpodautoscaler_spec_max_replicas", "kube_horizontalpodautoscaler_spec_min_replicas", "kube_horizontalpodautoscaler_spec_target_metric", + "kube_horizontalpodautoscaler_status_current_target_metric", "kube_horizontalpodautoscaler_status_current_replicas", "kube_horizontalpodautoscaler_status_desired_replicas", "kube_horizontalpodautoscaler_status_condition", @@ -368,6 +375,13 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 75 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 100 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 100 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="value",namespace="ns1"} 847775744 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="value",namespace="ns1"} 28 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="value",namespace="ns1"} 0.062 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="value",namespace="ns1"} 6 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 2.9 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 0 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="true"} 1 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="unknown"} 0 @@ -380,6 +394,7 @@ func TestHPAStore(t *testing.T) { "kube_horizontalpodautoscaler_spec_max_replicas", "kube_horizontalpodautoscaler_spec_min_replicas", "kube_horizontalpodautoscaler_spec_target_metric", + "kube_horizontalpodautoscaler_status_current_target_metric", "kube_horizontalpodautoscaler_status_current_replicas", "kube_horizontalpodautoscaler_status_desired_replicas", "kube_horizontalpodautoscaler_status_condition", From 6906e076456c4133d4a3962792b0352e43132979 Mon Sep 17 00:00:00 2001 From: Tanguy Falconnet Date: Fri, 29 Apr 2022 12:34:09 +0200 Subject: [PATCH 2/6] fix(hpa): status current target --- internal/store/horizontalpodautoscaler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/store/horizontalpodautoscaler.go b/internal/store/horizontalpodautoscaler.go index 04b99a8be8..2f15dad8b4 100644 --- a/internal/store/horizontalpodautoscaler.go +++ b/internal/store/horizontalpodautoscaler.go @@ -183,14 +183,14 @@ func hpaMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat } return &metric.Family{Metrics: ms} }), - ),, + ), *generator.NewFamilyGenerator( "kube_horizontalpodautoscaler_status_current_target_metric", "The metric current status used by this autoscaler when calculating the desired replica count.", metric.Gauge, "", wrapHPAFunc(func(a *autoscaling.HorizontalPodAutoscaler) *metric.Family { - ms := make([]*metric.Metric, 0, len(a.Status.Metrics)) + ms := make([]*metric.Metric, 0, len(a.Status.CurrentMetrics)) for _, m := range a.Status.CurrentMetrics { var metricName string From b26d66357ad096155de491bd33f3dfbea5c5457f Mon Sep 17 00:00:00 2001 From: Tanguy Falconnet Date: Fri, 29 Apr 2022 12:34:42 +0200 Subject: [PATCH 3/6] fix(test/hpa): values & labels wanted --- internal/store/horizontalpodautoscaler_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/store/horizontalpodautoscaler_test.go b/internal/store/horizontalpodautoscaler_test.go index baa035b178..2e22b02969 100644 --- a/internal/store/horizontalpodautoscaler_test.go +++ b/internal/store/horizontalpodautoscaler_test.go @@ -217,7 +217,7 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="transactions_processed",metric_target_type="average",namespace="ns1"} 33 kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.007 kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 80 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 26335914.666 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 2.6335914666e+07 kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="true"} 1 @@ -375,12 +375,12 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 75 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 100 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 100 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="value",namespace="ns1"} 847775744 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="value",namespace="ns1"} 28 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="value",namespace="ns1"} 0.062 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="value",namespace="ns1"} 6 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 2.9 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="average",namespace="ns1"} 8.47775744e+08 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 28 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.062 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 6 kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 0 + kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="average",namespace="ns1"} 2.9 kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="true"} 1 From 20084df76ea857734a2c64741dcf849850f330bf Mon Sep 17 00:00:00 2001 From: Tanguy Falconnet Date: Fri, 29 Apr 2022 15:28:07 +0200 Subject: [PATCH 4/6] chore(hpa): rename metric to match with k8s api --- docs/horizontalpodautoscaler-metrics.md | 2 +- internal/store/horizontalpodautoscaler.go | 2 +- .../store/horizontalpodautoscaler_test.go | 30 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/horizontalpodautoscaler-metrics.md b/docs/horizontalpodautoscaler-metrics.md index 79b59945da..a12fcd678a 100644 --- a/docs/horizontalpodautoscaler-metrics.md +++ b/docs/horizontalpodautoscaler-metrics.md @@ -9,7 +9,7 @@ | kube_horizontalpodautoscaler_spec_max_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_spec_min_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_spec_target_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | -| kube_horizontalpodautoscaler_status_current_target_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | +| kube_horizontalpodautoscaler_status_current_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | | kube_horizontalpodautoscaler_status_condition | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`condition`=<hpa-condition>
`status`=<true\|false\|unknown> | STABLE | | kube_horizontalpodautoscaler_status_current_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_status_desired_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | diff --git a/internal/store/horizontalpodautoscaler.go b/internal/store/horizontalpodautoscaler.go index 2f15dad8b4..a196951d73 100644 --- a/internal/store/horizontalpodautoscaler.go +++ b/internal/store/horizontalpodautoscaler.go @@ -185,7 +185,7 @@ func hpaMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat }), ), *generator.NewFamilyGenerator( - "kube_horizontalpodautoscaler_status_current_target_metric", + "kube_horizontalpodautoscaler_status_current_metric", "The metric current status used by this autoscaler when calculating the desired replica count.", metric.Gauge, "", diff --git a/internal/store/horizontalpodautoscaler_test.go b/internal/store/horizontalpodautoscaler_test.go index 2e22b02969..4e09c30526 100644 --- a/internal/store/horizontalpodautoscaler_test.go +++ b/internal/store/horizontalpodautoscaler_test.go @@ -42,7 +42,7 @@ func TestHPAStore(t *testing.T) { # HELP kube_horizontalpodautoscaler_spec_max_replicas Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. # HELP kube_horizontalpodautoscaler_spec_min_replicas Lower limit for the number of pods that can be set by the autoscaler, default 1. # HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. - # HELP kube_horizontalpodautoscaler_status_current_target_metric The metric current status used by this autoscaler when calculating the desired replica count. + # HELP kube_horizontalpodautoscaler_status_current_metric The metric current status used by this autoscaler when calculating the desired replica count. # HELP kube_horizontalpodautoscaler_status_condition The condition of this autoscaler. # HELP kube_horizontalpodautoscaler_status_current_replicas Current number of replicas of pods managed by this autoscaler. # HELP kube_horizontalpodautoscaler_status_desired_replicas Desired number of replicas of pods managed by this autoscaler. @@ -53,7 +53,7 @@ func TestHPAStore(t *testing.T) { # TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge # TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge # TYPE kube_horizontalpodautoscaler_spec_target_metric gauge - # TYPE kube_horizontalpodautoscaler_status_current_target_metric gauge + # TYPE kube_horizontalpodautoscaler_status_current_metric gauge # TYPE kube_horizontalpodautoscaler_status_condition gauge # TYPE kube_horizontalpodautoscaler_status_current_replicas gauge # TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge @@ -215,10 +215,10 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="sqs_jobs",metric_target_type="value",namespace="ns1"} 30 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="transactions_processed",metric_target_type="average",namespace="ns1"} 33 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.007 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 80 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 2.6335914666e+07 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.007 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 80 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 2.6335914666e+07 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="true"} 1 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="unknown"} 0 @@ -231,7 +231,7 @@ func TestHPAStore(t *testing.T) { "kube_horizontalpodautoscaler_spec_max_replicas", "kube_horizontalpodautoscaler_spec_min_replicas", "kube_horizontalpodautoscaler_spec_target_metric", - "kube_horizontalpodautoscaler_status_current_target_metric", + "kube_horizontalpodautoscaler_status_current_metric", "kube_horizontalpodautoscaler_status_current_replicas", "kube_horizontalpodautoscaler_status_desired_replicas", "kube_horizontalpodautoscaler_status_condition", @@ -375,13 +375,13 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 75 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 100 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 100 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="average",namespace="ns1"} 8.47775744e+08 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 28 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.062 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 6 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 0 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="average",namespace="ns1"} 2.9 - kube_horizontalpodautoscaler_status_current_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 0 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="average",namespace="ns1"} 8.47775744e+08 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 28 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.062 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 6 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 0 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="average",namespace="ns1"} 2.9 + kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="true"} 1 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="unknown"} 0 @@ -394,7 +394,7 @@ func TestHPAStore(t *testing.T) { "kube_horizontalpodautoscaler_spec_max_replicas", "kube_horizontalpodautoscaler_spec_min_replicas", "kube_horizontalpodautoscaler_spec_target_metric", - "kube_horizontalpodautoscaler_status_current_target_metric", + "kube_horizontalpodautoscaler_status_current_metric", "kube_horizontalpodautoscaler_status_current_replicas", "kube_horizontalpodautoscaler_status_desired_replicas", "kube_horizontalpodautoscaler_status_condition", From b09674c2d48f4fa67992d65c40c0a827f0b47cea Mon Sep 17 00:00:00 2001 From: Tanguy Falconnet Date: Wed, 4 May 2022 10:11:11 +0200 Subject: [PATCH 5/6] chore: apply suggestions from code review Co-authored-by: Filip Petkovski --- internal/store/horizontalpodautoscaler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/store/horizontalpodautoscaler.go b/internal/store/horizontalpodautoscaler.go index a196951d73..1b0de5241a 100644 --- a/internal/store/horizontalpodautoscaler.go +++ b/internal/store/horizontalpodautoscaler.go @@ -185,8 +185,8 @@ func hpaMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generat }), ), *generator.NewFamilyGenerator( - "kube_horizontalpodautoscaler_status_current_metric", - "The metric current status used by this autoscaler when calculating the desired replica count.", + "kube_horizontalpodautoscaler_status_target_metric", + "The current metric status used by this autoscaler when calculating the desired replica count.", metric.Gauge, "", wrapHPAFunc(func(a *autoscaling.HorizontalPodAutoscaler) *metric.Family { From 8e5d283d118917c7e8098159704caf64ee3da41e Mon Sep 17 00:00:00 2001 From: Tanguy Falconnet Date: Wed, 4 May 2022 10:34:22 +0200 Subject: [PATCH 6/6] update(hpa): according to code review --- docs/horizontalpodautoscaler-metrics.md | 2 +- .../store/horizontalpodautoscaler_test.go | 30 +++++++++---------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/horizontalpodautoscaler-metrics.md b/docs/horizontalpodautoscaler-metrics.md index a12fcd678a..2c909acdbf 100644 --- a/docs/horizontalpodautoscaler-metrics.md +++ b/docs/horizontalpodautoscaler-metrics.md @@ -9,7 +9,7 @@ | kube_horizontalpodautoscaler_spec_max_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_spec_min_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_spec_target_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | -| kube_horizontalpodautoscaler_status_current_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | +| kube_horizontalpodautoscaler_status_target_metric | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`metric_name`=<metric-name>
`metric_target_type`=<value\|utilization\|average> | EXPERIMENTAL | | kube_horizontalpodautoscaler_status_condition | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace>
`condition`=<hpa-condition>
`status`=<true\|false\|unknown> | STABLE | | kube_horizontalpodautoscaler_status_current_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | | kube_horizontalpodautoscaler_status_desired_replicas | Gauge | `horizontalpodautoscaler`=<hpa-name>
`namespace`=<hpa-namespace> | STABLE | diff --git a/internal/store/horizontalpodautoscaler_test.go b/internal/store/horizontalpodautoscaler_test.go index 4e09c30526..d573113a70 100644 --- a/internal/store/horizontalpodautoscaler_test.go +++ b/internal/store/horizontalpodautoscaler_test.go @@ -42,7 +42,7 @@ func TestHPAStore(t *testing.T) { # HELP kube_horizontalpodautoscaler_spec_max_replicas Upper limit for the number of pods that can be set by the autoscaler; cannot be smaller than MinReplicas. # HELP kube_horizontalpodautoscaler_spec_min_replicas Lower limit for the number of pods that can be set by the autoscaler, default 1. # HELP kube_horizontalpodautoscaler_spec_target_metric The metric specifications used by this autoscaler when calculating the desired replica count. - # HELP kube_horizontalpodautoscaler_status_current_metric The metric current status used by this autoscaler when calculating the desired replica count. + # HELP kube_horizontalpodautoscaler_status_target_metric The current metric status used by this autoscaler when calculating the desired replica count. # HELP kube_horizontalpodautoscaler_status_condition The condition of this autoscaler. # HELP kube_horizontalpodautoscaler_status_current_replicas Current number of replicas of pods managed by this autoscaler. # HELP kube_horizontalpodautoscaler_status_desired_replicas Desired number of replicas of pods managed by this autoscaler. @@ -53,7 +53,7 @@ func TestHPAStore(t *testing.T) { # TYPE kube_horizontalpodautoscaler_spec_max_replicas gauge # TYPE kube_horizontalpodautoscaler_spec_min_replicas gauge # TYPE kube_horizontalpodautoscaler_spec_target_metric gauge - # TYPE kube_horizontalpodautoscaler_status_current_metric gauge + # TYPE kube_horizontalpodautoscaler_status_target_metric gauge # TYPE kube_horizontalpodautoscaler_status_condition gauge # TYPE kube_horizontalpodautoscaler_status_current_replicas gauge # TYPE kube_horizontalpodautoscaler_status_desired_replicas gauge @@ -215,10 +215,10 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="sqs_jobs",metric_target_type="value",namespace="ns1"} 30 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa1",metric_name="transactions_processed",metric_target_type="average",namespace="ns1"} 33 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.007 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 80 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 2.6335914666e+07 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.007 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa1",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 80 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="average",namespace="ns1"} 2.6335914666e+07 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa1",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 80 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="true"} 1 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa1",namespace="ns1",status="unknown"} 0 @@ -231,7 +231,7 @@ func TestHPAStore(t *testing.T) { "kube_horizontalpodautoscaler_spec_max_replicas", "kube_horizontalpodautoscaler_spec_min_replicas", "kube_horizontalpodautoscaler_spec_target_metric", - "kube_horizontalpodautoscaler_status_current_metric", + "kube_horizontalpodautoscaler_status_target_metric", "kube_horizontalpodautoscaler_status_current_replicas", "kube_horizontalpodautoscaler_status_desired_replicas", "kube_horizontalpodautoscaler_status_condition", @@ -375,13 +375,13 @@ func TestHPAStore(t *testing.T) { kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 75 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 100 kube_horizontalpodautoscaler_spec_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 100 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="average",namespace="ns1"} 8.47775744e+08 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 28 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.062 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 6 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 0 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="average",namespace="ns1"} 2.9 - kube_horizontalpodautoscaler_status_current_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 0 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="average",namespace="ns1"} 8.47775744e+08 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="memory",metric_target_type="utilization",namespace="ns1"} 28 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="average",namespace="ns1"} 0.062 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="cpu",metric_target_type="utilization",namespace="ns1"} 6 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="value",namespace="ns1"} 0 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_requests_per_second",metric_target_type="average",namespace="ns1"} 2.9 + kube_horizontalpodautoscaler_status_target_metric{horizontalpodautoscaler="hpa2",metric_name="traefik_backend_errors_per_second",metric_target_type="value",namespace="ns1"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="false"} 0 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="true"} 1 kube_horizontalpodautoscaler_status_condition{condition="AbleToScale",horizontalpodautoscaler="hpa2",namespace="ns1",status="unknown"} 0 @@ -394,7 +394,7 @@ func TestHPAStore(t *testing.T) { "kube_horizontalpodautoscaler_spec_max_replicas", "kube_horizontalpodautoscaler_spec_min_replicas", "kube_horizontalpodautoscaler_spec_target_metric", - "kube_horizontalpodautoscaler_status_current_metric", + "kube_horizontalpodautoscaler_status_target_metric", "kube_horizontalpodautoscaler_status_current_replicas", "kube_horizontalpodautoscaler_status_desired_replicas", "kube_horizontalpodautoscaler_status_condition",