From 21ff3c196c250b47b71afcd36d08f8db43b5ad24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E7=8E=AE=E6=96=87?= Date: Thu, 4 Sep 2025 19:41:52 +0800 Subject: [PATCH] kubelet/metrics: fix multiple Register call DRA also calls Register at pkg/kubelet/cm/container_manager_linux.go NewContainerManager(), causing volume stats collector being ignored. Fix this by moving it out of `sync.Once()`, allowing multiple calls to `Register()` func. --- pkg/kubelet/cm/container_manager_linux.go | 2 +- pkg/kubelet/kubelet.go | 3 ++- pkg/kubelet/metrics/metrics.go | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/kubelet/cm/container_manager_linux.go b/pkg/kubelet/cm/container_manager_linux.go index c08aa56f244..c65053cd678 100644 --- a/pkg/kubelet/cm/container_manager_linux.go +++ b/pkg/kubelet/cm/container_manager_linux.go @@ -317,7 +317,7 @@ func NewContainerManager(mountUtil mount.Interface, cadvisorInterface cadvisor.I if err != nil { return nil, err } - metrics.Register(cm.draManager.NewMetricsCollector()) + metrics.RegisterCollectors(cm.draManager.NewMetricsCollector()) } cm.kubeClient = kubeClient diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index d8bbe14e427..b63dd49bb0d 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1632,7 +1632,8 @@ func (kl *Kubelet) StartGarbageCollection() { // Note that the modules here must not depend on modules that are not initialized here. func (kl *Kubelet) initializeModules(ctx context.Context) error { // Prometheus metrics. - metrics.Register( + metrics.Register() + metrics.RegisterCollectors( collectors.NewVolumeStatsCollector(kl), collectors.NewLogMetricsCollector(kl.StatsProvider.ListPodStats), ) diff --git a/pkg/kubelet/metrics/metrics.go b/pkg/kubelet/metrics/metrics.go index 3383f6a07a3..d960989d2bd 100644 --- a/pkg/kubelet/metrics/metrics.go +++ b/pkg/kubelet/metrics/metrics.go @@ -1194,7 +1194,7 @@ var ( var registerMetrics sync.Once // Register registers all metrics. -func Register(collectors ...metrics.StableCollector) { +func Register() { // Register the metrics. registerMetrics.Do(func() { legacyregistry.MustRegister(FirstNetworkPodStartSLIDuration) @@ -1274,8 +1274,6 @@ func Register(collectors ...metrics.StableCollector) { legacyregistry.MustRegister(OrphanPodCleanedVolumes) legacyregistry.MustRegister(OrphanPodCleanedVolumesErrors) - legacyregistry.CustomMustRegister(collectors...) - if utilfeature.DefaultFeatureGate.Enabled(features.GracefulNodeShutdown) && utilfeature.DefaultFeatureGate.Enabled(features.GracefulNodeShutdownBasedOnPodPriority) { legacyregistry.MustRegister(GracefulShutdownStartTime) @@ -1312,6 +1310,10 @@ func Register(collectors ...metrics.StableCollector) { }) } +func RegisterCollectors(collectors ...metrics.StableCollector) { + legacyregistry.CustomMustRegister(collectors...) +} + // GetGather returns the gatherer. It used by test case outside current package. func GetGather() metrics.Gatherer { return legacyregistry.DefaultGatherer