mirror of
https://github.com/grafana/grafana.git
synced 2024-11-29 20:24:18 -06:00
83 lines
1.8 KiB
Go
83 lines
1.8 KiB
Go
// includes code from
|
|
// https://raw.githubusercontent.com/rcrowley/go-metrics/master/sample.go
|
|
// Copyright 2012 Richard Crowley. All rights reserved.
|
|
|
|
package metrics
|
|
|
|
import "sync/atomic"
|
|
|
|
// Gauges hold an int64 value that can be set arbitrarily.
|
|
type Gauge interface {
|
|
Metric
|
|
|
|
Update(int64)
|
|
Value() int64
|
|
}
|
|
|
|
func NewGauge(meta *MetricMeta) Gauge {
|
|
if UseNilMetrics {
|
|
return NilGauge{}
|
|
}
|
|
return &StandardGauge{
|
|
MetricMeta: meta,
|
|
value: 0,
|
|
}
|
|
}
|
|
|
|
func RegGauge(meta *MetricMeta) Gauge {
|
|
g := NewGauge(meta)
|
|
MetricStats.Register(g)
|
|
return g
|
|
}
|
|
|
|
// GaugeSnapshot is a read-only copy of another Gauge.
|
|
type GaugeSnapshot struct {
|
|
*MetricMeta
|
|
value int64
|
|
}
|
|
|
|
// Snapshot returns the snapshot.
|
|
func (g GaugeSnapshot) Snapshot() Metric { 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 g.value }
|
|
|
|
// NilGauge is a no-op Gauge.
|
|
type NilGauge struct{ *MetricMeta }
|
|
|
|
// Snapshot is a no-op.
|
|
func (NilGauge) Snapshot() Metric { 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 {
|
|
*MetricMeta
|
|
value int64
|
|
}
|
|
|
|
// Snapshot returns a read-only copy of the gauge.
|
|
func (g *StandardGauge) Snapshot() Metric {
|
|
return GaugeSnapshot{MetricMeta: g.MetricMeta, value: 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)
|
|
}
|