diff --git a/metrics/database.go b/metrics/database.go index fa742c33d..c87af72bf 100644 --- a/metrics/database.go +++ b/metrics/database.go @@ -45,8 +45,8 @@ func NewDefaultDatabaseMetrics(pkg string) DatabaseMetrics { databaseLatencyLabels, ), } - prometheus.MustRegister(metrics.DatabaseOperations) - prometheus.MustRegister(metrics.DatabaseLatencies) + metrics.DatabaseOperations = registerOnce(metrics.DatabaseOperations).(*prometheus.CounterVec) + metrics.DatabaseLatencies = registerOnce(metrics.DatabaseLatencies).(*prometheus.HistogramVec) return metrics } diff --git a/metrics/metrics.go b/metrics/prometheus_service.go similarity index 100% rename from metrics/metrics.go rename to metrics/prometheus_service.go diff --git a/metrics/util.go b/metrics/util.go new file mode 100644 index 000000000..139e3e39b --- /dev/null +++ b/metrics/util.go @@ -0,0 +1,23 @@ +package metrics + +import ( + "errors" + + "github.com/prometheus/client_golang/prometheus" +) + +// Registers the collector with Prometheus. If an identical collector is already +// registered, returns the existing collector, otherwise returns the provided collector. +// Panics if the collector cannot be registered. +func registerOnce(collector prometheus.Collector) prometheus.Collector { + if err := prometheus.Register(collector); err != nil { + are := &prometheus.AlreadyRegisteredError{} + if errors.As(err, are) { + // Use the old collector from now on. + return are.ExistingCollector + } + // Something else went wrong. + panic(err) + } + return collector +}