From 34c37eb6d13198b84cfa4c06b6c3e9d74df25adc Mon Sep 17 00:00:00 2001 From: Lukasz Klimek <842586+lklimek@users.noreply.github.com> Date: Wed, 4 Sep 2024 11:36:45 +0200 Subject: [PATCH] fix(metrics): no of validators that didn't sign is always 0 --- internal/consensus/state_apply_commit.go | 32 +++++++++++++++++++----- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/internal/consensus/state_apply_commit.go b/internal/consensus/state_apply_commit.go index 2d618e64e..b54544afa 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 power and count and then decrement as we find the validators + // who have not 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))