github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/tendermint/p2p/prometheus.go (about)

     1  package p2p
     2  
     3  import (
     4  	"github.com/go-kit/kit/metrics"
     5  	"github.com/prometheus/client_golang/prometheus"
     6  )
     7  
     8  type LabelValues []string
     9  
    10  // With validates the input, and returns a new aggregate labelValues.
    11  func (lvs LabelValues) With(labelValues ...string) LabelValues {
    12  	if len(labelValues)%2 != 0 {
    13  		labelValues = append(labelValues, "unknown")
    14  	}
    15  	return append(lvs, labelValues...)
    16  }
    17  
    18  // Counter implements Counter, via a Prometheus CounterVec.
    19  type Counter struct {
    20  	cv     *prometheus.CounterVec
    21  	lvs    LabelValues
    22  	labels prometheus.Labels
    23  	c      prometheus.Counter
    24  }
    25  
    26  // NewCounterFrom constructs and registers a Prometheus CounterVec,
    27  // and returns a usable Counter object.
    28  func NewCounterFrom(opts prometheus.CounterOpts, labelNames []string) *Counter {
    29  	cv := prometheus.NewCounterVec(opts, labelNames)
    30  	prometheus.MustRegister(cv)
    31  	return NewCounter(cv)
    32  }
    33  
    34  // NewCounter wraps the CounterVec and returns a usable Counter object.
    35  func NewCounter(cv *prometheus.CounterVec) *Counter {
    36  	counter := &Counter{
    37  		cv: cv,
    38  	}
    39  	counter.labels = makeLabels(counter.lvs...)
    40  	counter.c, _ = counter.cv.GetMetricWith(counter.labels)
    41  	return counter
    42  }
    43  
    44  // With implements Counter.
    45  func (c *Counter) With(labelValues ...string) metrics.Counter {
    46  	counter := &Counter{
    47  		cv:  c.cv,
    48  		lvs: c.lvs.With(labelValues...),
    49  	}
    50  	counter.labels = makeLabels(counter.lvs...)
    51  	counter.c, _ = counter.cv.GetMetricWith(counter.labels)
    52  	return counter
    53  }
    54  
    55  // Add implements Counter.
    56  func (c *Counter) Add(delta float64) {
    57  	if c.c != nil {
    58  		c.c.Add(delta)
    59  	} else {
    60  		c.cv.With(c.labels).Add(delta)
    61  	}
    62  }
    63  
    64  func makeLabels(labelValues ...string) prometheus.Labels {
    65  	labels := prometheus.Labels{}
    66  	for i := 0; i < len(labelValues); i += 2 {
    67  		labels[labelValues[i]] = labelValues[i+1]
    68  	}
    69  	return labels
    70  }