forked from TrueCloudLab/frostfs-node
41 lines
1.1 KiB
Go
41 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()
|
||
|
// 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()
|
||
|
}
|