From 2c878b84c7ee1fb0a3cc4cc295699fa2d9b9db9d Mon Sep 17 00:00:00 2001 From: devGP7 Date: Thu, 6 Aug 2026 01:55:44 +0530 Subject: [PATCH] fix(metrics): drop high-cardinality labels from quota and legacy container-memory metrics Signed-off-by: devGP7 --- cmd/scheduler/metrics.go | 12 ++++++++-- cmd/scheduler/metrics_test.go | 39 +++++++++++++++++++++++++++++++++ cmd/vGPUmonitor/metrics_test.go | 1 + 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/cmd/scheduler/metrics.go b/cmd/scheduler/metrics.go index d652582253..9f2e04939c 100644 --- a/cmd/scheduler/metrics.go +++ b/cmd/scheduler/metrics.go @@ -259,13 +259,21 @@ func (cc ClusterManagerCollector) Collect(ch chan<- prometheus.Metric) { quotaUsedDesc := prometheus.NewDesc( "hami_resource_quota_used", "resourcequota usage for a certain device", - []string{"namespace", "quota_name", "limit"}, nil, + []string{"namespace", "quota_name"}, nil, + ) + quotaLimitDesc := prometheus.NewDesc( + "hami_resource_quota_limit", + "Configured hard limit for a resource quota", + []string{"namespace", "quota_name"}, nil, ) for ns, val := range cc.metricsProvider.GetQuotaManager().GetResourceQuota() { for quotaname, q := range *val { - if err := sendMetric(ch, quotaUsedDesc, prometheus.GaugeValue, float64(q.Used), ns, quotaname, fmt.Sprint(q.Limit)); err != nil { + if err := sendMetric(ch, quotaUsedDesc, prometheus.GaugeValue, float64(q.Used), ns, quotaname); err != nil { klog.V(4).Infof("Failed to send quotaUsedDesc metric: %v", err) } + if err := sendMetric(ch, quotaLimitDesc, prometheus.GaugeValue, float64(q.Limit), ns, quotaname); err != nil { + klog.V(4).Infof("Failed to send quotaLimitDesc metric: %v", err) + } if legacy { sendLegacyMetric(ch, legacyQuotaUsed, prometheus.GaugeValue, float64(q.Used), ns, quotaname, fmt.Sprint(q.Limit)) } diff --git a/cmd/scheduler/metrics_test.go b/cmd/scheduler/metrics_test.go index 60f19e98b0..5d8114cdb0 100644 --- a/cmd/scheduler/metrics_test.go +++ b/cmd/scheduler/metrics_test.go @@ -215,3 +215,42 @@ nodeGPUMemoryPercentage{deviceidx="2",deviceuuid="normal-memory",nodeid="node-1" t.Fatalf("unexpected collecting result:\n%s", err) } } + +func TestQuotaMetricHasNoLimitLabel(t *testing.T) { + qm := device.NewQuotaManager() + qm.Quotas["test-namespace"] = &device.DeviceQuota{ + "test-quota": &device.Quota{ + Limit: 10, + Used: 3, + }, + } + + collector := ClusterManagerCollector{ + ClusterManager: &ClusterManager{ + LegacyMetrics: false, + }, + metricsProvider: &fakeSchedulerMetricsProvider{ + nodeUsage: map[string]*schedulerpkg.NodeUsage{}, + quotaManager: qm, + podManager: device.NewPodManager(), + }, + } + + want := ` +# HELP hami_resource_quota_limit Configured hard limit for a resource quota +# TYPE hami_resource_quota_limit gauge +hami_resource_quota_limit{namespace="test-namespace",quota_name="test-quota"} 10 +# HELP hami_resource_quota_used resourcequota usage for a certain device +# TYPE hami_resource_quota_used gauge +hami_resource_quota_used{namespace="test-namespace",quota_name="test-quota"} 3 +` + + if err := promtestutil.CollectAndCompare( + collector, + strings.NewReader(want), + "hami_resource_quota_limit", + "hami_resource_quota_used", + ); err != nil { + t.Fatalf("unexpected collecting result:\n%s", err) + } +} diff --git a/cmd/vGPUmonitor/metrics_test.go b/cmd/vGPUmonitor/metrics_test.go index 2c31e4d221..69893c0920 100644 --- a/cmd/vGPUmonitor/metrics_test.go +++ b/cmd/vGPUmonitor/metrics_test.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "strings" "testing" "github.com/prometheus/client_golang/prometheus"