From a6ced42e9c10dd997ca289b5c989c94e50bc7e47 Mon Sep 17 00:00:00 2001 From: Eric Fried Date: Fri, 9 Jul 2021 09:59:13 -0500 Subject: [PATCH] :warning: Make `rest_client_request_latency_seconds` metric optional This metric has been deprecated since kube 1.14 and [turned off in kube 1.17](https://github.com/kubernetes/kubernetes/pull/83836). Stop registering it by default, but export the appropriate variables so consumers can register it explicitly if they wish. --- pkg/metrics/client_go_adapter.go | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/pkg/metrics/client_go_adapter.go b/pkg/metrics/client_go_adapter.go index 90754269dd..d32ce25348 100644 --- a/pkg/metrics/client_go_adapter.go +++ b/pkg/metrics/client_go_adapter.go @@ -52,7 +52,24 @@ const ( var ( // client metrics. - requestLatency = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + + // RequestLatency reports the request latency in seconds per verb/URL. + // Deprecated: This metric is deprecated for removal in a future release: using the URL as a + // dimension results in cardinality explosion for some consumers. It was deprecated upstream + // in k8s v1.14 and hidden in v1.17 via https://github.com/kubernetes/kubernetes/pull/83836. + // It is not registered by default. To register: + // import ( + // clientmetrics "k8s.io/client-go/tools/metrics" + // clmetrics "sigs.k8s.io/controller-runtime/metrics" + // ) + // + // func init() { + // clmetrics.Registry.MustRegister(clmetrics.RequestLatency) + // clientmetrics.Register(clientmetrics.RegisterOpts{ + // RequestLatency: clmetrics.LatencyAdapter + // }) + // } + RequestLatency = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Subsystem: RestClientSubsystem, Name: LatencyKey, Help: "Request latency in seconds. Broken down by verb and URL.", @@ -127,13 +144,11 @@ func init() { // registerClientMetrics sets up the client latency metrics from client-go. func registerClientMetrics() { // register the metrics with our registry - Registry.MustRegister(requestLatency) Registry.MustRegister(requestResult) // register the metrics with client-go clientmetrics.Register(clientmetrics.RegisterOpts{ - RequestLatency: &latencyAdapter{metric: requestLatency}, - RequestResult: &resultAdapter{metric: requestResult}, + RequestResult: &resultAdapter{metric: requestResult}, }) } @@ -159,11 +174,13 @@ func registerReflectorMetrics() { // copied (more-or-less directly) from k8s.io/kubernetes setup code // (which isn't anywhere in an easily-importable place). -type latencyAdapter struct { +// LatencyAdapter implements LatencyMetric. +type LatencyAdapter struct { metric *prometheus.HistogramVec } -func (l *latencyAdapter) Observe(_ context.Context, verb string, u url.URL, latency time.Duration) { +// Observe increments the request latency metric for the given verb/URL. +func (l *LatencyAdapter) Observe(_ context.Context, verb string, u url.URL, latency time.Duration) { l.metric.WithLabelValues(verb, u.String()).Observe(latency.Seconds()) }