From 9656ffee7ca448f8ceb44a007bf2f906d3945bd4 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Tue, 13 Jul 2021 02:22:55 +0000 Subject: [PATCH] Metrics for sync aggregate fullness (#2439) ## Issue Addressed NA ## Proposed Changes Adds a metric to see how many set bits are in the sync aggregate for each beacon block being imported. ## Additional Info NA --- beacon_node/beacon_chain/src/beacon_chain.rs | 20 ++++++++++++++++---- beacon_node/beacon_chain/src/metrics.rs | 4 ++++ consensus/types/src/beacon_block_body.rs | 10 ++++++++++ consensus/types/src/sync_aggregate.rs | 5 +++++ 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index 8f1908e80f2..227813380d8 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -1976,10 +1976,22 @@ impl BeaconChain { drop(validator_monitor); - metrics::observe( - &metrics::OPERATIONS_PER_BLOCK_ATTESTATION, - block.body().attestations().len() as f64, - ); + // Only present some metrics for blocks from the previous epoch or later. + // + // This helps avoid noise in the metrics during sync. + if block.slot().epoch(T::EthSpec::slots_per_epoch()) + 1 >= self.epoch()? { + metrics::observe( + &metrics::OPERATIONS_PER_BLOCK_ATTESTATION, + block.body().attestations().len() as f64, + ); + + if let Some(sync_aggregate) = block.body().sync_aggregate() { + metrics::set_gauge( + &metrics::BLOCK_SYNC_AGGREGATE_SET_BITS, + sync_aggregate.num_set_bits() as i64, + ); + } + } let db_write_timer = metrics::start_timer(&metrics::BLOCK_PROCESSING_DB_WRITE); diff --git a/beacon_node/beacon_chain/src/metrics.rs b/beacon_node/beacon_chain/src/metrics.rs index fd79c0e6666..314d1c482f6 100644 --- a/beacon_node/beacon_chain/src/metrics.rs +++ b/beacon_node/beacon_chain/src/metrics.rs @@ -54,6 +54,10 @@ lazy_static! { "beacon_block_processing_attestation_observation_seconds", "Time spent hashing and remembering all the attestations in the block" ); + pub static ref BLOCK_SYNC_AGGREGATE_SET_BITS: Result = try_create_int_gauge( + "block_sync_aggregate_set_bits", + "The number of true bits in the last sync aggregate in a block" + ); /* * Block Production diff --git a/consensus/types/src/beacon_block_body.rs b/consensus/types/src/beacon_block_body.rs index 1924ca14f4d..ceb90fef906 100644 --- a/consensus/types/src/beacon_block_body.rs +++ b/consensus/types/src/beacon_block_body.rs @@ -45,6 +45,16 @@ pub struct BeaconBlockBody { pub sync_aggregate: SyncAggregate, } +impl<'a, T: EthSpec> BeaconBlockBodyRef<'a, T> { + /// Access the sync aggregate from the block's body, if one exists. + pub fn sync_aggregate(self) -> Option<&'a SyncAggregate> { + match self { + BeaconBlockBodyRef::Base(_) => None, + BeaconBlockBodyRef::Altair(inner) => Some(&inner.sync_aggregate), + } + } +} + #[cfg(test)] mod tests { mod base { diff --git a/consensus/types/src/sync_aggregate.rs b/consensus/types/src/sync_aggregate.rs index 85547e1b0ec..ea2298d23a8 100644 --- a/consensus/types/src/sync_aggregate.rs +++ b/consensus/types/src/sync_aggregate.rs @@ -33,4 +33,9 @@ impl SyncAggregate { sync_committee_signature: AggregateSignature::empty(), } } + + /// Returns how many bits are `true` in `self.sync_committee_bits`. + pub fn num_set_bits(&self) -> usize { + self.sync_committee_bits.num_set_bits() + } }