diff --git a/consensus/metrics.go b/consensus/metrics.go index 2c74ceb7e..064e5be5c 100644 --- a/consensus/metrics.go +++ b/consensus/metrics.go @@ -4,22 +4,22 @@ import "github.com/go-kit/kit/metrics" import "github.com/go-kit/kit/metrics/discard" // Metrics contains metrics exposed by this package. +// see MetricsProvider for descriptions. type Metrics struct { - // height of the chain Height metrics.Counter - // number of validators who signed - Validators metrics.Gauge - // number of validators who did not sign - MissingValidators metrics.Gauge - // number of validators who tried to double sign - ByzantineValidators metrics.Gauge - // time between this and the last block + + Validators metrics.Gauge + ValidatorsPower metrics.Gauge + MissingValidators metrics.Gauge + MissingValidatorsPower metrics.Gauge + ByzantineValidators metrics.Gauge + ByzantineValidatorsPower metrics.Gauge + BlockIntervalSeconds metrics.Histogram - // number of transactions - NumTxs metrics.Gauge - // total number of transactions + + NumTxs metrics.Gauge TotalTxs metrics.Counter - // size of the block + BlockSizeBytes metrics.Gauge } diff --git a/consensus/state.go b/consensus/state.go index 2fb1fb694..61e01a9be 100644 --- a/consensus/state.go +++ b/consensus/state.go @@ -1300,18 +1300,29 @@ func (cs *ConsensusState) finalizeCommit(height int64) { func (cs *ConsensusState) recordMetrics(height int64, block *types.Block) { cs.metrics.Validators.Set(float64(cs.Validators.Size())) + cs.metrics.ValidatorsPower.Set(float64(cs.Validators.TotalVotingPower())) missingValidators := 0 - for i := range cs.Validators.Validators { + missingValidatorsPower := int64(0) + for i, val := range cs.Validators.Validators { var vote *types.Vote if i < len(block.LastCommit.Precommits) { vote = block.LastCommit.Precommits[i] } if vote == nil { missingValidators++ + missingValidatorsPower += val.VotingPower } } cs.metrics.MissingValidators.Set(float64(missingValidators)) + cs.metrics.MissingValidatorsPower.Set(float64(missingValidatorsPower)) cs.metrics.ByzantineValidators.Set(float64(len(block.Evidence.Evidence))) + byzantineValidatorsPower := int64(0) + for _, ev := range block.Evidence.Evidence { + if _, val := cs.Validators.GetByAddress(ev.Address()); val != nil { + byzantineValidatorsPower += val.VotingPower + } + } + cs.metrics.ByzantineValidatorsPower.Set(float64(byzantineValidatorsPower)) if height > 1 { lastBlockMeta := cs.blockStore.LoadBlockMeta(height - 1) diff --git a/node/node.go b/node/node.go index 681dc04b3..79862088a 100644 --- a/node/node.go +++ b/node/node.go @@ -106,30 +106,45 @@ func DefaultMetricsProvider() *cs.Metrics { Validators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Subsystem: "consensus", Name: "validators", - Help: "Number of validators who signed, partitioned by height.", + Help: "Number of validators who signed.", + }, []string{}), + ValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Subsystem: "consensus", + Name: "validators_power", + Help: "Total power of all validators.", }, []string{}), MissingValidators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Subsystem: "consensus", Name: "missing_validators", - Help: "Number of validators who did not sign, partitioned by height.", + Help: "Number of validators who did not sign.", + }, []string{}), + MissingValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Subsystem: "consensus", + Name: "missing_validators_power", + Help: "Total power of the missing validators.", }, []string{}), ByzantineValidators: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Subsystem: "consensus", Name: "byzantine_validators", - Help: "Number of validators who tried to double sign, partitioned by height.", + Help: "Number of validators who tried to double sign.", + }, []string{}), + ByzantineValidatorsPower: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ + Subsystem: "consensus", + Name: "byzantine_validators_power", + Help: "Total power of the byzantine validators.", }, []string{}), BlockIntervalSeconds: prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{ Subsystem: "consensus", Name: "block_interval_seconds", - Help: "Time between this and the last block, partitioned by height.", + Help: "Time between this and the last block.", Buckets: []float64{1, 2.5, 5, 10, 60}, }, []string{}), NumTxs: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Subsystem: "consensus", Name: "num_txs", - Help: "Number of transactions, partitioned by height.", + Help: "Number of transactions.", }, []string{}), TotalTxs: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ Subsystem: "consensus", @@ -140,7 +155,7 @@ func DefaultMetricsProvider() *cs.Metrics { BlockSizeBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ Subsystem: "consensus", Name: "block_size_bytes", - Help: "Size of the block, partitioned by height.", + Help: "Size of the block.", }, []string{}), } }