Skip to content

Commit 8579a68

Browse files
committed
fix: expose metrics for VPA objects with empty target refs
Signed-off-by: m.nabokikh <maksim.nabokikh@flant.com>
1 parent c39a3bd commit 8579a68

2 files changed

Lines changed: 36 additions & 5 deletions

File tree

internal/store/verticalpodautoscaler.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package store
1919
import (
2020
"context"
2121

22+
k8sautoscaling "k8s.io/api/autoscaling/v1"
2223
v1 "k8s.io/api/core/v1"
2324
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2425
"k8s.io/apimachinery/pkg/runtime"
@@ -274,16 +275,18 @@ func vpaResourcesToMetrics(containerName string, resources v1.ResourceList) []*m
274275
func wrapVPAFunc(f func(*autoscaling.VerticalPodAutoscaler) *metric.Family) func(interface{}) *metric.Family {
275276
return func(obj interface{}) *metric.Family {
276277
vpa := obj.(*autoscaling.VerticalPodAutoscaler)
278+
279+
metricFamily := f(vpa)
277280
targetRef := vpa.Spec.TargetRef
278281

279282
// targetRef was not a mandatory field, which can lead to a nil pointer exception here.
280-
// Since it is pointless to have a VPA object without target ref, skip exporting metrics.
283+
// However, we still want to expose metrics to be able:
284+
// * to alert about VPA objects without target refs
285+
// * to count the right amount of VPA objects in a cluster
281286
if targetRef == nil {
282-
return &metric.Family{}
287+
targetRef = &k8sautoscaling.CrossVersionObjectReference{}
283288
}
284289

285-
metricFamily := f(vpa)
286-
287290
for _, m := range metricFamily.Metrics {
288291
m.LabelKeys = append(descVerticalPodAutoscalerLabelsDefaultLabels, m.LabelKeys...)
289292
m.LabelValues = append([]string{vpa.Namespace, vpa.Name, targetRef.APIVersion, targetRef.Kind, targetRef.Name}, m.LabelValues...)

internal/store/verticalpodautoscaler_test.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,35 @@ func TestVPAStore(t *testing.T) {
169169
},
170170
},
171171
},
172-
Want: metadata,
172+
Want: metadata + `
173+
kube_verticalpodautoscaler_spec_resourcepolicy_container_policies_maxallowed{container="*",namespace="ns2",resource="cpu",target_api_version="",target_kind="",target_name="",unit="core",verticalpodautoscaler="vpa-without-target-ref"} 4
174+
kube_verticalpodautoscaler_spec_resourcepolicy_container_policies_maxallowed{container="*",namespace="ns2",resource="memory",target_api_version="",target_kind="",target_name="",unit="byte",verticalpodautoscaler="vpa-without-target-ref"} 8.589934592e+09
175+
kube_verticalpodautoscaler_spec_resourcepolicy_container_policies_minallowed{container="*",namespace="ns2",resource="cpu",target_api_version="",target_kind="",target_name="",unit="core",verticalpodautoscaler="vpa-without-target-ref"} 1
176+
kube_verticalpodautoscaler_spec_resourcepolicy_container_policies_minallowed{container="*",namespace="ns2",resource="memory",target_api_version="",target_kind="",target_name="",unit="byte",verticalpodautoscaler="vpa-without-target-ref"} 4.294967296e+09
177+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_lowerbound{container="container1",namespace="ns2",resource="cpu",target_api_version="",target_kind="",target_name="",unit="core",verticalpodautoscaler="vpa-without-target-ref"} 1
178+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_lowerbound{container="container1",namespace="ns2",resource="memory",target_api_version="",target_kind="",target_name="",unit="byte",verticalpodautoscaler="vpa-without-target-ref"} 4.294967296e+09
179+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_target{container="container1",namespace="ns2",resource="cpu",target_api_version="",target_kind="",target_name="",unit="core",verticalpodautoscaler="vpa-without-target-ref"} 3
180+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_target{container="container1",namespace="ns2",resource="memory",target_api_version="",target_kind="",target_name="",unit="byte",verticalpodautoscaler="vpa-without-target-ref"} 7.516192768e+09
181+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_uncappedtarget{container="container1",namespace="ns2",resource="cpu",target_api_version="",target_kind="",target_name="",unit="core",verticalpodautoscaler="vpa-without-target-ref"} 6
182+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_uncappedtarget{container="container1",namespace="ns2",resource="memory",target_api_version="",target_kind="",target_name="",unit="byte",verticalpodautoscaler="vpa-without-target-ref"} 1.073741824e+10
183+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_upperbound{container="container1",namespace="ns2",resource="cpu",target_api_version="",target_kind="",target_name="",unit="core",verticalpodautoscaler="vpa-without-target-ref"} 4
184+
kube_verticalpodautoscaler_status_recommendation_containerrecommendations_upperbound{container="container1",namespace="ns2",resource="memory",target_api_version="",target_kind="",target_name="",unit="byte",verticalpodautoscaler="vpa-without-target-ref"} 8.589934592e+09
185+
kube_verticalpodautoscaler_labels{namespace="ns2",target_api_version="",target_kind="",target_name="",verticalpodautoscaler="vpa-without-target-ref"} 1
186+
kube_verticalpodautoscaler_spec_updatepolicy_updatemode{namespace="ns2",target_api_version="",target_kind="",target_name="",update_mode="Auto",verticalpodautoscaler="vpa-without-target-ref"} 0
187+
kube_verticalpodautoscaler_spec_updatepolicy_updatemode{namespace="ns2",target_api_version="",target_kind="",target_name="",update_mode="Initial",verticalpodautoscaler="vpa-without-target-ref"} 0
188+
kube_verticalpodautoscaler_spec_updatepolicy_updatemode{namespace="ns2",target_api_version="",target_kind="",target_name="",update_mode="Off",verticalpodautoscaler="vpa-without-target-ref"} 0
189+
kube_verticalpodautoscaler_spec_updatepolicy_updatemode{namespace="ns2",target_api_version="",target_kind="",target_name="",update_mode="Recreate",verticalpodautoscaler="vpa-without-target-ref"} 1
190+
`,
191+
MetricNames: []string{
192+
"kube_verticalpodautoscaler_labels",
193+
"kube_verticalpodautoscaler_spec_updatepolicy_updatemode",
194+
"kube_verticalpodautoscaler_spec_resourcepolicy_container_policies_minallowed",
195+
"kube_verticalpodautoscaler_spec_resourcepolicy_container_policies_maxallowed",
196+
"kube_verticalpodautoscaler_status_recommendation_containerrecommendations_lowerbound",
197+
"kube_verticalpodautoscaler_status_recommendation_containerrecommendations_upperbound",
198+
"kube_verticalpodautoscaler_status_recommendation_containerrecommendations_target",
199+
"kube_verticalpodautoscaler_status_recommendation_containerrecommendations_uncappedtarget",
200+
},
173201
},
174202
}
175203
for i, c := range cases {

0 commit comments

Comments
 (0)