frostfs-node/pkg/metrics/registry.go

43 lines
1.1 KiB
Go

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()
// registeredDescriptionsMtx protects collectors slice.
// It should not be acessed concurrently, but we can easily forget this in future, thus this mutex.
registeredDescriptionsMtx sync.Mutex
registeredDescriptions []Description
)
func init() {
registry.MustRegister(collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}))
registry.MustRegister(collectors.NewGoCollector())
}
func mustRegister[T prometheus.Collector](cs ...metric[T]) {
for i := range cs {
registry.MustRegister(cs[i].value)
}
registeredDescriptionsMtx.Lock()
for i := range cs {
registeredDescriptions = append(registeredDescriptions, cs[i].desc)
}
registeredDescriptionsMtx.Unlock()
}