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 }