2015-06-22 12:00:55 +03:00
|
|
|
package metrics
|
|
|
|
|
|
|
|
import "sync/atomic"
|
|
|
|
|
|
|
|
// Gauges hold an int64 value that can be set arbitrarily.
|
|
|
|
type Gauge interface {
|
|
|
|
Snapshot() Gauge
|
|
|
|
Update(int64)
|
2019-09-10 14:39:07 +03:00
|
|
|
Dec(int64)
|
|
|
|
Inc(int64)
|
2015-06-22 12:00:55 +03:00
|
|
|
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 {
|
2018-02-23 12:56:08 +03:00
|
|
|
if !Enabled {
|
2015-06-22 12:00:55 +03:00
|
|
|
return NilGauge{}
|
|
|
|
}
|
2023-04-20 10:36:54 +03:00
|
|
|
return &StandardGauge{}
|
2015-06-22 12:00:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
}
|
|
|
|
|
2016-10-28 20:05:01 +03:00
|
|
|
// NewFunctionalGauge constructs a new FunctionalGauge.
|
|
|
|
func NewFunctionalGauge(f func() int64) Gauge {
|
2018-02-23 12:56:08 +03:00
|
|
|
if !Enabled {
|
2016-10-28 20:05:01 +03:00
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2015-06-22 12:00:55 +03:00
|
|
|
// 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")
|
|
|
|
}
|
|
|
|
|
2019-09-10 14:39:07 +03:00
|
|
|
// Dec panics.
|
|
|
|
func (GaugeSnapshot) Dec(int64) {
|
|
|
|
panic("Dec called on a GaugeSnapshot")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Inc panics.
|
|
|
|
func (GaugeSnapshot) Inc(int64) {
|
|
|
|
panic("Inc called on a GaugeSnapshot")
|
|
|
|
}
|
|
|
|
|
2015-06-22 12:00:55 +03:00
|
|
|
// 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) {}
|
|
|
|
|
2019-09-10 14:39:07 +03:00
|
|
|
// Dec is a no-op.
|
|
|
|
func (NilGauge) Dec(i int64) {}
|
|
|
|
|
|
|
|
// Inc is a no-op.
|
|
|
|
func (NilGauge) Inc(i int64) {}
|
|
|
|
|
2015-06-22 12:00:55 +03:00
|
|
|
// 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 {
|
2023-04-20 10:36:54 +03:00
|
|
|
value atomic.Int64
|
2015-06-22 12:00:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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) {
|
2023-04-20 10:36:54 +03:00
|
|
|
g.value.Store(v)
|
2015-06-22 12:00:55 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Value returns the gauge's current value.
|
|
|
|
func (g *StandardGauge) Value() int64 {
|
2023-04-20 10:36:54 +03:00
|
|
|
return g.value.Load()
|
2015-06-22 12:00:55 +03:00
|
|
|
}
|
2017-01-10 21:33:17 +03:00
|
|
|
|
2019-09-10 14:39:07 +03:00
|
|
|
// Dec decrements the gauge's current value by the given amount.
|
|
|
|
func (g *StandardGauge) Dec(i int64) {
|
2023-04-20 10:36:54 +03:00
|
|
|
g.value.Add(-i)
|
2019-09-10 14:39:07 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Inc increments the gauge's current value by the given amount.
|
|
|
|
func (g *StandardGauge) Inc(i int64) {
|
2023-04-20 10:36:54 +03:00
|
|
|
g.value.Add(i)
|
2019-09-10 14:39:07 +03:00
|
|
|
}
|
|
|
|
|
2016-10-28 20:05:01 +03:00
|
|
|
// 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")
|
2017-01-10 21:33:17 +03:00
|
|
|
}
|
2019-09-10 14:39:07 +03:00
|
|
|
|
|
|
|
// Dec panics.
|
|
|
|
func (FunctionalGauge) Dec(int64) {
|
|
|
|
panic("Dec called on a FunctionalGauge")
|
|
|
|
}
|
|
|
|
|
|
|
|
// Inc panics.
|
|
|
|
func (FunctionalGauge) Inc(int64) {
|
|
|
|
panic("Inc called on a FunctionalGauge")
|
|
|
|
}
|