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 }