func()

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())
	}
}