Files
obsx/metrics.go
2026-03-23 01:16:18 +03:00

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
}