diff --git a/pkg/kubelet/certificate/BUILD b/pkg/kubelet/certificate/BUILD index 5c85202a4b7..d61c8184961 100644 --- a/pkg/kubelet/certificate/BUILD +++ b/pkg/kubelet/certificate/BUILD @@ -26,7 +26,8 @@ go_library( "//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/client-go/util/certificate:go_default_library", "//staging/src/k8s.io/client-go/util/connrotation:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", + "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) diff --git a/pkg/kubelet/certificate/kubelet.go b/pkg/kubelet/certificate/kubelet.go index cf106c84e10..cea55f0c34e 100644 --- a/pkg/kubelet/certificate/kubelet.go +++ b/pkg/kubelet/certificate/kubelet.go @@ -24,14 +24,14 @@ import ( "net" "sort" - "github.com/prometheus/client_golang/prometheus" - certificates "k8s.io/api/certificates/v1beta1" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" clientset "k8s.io/client-go/kubernetes" certificatesclient "k8s.io/client-go/kubernetes/typed/certificates/v1beta1" "k8s.io/client-go/util/certificate" + compbasemetrics "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" "k8s.io/kubernetes/pkg/kubelet/metrics" ) @@ -52,15 +52,16 @@ func NewKubeletServerCertificateManager(kubeClient clientset.Interface, kubeCfg if err != nil { return nil, fmt.Errorf("failed to initialize server certificate store: %v", err) } - var certificateExpiration = prometheus.NewGauge( - prometheus.GaugeOpts{ - Namespace: metrics.KubeletSubsystem, - Subsystem: "certificate_manager", - Name: "server_expiration_seconds", - Help: "Gauge of the lifetime of a certificate. The value is the date the certificate will expire in seconds since January 1, 1970 UTC.", + var certificateExpiration = compbasemetrics.NewGauge( + &compbasemetrics.GaugeOpts{ + Namespace: metrics.KubeletSubsystem, + Subsystem: "certificate_manager", + Name: "server_expiration_seconds", + Help: "Gauge of the lifetime of a certificate. The value is the date the certificate will expire in seconds since January 1, 1970 UTC.", + StabilityLevel: compbasemetrics.ALPHA, }, ) - prometheus.MustRegister(certificateExpiration) + legacyregistry.MustRegister(certificateExpiration) getTemplate := func() *x509.CertificateRequest { hostnames, ips := addressesToHostnamesAndIPs(getAddresses()) @@ -166,15 +167,16 @@ func NewKubeletClientCertificateManager( if err != nil { return nil, fmt.Errorf("failed to initialize client certificate store: %v", err) } - var certificateExpiration = prometheus.NewGauge( - prometheus.GaugeOpts{ - Namespace: metrics.KubeletSubsystem, - Subsystem: "certificate_manager", - Name: "client_expiration_seconds", - Help: "Gauge of the lifetime of a certificate. The value is the date the certificate will expire in seconds since January 1, 1970 UTC.", + var certificateExpiration = compbasemetrics.NewGauge( + &compbasemetrics.GaugeOpts{ + Namespace: metrics.KubeletSubsystem, + Subsystem: "certificate_manager", + Name: "client_expiration_seconds", + Help: "Gauge of the lifetime of a certificate. The value is the date the certificate will expire in seconds since January 1, 1970 UTC.", + StabilityLevel: compbasemetrics.ALPHA, }, ) - prometheus.Register(certificateExpiration) + legacyregistry.Register(certificateExpiration) m, err := certificate.NewManager(&certificate.Config{ ClientFn: clientFn, diff --git a/pkg/kubelet/dockershim/metrics/BUILD b/pkg/kubelet/dockershim/metrics/BUILD index 3ea7d9321d5..23d95719007 100644 --- a/pkg/kubelet/dockershim/metrics/BUILD +++ b/pkg/kubelet/dockershim/metrics/BUILD @@ -5,7 +5,11 @@ go_library( srcs = ["metrics.go"], importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/metrics", visibility = ["//visibility:public"], - deps = ["//vendor/github.com/prometheus/client_golang/prometheus:go_default_library"], + deps = [ + "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", + "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", + ], ) filegroup( diff --git a/pkg/kubelet/dockershim/metrics/metrics.go b/pkg/kubelet/dockershim/metrics/metrics.go index fb6433daa8b..228856e988e 100644 --- a/pkg/kubelet/dockershim/metrics/metrics.go +++ b/pkg/kubelet/dockershim/metrics/metrics.go @@ -21,6 +21,9 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" ) const ( @@ -49,79 +52,87 @@ const ( var ( // DockerOperationsLatency collects operation latency numbers by operation // type. - DockerOperationsLatency = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: kubeletSubsystem, - Name: DockerOperationsLatencyKey, - Help: "Latency in seconds of Docker operations. Broken down by operation type.", - Buckets: prometheus.DefBuckets, + DockerOperationsLatency = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: kubeletSubsystem, + Name: DockerOperationsLatencyKey, + Help: "Latency in seconds of Docker operations. Broken down by operation type.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DockerOperations collects operation counts by operation type. - DockerOperations = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: DockerOperationsKey, - Help: "Cumulative number of Docker operations by operation type.", + DockerOperations = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: DockerOperationsKey, + Help: "Cumulative number of Docker operations by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DockerOperationsErrors collects operation errors by operation // type. - DockerOperationsErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: DockerOperationsErrorsKey, - Help: "Cumulative number of Docker operation errors by operation type.", + DockerOperationsErrors = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: DockerOperationsErrorsKey, + Help: "Cumulative number of Docker operation errors by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DockerOperationsTimeout collects operation timeouts by operation type. - DockerOperationsTimeout = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: DockerOperationsTimeoutKey, - Help: "Cumulative number of Docker operation timeout by operation type.", + DockerOperationsTimeout = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: DockerOperationsTimeoutKey, + Help: "Cumulative number of Docker operation timeout by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedDockerOperationsLatency collects operation latency numbers by operation // type. - DeprecatedDockerOperationsLatency = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: kubeletSubsystem, - Name: DeprecatedDockerOperationsLatencyKey, - Help: "(Deprecated) Latency in microseconds of Docker operations. Broken down by operation type.", + DeprecatedDockerOperationsLatency = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: kubeletSubsystem, + Name: DeprecatedDockerOperationsLatencyKey, + Help: "(Deprecated) Latency in microseconds of Docker operations. Broken down by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedDockerOperations collects operation counts by operation type. - DeprecatedDockerOperations = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: DeprecatedDockerOperationsKey, - Help: "(Deprecated) Cumulative number of Docker operations by operation type.", + DeprecatedDockerOperations = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: DeprecatedDockerOperationsKey, + Help: "(Deprecated) Cumulative number of Docker operations by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedDockerOperationsErrors collects operation errors by operation // type. - DeprecatedDockerOperationsErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: DeprecatedDockerOperationsErrorsKey, - Help: "(Deprecated) Cumulative number of Docker operation errors by operation type.", + DeprecatedDockerOperationsErrors = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: DeprecatedDockerOperationsErrorsKey, + Help: "(Deprecated) Cumulative number of Docker operation errors by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedDockerOperationsTimeout collects operation timeouts by operation type. - DeprecatedDockerOperationsTimeout = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: DeprecatedDockerOperationsTimeoutKey, - Help: "(Deprecated) Cumulative number of Docker operation timeout by operation type.", + DeprecatedDockerOperationsTimeout = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: DeprecatedDockerOperationsTimeoutKey, + Help: "(Deprecated) Cumulative number of Docker operation timeout by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) @@ -132,14 +143,14 @@ var registerMetrics sync.Once // Register all metrics. func Register() { registerMetrics.Do(func() { - prometheus.MustRegister(DockerOperationsLatency) - prometheus.MustRegister(DockerOperations) - prometheus.MustRegister(DockerOperationsErrors) - prometheus.MustRegister(DockerOperationsTimeout) - prometheus.MustRegister(DeprecatedDockerOperationsLatency) - prometheus.MustRegister(DeprecatedDockerOperations) - prometheus.MustRegister(DeprecatedDockerOperationsErrors) - prometheus.MustRegister(DeprecatedDockerOperationsTimeout) + legacyregistry.MustRegister(DockerOperationsLatency) + legacyregistry.MustRegister(DockerOperations) + legacyregistry.MustRegister(DockerOperationsErrors) + legacyregistry.MustRegister(DockerOperationsTimeout) + legacyregistry.MustRegister(DeprecatedDockerOperationsLatency) + legacyregistry.MustRegister(DeprecatedDockerOperations) + legacyregistry.MustRegister(DeprecatedDockerOperationsErrors) + legacyregistry.MustRegister(DeprecatedDockerOperationsTimeout) }) } diff --git a/pkg/kubelet/dockershim/network/metrics/BUILD b/pkg/kubelet/dockershim/network/metrics/BUILD index a473e363aca..dabd4dee307 100644 --- a/pkg/kubelet/dockershim/network/metrics/BUILD +++ b/pkg/kubelet/dockershim/network/metrics/BUILD @@ -5,7 +5,11 @@ go_library( srcs = ["metrics.go"], importpath = "k8s.io/kubernetes/pkg/kubelet/dockershim/network/metrics", visibility = ["//visibility:public"], - deps = ["//vendor/github.com/prometheus/client_golang/prometheus:go_default_library"], + deps = [ + "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", + "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", + ], ) filegroup( diff --git a/pkg/kubelet/dockershim/network/metrics/metrics.go b/pkg/kubelet/dockershim/network/metrics/metrics.go index 3e2247ba144..8ecd02132c3 100644 --- a/pkg/kubelet/dockershim/network/metrics/metrics.go +++ b/pkg/kubelet/dockershim/network/metrics/metrics.go @@ -21,6 +21,9 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" ) const ( @@ -38,23 +41,25 @@ const ( var ( // NetworkPluginOperationsLatency collects operation latency numbers by operation // type. - NetworkPluginOperationsLatency = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: kubeletSubsystem, - Name: NetworkPluginOperationsLatencyKey, - Help: "Latency in seconds of network plugin operations. Broken down by operation type.", - Buckets: prometheus.DefBuckets, + NetworkPluginOperationsLatency = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: kubeletSubsystem, + Name: NetworkPluginOperationsLatencyKey, + Help: "Latency in seconds of network plugin operations. Broken down by operation type.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedNetworkPluginOperationsLatency collects operation latency numbers by operation // type. - DeprecatedNetworkPluginOperationsLatency = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: kubeletSubsystem, - Name: DeprecatedNetworkPluginOperationsLatencyKey, - Help: "(Deprecated) Latency in microseconds of network plugin operations. Broken down by operation type.", + DeprecatedNetworkPluginOperationsLatency = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: kubeletSubsystem, + Name: DeprecatedNetworkPluginOperationsLatencyKey, + Help: "(Deprecated) Latency in microseconds of network plugin operations. Broken down by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) @@ -65,8 +70,8 @@ var registerMetrics sync.Once // Register all metrics. func Register() { registerMetrics.Do(func() { - prometheus.MustRegister(NetworkPluginOperationsLatency) - prometheus.MustRegister(DeprecatedNetworkPluginOperationsLatency) + legacyregistry.MustRegister(NetworkPluginOperationsLatency) + legacyregistry.MustRegister(DeprecatedNetworkPluginOperationsLatency) }) } diff --git a/pkg/kubelet/kuberuntime/BUILD b/pkg/kubelet/kuberuntime/BUILD index 1e92393a144..3813012d891 100644 --- a/pkg/kubelet/kuberuntime/BUILD +++ b/pkg/kubelet/kuberuntime/BUILD @@ -117,12 +117,11 @@ go_test( "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library", "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//staging/src/k8s.io/cri-api/pkg/apis/runtime/v1alpha2:go_default_library", "//staging/src/k8s.io/cri-api/pkg/apis/testing:go_default_library", "//vendor/github.com/golang/mock/gomock:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/github.com/stretchr/testify/require:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", diff --git a/pkg/kubelet/kuberuntime/instrumented_services_test.go b/pkg/kubelet/kuberuntime/instrumented_services_test.go index 7704d3bfe0c..91a1e5be23d 100644 --- a/pkg/kubelet/kuberuntime/instrumented_services_test.go +++ b/pkg/kubelet/kuberuntime/instrumented_services_test.go @@ -22,17 +22,17 @@ import ( "testing" "time" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/stretchr/testify/assert" + + "k8s.io/component-base/metrics/legacyregistry" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" "k8s.io/kubernetes/pkg/kubelet/metrics" ) func TestRecordOperation(t *testing.T) { - prometheus.MustRegister(metrics.RuntimeOperations) - prometheus.MustRegister(metrics.RuntimeOperationsDuration) - prometheus.MustRegister(metrics.RuntimeOperationsErrors) + legacyregistry.MustRegister(metrics.RuntimeOperations) + legacyregistry.MustRegister(metrics.RuntimeOperationsDuration) + legacyregistry.MustRegister(metrics.RuntimeOperationsErrors) temporalServer := "127.0.0.1:1234" l, err := net.Listen("tcp", temporalServer) @@ -41,7 +41,8 @@ func TestRecordOperation(t *testing.T) { prometheusURL := "http://" + temporalServer + "/metrics" mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) + //lint:ignore SA1019 ignore deprecated warning until we move off of global registries + mux.Handle("/metrics", legacyregistry.Handler()) server := &http.Server{ Addr: temporalServer, Handler: mux, diff --git a/pkg/kubelet/metrics/BUILD b/pkg/kubelet/metrics/BUILD index 2c6224cbde5..176015f2e39 100644 --- a/pkg/kubelet/metrics/BUILD +++ b/pkg/kubelet/metrics/BUILD @@ -15,6 +15,8 @@ go_library( "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], diff --git a/pkg/kubelet/metrics/metrics.go b/pkg/kubelet/metrics/metrics.go index 71e1b6d24b3..8f82c870da1 100644 --- a/pkg/kubelet/metrics/metrics.go +++ b/pkg/kubelet/metrics/metrics.go @@ -18,6 +18,8 @@ package metrics import ( "fmt" + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" "sync" "time" @@ -88,279 +90,307 @@ const ( var ( // NodeName is a Gauge that tracks the ode's name. The count is always 1. - NodeName = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: KubeletSubsystem, - Name: NodeNameKey, - Help: "The node's name. The count is always 1.", + NodeName = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Subsystem: KubeletSubsystem, + Name: NodeNameKey, + Help: "The node's name. The count is always 1.", + StabilityLevel: metrics.ALPHA, }, []string{NodeLabelKey}, ) // ContainersPerPodCount is a Counter that tracks the number of containers per pod. - ContainersPerPodCount = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: "containers_per_pod_count", - Help: "The number of containers per pod.", - Buckets: prometheus.DefBuckets, + ContainersPerPodCount = metrics.NewHistogram( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: "containers_per_pod_count", + Help: "The number of containers per pod.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, ) // PodWorkerDuration is a Histogram that tracks the duration (in seconds) in takes to sync a single pod. // Broken down by the operation type. - PodWorkerDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: PodWorkerDurationKey, - Help: "Duration in seconds to sync a single pod. Broken down by operation type: create, update, or sync", - Buckets: prometheus.DefBuckets, + PodWorkerDuration = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: PodWorkerDurationKey, + Help: "Duration in seconds to sync a single pod. Broken down by operation type: create, update, or sync", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // PodStartDuration is a Histogram that tracks the duration (in seconds) it takes for a single pod to go from pending to running. - PodStartDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: PodStartDurationKey, - Help: "Duration in seconds for a single pod to go from pending to running.", - Buckets: prometheus.DefBuckets, + PodStartDuration = metrics.NewHistogram( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: PodStartDurationKey, + Help: "Duration in seconds for a single pod to go from pending to running.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, ) // CgroupManagerDuration is a Histogram that tracks the duration (in seconds) it takes for cgroup manager operations to complete. // Broken down by method. - CgroupManagerDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: CgroupManagerOperationsKey, - Help: "Duration in seconds for cgroup manager operations. Broken down by method.", - Buckets: prometheus.DefBuckets, + CgroupManagerDuration = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: CgroupManagerOperationsKey, + Help: "Duration in seconds for cgroup manager operations. Broken down by method.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // PodWorkerStartDuration is a Histogram that tracks the duration (in seconds) it takes from seeing a pod to starting a worker. - PodWorkerStartDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: PodWorkerStartDurationKey, - Help: "Duration in seconds from seeing a pod to starting a worker.", - Buckets: prometheus.DefBuckets, + PodWorkerStartDuration = metrics.NewHistogram( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: PodWorkerStartDurationKey, + Help: "Duration in seconds from seeing a pod to starting a worker.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, ) // PLEGRelistDuration is a Histogram that tracks the duration (in seconds) it takes for relisting pods in the Kubelet's // Pod Lifecycle Event Generator (PLEG). - PLEGRelistDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: PLEGRelistDurationKey, - Help: "Duration in seconds for relisting pods in PLEG.", - Buckets: prometheus.DefBuckets, + PLEGRelistDuration = metrics.NewHistogram( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: PLEGRelistDurationKey, + Help: "Duration in seconds for relisting pods in PLEG.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, ) // PLEGDiscardEvents is a Histogram that tracks the duration (in seconds) it takes for discarding events in the Kubelet's // Pod Lifecycle Event Generator (PLEG). - PLEGDiscardEvents = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: PLEGDiscardEventsKey, - Help: "The number of discard events in PLEG.", + PLEGDiscardEvents = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: PLEGDiscardEventsKey, + Help: "The number of discard events in PLEG.", + StabilityLevel: metrics.ALPHA, }, []string{}, ) // PLEGRelistInterval is a Histogram that tracks the intervals (in seconds) between relisting in the Kubelet's // Pod Lifecycle Event Generator (PLEG). - PLEGRelistInterval = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: PLEGRelistIntervalKey, - Help: "Interval in seconds between relisting in PLEG.", - Buckets: prometheus.DefBuckets, + PLEGRelistInterval = metrics.NewHistogram( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: PLEGRelistIntervalKey, + Help: "Interval in seconds between relisting in PLEG.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, ) // RuntimeOperations is a Counter that tracks the cumulative number of remote runtime operations. // Broken down by operation type. - RuntimeOperations = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: RuntimeOperationsKey, - Help: "Cumulative number of runtime operations by operation type.", + RuntimeOperations = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: RuntimeOperationsKey, + Help: "Cumulative number of runtime operations by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // RuntimeOperationsDuration is a Histogram that tracks the duration (in seconds) for remote runtime operations to complete. // Broken down by operation type. - RuntimeOperationsDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: RuntimeOperationsDurationKey, - Help: "Duration in seconds of runtime operations. Broken down by operation type.", - Buckets: prometheus.DefBuckets, + RuntimeOperationsDuration = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: RuntimeOperationsDurationKey, + Help: "Duration in seconds of runtime operations. Broken down by operation type.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // RuntimeOperationsErrors is a Counter that tracks the cumulative number of remote runtime operations errors. // Broken down by operation type. - RuntimeOperationsErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: RuntimeOperationsErrorsKey, - Help: "Cumulative number of runtime operation errors by operation type.", + RuntimeOperationsErrors = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: RuntimeOperationsErrorsKey, + Help: "Cumulative number of runtime operation errors by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // Evictions is a Counter that tracks the cumulative number of pod evictions initiated by the kubelet. // Broken down by eviction signal. - Evictions = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: EvictionsKey, - Help: "Cumulative number of pod evictions by eviction signal", + Evictions = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: EvictionsKey, + Help: "Cumulative number of pod evictions by eviction signal", + StabilityLevel: metrics.ALPHA, }, []string{"eviction_signal"}, ) // EvictionStatsAge is a Histogram that tracks the time (in seconds) between when stats are collected and when a pod is evicted // based on those stats. Broken down by eviction signal. - EvictionStatsAge = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: EvictionStatsAgeKey, - Help: "Time between when stats are collected, and when pod is evicted based on those stats by eviction signal", - Buckets: prometheus.DefBuckets, + EvictionStatsAge = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: EvictionStatsAgeKey, + Help: "Time between when stats are collected, and when pod is evicted based on those stats by eviction signal", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"eviction_signal"}, ) // DevicePluginRegistrationCount is a Counter that tracks the cumulative number of device plugin registrations. // Broken down by resource name. - DevicePluginRegistrationCount = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: DevicePluginRegistrationCountKey, - Help: "Cumulative number of device plugin registrations. Broken down by resource name.", + DevicePluginRegistrationCount = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: DevicePluginRegistrationCountKey, + Help: "Cumulative number of device plugin registrations. Broken down by resource name.", + StabilityLevel: metrics.ALPHA, }, []string{"resource_name"}, ) // DevicePluginAllocationDuration is a Histogram that tracks the duration (in seconds) to serve a device plugin allocation request. // Broken down by resource name. - DevicePluginAllocationDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Subsystem: KubeletSubsystem, - Name: DevicePluginAllocationDurationKey, - Help: "Duration in seconds to serve a device plugin Allocation request. Broken down by resource name.", - Buckets: prometheus.DefBuckets, + DevicePluginAllocationDuration = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Subsystem: KubeletSubsystem, + Name: DevicePluginAllocationDurationKey, + Help: "Duration in seconds to serve a device plugin Allocation request. Broken down by resource name.", + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"resource_name"}, ) // DeprecatedPodWorkerLatency is a Summary that tracks the latency (in microseconds) to sync a single pod. // Broken down by operation type. This metric is deprecated. - DeprecatedPodWorkerLatency = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedPodWorkerLatencyKey, - Help: "(Deprecated) Latency in microseconds to sync a single pod. Broken down by operation type: create, update, or sync", + DeprecatedPodWorkerLatency = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedPodWorkerLatencyKey, + Help: "(Deprecated) Latency in microseconds to sync a single pod. Broken down by operation type: create, update, or sync", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedPodStartLatency is a Summary that tracks the latency (in microseconds) for a single pod to go from pending to running. // This metric is deprecated. - DeprecatedPodStartLatency = prometheus.NewSummary( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedPodStartLatencyKey, - Help: "(Deprecated) Latency in microseconds for a single pod to go from pending to running.", + DeprecatedPodStartLatency = metrics.NewSummary( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedPodStartLatencyKey, + Help: "(Deprecated) Latency in microseconds for a single pod to go from pending to running.", + StabilityLevel: metrics.ALPHA, }, ) // DeprecatedCgroupManagerLatency is a Summary that tracks the latency (in microseconds) for cgroup manager operations to complete. // Broken down by operation type. This metric is deprecated. - DeprecatedCgroupManagerLatency = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedCgroupManagerOperationsKey, - Help: "(Deprecated) Latency in microseconds for cgroup manager operations. Broken down by method.", + DeprecatedCgroupManagerLatency = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedCgroupManagerOperationsKey, + Help: "(Deprecated) Latency in microseconds for cgroup manager operations. Broken down by method.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedPodWorkerStartLatency is a Summary that tracks the latency (in microseconds) from seeing a pod to starting a worker. // This metric is deprecated. - DeprecatedPodWorkerStartLatency = prometheus.NewSummary( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedPodWorkerStartLatencyKey, - Help: "(Deprecated) Latency in microseconds from seeing a pod to starting a worker.", + DeprecatedPodWorkerStartLatency = metrics.NewSummary( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedPodWorkerStartLatencyKey, + Help: "(Deprecated) Latency in microseconds from seeing a pod to starting a worker.", + StabilityLevel: metrics.ALPHA, }, ) // DeprecatedPLEGRelistLatency is a Summary that tracks the latency (in microseconds) for relisting pods in PLEG. // This metric is deprecated. - DeprecatedPLEGRelistLatency = prometheus.NewSummary( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedPLEGRelistLatencyKey, - Help: "(Deprecated) Latency in microseconds for relisting pods in PLEG.", + DeprecatedPLEGRelistLatency = metrics.NewSummary( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedPLEGRelistLatencyKey, + Help: "(Deprecated) Latency in microseconds for relisting pods in PLEG.", + StabilityLevel: metrics.ALPHA, }, ) // DeprecatedPLEGRelistInterval is a Summary that tracks the interval (in microseconds) between relistings in PLEG. // This metric is deprecated. - DeprecatedPLEGRelistInterval = prometheus.NewSummary( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedPLEGRelistIntervalKey, - Help: "(Deprecated) Interval in microseconds between relisting in PLEG.", + DeprecatedPLEGRelistInterval = metrics.NewSummary( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedPLEGRelistIntervalKey, + Help: "(Deprecated) Interval in microseconds between relisting in PLEG.", + StabilityLevel: metrics.ALPHA, }, ) // DeprecatedRuntimeOperations is a Counter that tracks the cumulative number of remote runtime operations. // Broken down by operation type. This metric is deprecated. - DeprecatedRuntimeOperations = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedRuntimeOperationsKey, - Help: "(Deprecated) Cumulative number of runtime operations by operation type.", + DeprecatedRuntimeOperations = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedRuntimeOperationsKey, + Help: "(Deprecated) Cumulative number of runtime operations by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedRuntimeOperationsLatency is a Summary that tracks the latency (in microseconds) of remote runtime operations // to complete. Broken down by operation type. This metric is deprecated. - DeprecatedRuntimeOperationsLatency = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedRuntimeOperationsLatencyKey, - Help: "(Deprecated) Latency in microseconds of runtime operations. Broken down by operation type.", + DeprecatedRuntimeOperationsLatency = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedRuntimeOperationsLatencyKey, + Help: "(Deprecated) Latency in microseconds of runtime operations. Broken down by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedRuntimeOperationsErrors is a Counter that tracks the cumulative number of remote runtime operation errors. // Broken down by operation type. This metric is deprecated. - DeprecatedRuntimeOperationsErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedRuntimeOperationsErrorsKey, - Help: "(Deprecated) Cumulative number of runtime operation errors by operation type.", + DeprecatedRuntimeOperationsErrors = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedRuntimeOperationsErrorsKey, + Help: "(Deprecated) Cumulative number of runtime operation errors by operation type.", + StabilityLevel: metrics.ALPHA, }, []string{"operation_type"}, ) // DeprecatedEvictionStatsAge is a Summary that tracks the time (in microseconds) between when stats are collected and when a pod // is evicted based on those stats. Broken down by eviction signal. This metric is deprecated. - DeprecatedEvictionStatsAge = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedEvictionStatsAgeKey, - Help: "(Deprecated) Time between when stats are collected, and when pod is evicted based on those stats by eviction signal", + DeprecatedEvictionStatsAge = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedEvictionStatsAgeKey, + Help: "(Deprecated) Time between when stats are collected, and when pod is evicted based on those stats by eviction signal", + StabilityLevel: metrics.ALPHA, }, []string{"eviction_signal"}, ) // DeprecatedDevicePluginRegistrationCount is a Counter that tracks the cumulative number of device plugin registrations. // Broken down by resource name. This metric is deprecated. - DeprecatedDevicePluginRegistrationCount = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedDevicePluginRegistrationCountKey, - Help: "(Deprecated) Cumulative number of device plugin registrations. Broken down by resource name.", + DeprecatedDevicePluginRegistrationCount = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedDevicePluginRegistrationCountKey, + Help: "(Deprecated) Cumulative number of device plugin registrations. Broken down by resource name.", + StabilityLevel: metrics.ALPHA, }, []string{"resource_name"}, ) // DeprecatedDevicePluginAllocationLatency is a Summary that tracks the latncy (in microseconds) for serving device plugin allocation requests. // Broken down by resource name. This metric is deprecated. - DeprecatedDevicePluginAllocationLatency = prometheus.NewSummaryVec( - prometheus.SummaryOpts{ - Subsystem: KubeletSubsystem, - Name: DeprecatedDevicePluginAllocationLatencyKey, - Help: "(Deprecated) Latency in microseconds to serve a device plugin Allocation request. Broken down by resource name.", + DeprecatedDevicePluginAllocationLatency = metrics.NewSummaryVec( + &metrics.SummaryOpts{ + Subsystem: KubeletSubsystem, + Name: DeprecatedDevicePluginAllocationLatencyKey, + Help: "(Deprecated) Latency in microseconds to serve a device plugin Allocation request. Broken down by resource name.", + StabilityLevel: metrics.ALPHA, }, []string{"resource_name"}, ) @@ -368,60 +398,66 @@ var ( // Metrics for node config // AssignedConfig is a Gauge that is set 1 if the Kubelet has a NodeConfig assigned. - AssignedConfig = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: KubeletSubsystem, - Name: AssignedConfigKey, - Help: "The node's understanding of intended config. The count is always 1.", + AssignedConfig = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Subsystem: KubeletSubsystem, + Name: AssignedConfigKey, + Help: "The node's understanding of intended config. The count is always 1.", + StabilityLevel: metrics.ALPHA, }, []string{ConfigSourceLabelKey, ConfigUIDLabelKey, ConfigResourceVersionLabelKey, KubeletConfigKeyLabelKey}, ) // ActiveConfig is a Gauge that is set to 1 if the Kubelet has an active NodeConfig. - ActiveConfig = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: KubeletSubsystem, - Name: ActiveConfigKey, - Help: "The config source the node is actively using. The count is always 1.", + ActiveConfig = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Subsystem: KubeletSubsystem, + Name: ActiveConfigKey, + Help: "The config source the node is actively using. The count is always 1.", + StabilityLevel: metrics.ALPHA, }, []string{ConfigSourceLabelKey, ConfigUIDLabelKey, ConfigResourceVersionLabelKey, KubeletConfigKeyLabelKey}, ) // LastKnownGoodConfig is a Gauge that is set to 1 if the Kubelet has a NodeConfig it can fall back to if there // are certain errors. - LastKnownGoodConfig = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: KubeletSubsystem, - Name: LastKnownGoodConfigKey, - Help: "The config source the node will fall back to when it encounters certain errors. The count is always 1.", + LastKnownGoodConfig = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Subsystem: KubeletSubsystem, + Name: LastKnownGoodConfigKey, + Help: "The config source the node will fall back to when it encounters certain errors. The count is always 1.", + StabilityLevel: metrics.ALPHA, }, []string{ConfigSourceLabelKey, ConfigUIDLabelKey, ConfigResourceVersionLabelKey, KubeletConfigKeyLabelKey}, ) // ConfigError is a Gauge that is set to 1 if the node is experiencing a configuration-related error. - ConfigError = prometheus.NewGauge( - prometheus.GaugeOpts{ - Subsystem: KubeletSubsystem, - Name: ConfigErrorKey, - Help: "This metric is true (1) if the node is experiencing a configuration-related error, false (0) otherwise.", + ConfigError = metrics.NewGauge( + &metrics.GaugeOpts{ + Subsystem: KubeletSubsystem, + Name: ConfigErrorKey, + Help: "This metric is true (1) if the node is experiencing a configuration-related error, false (0) otherwise.", + StabilityLevel: metrics.ALPHA, }, ) // RunPodSandboxDuration is a Histogram that tracks the duration (in seconds) it takes to run Pod Sandbox operations. // Broken down by RuntimeClass. - RunPodSandboxDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ + RunPodSandboxDuration = metrics.NewHistogramVec( + &metrics.HistogramOpts{ Subsystem: KubeletSubsystem, Name: RunPodSandboxDurationKey, Help: "Duration in seconds of the run_podsandbox operations. Broken down by RuntimeClass.", // Use DefBuckets for now, will customize the buckets if necessary. - Buckets: prometheus.DefBuckets, + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"runtime_handler"}, ) // RunPodSandboxErrors is a Counter that tracks the cumulative number of Pod Sandbox operations errors. // Broken down by RuntimeClass. - RunPodSandboxErrors = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: KubeletSubsystem, - Name: RunPodSandboxErrorsKey, - Help: "Cumulative number of the run_podsandbox operation errors by RuntimeClass.", + RunPodSandboxErrors = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: KubeletSubsystem, + Name: RunPodSandboxErrorsKey, + Help: "Cumulative number of the run_podsandbox operation errors by RuntimeClass.", + StabilityLevel: metrics.ALPHA, }, []string{"runtime_handler"}, ) @@ -433,43 +469,43 @@ var registerMetrics sync.Once func Register(containerCache kubecontainer.RuntimeCache, collectors ...prometheus.Collector) { // Register the metrics. registerMetrics.Do(func() { - prometheus.MustRegister(NodeName) - prometheus.MustRegister(PodWorkerDuration) - prometheus.MustRegister(PodStartDuration) - prometheus.MustRegister(CgroupManagerDuration) - prometheus.MustRegister(PodWorkerStartDuration) - prometheus.MustRegister(ContainersPerPodCount) - prometheus.MustRegister(newPodAndContainerCollector(containerCache)) - prometheus.MustRegister(PLEGRelistDuration) - prometheus.MustRegister(PLEGDiscardEvents) - prometheus.MustRegister(PLEGRelistInterval) - prometheus.MustRegister(RuntimeOperations) - prometheus.MustRegister(RuntimeOperationsDuration) - prometheus.MustRegister(RuntimeOperationsErrors) - prometheus.MustRegister(Evictions) - prometheus.MustRegister(EvictionStatsAge) - prometheus.MustRegister(DevicePluginRegistrationCount) - prometheus.MustRegister(DevicePluginAllocationDuration) - prometheus.MustRegister(DeprecatedPodWorkerLatency) - prometheus.MustRegister(DeprecatedPodStartLatency) - prometheus.MustRegister(DeprecatedCgroupManagerLatency) - prometheus.MustRegister(DeprecatedPodWorkerStartLatency) - prometheus.MustRegister(DeprecatedPLEGRelistLatency) - prometheus.MustRegister(DeprecatedPLEGRelistInterval) - prometheus.MustRegister(DeprecatedRuntimeOperations) - prometheus.MustRegister(DeprecatedRuntimeOperationsLatency) - prometheus.MustRegister(DeprecatedRuntimeOperationsErrors) - prometheus.MustRegister(DeprecatedEvictionStatsAge) - prometheus.MustRegister(DeprecatedDevicePluginRegistrationCount) - prometheus.MustRegister(DeprecatedDevicePluginAllocationLatency) + legacyregistry.MustRegister(NodeName) + legacyregistry.MustRegister(PodWorkerDuration) + legacyregistry.MustRegister(PodStartDuration) + legacyregistry.MustRegister(CgroupManagerDuration) + legacyregistry.MustRegister(PodWorkerStartDuration) + legacyregistry.MustRegister(ContainersPerPodCount) + legacyregistry.RawMustRegister(newPodAndContainerCollector(containerCache)) + legacyregistry.MustRegister(PLEGRelistDuration) + legacyregistry.MustRegister(PLEGDiscardEvents) + legacyregistry.MustRegister(PLEGRelistInterval) + legacyregistry.MustRegister(RuntimeOperations) + legacyregistry.MustRegister(RuntimeOperationsDuration) + legacyregistry.MustRegister(RuntimeOperationsErrors) + legacyregistry.MustRegister(Evictions) + legacyregistry.MustRegister(EvictionStatsAge) + legacyregistry.MustRegister(DevicePluginRegistrationCount) + legacyregistry.MustRegister(DevicePluginAllocationDuration) + legacyregistry.MustRegister(DeprecatedPodWorkerLatency) + legacyregistry.MustRegister(DeprecatedPodStartLatency) + legacyregistry.MustRegister(DeprecatedCgroupManagerLatency) + legacyregistry.MustRegister(DeprecatedPodWorkerStartLatency) + legacyregistry.MustRegister(DeprecatedPLEGRelistLatency) + legacyregistry.MustRegister(DeprecatedPLEGRelistInterval) + legacyregistry.MustRegister(DeprecatedRuntimeOperations) + legacyregistry.MustRegister(DeprecatedRuntimeOperationsLatency) + legacyregistry.MustRegister(DeprecatedRuntimeOperationsErrors) + legacyregistry.MustRegister(DeprecatedEvictionStatsAge) + legacyregistry.MustRegister(DeprecatedDevicePluginRegistrationCount) + legacyregistry.MustRegister(DeprecatedDevicePluginAllocationLatency) if utilfeature.DefaultFeatureGate.Enabled(features.DynamicKubeletConfig) { - prometheus.MustRegister(AssignedConfig) - prometheus.MustRegister(ActiveConfig) - prometheus.MustRegister(LastKnownGoodConfig) - prometheus.MustRegister(ConfigError) + legacyregistry.MustRegister(AssignedConfig) + legacyregistry.MustRegister(ActiveConfig) + legacyregistry.MustRegister(LastKnownGoodConfig) + legacyregistry.MustRegister(ConfigError) } for _, collector := range collectors { - prometheus.MustRegister(collector) + legacyregistry.RawMustRegister(collector) } }) } diff --git a/pkg/kubelet/prober/BUILD b/pkg/kubelet/prober/BUILD index d3b3046bcc3..e4b1d9d24fe 100644 --- a/pkg/kubelet/prober/BUILD +++ b/pkg/kubelet/prober/BUILD @@ -32,6 +32,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library", + "//staging/src/k8s.io/component-base/metrics:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/exec:go_default_library", diff --git a/pkg/kubelet/prober/prober_manager.go b/pkg/kubelet/prober/prober_manager.go index efa7d827145..69a7ca36a96 100644 --- a/pkg/kubelet/prober/prober_manager.go +++ b/pkg/kubelet/prober/prober_manager.go @@ -19,12 +19,12 @@ package prober import ( "sync" - "github.com/prometheus/client_golang/prometheus" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/tools/record" + "k8s.io/component-base/metrics" "k8s.io/klog" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/prober/results" @@ -33,11 +33,12 @@ import ( ) // ProberResults stores the cumulative number of a probe by result as prometheus metrics. -var ProberResults = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: "prober", - Name: "probe_total", - Help: "Cumulative number of a liveness or readiness probe for a container by result.", +var ProberResults = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: "prober", + Name: "probe_total", + Help: "Cumulative number of a liveness or readiness probe for a container by result.", + StabilityLevel: metrics.ALPHA, }, []string{"probe_type", "result", diff --git a/pkg/kubelet/server/BUILD b/pkg/kubelet/server/BUILD index c036a121611..87ea8f01d82 100644 --- a/pkg/kubelet/server/BUILD +++ b/pkg/kubelet/server/BUILD @@ -47,6 +47,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/util/flushwriter:go_default_library", "//staging/src/k8s.io/component-base/logs:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/github.com/emicklei/go-restful:go_default_library", "//vendor/github.com/google/cadvisor/container:go_default_library", "//vendor/github.com/google/cadvisor/info/v1:go_default_library", diff --git a/pkg/kubelet/server/metrics/BUILD b/pkg/kubelet/server/metrics/BUILD index 6d22a4d7fc6..f8fdebf05e4 100644 --- a/pkg/kubelet/server/metrics/BUILD +++ b/pkg/kubelet/server/metrics/BUILD @@ -10,6 +10,8 @@ go_library( srcs = ["metrics.go"], importpath = "k8s.io/kubernetes/pkg/kubelet/server/metrics", deps = [ + "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", ], ) diff --git a/pkg/kubelet/server/metrics/metrics.go b/pkg/kubelet/server/metrics/metrics.go index 1694ac9bc5c..f5c7ad5f633 100644 --- a/pkg/kubelet/server/metrics/metrics.go +++ b/pkg/kubelet/server/metrics/metrics.go @@ -21,6 +21,9 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" ) const ( @@ -29,11 +32,12 @@ const ( var ( // HTTPRequests tracks the number of the http requests received since the server started. - HTTPRequests = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Subsystem: kubeletSubsystem, - Name: "http_requests_total", - Help: "Number of the http requests received since the server started", + HTTPRequests = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: kubeletSubsystem, + Name: "http_requests_total", + Help: "Number of the http requests received since the server started", + StabilityLevel: metrics.ALPHA, }, // server_type aims to differentiate the readonly server and the readwrite server. // long_running marks whether the request is long-running or not. @@ -41,22 +45,24 @@ var ( []string{"method", "path", "server_type", "long_running"}, ) // HTTPRequestsDuration tracks the duration in seconds to serve http requests. - HTTPRequestsDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ + HTTPRequestsDuration = metrics.NewHistogramVec( + &metrics.HistogramOpts{ Subsystem: kubeletSubsystem, Name: "http_requests_duration_seconds", Help: "Duration in seconds to serve http requests", // Use DefBuckets for now, will customize the buckets if necessary. - Buckets: prometheus.DefBuckets, + Buckets: prometheus.DefBuckets, + StabilityLevel: metrics.ALPHA, }, []string{"method", "path", "server_type", "long_running"}, ) // HTTPInflightRequests tracks the number of the inflight http requests. - HTTPInflightRequests = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Subsystem: kubeletSubsystem, - Name: "http_inflight_requests", - Help: "Number of the inflight http requests", + HTTPInflightRequests = metrics.NewGaugeVec( + &metrics.GaugeOpts{ + Subsystem: kubeletSubsystem, + Name: "http_inflight_requests", + Help: "Number of the inflight http requests", + StabilityLevel: metrics.ALPHA, }, []string{"method", "path", "server_type", "long_running"}, ) @@ -67,9 +73,9 @@ var registerMetrics sync.Once // Register all metrics. func Register() { registerMetrics.Do(func() { - prometheus.MustRegister(HTTPRequests) - prometheus.MustRegister(HTTPRequestsDuration) - prometheus.MustRegister(HTTPInflightRequests) + legacyregistry.MustRegister(HTTPRequests) + legacyregistry.MustRegister(HTTPRequestsDuration) + legacyregistry.MustRegister(HTTPInflightRequests) }) } diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go index 9c28896c679..324e8ab8576 100644 --- a/pkg/kubelet/server/server.go +++ b/pkg/kubelet/server/server.go @@ -32,7 +32,7 @@ import ( "strings" "time" - restful "github.com/emicklei/go-restful" + "github.com/emicklei/go-restful" cadvisormetrics "github.com/google/cadvisor/container" cadvisorapi "github.com/google/cadvisor/info/v1" "github.com/google/cadvisor/metrics" @@ -56,6 +56,7 @@ import ( "k8s.io/apiserver/pkg/util/flushwriter" "k8s.io/component-base/logs" compbasemetrics "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/v1/validation" @@ -297,7 +298,7 @@ func (s *Server) InstallDefaultHandlers(enableCAdvisorJSONEndpoints bool) { s.restfulCont.Add(stats.CreateHandlers(statsPath, s.host, s.resourceAnalyzer, enableCAdvisorJSONEndpoints)) //lint:ignore SA1019 https://github.com/kubernetes/enhancements/issues/1206 - s.restfulCont.Handle(metricsPath, prometheus.Handler()) + s.restfulCont.Handle(metricsPath, legacyregistry.Handler()) // cAdvisor metrics are exposed under the secured handler as well r := prometheus.NewRegistry() @@ -325,8 +326,9 @@ func (s *Server) InstallDefaultHandlers(enableCAdvisorJSONEndpoints bool) { ) // prober metrics are exposed under a different endpoint - p := prometheus.NewRegistry() - compbasemetrics.RegisterProcessStartTime(p) + + p := compbasemetrics.NewKubeRegistry() + compbasemetrics.RegisterProcessStartTime(p.RawRegister) p.MustRegister(prober.ProberResults) s.restfulCont.Handle(proberMetricsPath, promhttp.HandlerFor(p, promhttp.HandlerOpts{ErrorHandling: promhttp.ContinueOnError}), diff --git a/pkg/kubelet/volumemanager/metrics/BUILD b/pkg/kubelet/volumemanager/metrics/BUILD index 522eb010844..0ac9ca9fb1b 100644 --- a/pkg/kubelet/volumemanager/metrics/BUILD +++ b/pkg/kubelet/volumemanager/metrics/BUILD @@ -9,6 +9,7 @@ go_library( "//pkg/kubelet/volumemanager/cache:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], diff --git a/pkg/kubelet/volumemanager/metrics/metrics.go b/pkg/kubelet/volumemanager/metrics/metrics.go index 2536eb55917..86f800b0bc4 100644 --- a/pkg/kubelet/volumemanager/metrics/metrics.go +++ b/pkg/kubelet/volumemanager/metrics/metrics.go @@ -17,6 +17,7 @@ limitations under the License. package metrics import ( + "k8s.io/component-base/metrics/legacyregistry" "sync" "github.com/prometheus/client_golang/prometheus" @@ -59,7 +60,7 @@ func (v volumeCount) add(state, plugin string) { // Register registers Volume Manager metrics. func Register(asw cache.ActualStateOfWorld, dsw cache.DesiredStateOfWorld, pluginMgr *volume.VolumePluginMgr) { registerMetrics.Do(func() { - prometheus.MustRegister(&totalVolumesCollector{asw, dsw, pluginMgr}) + legacyregistry.RawMustRegister(&totalVolumesCollector{asw, dsw, pluginMgr}) }) } diff --git a/pkg/volume/util/BUILD b/pkg/volume/util/BUILD index a0b59bafa0b..a451cbb4396 100644 --- a/pkg/volume/util/BUILD +++ b/pkg/volume/util/BUILD @@ -41,7 +41,8 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", + "//staging/src/k8s.io/component-base/metrics:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/k8s.io/utils/strings:go_default_library", ], diff --git a/pkg/volume/util/metrics.go b/pkg/volume/util/metrics.go index 10c66794dc2..5542f8e534b 100644 --- a/pkg/volume/util/metrics.go +++ b/pkg/volume/util/metrics.go @@ -20,7 +20,8 @@ import ( "fmt" "time" - "github.com/prometheus/client_golang/prometheus" + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" "k8s.io/kubernetes/pkg/volume" ) @@ -29,36 +30,48 @@ const ( statusFailUnknown = "fail-unknown" ) -var storageOperationMetric = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Name: "storage_operation_duration_seconds", - Help: "Storage operation duration", - Buckets: []float64{.1, .25, .5, 1, 2.5, 5, 10, 15, 25, 50, 120, 300, 600}, +/* + * By default, all the following metrics are defined as falling under + * ALPHA stability level https://github.com/kubernetes/enhancements/blob/master/keps/sig-instrumentation/20190404-kubernetes-control-plane-metrics-stability.md#stability-classes) + * + * Promoting the stability level of the metric is a responsibility of the component owner, since it + * involves explicitly acknowledging support for the metric across multiple releases, in accordance with + * the metric stability policy. + */ +var storageOperationMetric = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Name: "storage_operation_duration_seconds", + Help: "Storage operation duration", + Buckets: []float64{.1, .25, .5, 1, 2.5, 5, 10, 15, 25, 50, 120, 300, 600}, + StabilityLevel: metrics.ALPHA, }, []string{"volume_plugin", "operation_name"}, ) -var storageOperationErrorMetric = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "storage_operation_errors_total", - Help: "Storage operation errors", +var storageOperationErrorMetric = metrics.NewCounterVec( + &metrics.CounterOpts{ + Name: "storage_operation_errors_total", + Help: "Storage operation errors", + StabilityLevel: metrics.ALPHA, }, []string{"volume_plugin", "operation_name"}, ) -var storageOperationStatusMetric = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Name: "storage_operation_status_count", - Help: "Storage operation return statuses count", +var storageOperationStatusMetric = metrics.NewCounterVec( + &metrics.CounterOpts{ + Name: "storage_operation_status_count", + Help: "Storage operation return statuses count", + StabilityLevel: metrics.ALPHA, }, []string{"volume_plugin", "operation_name", "status"}, ) -var storageOperationEndToEndLatencyMetric = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Name: "volume_operation_total_seconds", - Help: "Storage operation end to end duration in seconds", - Buckets: []float64{.1, .25, .5, 1, 2.5, 5, 10, 15, 25, 50, 120, 300, 600}, +var storageOperationEndToEndLatencyMetric = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Name: "volume_operation_total_seconds", + Help: "Storage operation end to end duration in seconds", + Buckets: []float64{.1, .25, .5, 1, 2.5, 5, 10, 15, 25, 50, 120, 300, 600}, + StabilityLevel: metrics.ALPHA, }, []string{"plugin_name", "operation_name"}, ) @@ -68,10 +81,12 @@ func init() { } func registerMetrics() { - prometheus.MustRegister(storageOperationMetric) - prometheus.MustRegister(storageOperationErrorMetric) - prometheus.MustRegister(storageOperationStatusMetric) - prometheus.MustRegister(storageOperationEndToEndLatencyMetric) + // legacyregistry is the internal k8s wrapper around the prometheus + // global registry, used specifically for metric stability enforcement + legacyregistry.MustRegister(storageOperationMetric) + legacyregistry.MustRegister(storageOperationErrorMetric) + legacyregistry.MustRegister(storageOperationStatusMetric) + legacyregistry.MustRegister(storageOperationEndToEndLatencyMetric) } // OperationCompleteHook returns a hook to call when an operation is completed diff --git a/pkg/volume/util/operationexecutor/BUILD b/pkg/volume/util/operationexecutor/BUILD index b1c2efe37e5..d97651eabbf 100644 --- a/pkg/volume/util/operationexecutor/BUILD +++ b/pkg/volume/util/operationexecutor/BUILD @@ -65,8 +65,8 @@ go_test( "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/component-base/featuregate:go_default_library", "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", + "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//staging/src/k8s.io/csi-translation-lib/plugins:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/github.com/prometheus/client_model/go:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", ], diff --git a/pkg/volume/util/operationexecutor/operation_generator_test.go b/pkg/volume/util/operationexecutor/operation_generator_test.go index 3f038e30b5b..a2c7bbb8cd2 100644 --- a/pkg/volume/util/operationexecutor/operation_generator_test.go +++ b/pkg/volume/util/operationexecutor/operation_generator_test.go @@ -18,7 +18,6 @@ package operationexecutor import ( "fmt" - "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_model/go" "github.com/stretchr/testify/assert" "k8s.io/api/core/v1" @@ -30,6 +29,7 @@ import ( "k8s.io/client-go/tools/record" "k8s.io/component-base/featuregate" featuregatetesting "k8s.io/component-base/featuregate/testing" + "k8s.io/component-base/metrics/legacyregistry" "k8s.io/csi-translation-lib/plugins" "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/volume" @@ -229,7 +229,7 @@ func getTestVolumeToUnmount(pod *v1.Pod, pvSpec v1.PersistentVolumeSpec, pluginN } func getMetricFamily(metricFamilyName string) *io_prometheus_client.MetricFamily { - metricFamilies, _ := prometheus.DefaultGatherer.Gather() + metricFamilies, _ := legacyregistry.DefaultGatherer.Gather() for _, mf := range metricFamilies { if *mf.Name == metricFamilyName { return mf diff --git a/staging/src/k8s.io/component-base/metrics/processstarttime.go b/staging/src/k8s.io/component-base/metrics/processstarttime.go index c8c561c7282..70912798532 100644 --- a/staging/src/k8s.io/component-base/metrics/processstarttime.go +++ b/staging/src/k8s.io/component-base/metrics/processstarttime.go @@ -32,17 +32,22 @@ var processStartTime = prometheus.NewGaugeVec( []string{}, ) +// Registerer is an interface expected by RegisterProcessStartTime in order to register the metric +type Registerer interface { + Register(prometheus.Collector) error +} + // RegisterProcessStartTime registers the process_start_time_seconds to // a prometheus registry. This metric needs to be included to ensure counter // data fidelity. -func RegisterProcessStartTime(registerer prometheus.Registerer) error { +func RegisterProcessStartTime(registrationFunc func(prometheus.Collector) error) error { start, err := getProcessStart() if err != nil { klog.Errorf("Could not get process start time, %v", err) start = float64(time.Now().Unix()) } processStartTime.WithLabelValues().Set(start) - return registerer.Register(processStartTime) + return registrationFunc(processStartTime) } func getProcessStart() (float64, error) { diff --git a/staging/src/k8s.io/component-base/metrics/version.go b/staging/src/k8s.io/component-base/metrics/version.go index 21d1f152f5a..63cc606e4c1 100644 --- a/staging/src/k8s.io/component-base/metrics/version.go +++ b/staging/src/k8s.io/component-base/metrics/version.go @@ -32,6 +32,6 @@ var ( // RegisterBuildInfo registers the build and version info in a metadata metric in prometheus func RegisterBuildInfo(r KubeRegistry) { info := version.Get() - buildInfo.WithLabelValues(info.Major, info.Minor, info.GitVersion, info.GitCommit, info.GitTreeState, info.BuildDate, info.GoVersion, info.Compiler, info.Platform).Set(1) r.MustRegister(buildInfo) + buildInfo.WithLabelValues(info.Major, info.Minor, info.GitVersion, info.GitCommit, info.GitTreeState, info.BuildDate, info.GoVersion, info.Compiler, info.Platform).Set(1) }