github.com/okex/exchain@v1.8.0/libs/tendermint/p2p/metrics.go (about) 1 package p2p 2 3 import ( 4 "github.com/go-kit/kit/metrics" 5 "github.com/go-kit/kit/metrics/discard" 6 "github.com/go-kit/kit/metrics/prometheus" 7 "github.com/okex/exchain/libs/tendermint/libs/fastmetrics" 8 stdprometheus "github.com/prometheus/client_golang/prometheus" 9 ) 10 11 const ( 12 // MetricsSubsystem is a subsystem shared by all metrics exposed by this 13 // package. 14 MetricsSubsystem = "p2p" 15 ) 16 17 // Metrics contains metrics exposed by this package. 18 type Metrics struct { 19 // Number of peers. 20 Peers metrics.Gauge 21 // Number of bytes received from a given peer. 22 PeerReceiveBytesTotal metrics.Counter 23 // Number of bytes sent to a given peer. 24 PeerSendBytesTotal metrics.Counter 25 // Pending bytes to be sent to a given peer. 26 PeerPendingSendBytes metrics.Gauge 27 // Number of transactions submitted by each peer. 28 NumTxs metrics.Gauge 29 } 30 31 type peerChMetric struct { 32 PeerReceiveBytesTotal map[byte]metrics.Counter 33 PeerSendBytesTotal map[byte]metrics.Counter 34 } 35 36 // PrometheusMetrics returns Metrics build using Prometheus client library. 37 // Optionally, labels can be provided along with their values ("foo", 38 // "fooValue"). 39 func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { 40 labels := []string{} 41 for i := 0; i < len(labelsAndValues); i += 2 { 42 labels = append(labels, labelsAndValues[i]) 43 } 44 return &Metrics{ 45 Peers: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 46 Namespace: namespace, 47 Subsystem: MetricsSubsystem, 48 Name: "peers", 49 Help: "Number of peers.", 50 }, labels).With(labelsAndValues...), 51 PeerReceiveBytesTotal: fastmetrics.NewCounterFrom(stdprometheus.CounterOpts{ 52 Namespace: namespace, 53 Subsystem: MetricsSubsystem, 54 Name: "peer_receive_bytes_total", 55 Help: "Number of bytes received from a given peer.", 56 }, append(labels, "peer_id", "chID")).With(labelsAndValues...), 57 PeerSendBytesTotal: fastmetrics.NewCounterFrom(stdprometheus.CounterOpts{ 58 Namespace: namespace, 59 Subsystem: MetricsSubsystem, 60 Name: "peer_send_bytes_total", 61 Help: "Number of bytes sent to a given peer.", 62 }, append(labels, "peer_id", "chID")).With(labelsAndValues...), 63 PeerPendingSendBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 64 Namespace: namespace, 65 Subsystem: MetricsSubsystem, 66 Name: "peer_pending_send_bytes", 67 Help: "Number of pending bytes to be sent to a given peer.", 68 }, append(labels, "peer_id")).With(labelsAndValues...), 69 NumTxs: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 70 Namespace: namespace, 71 Subsystem: MetricsSubsystem, 72 Name: "num_txs", 73 Help: "Number of transactions submitted by each peer.", 74 }, append(labels, "peer_id")).With(labelsAndValues...), 75 } 76 } 77 78 // NopMetrics returns no-op Metrics. 79 func NopMetrics() *Metrics { 80 return &Metrics{ 81 Peers: discard.NewGauge(), 82 PeerReceiveBytesTotal: discard.NewCounter(), 83 PeerSendBytesTotal: discard.NewCounter(), 84 PeerPendingSendBytes: discard.NewGauge(), 85 NumTxs: discard.NewGauge(), 86 } 87 }