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  }