package metrics import ( "net/http" "sync" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" ) // Handler returns an http.Handler for the local registry. func Handler() http.Handler { promhttp.Handler() return promhttp.InstrumentMetricHandler( registry, promhttp.HandlerFor(registry, promhttp.HandlerOpts{})) } var ( registry = prometheus.NewRegistry() // registeredCollectorsMtx protects collectors slice. // It should not be acessed concurrently, but we can easily forget this in future, thus this mutex. registeredCollectorsMtx sync.Mutex registeredCollectors []prometheus.Collector ) func init() { mustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{})) mustRegister(collectors.NewGoCollector()) } func mustRegister(cs ...prometheus.Collector) { for i := range cs { registry.MustRegister(cs[i]) } registeredCollectorsMtx.Lock() registeredCollectors = append(registeredCollectors, cs...) registeredCollectorsMtx.Unlock() }