From ea20e96f87220290cedfbe2d71b372056f3d3796 Mon Sep 17 00:00:00 2001 From: Trong Huu Nguyen Date: Tue, 28 Jul 2026 09:05:04 +0200 Subject: [PATCH] fix(metrics): log collector registration failures Registration errors were discarded, leaving the collector silently absent from the metrics endpoint while the vectors still recorded. Duplicate registrations remain ignored; they are expected when several instances are constructed in the same process. --- pkg/metrics/metrics.go | 15 +++++++++++++++ pkg/middleware/prometheus.go | 4 ++-- pkg/session/store.go | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pkg/metrics/metrics.go b/pkg/metrics/metrics.go index 0a59974..952c4ac 100644 --- a/pkg/metrics/metrics.go +++ b/pkg/metrics/metrics.go @@ -1,11 +1,13 @@ package metrics import ( + "errors" "net/url" "strings" "time" "github.com/prometheus/client_golang/prometheus" + log "github.com/sirupsen/logrus" ) const ( @@ -131,6 +133,19 @@ func Register() { ) } +func RegisterCollector(collector prometheus.Collector) { + err := prometheus.DefaultRegisterer.Register(collector) + if err == nil { + return + } + + if _, ok := errors.AsType[prometheus.AlreadyRegisteredError](err); ok { + return + } + + log.Warnf("metrics: registering collector: %+v", err) +} + func ObserveRedisLatency(operation string, fun func() error) error { timer := time.Now() err := fun() diff --git a/pkg/middleware/prometheus.go b/pkg/middleware/prometheus.go index c0404b4..1ba2c4f 100644 --- a/pkg/middleware/prometheus.go +++ b/pkg/middleware/prometheus.go @@ -56,8 +56,8 @@ func Prometheus(provider string, buckets ...float64) *PrometheusMiddleware { []string{"code", "method", "path", "host"}, ) - prometheus.Register(m.reqs) - prometheus.Register(m.latency) + metrics.RegisterCollector(m.reqs) + metrics.RegisterCollector(m.latency) return &m } diff --git a/pkg/session/store.go b/pkg/session/store.go index 9e7ced4..dc9df98 100644 --- a/pkg/session/store.go +++ b/pkg/session/store.go @@ -5,12 +5,12 @@ import ( "fmt" "time" - "github.com/prometheus/client_golang/prometheus" "github.com/redis/go-redis/extra/redisotel/v9" "github.com/redis/go-redis/extra/redisprometheus/v9" log "github.com/sirupsen/logrus" "github.com/nais/wonderwall/pkg/config" + "github.com/nais/wonderwall/pkg/metrics" ) type Store interface { @@ -34,7 +34,7 @@ func NewStore(cfg *config.Config) (Store, error) { } collector := redisprometheus.NewCollector("wonderwall", "", redisClient) - prometheus.Register(collector) + metrics.RegisterCollector(collector) ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) defer cancel()