github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/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 stdprometheus "github.com/prometheus/client_golang/prometheus" 8 ) 9 10 const ( 11 // MetricsSubsystem is a subsystem shared by all metrics exposed by this 12 // package. 13 MetricsSubsystem = "p2p" 14 ) 15 16 // Metrics contains metrics exposed by this package. 17 type Metrics struct { 18 // Number of peers. 19 Peers metrics.Gauge 20 // Number of bytes received from a given peer. 21 PeerReceiveBytesTotal metrics.Counter 22 // Number of bytes sent to a given peer. 23 PeerSendBytesTotal metrics.Counter 24 // Pending bytes to be sent to a given peer. 25 PeerPendingSendBytes metrics.Gauge 26 // Number of transactions submitted by each peer. 27 NumTxs metrics.Gauge 28 // Number of abandoned peer messages 29 NumAbandonedPeerMsgs metrics.Counter 30 // Number of pooled peer messages 31 NumPooledPeerMsgs metrics.Gauge 32 } 33 34 // PrometheusMetrics returns Metrics build using Prometheus client library. 35 // Optionally, labels can be provided along with their values ("foo", 36 // "fooValue"). 37 func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { 38 labels := []string{} 39 for i := 0; i < len(labelsAndValues); i += 2 { 40 labels = append(labels, labelsAndValues[i]) 41 } 42 return &Metrics{ 43 Peers: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 44 Namespace: namespace, 45 Subsystem: MetricsSubsystem, 46 Name: "peers", 47 Help: "Number of peers.", 48 }, labels).With(labelsAndValues...), 49 PeerReceiveBytesTotal: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 50 Namespace: namespace, 51 Subsystem: MetricsSubsystem, 52 Name: "peer_receive_bytes_total", 53 Help: "Number of bytes received from a given peer.", 54 }, append(labels, "peer_id", "chID")).With(labelsAndValues...), 55 PeerSendBytesTotal: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 56 Namespace: namespace, 57 Subsystem: MetricsSubsystem, 58 Name: "peer_send_bytes_total", 59 Help: "Number of bytes sent to a given peer.", 60 }, append(labels, "peer_id", "chID")).With(labelsAndValues...), 61 PeerPendingSendBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 62 Namespace: namespace, 63 Subsystem: MetricsSubsystem, 64 Name: "peer_pending_send_bytes", 65 Help: "Number of pending bytes to be sent to a given peer.", 66 }, append(labels, "peer_id")).With(labelsAndValues...), 67 NumTxs: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 68 Namespace: namespace, 69 Subsystem: MetricsSubsystem, 70 Name: "num_txs", 71 Help: "Number of transactions submitted by each peer.", 72 }, append(labels, "peer_id")).With(labelsAndValues...), 73 NumAbandonedPeerMsgs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 74 Namespace: namespace, 75 Subsystem: MetricsSubsystem, 76 Name: "num_abandoned_peer_msgs", 77 Help: "Number of peer messages abandoned because of full channel", 78 }, append(labels, "peer_id", "chID")).With(labelsAndValues...), 79 NumPooledPeerMsgs: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 80 Namespace: namespace, 81 Subsystem: MetricsSubsystem, 82 Name: "num_pooled_peer_msgs", 83 Help: "Number of peer messages pooled currently", 84 }, append(labels, "peer_id", "chID")).With(labelsAndValues...), 85 } 86 } 87 88 // NopMetrics returns no-op Metrics. 89 func NopMetrics() *Metrics { 90 return &Metrics{ 91 Peers: discard.NewGauge(), 92 PeerReceiveBytesTotal: discard.NewCounter(), 93 PeerSendBytesTotal: discard.NewCounter(), 94 PeerPendingSendBytes: discard.NewGauge(), 95 NumTxs: discard.NewGauge(), 96 NumAbandonedPeerMsgs: discard.NewCounter(), 97 NumPooledPeerMsgs: discard.NewGauge(), 98 } 99 }