protoc-gen-go-micro/vendor/github.com/go-kit/kit/metrics/expvar/expvar.go

95 lines
2.5 KiB
Go
Raw Normal View History

// 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))
}