79 lines
2.1 KiB
Go
79 lines
2.1 KiB
Go
package obsx
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
)
|
|
|
|
// MetricsConfig configures the metrics factory.
|
|
type MetricsConfig struct {
|
|
Namespace string
|
|
Subsystem string
|
|
}
|
|
|
|
// Metrics is a factory for creating Prometheus metrics with consistent naming.
|
|
type Metrics struct {
|
|
cfg MetricsConfig
|
|
registry *prometheus.Registry
|
|
}
|
|
|
|
// NewMetrics creates a new Metrics factory.
|
|
func NewMetrics(cfg MetricsConfig) *Metrics {
|
|
reg := prometheus.NewRegistry()
|
|
reg.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
|
|
reg.MustRegister(prometheus.NewGoCollector())
|
|
return &Metrics{cfg: cfg, registry: reg}
|
|
}
|
|
|
|
// Counter creates and registers a new CounterVec.
|
|
func (m *Metrics) Counter(name, help string, labels ...string) *prometheus.CounterVec {
|
|
c := prometheus.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: m.cfg.Namespace,
|
|
Subsystem: m.cfg.Subsystem,
|
|
Name: name,
|
|
Help: help,
|
|
}, labels)
|
|
m.registry.MustRegister(c)
|
|
return c
|
|
}
|
|
|
|
// Histogram creates and registers a new HistogramVec.
|
|
func (m *Metrics) Histogram(name, help string, buckets []float64, labels ...string) *prometheus.HistogramVec {
|
|
if buckets == nil {
|
|
buckets = prometheus.DefBuckets
|
|
}
|
|
h := prometheus.NewHistogramVec(prometheus.HistogramOpts{
|
|
Namespace: m.cfg.Namespace,
|
|
Subsystem: m.cfg.Subsystem,
|
|
Name: name,
|
|
Help: help,
|
|
Buckets: buckets,
|
|
}, labels)
|
|
m.registry.MustRegister(h)
|
|
return h
|
|
}
|
|
|
|
// Gauge creates and registers a new GaugeVec.
|
|
func (m *Metrics) Gauge(name, help string, labels ...string) *prometheus.GaugeVec {
|
|
g := prometheus.NewGaugeVec(prometheus.GaugeOpts{
|
|
Namespace: m.cfg.Namespace,
|
|
Subsystem: m.cfg.Subsystem,
|
|
Name: name,
|
|
Help: help,
|
|
}, labels)
|
|
m.registry.MustRegister(g)
|
|
return g
|
|
}
|
|
|
|
// Handler returns an http.Handler for the /metrics endpoint.
|
|
func (m *Metrics) Handler() http.Handler {
|
|
return promhttp.HandlerFor(m.registry, promhttp.HandlerOpts{})
|
|
}
|
|
|
|
// Registry returns the underlying Prometheus registry.
|
|
func (m *Metrics) Registry() *prometheus.Registry {
|
|
return m.registry
|
|
}
|