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) {}