github.com/theQRL/go-zond@v0.1.1/metrics/gauge.go (about) 1 package metrics 2 3 import "sync/atomic" 4 5 // gaugeSnapshot contains a readonly int64. 6 type GaugeSnapshot interface { 7 Value() int64 8 } 9 10 // Gauges hold an int64 value that can be set arbitrarily. 11 type Gauge interface { 12 Snapshot() GaugeSnapshot 13 Update(int64) 14 UpdateIfGt(int64) 15 Dec(int64) 16 Inc(int64) 17 } 18 19 // GetOrRegisterGauge returns an existing Gauge or constructs and registers a 20 // new StandardGauge. 21 func GetOrRegisterGauge(name string, r Registry) Gauge { 22 if nil == r { 23 r = DefaultRegistry 24 } 25 return r.GetOrRegister(name, NewGauge).(Gauge) 26 } 27 28 // NewGauge constructs a new StandardGauge. 29 func NewGauge() Gauge { 30 if !Enabled { 31 return NilGauge{} 32 } 33 return &StandardGauge{} 34 } 35 36 // NewRegisteredGauge constructs and registers a new StandardGauge. 37 func NewRegisteredGauge(name string, r Registry) Gauge { 38 c := NewGauge() 39 if nil == r { 40 r = DefaultRegistry 41 } 42 r.Register(name, c) 43 return c 44 } 45 46 // gaugeSnapshot is a read-only copy of another Gauge. 47 type gaugeSnapshot int64 48 49 // Value returns the value at the time the snapshot was taken. 50 func (g gaugeSnapshot) Value() int64 { return int64(g) } 51 52 // NilGauge is a no-op Gauge. 53 type NilGauge struct{} 54 55 func (NilGauge) Snapshot() GaugeSnapshot { return (*emptySnapshot)(nil) } 56 func (NilGauge) Update(v int64) {} 57 func (NilGauge) UpdateIfGt(v int64) {} 58 func (NilGauge) Dec(i int64) {} 59 func (NilGauge) Inc(i int64) {} 60 61 // StandardGauge is the standard implementation of a Gauge and uses the 62 // sync/atomic package to manage a single int64 value. 63 type StandardGauge struct { 64 value atomic.Int64 65 } 66 67 // Snapshot returns a read-only copy of the gauge. 68 func (g *StandardGauge) Snapshot() GaugeSnapshot { 69 return gaugeSnapshot(g.value.Load()) 70 } 71 72 // Update updates the gauge's value. 73 func (g *StandardGauge) Update(v int64) { 74 g.value.Store(v) 75 } 76 77 // Update updates the gauge's value if v is larger then the current valie. 78 func (g *StandardGauge) UpdateIfGt(v int64) { 79 for { 80 exist := g.value.Load() 81 if exist >= v { 82 break 83 } 84 if g.value.CompareAndSwap(exist, v) { 85 break 86 } 87 } 88 } 89 90 // Dec decrements the gauge's current value by the given amount. 91 func (g *StandardGauge) Dec(i int64) { 92 g.value.Add(-i) 93 } 94 95 // Inc increments the gauge's current value by the given amount. 96 func (g *StandardGauge) Inc(i int64) { 97 g.value.Add(i) 98 }