github.com/MetalBlockchain/metalgo@v1.11.9/utils/metric/averager.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package metric 5 6 import ( 7 "errors" 8 "fmt" 9 10 "github.com/prometheus/client_golang/prometheus" 11 12 "github.com/MetalBlockchain/metalgo/utils/wrappers" 13 ) 14 15 var ErrFailedRegistering = errors.New("failed registering metric") 16 17 type Averager interface { 18 Observe(float64) 19 } 20 21 type averager struct { 22 count prometheus.Counter 23 sum prometheus.Gauge 24 } 25 26 func NewAverager(name, desc string, reg prometheus.Registerer) (Averager, error) { 27 errs := wrappers.Errs{} 28 a := NewAveragerWithErrs(name, desc, reg, &errs) 29 return a, errs.Err 30 } 31 32 func NewAveragerWithErrs(name, desc string, reg prometheus.Registerer, errs *wrappers.Errs) Averager { 33 a := averager{ 34 count: prometheus.NewCounter(prometheus.CounterOpts{ 35 Name: AppendNamespace(name, "count"), 36 Help: "Total # of observations of " + desc, 37 }), 38 sum: prometheus.NewGauge(prometheus.GaugeOpts{ 39 Name: AppendNamespace(name, "sum"), 40 Help: "Sum of " + desc, 41 }), 42 } 43 44 if err := reg.Register(a.count); err != nil { 45 errs.Add(fmt.Errorf("%w: %w", ErrFailedRegistering, err)) 46 } 47 if err := reg.Register(a.sum); err != nil { 48 errs.Add(fmt.Errorf("%w: %w", ErrFailedRegistering, err)) 49 } 50 return &a 51 } 52 53 func (a *averager) Observe(v float64) { 54 a.count.Inc() 55 a.sum.Add(v) 56 } 57 58 type noAverager struct{} 59 60 func NewNoAverager() Averager { 61 return noAverager{} 62 } 63 64 func (noAverager) Observe(float64) {}