mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-15 10:52:43 +00:00
## Issue Addressed Closes #2528 ## Proposed Changes - Add `BlockTimesCache` to provide block timing information to `BeaconChain`. This allows additional metrics to be calculated for blocks that are set as head too late. - Thread the `seen_timestamp` of blocks received from RPC responses (except blocks from syncing) through to the sync manager, similar to what is done for blocks from gossip. ## Additional Info This provides the following additional metrics: - `BEACON_BLOCK_OBSERVED_SLOT_START_DELAY_TIME` - The delay between the start of the slot and when the block was first observed. - `BEACON_BLOCK_IMPORTED_OBSERVED_DELAY_TIME` - The delay between when the block was first observed and when the block was imported. - `BEACON_BLOCK_HEAD_IMPORTED_DELAY_TIME` - The delay between when the block was imported and when the block was set as head. The metric `BEACON_BLOCK_IMPORTED_SLOT_START_DELAY_TIME` was removed. A log is produced when a block is set as head too late, e.g.: ``` Aug 27 03:46:39.006 DEBG Delayed head block set_as_head_delay: Some(21.731066ms), imported_delay: Some(119.929934ms), observed_delay: Some(3.864596988s), block_delay: 4.006257988s, slot: 1931331, proposer_index: 24294, block_root: 0x937602c89d3143afa89088a44bdf4b4d0d760dad082abacb229495c048648a9e, service: beacon ```
140 lines
5.3 KiB
Rust
140 lines
5.3 KiB
Rust
pub use eth2::types::{EventKind, SseBlock, SseFinalizedCheckpoint, SseHead};
|
|
use slog::{trace, Logger};
|
|
use tokio::sync::broadcast;
|
|
use tokio::sync::broadcast::{error::SendError, Receiver, Sender};
|
|
use types::EthSpec;
|
|
|
|
const DEFAULT_CHANNEL_CAPACITY: usize = 16;
|
|
|
|
pub struct ServerSentEventHandler<T: EthSpec> {
|
|
attestation_tx: Sender<EventKind<T>>,
|
|
block_tx: Sender<EventKind<T>>,
|
|
finalized_tx: Sender<EventKind<T>>,
|
|
head_tx: Sender<EventKind<T>>,
|
|
exit_tx: Sender<EventKind<T>>,
|
|
chain_reorg_tx: Sender<EventKind<T>>,
|
|
contribution_tx: Sender<EventKind<T>>,
|
|
late_head: Sender<EventKind<T>>,
|
|
log: Logger,
|
|
}
|
|
|
|
impl<T: EthSpec> ServerSentEventHandler<T> {
|
|
pub fn new(log: Logger) -> Self {
|
|
Self::new_with_capacity(log, DEFAULT_CHANNEL_CAPACITY)
|
|
}
|
|
|
|
pub fn new_with_capacity(log: Logger, capacity: usize) -> Self {
|
|
let (attestation_tx, _) = broadcast::channel(capacity);
|
|
let (block_tx, _) = broadcast::channel(capacity);
|
|
let (finalized_tx, _) = broadcast::channel(capacity);
|
|
let (head_tx, _) = broadcast::channel(capacity);
|
|
let (exit_tx, _) = broadcast::channel(capacity);
|
|
let (chain_reorg_tx, _) = broadcast::channel(capacity);
|
|
let (contribution_tx, _) = broadcast::channel(capacity);
|
|
let (late_head, _) = broadcast::channel(capacity);
|
|
|
|
Self {
|
|
attestation_tx,
|
|
block_tx,
|
|
finalized_tx,
|
|
head_tx,
|
|
exit_tx,
|
|
chain_reorg_tx,
|
|
contribution_tx,
|
|
late_head,
|
|
log,
|
|
}
|
|
}
|
|
|
|
pub fn register(&self, kind: EventKind<T>) {
|
|
let result = match kind {
|
|
EventKind::Attestation(attestation) => self
|
|
.attestation_tx
|
|
.send(EventKind::Attestation(attestation))
|
|
.map(|count| trace!(self.log, "Registering server-sent attestation event"; "receiver_count" => count)),
|
|
EventKind::Block(block) => self.block_tx.send(EventKind::Block(block))
|
|
.map(|count| trace!(self.log, "Registering server-sent block event"; "receiver_count" => count)),
|
|
EventKind::FinalizedCheckpoint(checkpoint) => self.finalized_tx
|
|
.send(EventKind::FinalizedCheckpoint(checkpoint))
|
|
.map(|count| trace!(self.log, "Registering server-sent finalized checkpoint event"; "receiver_count" => count)),
|
|
EventKind::Head(head) => self.head_tx.send(EventKind::Head(head))
|
|
.map(|count| trace!(self.log, "Registering server-sent head event"; "receiver_count" => count)),
|
|
EventKind::VoluntaryExit(exit) => self.exit_tx.send(EventKind::VoluntaryExit(exit))
|
|
.map(|count| trace!(self.log, "Registering server-sent voluntary exit event"; "receiver_count" => count)),
|
|
EventKind::ChainReorg(reorg) => self.chain_reorg_tx.send(EventKind::ChainReorg(reorg))
|
|
.map(|count| trace!(self.log, "Registering server-sent chain reorg event"; "receiver_count" => count)),
|
|
EventKind::ContributionAndProof(contribution_and_proof) => self.contribution_tx.send(EventKind::ContributionAndProof(contribution_and_proof))
|
|
.map(|count| trace!(self.log, "Registering server-sent contribution and proof event"; "receiver_count" => count)),
|
|
EventKind::LateHead(late_head) => self.late_head.send(EventKind::LateHead(late_head))
|
|
.map(|count| trace!(self.log, "Registering server-sent late head event"; "receiver_count" => count)),
|
|
};
|
|
if let Err(SendError(event)) = result {
|
|
trace!(self.log, "No receivers registered to listen for event"; "event" => ?event);
|
|
}
|
|
}
|
|
|
|
pub fn subscribe_attestation(&self) -> Receiver<EventKind<T>> {
|
|
self.attestation_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_block(&self) -> Receiver<EventKind<T>> {
|
|
self.block_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_finalized(&self) -> Receiver<EventKind<T>> {
|
|
self.finalized_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_head(&self) -> Receiver<EventKind<T>> {
|
|
self.head_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_exit(&self) -> Receiver<EventKind<T>> {
|
|
self.exit_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_reorgs(&self) -> Receiver<EventKind<T>> {
|
|
self.chain_reorg_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_contributions(&self) -> Receiver<EventKind<T>> {
|
|
self.contribution_tx.subscribe()
|
|
}
|
|
|
|
pub fn subscribe_late_head(&self) -> Receiver<EventKind<T>> {
|
|
self.late_head.subscribe()
|
|
}
|
|
|
|
pub fn has_attestation_subscribers(&self) -> bool {
|
|
self.attestation_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_block_subscribers(&self) -> bool {
|
|
self.block_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_finalized_subscribers(&self) -> bool {
|
|
self.finalized_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_head_subscribers(&self) -> bool {
|
|
self.head_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_exit_subscribers(&self) -> bool {
|
|
self.exit_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_reorg_subscribers(&self) -> bool {
|
|
self.chain_reorg_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_contribution_subscribers(&self) -> bool {
|
|
self.contribution_tx.receiver_count() > 0
|
|
}
|
|
|
|
pub fn has_late_head_subscribers(&self) -> bool {
|
|
self.late_head.receiver_count() > 0
|
|
}
|
|
}
|