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  }