+++ /dev/null
-// Package expvar provides expvar backends for metrics.
-// Label values are not supported.
-package expvar
-
-import (
- "expvar"
- "sync"
-
- "github.com/go-kit/kit/metrics"
- "github.com/go-kit/kit/metrics/generic"
-)
-
-// Counter implements the counter metric with an expvar float.
-// Label values are not supported.
-type Counter struct {
- f *expvar.Float
-}
-
-// NewCounter creates an expvar Float with the given name, and returns an object
-// that implements the Counter interface.
-func NewCounter(name string) *Counter {
- return &Counter{
- f: expvar.NewFloat(name),
- }
-}
-
-// With is a no-op.
-func (c *Counter) With(labelValues ...string) metrics.Counter { return c }
-
-// Add implements Counter.
-func (c *Counter) Add(delta float64) { c.f.Add(delta) }
-
-// Gauge implements the gauge metric with an expvar float.
-// Label values are not supported.
-type Gauge struct {
- f *expvar.Float
-}
-
-// NewGauge creates an expvar Float with the given name, and returns an object
-// that implements the Gauge interface.
-func NewGauge(name string) *Gauge {
- return &Gauge{
- f: expvar.NewFloat(name),
- }
-}
-
-// With is a no-op.
-func (g *Gauge) With(labelValues ...string) metrics.Gauge { return g }
-
-// Set implements Gauge.
-func (g *Gauge) Set(value float64) { g.f.Set(value) }
-
-// Add implements metrics.Gauge.
-func (g *Gauge) Add(delta float64) { g.f.Add(delta) }
-
-// Histogram implements the histogram metric with a combination of the generic
-// Histogram object and several expvar Floats, one for each of the 50th, 90th,
-// 95th, and 99th quantiles of observed values, with the quantile attached to
-// the name as a suffix. Label values are not supported.
-type Histogram struct {
- mtx sync.Mutex
- h *generic.Histogram
- p50 *expvar.Float
- p90 *expvar.Float
- p95 *expvar.Float
- p99 *expvar.Float
-}
-
-// NewHistogram returns a Histogram object with the given name and number of
-// buckets in the underlying histogram object. 50 is a good default number of
-// buckets.
-func NewHistogram(name string, buckets int) *Histogram {
- return &Histogram{
- h: generic.NewHistogram(name, buckets),
- p50: expvar.NewFloat(name + ".p50"),
- p90: expvar.NewFloat(name + ".p90"),
- p95: expvar.NewFloat(name + ".p95"),
- p99: expvar.NewFloat(name + ".p99"),
- }
-}
-
-// With is a no-op.
-func (h *Histogram) With(labelValues ...string) metrics.Histogram { return h }
-
-// Observe implements Histogram.
-func (h *Histogram) Observe(value float64) {
- h.mtx.Lock()
- defer h.mtx.Unlock()
- h.h.Observe(value)
- h.p50.Set(h.h.Quantile(0.50))
- h.p90.Set(h.h.Quantile(0.90))
- h.p95.Set(h.h.Quantile(0.95))
- h.p99.Set(h.h.Quantile(0.99))
-}