121 lines
2.8 KiB
Go
121 lines
2.8 KiB
Go
|
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")
|
||
|
}
|