Skip to content

Commit 26c080f

Browse files
committed
Keep track of exactly which collectors are registered for logging warnings to unsupported volumes.
Change-Id: Ie7ce9cf87e47410afb2493f0a0de8ab6d0c3e34b
1 parent 7d5ae6c commit 26c080f

1 file changed

Lines changed: 20 additions & 9 deletions

File tree

pkg/metrics/metrics.go

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import (
2929
"sync"
3030
"time"
3131

32+
"k8s.io/apimachinery/pkg/util/sets"
33+
3234
"github.com/googlecloudplatform/gcs-fuse-csi-driver/pkg/cloud_provider/clientset"
3335
"github.com/googlecloudplatform/gcs-fuse-csi-driver/pkg/util"
3436
"github.com/prometheus/client_golang/prometheus"
@@ -59,7 +61,7 @@ type manager struct {
5961
clientset clientset.Interface
6062

6163
maximumNumberOfCollectors int
62-
registeredCollectorsCount int
64+
volumesRegistered sets.Set[string]
6365
mutex sync.Mutex
6466
}
6567

@@ -127,20 +129,29 @@ func (mm *manager) RegisterMetricsCollector(targetPath, podNamespace, podName, b
127129
mm.mutex.Lock()
128130
defer mm.mutex.Unlock()
129131

130-
// We skip registration when we already registered all supported metrics collectors. If a limit is
131-
// unset (maximumNumberOfCollectors less than zero), we continue to registration.
132-
if mm.maximumNumberOfCollectors >= 0 && mm.registeredCollectorsCount >= mm.maximumNumberOfCollectors {
133-
return
132+
// Check if we need to register collector. We register a collector when the following are met:
133+
// 1. There is space on the metrics pipeline for the collector to be registered.
134+
// 2. The metrics collector has not previously been registered.
135+
if mm.maximumNumberOfCollectors >= 0 {
136+
// If volume is already registered, do not register again. This can happen since GCSFuse CSI driver has republishVolume capability.
137+
if mm.volumesRegistered.Has(targetPath) {
138+
return
139+
}
140+
// If collector hasn't been registered and there's no space left, log a warning.
141+
if mm.volumesRegistered.Len() >= mm.maximumNumberOfCollectors {
142+
klog.Infof("could not register a metrics collector: podUID: %s, volume: %s. there's already %d collectors registered.", podUID, bucketName, mm.volumesRegistered.Len())
143+
}
134144
}
135145

146+
// Attempt to register new metrics collector and record success.
136147
err = mm.registry.Register(c)
137148
if err != nil {
138149
if !strings.Contains(err.Error(), prometheus.AlreadyRegisteredError{}.Error()) {
139150
klog.Errorf("failed to register metrics collector for pod %v/%v, volume %q, bucket %q: %v", podNamespace, podName, volumeName, bucketName, err)
140151
}
141152
} else {
142-
mm.registeredCollectorsCount += 1
143-
klog.Infof("successfully registered a new metrics collector: podUID: %s, volume: %s. there's %d collectors registerd.", podUID, bucketName, mm.registeredCollectorsCount)
153+
mm.volumesRegistered.Insert(targetPath)
154+
klog.Infof("successfully registered a new metrics collector: podUID: %s, volume: %s. there's %d collectors registered.", podUID, bucketName, mm.volumesRegistered.Len())
144155
}
145156
}
146157

@@ -158,8 +169,8 @@ func (mm *manager) UnregisterMetricsCollector(targetPath string) {
158169
if ok := mm.registry.Unregister(c); !ok {
159170
klog.Infof("Unregister metrics collector for targetPath %q is not needed since the collector is not registered", targetPath)
160171
} else {
161-
mm.registeredCollectorsCount -= 1
162-
klog.Infof("successfully unregistered a metrics collector: podUID: %s, volume: %s. there's %d collectors registerd.", podUID, volumeName, mm.registeredCollectorsCount)
172+
mm.volumesRegistered.Delete(targetPath)
173+
klog.Infof("successfully unregistered a metrics collector: podUID: %s, volume: %s. there's %d collectors registered.", podUID, volumeName, mm.volumesRegistered.Len())
163174
}
164175
}
165176

0 commit comments

Comments
 (0)