123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- package metrics
- import "sync/atomic"
- // Gauges hold an int64 value that can be set arbitrarily.
- type Gauge interface {
- Snapshot() Gauge
- Update(int64)
- Value() int64
- }
- // GetOrRegisterGauge returns an existing Gauge or constructs and registers a
- // new StandardGauge.
- func GetOrRegisterGauge(name string, r Registry) Gauge {
- if nil == r {
- r = DefaultRegistry
- }
- return r.GetOrRegister(name, NewGauge).(Gauge)
- }
- // NewGauge constructs a new StandardGauge.
- func NewGauge() Gauge {
- if UseNilMetrics {
- return NilGauge{}
- }
- return &StandardGauge{0}
- }
- // NewRegisteredGauge constructs and registers a new StandardGauge.
- func NewRegisteredGauge(name string, r Registry) Gauge {
- c := NewGauge()
- if nil == r {
- r = DefaultRegistry
- }
- r.Register(name, c)
- return c
- }
- // NewFunctionalGauge constructs a new FunctionalGauge.
- func NewFunctionalGauge(f func() int64) Gauge {
- if UseNilMetrics {
- return NilGauge{}
- }
- return &FunctionalGauge{value: f}
- }
- // NewRegisteredFunctionalGauge constructs and registers a new StandardGauge.
- func NewRegisteredFunctionalGauge(name string, r Registry, f func() int64) Gauge {
- c := NewFunctionalGauge(f)
- if nil == r {
- r = DefaultRegistry
- }
- r.Register(name, c)
- return c
- }
- // GaugeSnapshot is a read-only copy of another Gauge.
- type GaugeSnapshot int64
- // Snapshot returns the snapshot.
- func (g GaugeSnapshot) Snapshot() Gauge { return g }
- // Update panics.
- func (GaugeSnapshot) Update(int64) {
- panic("Update called on a GaugeSnapshot")
- }
- // Value returns the value at the time the snapshot was taken.
- func (g GaugeSnapshot) Value() int64 { return int64(g) }
- // NilGauge is a no-op Gauge.
- type NilGauge struct{}
- // Snapshot is a no-op.
- func (NilGauge) Snapshot() Gauge { return NilGauge{} }
- // Update is a no-op.
- func (NilGauge) Update(v int64) {}
- // Value is a no-op.
- func (NilGauge) Value() int64 { return 0 }
- // StandardGauge is the standard implementation of a Gauge and uses the
- // sync/atomic package to manage a single int64 value.
- type StandardGauge struct {
- value int64
- }
- // Snapshot returns a read-only copy of the gauge.
- func (g *StandardGauge) Snapshot() Gauge {
- return GaugeSnapshot(g.Value())
- }
- // Update updates the gauge's value.
- func (g *StandardGauge) Update(v int64) {
- atomic.StoreInt64(&g.value, v)
- }
- // Value returns the gauge's current value.
- func (g *StandardGauge) Value() int64 {
- return atomic.LoadInt64(&g.value)
- }
- // FunctionalGauge returns value from given function
- type FunctionalGauge struct {
- value func() int64
- }
- // Value returns the gauge's current value.
- func (g FunctionalGauge) Value() int64 {
- return g.value()
- }
- // Snapshot returns the snapshot.
- func (g FunctionalGauge) Snapshot() Gauge { return GaugeSnapshot(g.Value()) }
- // Update panics.
- func (FunctionalGauge) Update(int64) {
- panic("Update called on a FunctionalGauge")
- }
|