Add obsx library
This commit is contained in:
78
metrics.go
Normal file
78
metrics.go
Normal file
@@ -0,0 +1,78 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user