159 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package metrics
 | 
						|
 | 
						|
import "sync/atomic"
 | 
						|
 | 
						|
// Gauges hold an int64 value that can be set arbitrarily.
 | 
						|
type Gauge interface {
 | 
						|
	Snapshot() Gauge
 | 
						|
	Update(int64)
 | 
						|
	Dec(int64)
 | 
						|
	Inc(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 !Enabled {
 | 
						|
		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 !Enabled {
 | 
						|
		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")
 | 
						|
}
 | 
						|
 | 
						|
// Dec panics.
 | 
						|
func (GaugeSnapshot) Dec(int64) {
 | 
						|
	panic("Dec called on a GaugeSnapshot")
 | 
						|
}
 | 
						|
 | 
						|
// Inc panics.
 | 
						|
func (GaugeSnapshot) Inc(int64) {
 | 
						|
	panic("Inc 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) {}
 | 
						|
 | 
						|
// Dec is a no-op.
 | 
						|
func (NilGauge) Dec(i int64) {}
 | 
						|
 | 
						|
// Inc is a no-op.
 | 
						|
func (NilGauge) Inc(i 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)
 | 
						|
}
 | 
						|
 | 
						|
// Dec decrements the gauge's current value by the given amount.
 | 
						|
func (g *StandardGauge) Dec(i int64) {
 | 
						|
	atomic.AddInt64(&g.value, -i)
 | 
						|
}
 | 
						|
 | 
						|
// Inc increments the gauge's current value by the given amount.
 | 
						|
func (g *StandardGauge) Inc(i int64) {
 | 
						|
	atomic.AddInt64(&g.value, i)
 | 
						|
}
 | 
						|
 | 
						|
// 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")
 | 
						|
}
 | 
						|
 | 
						|
// Dec panics.
 | 
						|
func (FunctionalGauge) Dec(int64) {
 | 
						|
	panic("Dec called on a FunctionalGauge")
 | 
						|
}
 | 
						|
 | 
						|
// Inc panics.
 | 
						|
func (FunctionalGauge) Inc(int64) {
 | 
						|
	panic("Inc called on a FunctionalGauge")
 | 
						|
}
 |