From 27dca16e75b7bdc69277721f245e151974a98bc6 Mon Sep 17 00:00:00 2001 From: wojtekt Date: Mon, 14 May 2018 11:22:10 +0200 Subject: [PATCH] Track number of registered watchers in apiserver Kubernetes-commit: bdd9492da0c992e532c5e5d07cae3b68c9b7b78f --- pkg/endpoints/handlers/watch.go | 5 +++++ pkg/endpoints/metrics/metrics.go | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/endpoints/handlers/watch.go b/pkg/endpoints/handlers/watch.go index 176b6c6f8..c1bc984e6 100755 --- a/pkg/endpoints/handlers/watch.go +++ b/pkg/endpoints/handlers/watch.go @@ -30,6 +30,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" + "k8s.io/apiserver/pkg/endpoints/metrics" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/server/httplog" "k8s.io/apiserver/pkg/util/wsstream" @@ -140,6 +141,10 @@ type WatchServer struct { // ServeHTTP serves a series of encoded events via HTTP with Transfer-Encoding: chunked // or over a websocket connection. func (s *WatchServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { + kind := s.Scope.Kind + metrics.RegisteredWatchers.WithLabelValues(kind.Group, kind.Version, kind.Kind).Inc() + defer metrics.RegisteredWatchers.WithLabelValues(kind.Group, kind.Version, kind.Kind).Dec() + w = httplog.Unlogged(w) if wsstream.IsWebSocketRequest(req) { diff --git a/pkg/endpoints/metrics/metrics.go b/pkg/endpoints/metrics/metrics.go index 8de7a4dc3..516452e16 100644 --- a/pkg/endpoints/metrics/metrics.go +++ b/pkg/endpoints/metrics/metrics.go @@ -93,6 +93,14 @@ var ( }, []string{"requestKind"}, ) + // RegisteredWatchers is a number of currently registered watchers splitted by resource. + RegisteredWatchers = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "apiserver_registered_watchers", + Help: "Number of currently registered watchers for a given resources", + }, + []string{"group", "version", "kind"}, + ) // Because of volatality of the base metric this is pre-aggregated one. Instead of reporing current usage all the time // it reports maximal usage during the last second. currentInflightRequests = prometheus.NewGaugeVec( @@ -111,6 +119,7 @@ var ( requestLatenciesSummary, responseSizes, DroppedRequests, + RegisteredWatchers, currentInflightRequests, } )