github.com/badrootd/celestia-core@v0.0.0-20240305091328-aa4207a4b25d/mempool/metrics.go (about) 1 package mempool 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 = "mempool" 14 15 TypeLabel = "type" 16 17 FailedPrecheck = "precheck" 18 FailedAdding = "adding" 19 FailedRecheck = "recheck" 20 21 EvictedNewTxFullMempool = "full-removed-incoming" 22 EvictedExistingTxFullMempool = "full-removed-existing" 23 EvictedTxExpiredBlocks = "expired-ttl-blocks" 24 EvictedTxExpiredTime = "expired-ttl-time" 25 ) 26 27 // Metrics contains metrics exposed by this package. 28 // see MetricsProvider for descriptions. 29 type Metrics struct { 30 // Size of the mempool. 31 Size metrics.Gauge 32 33 // Total size of the mempool in bytes. 34 SizeBytes metrics.Gauge 35 36 // Histogram of transaction sizes, in bytes. 37 TxSizeBytes metrics.Histogram 38 39 // FailedTxs defines the number of failed transactions. These were marked 40 // invalid by the application in either CheckTx or RecheckTx. 41 FailedTxs metrics.Counter 42 43 // EvictedTxs defines the number of evicted transactions. These are valid 44 // transactions that passed CheckTx and existed in the mempool but were later 45 // evicted to make room for higher priority valid transactions that passed 46 // CheckTx. 47 EvictedTxs metrics.Counter 48 49 // SuccessfulTxs defines the number of transactions that successfully made 50 // it into a block. 51 SuccessfulTxs metrics.Counter 52 53 // Number of times transactions are rechecked in the mempool. 54 RecheckTimes metrics.Counter 55 56 // AlreadySeenTxs defines the number of transactions that entered the 57 // mempool which were already present in the mempool. This is a good 58 // indicator of the degree of duplication in message gossiping. 59 AlreadySeenTxs metrics.Counter 60 61 // RequestedTxs defines the number of times that the node requested a 62 // tx to a peer 63 RequestedTxs metrics.Counter 64 65 // RerequestedTxs defines the number of times that a requested tx 66 // never received a response in time and a new request was made. 67 RerequestedTxs metrics.Counter 68 } 69 70 // PrometheusMetrics returns Metrics build using Prometheus client library. 71 // Optionally, labels can be provided along with their values ("foo", 72 // "fooValue"). 73 func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { 74 labels := []string{} 75 for i := 0; i < len(labelsAndValues); i += 2 { 76 labels = append(labels, labelsAndValues[i]) 77 } 78 typedCounterLabels := append(append(make([]string, 0, len(labels)+1), labels...), TypeLabel) 79 return &Metrics{ 80 Size: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 81 Namespace: namespace, 82 Subsystem: MetricsSubsystem, 83 Name: "size", 84 Help: "Size of the mempool (number of uncommitted transactions).", 85 }, labels).With(labelsAndValues...), 86 87 SizeBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 88 Namespace: namespace, 89 Subsystem: MetricsSubsystem, 90 Name: "size_bytes", 91 Help: "Total size of the mempool in bytes.", 92 }, labels).With(labelsAndValues...), 93 94 TxSizeBytes: prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{ 95 Namespace: namespace, 96 Subsystem: MetricsSubsystem, 97 Name: "tx_size_bytes", 98 Help: "Transaction sizes in bytes.", 99 Buckets: stdprometheus.ExponentialBuckets(1, 3, 17), 100 }, labels).With(labelsAndValues...), 101 102 FailedTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 103 Namespace: namespace, 104 Subsystem: MetricsSubsystem, 105 Name: "failed_txs", 106 Help: "Number of failed transactions.", 107 }, typedCounterLabels).With(labelsAndValues...), 108 109 EvictedTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 110 Namespace: namespace, 111 Subsystem: MetricsSubsystem, 112 Name: "evicted_txs", 113 Help: "Number of evicted transactions.", 114 }, typedCounterLabels).With(labelsAndValues...), 115 116 SuccessfulTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 117 Namespace: namespace, 118 Subsystem: MetricsSubsystem, 119 Name: "successful_txs", 120 Help: "Number of transactions that successfully made it into a block.", 121 }, labels).With(labelsAndValues...), 122 123 RecheckTimes: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 124 Namespace: namespace, 125 Subsystem: MetricsSubsystem, 126 Name: "recheck_times", 127 Help: "Number of times transactions are rechecked in the mempool.", 128 }, labels).With(labelsAndValues...), 129 130 AlreadySeenTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 131 Namespace: namespace, 132 Subsystem: MetricsSubsystem, 133 Name: "already_seen_txs", 134 Help: "Number of transactions that entered the mempool but were already present in the mempool.", 135 }, labels).With(labelsAndValues...), 136 137 RequestedTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 138 Namespace: namespace, 139 Subsystem: MetricsSubsystem, 140 Name: "requested_txs", 141 Help: "Number of initial requests for a transaction", 142 }, labels).With(labelsAndValues...), 143 144 RerequestedTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 145 Namespace: namespace, 146 Subsystem: MetricsSubsystem, 147 Name: "rerequested_txs", 148 Help: "Number of times a transaction was requested again after a previous request timed out", 149 }, labels).With(labelsAndValues...), 150 } 151 } 152 153 // NopMetrics returns no-op Metrics. 154 func NopMetrics() *Metrics { 155 return &Metrics{ 156 Size: discard.NewGauge(), 157 SizeBytes: discard.NewGauge(), 158 TxSizeBytes: discard.NewHistogram(), 159 FailedTxs: discard.NewCounter(), 160 EvictedTxs: discard.NewCounter(), 161 SuccessfulTxs: discard.NewCounter(), 162 RecheckTimes: discard.NewCounter(), 163 AlreadySeenTxs: discard.NewCounter(), 164 RequestedTxs: discard.NewCounter(), 165 RerequestedTxs: discard.NewCounter(), 166 } 167 }