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