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  }