forked from cerc-io/plugeth
d78f9b834a
The Azure SDK doesn't support Go 1.5 anymore. We can't upgrade it until Go 1.8 comes out.
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")
|
|
}
|