github.com/DFWallet/tendermint-cosmos@v0.0.2/consensus/metrics.go (about)

     1  package consensus
     2  
     3  import (
     4  	"github.com/go-kit/kit/metrics"
     5  	"github.com/go-kit/kit/metrics/discard"
     6  
     7  	prometheus "github.com/go-kit/kit/metrics/prometheus"
     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 = "consensus"
    15  )
    16  
    17  // Metrics contains metrics exposed by this package.
    18  type Metrics struct {
    19  	// Height of the chain.
    20  	Height metrics.Gauge
    21  
    22  	// ValidatorLastSignedHeight of a validator.
    23  	ValidatorLastSignedHeight metrics.Gauge
    24  
    25  	// Number of rounds.
    26  	Rounds metrics.Gauge
    27  
    28  	// Number of validators.
    29  	Validators metrics.Gauge
    30  	// Total power of all validators.
    31  	ValidatorsPower metrics.Gauge
    32  	// Power of a validator.
    33  	ValidatorPower metrics.Gauge
    34  	// Amount of blocks missed by a validator.
    35  	ValidatorMissedBlocks metrics.Gauge
    36  	// Number of validators who did not sign.
    37  	MissingValidators metrics.Gauge
    38  	// Total power of the missing validators.
    39  	MissingValidatorsPower metrics.Gauge
    40  	// Number of validators who tried to double sign.
    41  	ByzantineValidators metrics.Gauge
    42  	// Total power of the byzantine validators.
    43  	ByzantineValidatorsPower metrics.Gauge
    44  
    45  	// Time between this and the last block.
    46  	BlockIntervalSeconds metrics.Histogram
    47  
    48  	// Number of transactions.
    49  	NumTxs metrics.Gauge
    50  	// Size of the block.
    51  	BlockSizeBytes metrics.Gauge
    52  	// Total number of transactions.
    53  	TotalTxs metrics.Gauge
    54  	// The latest block height.
    55  	CommittedHeight metrics.Gauge
    56  	// Whether or not a node is fast syncing. 1 if yes, 0 if no.
    57  	FastSyncing metrics.Gauge
    58  	// Whether or not a node is state syncing. 1 if yes, 0 if no.
    59  	StateSyncing metrics.Gauge
    60  
    61  	// Number of blockparts transmitted by peer.
    62  	BlockParts metrics.Counter
    63  }
    64  
    65  // PrometheusMetrics returns Metrics build using Prometheus client library.
    66  // Optionally, labels can be provided along with their values ("foo",
    67  // "fooValue").
    68  func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
    69  	labels := []string{}
    70  	for i := 0; i < len(labelsAndValues); i += 2 {
    71  		labels = append(labels, labelsAndValues[i])
    72  	}
    73  	return &Metrics{
    74  		Height: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    75  			Namespace: namespace,
    76  			Subsystem: MetricsSubsystem,
    77  			Name:      "height",
    78  			Help:      "Height of the chain.",
    79  		}, labels).With(labelsAndValues...),
    80  		Rounds: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    81  			Namespace: namespace,
    82  			Subsystem: MetricsSubsystem,
    83  			Name:      "rounds",
    84  			Help:      "Number of rounds.",
    85  		}, labels).With(labelsAndValues...),
    86  
    87  		Validators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    88  			Namespace: namespace,
    89  			Subsystem: MetricsSubsystem,
    90  			Name:      "validators",
    91  			Help:      "Number of validators.",
    92  		}, labels).With(labelsAndValues...),
    93  		ValidatorLastSignedHeight: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    94  			Namespace: namespace,
    95  			Subsystem: MetricsSubsystem,
    96  			Name:      "validator_last_signed_height",
    97  			Help:      "Last signed height for a validator",
    98  		}, append(labels, "validator_address")).With(labelsAndValues...),
    99  		ValidatorMissedBlocks: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   100  			Namespace: namespace,
   101  			Subsystem: MetricsSubsystem,
   102  			Name:      "validator_missed_blocks",
   103  			Help:      "Total missed blocks for a validator",
   104  		}, append(labels, "validator_address")).With(labelsAndValues...),
   105  		ValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   106  			Namespace: namespace,
   107  			Subsystem: MetricsSubsystem,
   108  			Name:      "validators_power",
   109  			Help:      "Total power of all validators.",
   110  		}, labels).With(labelsAndValues...),
   111  		ValidatorPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   112  			Namespace: namespace,
   113  			Subsystem: MetricsSubsystem,
   114  			Name:      "validator_power",
   115  			Help:      "Power of a validator",
   116  		}, append(labels, "validator_address")).With(labelsAndValues...),
   117  		MissingValidators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   118  			Namespace: namespace,
   119  			Subsystem: MetricsSubsystem,
   120  			Name:      "missing_validators",
   121  			Help:      "Number of validators who did not sign.",
   122  		}, labels).With(labelsAndValues...),
   123  		MissingValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   124  			Namespace: namespace,
   125  			Subsystem: MetricsSubsystem,
   126  			Name:      "missing_validators_power",
   127  			Help:      "Total power of the missing validators.",
   128  		}, labels).With(labelsAndValues...),
   129  		ByzantineValidators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   130  			Namespace: namespace,
   131  			Subsystem: MetricsSubsystem,
   132  			Name:      "byzantine_validators",
   133  			Help:      "Number of validators who tried to double sign.",
   134  		}, labels).With(labelsAndValues...),
   135  		ByzantineValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   136  			Namespace: namespace,
   137  			Subsystem: MetricsSubsystem,
   138  			Name:      "byzantine_validators_power",
   139  			Help:      "Total power of the byzantine validators.",
   140  		}, labels).With(labelsAndValues...),
   141  		BlockIntervalSeconds: prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{
   142  			Namespace: namespace,
   143  			Subsystem: MetricsSubsystem,
   144  			Name:      "block_interval_seconds",
   145  			Help:      "Time between this and the last block.",
   146  		}, labels).With(labelsAndValues...),
   147  		NumTxs: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   148  			Namespace: namespace,
   149  			Subsystem: MetricsSubsystem,
   150  			Name:      "num_txs",
   151  			Help:      "Number of transactions.",
   152  		}, labels).With(labelsAndValues...),
   153  		BlockSizeBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   154  			Namespace: namespace,
   155  			Subsystem: MetricsSubsystem,
   156  			Name:      "block_size_bytes",
   157  			Help:      "Size of the block.",
   158  		}, labels).With(labelsAndValues...),
   159  		TotalTxs: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   160  			Namespace: namespace,
   161  			Subsystem: MetricsSubsystem,
   162  			Name:      "total_txs",
   163  			Help:      "Total number of transactions.",
   164  		}, labels).With(labelsAndValues...),
   165  		CommittedHeight: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   166  			Namespace: namespace,
   167  			Subsystem: MetricsSubsystem,
   168  			Name:      "latest_block_height",
   169  			Help:      "The latest block height.",
   170  		}, labels).With(labelsAndValues...),
   171  		FastSyncing: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   172  			Namespace: namespace,
   173  			Subsystem: MetricsSubsystem,
   174  			Name:      "fast_syncing",
   175  			Help:      "Whether or not a node is fast syncing. 1 if yes, 0 if no.",
   176  		}, labels).With(labelsAndValues...),
   177  		StateSyncing: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
   178  			Namespace: namespace,
   179  			Subsystem: MetricsSubsystem,
   180  			Name:      "state_syncing",
   181  			Help:      "Whether or not a node is state syncing. 1 if yes, 0 if no.",
   182  		}, labels).With(labelsAndValues...),
   183  		BlockParts: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
   184  			Namespace: namespace,
   185  			Subsystem: MetricsSubsystem,
   186  			Name:      "block_parts",
   187  			Help:      "Number of blockparts transmitted by peer.",
   188  		}, append(labels, "peer_id")).With(labelsAndValues...),
   189  	}
   190  }
   191  
   192  // NopMetrics returns no-op Metrics.
   193  func NopMetrics() *Metrics {
   194  	return &Metrics{
   195  		Height: discard.NewGauge(),
   196  
   197  		ValidatorLastSignedHeight: discard.NewGauge(),
   198  
   199  		Rounds: discard.NewGauge(),
   200  
   201  		Validators:               discard.NewGauge(),
   202  		ValidatorsPower:          discard.NewGauge(),
   203  		ValidatorPower:           discard.NewGauge(),
   204  		ValidatorMissedBlocks:    discard.NewGauge(),
   205  		MissingValidators:        discard.NewGauge(),
   206  		MissingValidatorsPower:   discard.NewGauge(),
   207  		ByzantineValidators:      discard.NewGauge(),
   208  		ByzantineValidatorsPower: discard.NewGauge(),
   209  
   210  		BlockIntervalSeconds: discard.NewHistogram(),
   211  
   212  		NumTxs:          discard.NewGauge(),
   213  		BlockSizeBytes:  discard.NewGauge(),
   214  		TotalTxs:        discard.NewGauge(),
   215  		CommittedHeight: discard.NewGauge(),
   216  		FastSyncing:     discard.NewGauge(),
   217  		StateSyncing:    discard.NewGauge(),
   218  		BlockParts:      discard.NewCounter(),
   219  	}
   220  }