diff --git a/cmd/csi-provisioner/csi-provisioner.go b/cmd/csi-provisioner/csi-provisioner.go index 47166e9e10..0fa4f0e35e 100644 --- a/cmd/csi-provisioner/csi-provisioner.go +++ b/cmd/csi-provisioner/csi-provisioner.go @@ -22,7 +22,6 @@ import ( "fmt" "math/rand" "net/http" - "net/http/pprof" "os" "strconv" "strings" @@ -30,7 +29,6 @@ import ( "github.com/container-storage-interface/spec/lib/go/csi" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" flag "github.com/spf13/pflag" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" @@ -275,17 +273,14 @@ func main() { // Prepare http endpoint for metrics + leader election healthz mux := http.NewServeMux() - gatherers := prometheus.Gatherers{ - // For workqueue and leader election metrics, set up via the anonymous imports of: - // https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/component-base/metrics/prometheus/workqueue/metrics.go - // https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/component-base/metrics/prometheus/clientgo/leaderelection/metrics.go - // - // Also to happens to include Go runtime and process metrics: - // https://github.com/kubernetes/kubernetes/blob/9780d88cb6a4b5b067256ecb4abf56892093ee87/staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go#L46-L49 - legacyregistry.DefaultGatherer, - // For CSI operations. - metricsManager.GetRegistry(), - } + + // For workqueue and leader election metrics, set up via the anonymous imports of: + // https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/component-base/metrics/prometheus/workqueue/metrics.go + // https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/component-base/metrics/prometheus/clientgo/leaderelection/metrics.go + // + // Also to happens to include Go runtime and process metrics: + // https://github.com/kubernetes/kubernetes/blob/9780d88cb6a4b5b067256ecb4abf56892093ee87/staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go#L46-L49 + metricsManager.WithAdditionalRegistry(legacyregistry.DefaultGatherer) pluginCapabilities, controllerCapabilities, err := ctrl.GetDriverCapabilities(grpcClient, *operationTimeout) if err != nil { @@ -581,26 +576,13 @@ func main() { m.PersistentVolumeDeleteDurationSeconds, }...) provisionerOptions = append(provisionerOptions, controller.MetricsInstance(m)) - gatherers = append(gatherers, reg) - - // This is similar to k8s.io/component-base/metrics HandlerWithReset - // except that we gather from multiple sources. This is necessary - // because both CSI metrics manager and component-base manage - // their own registry. Probably could be avoided by making - // CSI metrics manager a bit more flexible. - mux.Handle(*metricsPath, - promhttp.InstrumentMetricHandler( - reg, - promhttp.HandlerFor(gatherers, promhttp.HandlerOpts{}))) + metricsManager.WithAdditionalRegistry(reg) + + metricsManager.RegisterToServer(mux, *metricsPath) if *enableProfile { klog.InfoS("Starting profiling", "endpoint", httpEndpoint) - - mux.HandleFunc("/debug/pprof/", pprof.Index) - mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline) - mux.HandleFunc("/debug/pprof/profile", pprof.Profile) - mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol) - mux.HandleFunc("/debug/pprof/trace", pprof.Trace) + metricsManager.RegisterPprofToServer(mux) } go func() { klog.Infof("ServeMux listening at %q", addr) diff --git a/go.mod b/go.mod index 72f35e8a6a..5c6e81cc51 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/golang/mock v1.6.0 github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/kubernetes-csi/csi-lib-utils v0.20.0 + github.com/kubernetes-csi/csi-lib-utils v0.21.0 github.com/kubernetes-csi/csi-test/v5 v5.3.1 github.com/kubernetes-csi/external-snapshotter/client/v8 v8.2.0 github.com/miekg/dns v1.1.62 // indirect diff --git a/go.sum b/go.sum index 84e48f3570..8afb685131 100644 --- a/go.sum +++ b/go.sum @@ -137,8 +137,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kubernetes-csi/csi-lib-utils v0.20.0 h1:JTvHRJugn+cByMnIU4nCnqPqOOUhuPzhlLqRvenwjDA= -github.com/kubernetes-csi/csi-lib-utils v0.20.0/go.mod h1:3b/HFVURW11oxV/gUAKyhhkvFpxXO/zRdvh1wdEfCZY= +github.com/kubernetes-csi/csi-lib-utils v0.21.0 h1:dUN/iIgXLucAxyML2iPyhniIlACQumIeAJmIzsMBddc= +github.com/kubernetes-csi/csi-lib-utils v0.21.0/go.mod h1:ZCVRTYuup+bwX9tOeE5Q3LDw64QvltSwMUQ3M3g2T+Q= github.com/kubernetes-csi/csi-test/v5 v5.3.1 h1:Wiukp1In+kif+BFo6q2ExjgB+MbrAz4jZWzGfijypuY= github.com/kubernetes-csi/csi-test/v5 v5.3.1/go.mod h1:7hA2cSYJ6T8CraEZPA6zqkLZwemjBD54XAnPsPC3VpA= github.com/kubernetes-csi/external-snapshotter/client/v8 v8.2.0 h1:Q3jQ1NkFqv5o+F8dMmHd8SfEmlcwNeo1immFApntEwE= diff --git a/vendor/github.com/kubernetes-csi/csi-lib-utils/metrics/metrics.go b/vendor/github.com/kubernetes-csi/csi-lib-utils/metrics/metrics.go index 33b64c7cd0..305e7997cb 100644 --- a/vendor/github.com/kubernetes-csi/csi-lib-utils/metrics/metrics.go +++ b/vendor/github.com/kubernetes-csi/csi-lib-utils/metrics/metrics.go @@ -25,6 +25,7 @@ import ( "strings" "time" + "github.com/prometheus/client_golang/prometheus" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "k8s.io/component-base/metrics" @@ -91,6 +92,11 @@ type CSIMetricsManager interface { // value is defined in the metrics manager HaveAdditionalLabel(name string) bool + // WithAdditionalRegistry can be used to ensure additional non-CSI registries are served through RegisterToServer + // + // registry - Any registry which implements Gather() (e.g. metrics.KubeRegistry, prometheus.Registry, etc.) + WithAdditionalRegistry(registry prometheus.Gatherer) CSIMetricsManager + // SetDriverName is called to update the CSI driver name. This should be done // as soon as possible, otherwise metrics recorded by this manager will be // recorded with an "unknown-driver" driver_name. @@ -242,11 +248,6 @@ func NewCSIMetricsManagerWithOptions(driverName string, options ...MetricsManage // https://github.com/open-telemetry/opentelemetry-collector/issues/969 // Add process_start_time_seconds into the metric to let the start time be parsed correctly metrics.RegisterProcessStartTime(cmm.registry.Register) - // TODO: This is a bug in component-base library. We need to remove this after upgrade component-base dependency - // BugFix: https://github.com/kubernetes/kubernetes/pull/96435 - // The first call to RegisterProcessStartTime can only create the metric, so we need a second call to actually - // register the metric. - metrics.RegisterProcessStartTime(cmm.registry.Register) } labels := []string{labelCSIDriverName, labelCSIOperationName, labelGrpcStatusCode} @@ -266,6 +267,9 @@ func NewCSIMetricsManagerWithOptions(driverName string, options ...MetricsManage ) cmm.SetDriverName(driverName) cmm.registerMetrics() + cmm.gatherers = prometheus.Gatherers{ + cmm.GetRegistry(), + } return &cmm } @@ -278,6 +282,7 @@ type csiMetricsManager struct { driverName string additionalLabelNames []string additionalLabels []label + gatherers prometheus.Gatherers csiOperationsLatencyMetric *metrics.HistogramVec registerProcessStartTime bool } @@ -367,6 +372,14 @@ func (cmm *csiMetricsManager) HaveAdditionalLabel(name string) bool { return false } +// WithAdditionalRegistry can be used to ensure additional non-CSI registries are served through RegisterToServer +// +// registry - Any registry which implements Gather() (e.g. metrics.KubeRegistry, prometheus.Registry, etc.) +func (cmm *csiMetricsManager) WithAdditionalRegistry(registry prometheus.Gatherer) CSIMetricsManager { + cmm.gatherers = append(cmm.gatherers, registry) + return cmm +} + // RecordMetrics passes the stored values as to the implementation. func (cmmv *csiMetricsManagerWithValues) RecordMetrics( operationName string, @@ -390,7 +403,7 @@ func (cmm *csiMetricsManager) SetDriverName(driverName string) { // given server at the specified address/path. func (cmm *csiMetricsManager) RegisterToServer(s Server, metricsPath string) { s.Handle(metricsPath, metrics.HandlerFor( - cmm.GetRegistry(), + cmm.gatherers, metrics.HandlerOpts{ ErrorHandling: metrics.ContinueOnError})) } diff --git a/vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/protosanitizer.go b/vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/protosanitizer.go index 2b63f24929..253116de16 100644 --- a/vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/protosanitizer.go +++ b/vendor/github.com/kubernetes-csi/csi-lib-utils/protosanitizer/protosanitizer.go @@ -68,7 +68,11 @@ func stripSingleValue(field protoreflect.FieldDescriptor, v protoreflect.Value) case protoreflect.MessageKind: return stripMessage(v.Message()) case protoreflect.EnumKind: - return field.Enum().Values().ByNumber(v.Enum()).Name() + desc := field.Enum().Values().ByNumber(v.Enum()) + if desc == nil { + return v.Enum() + } + return desc.Name() default: return v.Interface() } diff --git a/vendor/modules.txt b/vendor/modules.txt index 79aeb1783b..2f034a47cf 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -256,7 +256,7 @@ github.com/klauspost/compress/internal/cpuinfo github.com/klauspost/compress/internal/snapref github.com/klauspost/compress/zstd github.com/klauspost/compress/zstd/internal/xxhash -# github.com/kubernetes-csi/csi-lib-utils v0.20.0 +# github.com/kubernetes-csi/csi-lib-utils v0.21.0 ## explicit; go 1.23.1 github.com/kubernetes-csi/csi-lib-utils/accessmodes github.com/kubernetes-csi/csi-lib-utils/connection