From 6c278e89aa5c02d90b2f63283956b48ee5f161ab Mon Sep 17 00:00:00 2001 From: fpetkovski Date: Tue, 19 Aug 2025 12:46:48 +0200 Subject: [PATCH 1/2] Add info metric for client-go version KSM supports a range of Kubernetes versions which makes it important to keep up with new versions as clusters upgrade. In order to allow for alerting on unsupported cluster versions, this commit adds an info metric for the client-go version used by KSM. This way users can set up alerts if the cluster in which KSM is running is outside of the supported range. Signed-off-by: fpetkovski --- Makefile | 6 ++++-- pkg/app/server.go | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 16bd5b5b13..fd476082b6 100644 --- a/Makefile +++ b/Makefile @@ -20,10 +20,12 @@ MULTI_ARCH_IMG = $(IMAGE)-$(ARCH) USER ?= $(shell id -u -n) HOST ?= $(shell hostname) MARKDOWNLINT_CLI2_VERSION = 0.18.1 +CLIENT_GO_VERSION = $(shell go list -m -f '{{.Version}}' k8s.io/client-go) +KSM_MODULE = $(shell go list -m) DOCKER_CLI ?= docker PROMTOOL_CLI ?= promtool -GOMPLATE_CLI ?= go tool github.com/hairyhenderson/gomplate/v4/cmd/gomplate +GOMPLATE_CLI ?= go tool github.com/hairyhenderson/gomplate/v4/cmd/gomplate GOJSONTOYAML_CLI ?= go tool github.com/brancz/gojsontoyaml EMBEDMD_CLI ?= go tool github.com/campoy/embedmd JSONNET_CLI ?= go tool github.com/google/go-jsonnet/cmd/jsonnet @@ -69,7 +71,7 @@ doccheck: generate validate-template @echo OK build-local: - GOOS=$(OS) GOARCH=$(ARCH) CGO_ENABLED=0 go build -ldflags "-s -w -X ${PKG}/version.Version=${TAG} -X ${PKG}/version.Revision=${GIT_COMMIT} -X ${PKG}/version.Branch=${BRANCH} -X ${PKG}/version.BuildUser=${USER}@${HOST} -X ${PKG}/version.BuildDate=${BUILD_DATE}" -o kube-state-metrics + GOOS=$(OS) GOARCH=$(ARCH) CGO_ENABLED=0 go build -ldflags "-s -w -X ${PKG}/version.Version=${TAG} -X ${PKG}/version.Revision=${GIT_COMMIT} -X ${PKG}/version.Branch=${BRANCH} -X ${PKG}/version.BuildUser=${USER}@${HOST} -X ${PKG}/version.BuildDate=${BUILD_DATE} -X ${PKG}/version.BuildDate=${BUILD_DATE} -X ${KSM_MODULE}/pkg/app.ClientGoVersion=${CLIENT_GO_VERSION}" -o kube-state-metrics build: kube-state-metrics diff --git a/pkg/app/server.go b/pkg/app/server.go index e2bb767c96..b70641c7e8 100644 --- a/pkg/app/server.go +++ b/pkg/app/server.go @@ -63,6 +63,10 @@ import ( "k8s.io/kube-state-metrics/v2/pkg/util/proc" ) +// ClientGoVersion is the version for the client-go library used by KSM. This +// value is set at build time using go build flags. +var ClientGoVersion = "unknown" + const ( metricsPath = "/metrics" healthzPath = "/healthz" @@ -86,6 +90,16 @@ func RunKubeStateMetricsWrapper(ctx context.Context, opts *options.Options) erro func RunKubeStateMetrics(ctx context.Context, opts *options.Options) error { ksmMetricsRegistry := prometheus.NewRegistry() ksmMetricsRegistry.MustRegister(versionCollector.NewCollector("kube_state_metrics")) + + clientGoVersion := promauto.With(ksmMetricsRegistry).NewGaugeVec( + prometheus.GaugeOpts{ + Name: "kube_state_metrics_client_go_info", + Help: "An info metric for the client-go version used by kube-state-metrics", + }, + []string{"version"}, + ) + clientGoVersion.WithLabelValues(ClientGoVersion).Set(1) + durationVec := promauto.With(ksmMetricsRegistry).NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", From af9fc6ada3ecd549c94c74e22e1adf3e8152830b Mon Sep 17 00:00:00 2001 From: fpetkovski Date: Tue, 4 Nov 2025 12:30:00 +0100 Subject: [PATCH 2/2] Add label to build_info metric Signed-off-by: fpetkovski --- go.mod | 4 ++-- go.sum | 12 ++++++------ pkg/app/server.go | 13 +++---------- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index b4ee32417f..8f87ecc5a4 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/gobuffalo/flect v1.0.3 github.com/google/go-cmp v0.7.0 github.com/oklog/run v1.2.0 - github.com/prometheus/client_golang v1.23.2 + github.com/prometheus/client_golang v1.23.3-0.20251103151724-a5ae20370e5e github.com/prometheus/client_model v0.6.2 github.com/prometheus/common v0.67.2 github.com/prometheus/exporter-toolkit v0.15.0 @@ -188,7 +188,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/procfs v0.19.2 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect diff --git a/go.sum b/go.sum index f9d3f6362e..3066ea152d 100644 --- a/go.sum +++ b/go.sum @@ -452,8 +452,8 @@ github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRt github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= +github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -546,8 +546,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_golang v1.23.3-0.20251103151724-a5ae20370e5e h1:VdOG0GiDJykWb5QSEdJzrwd1XVQy6kuBkNhcPmwwQsQ= +github.com/prometheus/client_golang v1.23.3-0.20251103151724-a5ae20370e5e/go.mod h1:Cd8aF6pZc1Z65dR58mjfsi9nymQTAgZFCiJYzDNsYDo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -567,8 +567,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= github.com/protocolbuffers/txtpbfmt v0.0.0-20250129171521-feedd8250727 h1:A8EM8fVuYc0qbVMw9D6EiKdKTIm1SmLvAWcCc2mipGY= github.com/protocolbuffers/txtpbfmt v0.0.0-20250129171521-feedd8250727/go.mod h1:VmWrOlMnBZNtToCWzRlZlIXcJqjo0hS5dwQbRD62gL8= github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= diff --git a/pkg/app/server.go b/pkg/app/server.go index b70641c7e8..9eb0c099dd 100644 --- a/pkg/app/server.go +++ b/pkg/app/server.go @@ -89,16 +89,9 @@ func RunKubeStateMetricsWrapper(ctx context.Context, opts *options.Options) erro // which implements customresource.RegistryFactory and pass all factories into this function. func RunKubeStateMetrics(ctx context.Context, opts *options.Options) error { ksmMetricsRegistry := prometheus.NewRegistry() - ksmMetricsRegistry.MustRegister(versionCollector.NewCollector("kube_state_metrics")) - - clientGoVersion := promauto.With(ksmMetricsRegistry).NewGaugeVec( - prometheus.GaugeOpts{ - Name: "kube_state_metrics_client_go_info", - Help: "An info metric for the client-go version used by kube-state-metrics", - }, - []string{"version"}, - ) - clientGoVersion.WithLabelValues(ClientGoVersion).Set(1) + ksmMetricsRegistry.MustRegister(versionCollector.NewCollector("kube_state_metrics", versionCollector.WithExtraConstLabels( + prometheus.Labels{"client_go_version": ClientGoVersion}, + ))) durationVec := promauto.With(ksmMetricsRegistry).NewHistogramVec( prometheus.HistogramOpts{