289b30715d
This commit converts the dependency management from Godeps to the vendor folder, also switching the tool from godep to trash. Since the upstream tool lacks a few features proposed via a few PRs, until those PRs are merged in (if), use github.com/karalabe/trash. You can update dependencies via trash --update. All dependencies have been updated to their latest version. Parts of the build system are reworked to drop old notions of Godeps and invocation of the go vet command so that it doesn't run against the vendor folder, as that will just blow up during vetting. The conversion drops OpenCL (and hence GPU mining support) from ethash and our codebase. The short reasoning is that there's noone to maintain and having opencl libs in our deps messes up builds as go install ./... tries to build them, failing with unsatisfied link errors for the C OpenCL deps. golang.org/x/net/context is not vendored in. We expect it to be fetched by the user (i.e. using go get). To keep ci.go builds reproducible the package is "vendored" in build/_vendor.
120 lines
2.8 KiB
Go
120 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 UseNilMetrics {
|
|
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 UseNilMetrics {
|
|
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")
|
|
} |