c40779224f
Fixes #52
95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
// 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))
|
|
}
|