in pkg/metrics/metrics.go [105:166]
func (mm *manager) RegisterMetricsCollector(targetPath, podNamespace, podName, bucketName string) {
emptyDirBasePath, err := util.PrepareEmptyDir(targetPath, false)
if err != nil {
klog.Errorf("failed to register metrics collector for pod %v/%v, bucket %q: %v", podNamespace, podName, bucketName, err)
return
}
socketBasePath := util.GetSocketBasePath(targetPath, mm.fuseSocketDir)
if err := os.Symlink(emptyDirBasePath, socketBasePath); err != nil && !os.IsExist(err) {
klog.Errorf("failed to create symbolic link to path %q: %v", socketBasePath, err)
return
}
podUID, volumeName, _ := util.ParsePodIDVolumeFromTargetpath(targetPath)
c := NewMetricsCollector(socketBasePath, emptyDirBasePath, podNamespace, podName, podUID, volumeName, map[string]string{
"pod_name": podName,
"namespace_name": podNamespace,
"volume_name": volumeName,
"bucket_name": bucketName,
"pod_uid": podUID,
}, mm.clientset)
// Lock the number of registered collectors while we attempt to register a new collector.
mm.mutex.Lock()
defer mm.mutex.Unlock()
if mm.maximumNumberOfCollectors == 0 {
klog.Infof("could not register metrics collector: podUID: %s, volume: %s. metrics collector limit is set to zero.", podUID, bucketName)
return
}
// Check if we need to register collector. We register a collector when the following are met:
// 1. There is space on the metrics pipeline for the collector to be registered.
// 2. The metrics collector has not previously been registered.
if mm.maximumNumberOfCollectors > 0 {
// If volume is already registered, do not register again. This flow can get triggered
// since CSI driver has republishVolume capability.
if mm.volumePublishPathRegistered.Has(targetPath) {
return
}
// If collector hasn't been registered and there's no space left, log a warning.
if mm.volumePublishPathRegistered.Len() >= mm.maximumNumberOfCollectors {
klog.V(6).Infof("could not register a metrics collector: podUID: %s, volume: %s. there's already %d collectors registered.", podUID, bucketName, mm.volumePublishPathRegistered.Len())
return
}
}
// Attempt to register new metrics collector and record success.
err = mm.registry.Register(c)
if err != nil {
if !strings.Contains(err.Error(), prometheus.AlreadyRegisteredError{}.Error()) {
klog.Errorf("failed to register metrics collector for pod %v/%v, volume %q, bucket %q: %v", podNamespace, podName, volumeName, bucketName, err)
}
} else {
mm.volumePublishPathRegistered.Insert(targetPath)
klog.Infof("successfully registered a new metrics collector: podUID: %s, volume: %s. there's %d collectors registered.", podUID, bucketName, mm.volumePublishPathRegistered.Len())
}
}