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