* go-metrics: fork library and introduce ResettingTimer and InfluxDB reporter. * vendor: change nonsense/go-metrics to ethersphere/go-metrics * go-metrics: add tests. move ResettingTimer logic from reporter to type. * all, metrics: pull in metrics package in go-ethereum * metrics/test: make sure metrics are enabled for tests * metrics: apply gosimple rules * metrics/exp, internal/debug: init expvar endpoint when starting pprof server * internal/debug: tiny comment formatting fix
		
			
				
	
	
		
			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 !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")
 | |
| }
 | |
| 
 | |
| // 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")
 | |
| }
 |