diff --git a/client/finality-grandpa/src/environment.rs b/client/finality-grandpa/src/environment.rs index d862372770518..9215dcb323516 100644 --- a/client/finality-grandpa/src/environment.rs +++ b/client/finality-grandpa/src/environment.rs @@ -39,7 +39,7 @@ use sp_runtime::generic::BlockId; use sp_runtime::traits::{ Block as BlockT, Header as HeaderT, NumberFor, One, Zero, }; -use sc_telemetry::{telemetry, CONSENSUS_INFO}; +use sc_telemetry::{telemetry, CONSENSUS_DEBUG, CONSENSUS_INFO}; use crate::{ CommandOrError, Commit, Config, Error, Precommit, Prevote, @@ -59,7 +59,7 @@ use sp_finality_grandpa::{ AuthorityId, AuthoritySignature, Equivocation, EquivocationProof, GrandpaApi, RoundNumber, SetId, }; -use prometheus_endpoint::{Gauge, U64, register, PrometheusError}; +use prometheus_endpoint::{register, Counter, Gauge, PrometheusError, U64}; type HistoricalVotes = finality_grandpa::HistoricalVotes< ::Hash, @@ -378,14 +378,32 @@ impl SharedVoterSetState { #[derive(Clone)] pub(crate) struct Metrics { finality_grandpa_round: Gauge, + finality_grandpa_prevotes: Counter, + finality_grandpa_precommits: Counter, } impl Metrics { - pub(crate) fn register(registry: &prometheus_endpoint::Registry) -> Result { + pub(crate) fn register( + registry: &prometheus_endpoint::Registry, + ) -> Result { Ok(Self { finality_grandpa_round: register( Gauge::new("finality_grandpa_round", "Highest completed GRANDPA round.")?, - registry + registry, + )?, + finality_grandpa_prevotes: register( + Counter::new( + "finality_grandpa_prevotes_total", + "Total number of GRANDPA prevotes cast locally.", + )?, + registry, + )?, + finality_grandpa_precommits: register( + Counter::new( + "finality_grandpa_precommits_total", + "Total number of GRANDPA precommits cast locally.", + )?, + registry, )?, }) } @@ -804,9 +822,22 @@ where None => return Ok(()), }; + let report_prevote_metrics = |prevote: &Prevote| { + telemetry!(CONSENSUS_DEBUG; "afg.prevote_issued"; + "round" => round, + "target_number" => ?prevote.target_number, + "target_hash" => ?prevote.target_hash, + ); + + if let Some(metrics) = self.metrics.as_ref() { + metrics.finality_grandpa_prevotes.inc(); + } + }; + self.update_voter_set_state(|voter_set_state| { let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; - let current_round = current_rounds.get(&round) + let current_round = current_rounds + .get(&round) .expect("checked in with_current_round that key exists; qed."); if !current_round.can_prevote() { @@ -816,6 +847,9 @@ where return Ok(None); } + // report to telemetry and prometheus + report_prevote_metrics(&prevote); + let propose = current_round.propose(); let mut current_rounds = current_rounds.clone(); @@ -837,7 +871,11 @@ where Ok(()) } - fn precommitted(&self, round: RoundNumber, precommit: Precommit) -> Result<(), Self::Error> { + fn precommitted( + &self, + round: RoundNumber, + precommit: Precommit, + ) -> Result<(), Self::Error> { let local_id = crate::is_voter(&self.voters, self.config.keystore.as_ref()); let local_id = match local_id { @@ -845,9 +883,22 @@ where None => return Ok(()), }; + let report_precommit_metrics = |precommit: &Precommit| { + telemetry!(CONSENSUS_DEBUG; "afg.precommit_issued"; + "round" => round, + "target_number" => ?precommit.target_number, + "target_hash" => ?precommit.target_hash, + ); + + if let Some(metrics) = self.metrics.as_ref() { + metrics.finality_grandpa_precommits.inc(); + } + }; + self.update_voter_set_state(|voter_set_state| { let (completed_rounds, current_rounds) = voter_set_state.with_current_round(round)?; - let current_round = current_rounds.get(&round) + let current_round = current_rounds + .get(&round) .expect("checked in with_current_round that key exists; qed."); if !current_round.can_precommit() { @@ -857,13 +908,16 @@ where return Ok(None); } + // report to telemetry and prometheus + report_precommit_metrics(&precommit); + let propose = current_round.propose(); let prevote = match current_round { HasVoted::Yes(_, Vote::Prevote(_, prevote)) => prevote, _ => { let msg = "Voter precommitting before prevoting."; return Err(Error::Safety(msg.to_string())); - }, + } }; let mut current_rounds = current_rounds.clone();