check / check (push) Waiting to run
A second metrics-enabled router in one process panicked on a duplicate collector registration, because every collector registered on Prometheus's global default registry. metrics.NewRegistry now builds one registry with the Go runtime and process collectors; fx provides it and the delivery metric set built on it. The middleware builds its HTTP recorder once on that registry (NewForTest on a fresh one), the engine and handlers take the metric set from fx, and nothing registers on the global default any more. /metrics is served from the new registry with the same series names, labels and auth. A test builds two metrics-enabled routers in one process. Model: opus-5-5
22 lines
656 B
Go
22 lines
656 B
Go
package handlers
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
)
|
|
|
|
// HandleMetrics returns the Prometheus scrape handler for the
|
|
// registry built by metrics.NewRegistry, which the HTTP, delivery, Go
|
|
// runtime and process collectors register on. It is what
|
|
// promhttp.Handler builds for the global default registry, including
|
|
// the promhttp_metric_handler_* series that count scrapes, pointed at
|
|
// that registry instead.
|
|
func (s *Handlers) HandleMetrics() http.HandlerFunc {
|
|
reg := s.params.Registry
|
|
|
|
return promhttp.InstrumentMetricHandler(
|
|
reg, promhttp.HandlerFor(reg, promhttp.HandlerOpts{}),
|
|
).ServeHTTP
|
|
}
|