diff --git a/internal/consensus/state_apply_commit.go b/internal/consensus/state_apply_commit.go index 1ce9d8d3f..264556685 100644 --- a/internal/consensus/state_apply_commit.go +++ b/internal/consensus/state_apply_commit.go @@ -108,13 +108,33 @@ func (c *ApplyCommitAction) Execute(ctx context.Context, stateEvent StateEvent) } func (c *ApplyCommitAction) RecordMetrics(stateData *StateData, height int64, block *types.Block, lastBlockMeta *types.BlockMeta) { - c.metrics.Validators.Set(float64(stateData.Validators.Size())) - c.metrics.ValidatorsPower.Set(float64(stateData.Validators.TotalVotingPower())) + totalValidators := stateData.Validators.Size() + totalValidatorsPower := stateData.Validators.TotalVotingPower() + + c.metrics.Validators.Set(float64(totalValidators)) + c.metrics.ValidatorsPower.Set(float64(totalValidatorsPower)) + + // Calculate validators that didn't sign + + // We initialize with total validators count and power, and then decrement as we find the validators + // who have signed the precommit + missingValidators := totalValidators + missingValidatorsPower := totalValidatorsPower + precommits := stateData.Votes.Precommits(stateData.CommitRound) + + for _, vote := range precommits.List() { + if val := stateData.Validators.GetByIndex(vote.ValidatorIndex); val != nil { + missingValidators-- + missingValidatorsPower -= val.VotingPower + } else { + c.logger.Error("precommit received from invalid validator", + "val", val, + "vote", vote, + "height", vote.Height, + "round", vote.Round) + } + } - var ( - missingValidators int - missingValidatorsPower int64 - ) c.metrics.MissingValidators.Set(float64(missingValidators)) c.metrics.MissingValidatorsPower.Set(float64(missingValidatorsPower))