mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-18 09:53:48 +00:00
metrics: fix gauge
This commit is contained in:
parent
c1c47eea90
commit
afaca63832
16 changed files with 78 additions and 107 deletions
|
|
@ -116,7 +116,7 @@ type freezerTable struct {
|
|||
headBytes int64 // Number of bytes written to the head file
|
||||
readMeter metrics.Meter // Meter for measuring the effective amount of data read
|
||||
writeMeter metrics.Meter // Meter for measuring the effective amount of data written
|
||||
sizeGauge metrics.Gauge // Gauge for tracking the combined size of all freezer tables
|
||||
sizeGauge *metrics.Gauge // Gauge for tracking the combined size of all freezer tables
|
||||
|
||||
logger log.Logger // Logger with database path and table name embedded
|
||||
lock sync.RWMutex // Mutex protecting the data file descriptors
|
||||
|
|
@ -124,13 +124,13 @@ type freezerTable struct {
|
|||
|
||||
// newFreezerTable opens the given path as a freezer table.
|
||||
func newFreezerTable(path, name string, disableSnappy, readonly bool) (*freezerTable, error) {
|
||||
return newTable(path, name, metrics.NilMeter{}, metrics.NilMeter{}, metrics.NilGauge{}, freezerTableSize, disableSnappy, readonly)
|
||||
return newTable(path, name, metrics.NilMeter{}, metrics.NilMeter{}, metrics.NewGauge(), freezerTableSize, disableSnappy, readonly)
|
||||
}
|
||||
|
||||
// newTable opens a freezer table, creating the data and index files if they are
|
||||
// non-existent. Both files are truncated to the shortest common length to ensure
|
||||
// they don't go out of sync.
|
||||
func newTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeGauge metrics.Gauge, maxFilesize uint32, noCompression, readonly bool) (*freezerTable, error) {
|
||||
func newTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeGauge *metrics.Gauge, maxFilesize uint32, noCompression, readonly bool) (*freezerTable, error) {
|
||||
// Ensure the containing directory exists and open the indexEntry file
|
||||
if err := os.MkdirAll(path, 0755); err != nil {
|
||||
return nil, err
|
||||
|
|
|
|||
|
|
@ -67,16 +67,16 @@ type Database struct {
|
|||
compWriteMeter metrics.Meter // Meter for measuring the data written during compaction
|
||||
writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction
|
||||
writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction
|
||||
diskSizeGauge metrics.Gauge // Gauge for tracking the size of all the levels in the database
|
||||
diskSizeGauge *metrics.Gauge // Gauge for tracking the size of all the levels in the database
|
||||
diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read
|
||||
diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written
|
||||
memCompGauge metrics.Gauge // Gauge for tracking the number of memory compaction
|
||||
level0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in level0
|
||||
nonlevel0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in non0 level
|
||||
seekCompGauge metrics.Gauge // Gauge for tracking the number of table compaction caused by read opt
|
||||
manualMemAllocGauge metrics.Gauge // Gauge to track the amount of memory that has been manually allocated (not a part of runtime/GC)
|
||||
memCompGauge *metrics.Gauge // Gauge for tracking the number of memory compaction
|
||||
level0CompGauge *metrics.Gauge // Gauge for tracking the number of table compaction in level0
|
||||
nonlevel0CompGauge *metrics.Gauge // Gauge for tracking the number of table compaction in non0 level
|
||||
seekCompGauge *metrics.Gauge // Gauge for tracking the number of table compaction caused by read opt
|
||||
manualMemAllocGauge *metrics.Gauge // Gauge to track the amount of memory that has been manually allocated (not a part of runtime/GC)
|
||||
|
||||
levelsGauge []metrics.Gauge // Gauge for tracking the number of tables in levels
|
||||
levelsGauge []*metrics.Gauge // Gauge for tracking the number of tables in levels
|
||||
|
||||
quitLock sync.Mutex // Mutex protecting the quit channel access
|
||||
quitChan chan chan error // Quit channel to stop the metrics collection before closing the database
|
||||
|
|
|
|||
|
|
@ -63,16 +63,16 @@ type Database struct {
|
|||
compWriteMeter metrics.Meter // Meter for measuring the data written during compaction
|
||||
writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction
|
||||
writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction
|
||||
diskSizeGauge metrics.Gauge // Gauge for tracking the size of all the levels in the database
|
||||
diskSizeGauge *metrics.Gauge // Gauge for tracking the size of all the levels in the database
|
||||
diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read
|
||||
diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written
|
||||
memCompGauge metrics.Gauge // Gauge for tracking the number of memory compaction
|
||||
level0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in level0
|
||||
nonlevel0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in non0 level
|
||||
seekCompGauge metrics.Gauge // Gauge for tracking the number of table compaction caused by read opt
|
||||
manualMemAllocGauge metrics.Gauge // Gauge for tracking amount of non-managed memory currently allocated
|
||||
memCompGauge *metrics.Gauge // Gauge for tracking the number of memory compaction
|
||||
level0CompGauge *metrics.Gauge // Gauge for tracking the number of table compaction in level0
|
||||
nonlevel0CompGauge *metrics.Gauge // Gauge for tracking the number of table compaction in non0 level
|
||||
seekCompGauge *metrics.Gauge // Gauge for tracking the number of table compaction caused by read opt
|
||||
manualMemAllocGauge *metrics.Gauge // Gauge for tracking amount of non-managed memory currently allocated
|
||||
|
||||
levelsGauge []metrics.Gauge // Gauge for tracking the number of tables in levels
|
||||
levelsGauge []*metrics.Gauge // Gauge for tracking the number of tables in levels
|
||||
|
||||
quitLock sync.RWMutex // Mutex protecting the quit channel and the closed flag
|
||||
quitChan chan chan error // Quit channel to stop the metrics collection before closing the database
|
||||
|
|
|
|||
|
|
@ -8,11 +8,11 @@ import (
|
|||
var (
|
||||
debugMetrics struct {
|
||||
GCStats struct {
|
||||
LastGC Gauge
|
||||
NumGC Gauge
|
||||
LastGC *Gauge
|
||||
NumGC *Gauge
|
||||
Pause Histogram
|
||||
//PauseQuantiles Histogram
|
||||
PauseTotal Gauge
|
||||
PauseTotal *Gauge
|
||||
}
|
||||
ReadGCStats Timer
|
||||
}
|
||||
|
|
|
|||
|
|
@ -192,7 +192,7 @@ func (exp *exp) syncToExpvar() {
|
|||
exp.publishCounter(name, i.Snapshot())
|
||||
case *metrics.CounterFloat64:
|
||||
exp.publishCounterFloat64(name, i.Snapshot())
|
||||
case metrics.Gauge:
|
||||
case *metrics.Gauge:
|
||||
exp.publishGauge(name, i.Snapshot())
|
||||
case metrics.GaugeFloat64:
|
||||
exp.publishGaugeFloat64(name, i.Snapshot())
|
||||
|
|
|
|||
|
|
@ -2,97 +2,69 @@ package metrics
|
|||
|
||||
import "sync/atomic"
|
||||
|
||||
// GaugeSnapshot contains a readonly int64.
|
||||
type GaugeSnapshot interface {
|
||||
Value() int64
|
||||
}
|
||||
// GaugeSnapshot is a read-only copy of a Gauge.
|
||||
type GaugeSnapshot int64
|
||||
|
||||
// Gauge holds an int64 value that can be set arbitrarily.
|
||||
type Gauge interface {
|
||||
Snapshot() GaugeSnapshot
|
||||
Update(int64)
|
||||
UpdateIfGt(int64)
|
||||
Dec(int64)
|
||||
Inc(int64)
|
||||
}
|
||||
// Value returns the value at the time the snapshot was taken.
|
||||
func (g GaugeSnapshot) Value() int64 { return int64(g) }
|
||||
|
||||
// GetOrRegisterGauge returns an existing Gauge or constructs and registers a
|
||||
// new StandardGauge.
|
||||
func GetOrRegisterGauge(name string, r Registry) Gauge {
|
||||
if nil == r {
|
||||
// new Gauge.
|
||||
func GetOrRegisterGauge(name string, r Registry) *Gauge {
|
||||
if r == nil {
|
||||
r = DefaultRegistry
|
||||
}
|
||||
return r.GetOrRegister(name, NewGauge).(Gauge)
|
||||
return r.GetOrRegister(name, NewGauge).(*Gauge)
|
||||
}
|
||||
|
||||
// NewGauge constructs a new StandardGauge.
|
||||
func NewGauge() Gauge {
|
||||
if !Enabled {
|
||||
return NilGauge{}
|
||||
}
|
||||
return &StandardGauge{}
|
||||
// NewGauge constructs a new Gauge.
|
||||
func NewGauge() *Gauge {
|
||||
return &Gauge{}
|
||||
}
|
||||
|
||||
// NewRegisteredGauge constructs and registers a new StandardGauge.
|
||||
func NewRegisteredGauge(name string, r Registry) Gauge {
|
||||
// NewRegisteredGauge constructs and registers a new Gauge.
|
||||
func NewRegisteredGauge(name string, r Registry) *Gauge {
|
||||
c := NewGauge()
|
||||
if nil == r {
|
||||
if r == nil {
|
||||
r = DefaultRegistry
|
||||
}
|
||||
r.Register(name, c)
|
||||
return c
|
||||
}
|
||||
|
||||
// gaugeSnapshot is a read-only copy of another Gauge.
|
||||
type gaugeSnapshot int64
|
||||
|
||||
// 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{}
|
||||
|
||||
func (NilGauge) Snapshot() GaugeSnapshot { return (*emptySnapshot)(nil) }
|
||||
func (NilGauge) Update(v int64) {}
|
||||
func (NilGauge) UpdateIfGt(v int64) {}
|
||||
func (NilGauge) Dec(i int64) {}
|
||||
func (NilGauge) Inc(i int64) {}
|
||||
|
||||
// StandardGauge is the standard implementation of a Gauge and uses the
|
||||
// sync/atomic package to manage a single int64 value.
|
||||
type StandardGauge struct {
|
||||
value atomic.Int64
|
||||
}
|
||||
// Gauge and uses the sync/atomic package to manage a single int64 value.
|
||||
type Gauge atomic.Int64
|
||||
|
||||
// Snapshot returns a read-only copy of the gauge.
|
||||
func (g *StandardGauge) Snapshot() GaugeSnapshot {
|
||||
return gaugeSnapshot(g.value.Load())
|
||||
func (g *Gauge) Snapshot() GaugeSnapshot {
|
||||
return GaugeSnapshot((*atomic.Int64)(g).Load())
|
||||
}
|
||||
|
||||
// Update updates the gauge's value.
|
||||
func (g *StandardGauge) Update(v int64) {
|
||||
g.value.Store(v)
|
||||
func (g *Gauge) Update(v int64) {
|
||||
(*atomic.Int64)(g).Store(v)
|
||||
}
|
||||
|
||||
// UpdateIfGt updates the gauge's value if v is larger then the current value.
|
||||
func (g *StandardGauge) UpdateIfGt(v int64) {
|
||||
func (g *Gauge) UpdateIfGt(v int64) {
|
||||
value := (*atomic.Int64)(g)
|
||||
for {
|
||||
exist := g.value.Load()
|
||||
exist := value.Load()
|
||||
if exist >= v {
|
||||
break
|
||||
}
|
||||
if g.value.CompareAndSwap(exist, v) {
|
||||
if value.CompareAndSwap(exist, v) {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dec decrements the gauge's current value by the given amount.
|
||||
func (g *StandardGauge) Dec(i int64) {
|
||||
g.value.Add(-i)
|
||||
func (g *Gauge) Dec(i int64) {
|
||||
(*atomic.Int64)(g).Add(-i)
|
||||
}
|
||||
|
||||
// Inc increments the gauge's current value by the given amount.
|
||||
func (g *StandardGauge) Inc(i int64) {
|
||||
g.value.Add(i)
|
||||
func (g *Gauge) Inc(i int64) {
|
||||
(*atomic.Int64)(g).Add(i)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ func graphite(c *GraphiteConfig) error {
|
|||
fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, metric.Snapshot().Count(), now)
|
||||
case *CounterFloat64:
|
||||
fmt.Fprintf(w, "%s.%s.count %f %d\n", c.Prefix, name, metric.Snapshot().Count(), now)
|
||||
case Gauge:
|
||||
case *Gauge:
|
||||
fmt.Fprintf(w, "%s.%s.value %d %d\n", c.Prefix, name, metric.Snapshot().Value(), now)
|
||||
case GaugeFloat64:
|
||||
fmt.Fprintf(w, "%s.%s.value %f %d\n", c.Prefix, name, metric.Snapshot().Value(), now)
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ package metrics
|
|||
var (
|
||||
_ SampleSnapshot = (*emptySnapshot)(nil)
|
||||
_ HistogramSnapshot = (*emptySnapshot)(nil)
|
||||
_ GaugeSnapshot = (*emptySnapshot)(nil)
|
||||
_ MeterSnapshot = (*emptySnapshot)(nil)
|
||||
_ TimerSnapshot = (*emptySnapshot)(nil)
|
||||
)
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ func readMeter(namespace, name string, i interface{}) (string, map[string]interf
|
|||
"value": metric.Snapshot().Count(),
|
||||
}
|
||||
return measurement, fields
|
||||
case metrics.Gauge:
|
||||
case *metrics.Gauge:
|
||||
measurement := fmt.Sprintf("%s%s.gauge", namespace, name)
|
||||
fields := map[string]interface{}{
|
||||
"value": metric.Snapshot().Value(),
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ func LogScaled(r Registry, freq time.Duration, scale time.Duration, l Logger) {
|
|||
case *CounterFloat64:
|
||||
l.Printf("counter %s\n", name)
|
||||
l.Printf(" count: %f\n", metric.Snapshot().Count())
|
||||
case Gauge:
|
||||
case *Gauge:
|
||||
l.Printf("gauge %s\n", name)
|
||||
l.Printf(" value: %9d\n", metric.Snapshot().Value())
|
||||
case GaugeFloat64:
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ func (c *OpenTSDBConfig) writeRegistry(w io.Writer, now int64, shortHostname str
|
|||
fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, metric.Snapshot().Count(), shortHostname)
|
||||
case *CounterFloat64:
|
||||
fmt.Fprintf(w, "put %s.%s.count %d %f host=%s\n", c.Prefix, name, now, metric.Snapshot().Count(), shortHostname)
|
||||
case Gauge:
|
||||
case *Gauge:
|
||||
fmt.Fprintf(w, "put %s.%s.value %d %d host=%s\n", c.Prefix, name, now, metric.Snapshot().Value(), shortHostname)
|
||||
case GaugeFloat64:
|
||||
fmt.Fprintf(w, "put %s.%s.value %d %f host=%s\n", c.Prefix, name, now, metric.Snapshot().Value(), shortHostname)
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ func (c *collector) Add(name string, i any) error {
|
|||
c.addCounter(name, m.Snapshot())
|
||||
case *metrics.CounterFloat64:
|
||||
c.addCounterFloat64(name, m.Snapshot())
|
||||
case metrics.Gauge:
|
||||
case *metrics.Gauge:
|
||||
c.addGauge(name, m.Snapshot())
|
||||
case metrics.GaugeFloat64:
|
||||
c.addGaugeFloat64(name, m.Snapshot())
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ func (r *StandardRegistry) GetAll() map[string]map[string]interface{} {
|
|||
values["count"] = metric.Snapshot().Count()
|
||||
case *CounterFloat64:
|
||||
values["count"] = metric.Snapshot().Count()
|
||||
case Gauge:
|
||||
case *Gauge:
|
||||
values["value"] = metric.Snapshot().Value()
|
||||
case GaugeFloat64:
|
||||
values["value"] = metric.Snapshot().Value()
|
||||
|
|
@ -214,7 +214,7 @@ func (r *StandardRegistry) Unregister(name string) {
|
|||
|
||||
func (r *StandardRegistry) loadOrRegister(name string, i interface{}) (interface{}, bool, bool) {
|
||||
switch i.(type) {
|
||||
case *Counter, *CounterFloat64, Gauge, GaugeFloat64, GaugeInfo, Healthcheck, Histogram, Meter, Timer, ResettingTimer:
|
||||
case *Counter, *CounterFloat64, *Gauge, GaugeFloat64, GaugeInfo, Healthcheck, Histogram, Meter, Timer, ResettingTimer:
|
||||
default:
|
||||
return nil, false, false
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ func Syslog(r Registry, d time.Duration, w *syslog.Writer) {
|
|||
w.Info(fmt.Sprintf("counter %s: count: %d", name, metric.Snapshot().Count()))
|
||||
case *CounterFloat64:
|
||||
w.Info(fmt.Sprintf("counter %s: count: %f", name, metric.Snapshot().Count()))
|
||||
case Gauge:
|
||||
case *Gauge:
|
||||
w.Info(fmt.Sprintf("gauge %s: value: %d", name, metric.Snapshot().Value()))
|
||||
case GaugeFloat64:
|
||||
w.Info(fmt.Sprintf("gauge %s: value: %f", name, metric.Snapshot().Value()))
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ func WriteOnce(r Registry, w io.Writer) {
|
|||
case *CounterFloat64:
|
||||
fmt.Fprintf(w, "counter %s\n", namedMetric.name)
|
||||
fmt.Fprintf(w, " count: %f\n", metric.Snapshot().Count())
|
||||
case Gauge:
|
||||
case *Gauge:
|
||||
fmt.Fprintf(w, "gauge %s\n", namedMetric.name)
|
||||
fmt.Fprintf(w, " value: %9d\n", metric.Snapshot().Value())
|
||||
case GaugeFloat64:
|
||||
|
|
|
|||
|
|
@ -37,9 +37,9 @@ const (
|
|||
)
|
||||
|
||||
var (
|
||||
activePeerGauge metrics.Gauge = metrics.NilGauge{}
|
||||
activeInboundPeerGauge metrics.Gauge = metrics.NilGauge{}
|
||||
activeOutboundPeerGauge metrics.Gauge = metrics.NilGauge{}
|
||||
activePeerGauge = metrics.NewGauge()
|
||||
activeInboundPeerGauge = metrics.NewGauge()
|
||||
activeOutboundPeerGauge = metrics.NewGauge()
|
||||
|
||||
ingressTrafficMeter = metrics.NewRegisteredMeter("p2p/ingress", nil)
|
||||
egressTrafficMeter = metrics.NewRegisteredMeter("p2p/egress", nil)
|
||||
|
|
|
|||
Loading…
Reference in a new issue