diff --git a/cmd/adapter/adapter.go b/cmd/adapter/adapter.go index 13ef3f8d..36a72ec7 100644 --- a/cmd/adapter/adapter.go +++ b/cmd/adapter/adapter.go @@ -271,11 +271,23 @@ func (cmd *PrometheusAdapter) addResourceMetricsAPI(promClient prom.Client, stop return err } + config, err := cmd.Config() + if err != nil { + return err + } + config.GenericConfig.EnableMetrics = false + server, err := cmd.Server() if err != nil { return err } + metricsHandler, err := mprom.MetricsHandler() + if err != nil { + return err + } + server.GenericAPIServer.Handler.NonGoRestfulMux.HandleFunc("/metrics", metricsHandler) + if err := api.Install(provider, podInformer.Lister(), informer.Core().V1().Nodes().Lister(), server.GenericAPIServer, nil); err != nil { return err } diff --git a/pkg/client/metrics/metrics.go b/pkg/client/metrics/metrics.go index b54067f2..0faaed82 100644 --- a/pkg/client/metrics/metrics.go +++ b/pkg/client/metrics/metrics.go @@ -18,11 +18,16 @@ package metrics import ( "context" + "net/http" "net/url" "time" "github.com/prometheus/client_golang/prometheus" + apimetrics "k8s.io/apiserver/pkg/endpoints/metrics" + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" + "sigs.k8s.io/prometheus-adapter/pkg/client" ) @@ -30,18 +35,29 @@ var ( // queryLatency is the total latency of any query going through the // various endpoints (query, range-query, series). It includes some deserialization // overhead and HTTP overhead. - queryLatency = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Name: "cmgateway_prometheus_query_latency_seconds", - Help: "Prometheus client query latency in seconds. Broken down by target prometheus endpoint and target server", - Buckets: prometheus.ExponentialBuckets(0.0001, 2, 10), + queryLatency = metrics.NewHistogramVec( + &metrics.HistogramOpts{ + Namespace: "prometheus_adapter", + Subsystem: "prometheus_client", + Name: "request_duration_seconds", + Help: "Prometheus client query latency in seconds. Broken down by target prometheus endpoint and target server", + Buckets: prometheus.DefBuckets, }, - []string{"endpoint", "server"}, + []string{"path", "server"}, ) ) -func init() { - prometheus.MustRegister(queryLatency) +func MetricsHandler() (http.HandlerFunc, error) { + registry := metrics.NewKubeRegistry() + err := registry.Register(queryLatency) + if err != nil { + return nil, err + } + apimetrics.Register() + return func(w http.ResponseWriter, req *http.Request) { + legacyregistry.Handler().ServeHTTP(w, req) + metrics.HandlerFor(registry, metrics.HandlerOpts{}).ServeHTTP(w, req) + }, nil } // instrumentedClient is a client.GenericAPIClient which instruments calls to Do, @@ -63,7 +79,7 @@ func (c *instrumentedGenericClient) Do(ctx context.Context, verb, endpoint strin return } } - queryLatency.With(prometheus.Labels{"endpoint": endpoint, "server": c.serverName}).Observe(endTime.Sub(startTime).Seconds()) + queryLatency.With(prometheus.Labels{"path": endpoint, "server": c.serverName}).Observe(endTime.Sub(startTime).Seconds()) }() var resp client.APIResponse