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.
This commit is contained in:
胡玮文
2025-09-04 19:41:52 +08:00
parent 98c6293623
commit 21ff3c196c
3 changed files with 8 additions and 5 deletions

View File

@@ -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

View File

@@ -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),
)

View File

@@ -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