// Package prometheus provides Prometheus implementations for metrics. // Individual metrics are mapped to their Prometheus counterparts, and // (depending on the constructor used) may be automatically registered in the // global Prometheus metrics registry. package prometheus import ( "github.com/prometheus/client_golang/prometheus" "github.com/go-kit/kit/metrics" "github.com/go-kit/kit/metrics/internal/lv" ) // Counter implements Counter, via a Prometheus CounterVec. type Counter struct { cv *prometheus.CounterVec lvs lv.LabelValues } // NewCounterFrom constructs and registers a Prometheus CounterVec, // and returns a usable Counter object. func NewCounterFrom(opts prometheus.CounterOpts, labelNames []string) *Counter { cv := prometheus.NewCounterVec(opts, labelNames) prometheus.MustRegister(cv) return NewCounter(cv) } // NewCounter wraps the CounterVec and returns a usable Counter object. func NewCounter(cv *prometheus.CounterVec) *Counter { return &Counter{ cv: cv, } } // With implements Counter. func (c *Counter) With(labelValues ...string) metrics.Counter { return &Counter{ cv: c.cv, lvs: c.lvs.With(labelValues...), } } // Add implements Counter. func (c *Counter) Add(delta float64) { c.cv.With(makeLabels(c.lvs...)).Add(delta) } // Gauge implements Gauge, via a Prometheus GaugeVec. type Gauge struct { gv *prometheus.GaugeVec lvs lv.LabelValues } // NewGaugeFrom construts and registers a Prometheus GaugeVec, // and returns a usable Gauge object. func NewGaugeFrom(opts prometheus.GaugeOpts, labelNames []string) *Gauge { gv := prometheus.NewGaugeVec(opts, labelNames) prometheus.MustRegister(gv) return NewGauge(gv) } // NewGauge wraps the GaugeVec and returns a usable Gauge object. func NewGauge(gv *prometheus.GaugeVec) *Gauge { return &Gauge{ gv: gv, } } // With implements Gauge. func (g *Gauge) With(labelValues ...string) metrics.Gauge { return &Gauge{ gv: g.gv, lvs: g.lvs.With(labelValues...), } } // Set implements Gauge. func (g *Gauge) Set(value float64) { g.gv.With(makeLabels(g.lvs...)).Set(value) } // Add is supported by Prometheus GaugeVecs. func (g *Gauge) Add(delta float64) { g.gv.With(makeLabels(g.lvs...)).Add(delta) } // Summary implements Histogram, via a Prometheus SummaryVec. The difference // between a Summary and a Histogram is that Summaries don't require predefined // quantile buckets, but cannot be statistically aggregated. type Summary struct { sv *prometheus.SummaryVec lvs lv.LabelValues } // NewSummaryFrom constructs and registers a Prometheus SummaryVec, // and returns a usable Summary object. func NewSummaryFrom(opts prometheus.SummaryOpts, labelNames []string) *Summary { sv := prometheus.NewSummaryVec(opts, labelNames) prometheus.MustRegister(sv) return NewSummary(sv) } // NewSummary wraps the SummaryVec and returns a usable Summary object. func NewSummary(sv *prometheus.SummaryVec) *Summary { return &Summary{ sv: sv, } } // With implements Histogram. func (s *Summary) With(labelValues ...string) metrics.Histogram { return &Summary{ sv: s.sv, lvs: s.lvs.With(labelValues...), } } // Observe implements Histogram. func (s *Summary) Observe(value float64) { s.sv.With(makeLabels(s.lvs...)).Observe(value) } // Histogram implements Histogram via a Prometheus HistogramVec. The difference // between a Histogram and a Summary is that Histograms require predefined // quantile buckets, and can be statistically aggregated. type Histogram struct { hv *prometheus.HistogramVec lvs lv.LabelValues } // NewHistogramFrom constructs and registers a Prometheus HistogramVec, // and returns a usable Histogram object. func NewHistogramFrom(opts prometheus.HistogramOpts, labelNames []string) *Histogram { hv := prometheus.NewHistogramVec(opts, labelNames) prometheus.MustRegister(hv) return NewHistogram(hv) } // NewHistogram wraps the HistogramVec and returns a usable Histogram object. func NewHistogram(hv *prometheus.HistogramVec) *Histogram { return &Histogram{ hv: hv, } } // With implements Histogram. func (h *Histogram) With(labelValues ...string) metrics.Histogram { return &Histogram{ hv: h.hv, lvs: h.lvs.With(labelValues...), } } // Observe implements Histogram. func (h *Histogram) Observe(value float64) { h.hv.With(makeLabels(h.lvs...)).Observe(value) } func makeLabels(labelValues ...string) prometheus.Labels { labels := prometheus.Labels{} for i := 0; i < len(labelValues); i += 2 { labels[labelValues[i]] = labelValues[i+1] } return labels }