| 
									
										
										
										
											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) | 
					
						
							|  |  |  | 	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 10:56:08 +01:00
										 |  |  | 	if !Enabled { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:00:55 +03:00
										 |  |  | 		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 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 20:05:01 +03:00
										 |  |  | // NewFunctionalGauge constructs a new FunctionalGauge. | 
					
						
							|  |  |  | func NewFunctionalGauge(f func() int64) Gauge { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01: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") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-10 19:33:17 +01: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 19:33:17 +01:00
										 |  |  | } |