reth_blockchain_tree/
metrics.rs1use metrics::Histogram;
2use reth_metrics::{
3 metrics::{Counter, Gauge},
4 Metrics,
5};
6use std::time::{Duration, Instant};
7
8#[derive(Metrics)]
10#[metrics(scope = "blockchain_tree.block_buffer")]
11pub struct BlockBufferMetrics {
12 pub blocks: Gauge,
14}
15
16#[derive(Debug)]
17pub(crate) struct MakeCanonicalDurationsRecorder {
18 start: Instant,
19 pub(crate) actions: Vec<(MakeCanonicalAction, Duration)>,
20 latest: Option<Duration>,
21 current_metrics: MakeCanonicalMetrics,
22}
23
24impl Default for MakeCanonicalDurationsRecorder {
25 fn default() -> Self {
26 Self {
27 start: Instant::now(),
28 actions: Vec::new(),
29 latest: None,
30 current_metrics: MakeCanonicalMetrics::default(),
31 }
32 }
33}
34
35impl MakeCanonicalDurationsRecorder {
36 pub(crate) fn record_relative(&mut self, action: MakeCanonicalAction) {
39 let elapsed = self.start.elapsed();
40 let duration = elapsed - self.latest.unwrap_or_default();
41
42 self.actions.push((action, duration));
43 self.current_metrics.record(action, duration);
44 self.latest = Some(elapsed);
45 }
46}
47
48#[derive(Metrics)]
50#[metrics(scope = "blockchain_tree")]
51pub struct TreeMetrics {
52 pub sidechains: Gauge,
54 pub canonical_chain_height: Gauge,
56 pub reorgs: Counter,
58 pub latest_reorg_depth: Gauge,
60 pub longest_sidechain_height: Gauge,
62 pub trie_updates_insert_cached: Counter,
64 pub trie_updates_insert_recomputed: Counter,
66}
67
68#[derive(Debug, Copy, Clone)]
70pub(crate) enum MakeCanonicalAction {
71 CloneOldBlocks,
73 FindCanonicalHeader,
75 SplitChain,
77 SplitChainForks,
79 MergeAllChains,
81 UpdateCanonicalIndex,
83 RetrieveStateTrieUpdates,
85 CommitCanonicalChainToDatabase,
87 RevertCanonicalChainFromDatabase,
89 InsertOldCanonicalChain,
91 ClearTrieUpdatesForOtherChildren,
93}
94
95#[derive(Metrics)]
97#[metrics(scope = "blockchain_tree.make_canonical")]
98struct MakeCanonicalMetrics {
99 clone_old_blocks: Histogram,
101 find_canonical_header: Histogram,
103 split_chain: Histogram,
105 split_chain_forks: Histogram,
107 merge_all_chains: Histogram,
109 update_canonical_index: Histogram,
111 retrieve_state_trie_updates: Histogram,
113 commit_canonical_chain_to_database: Histogram,
115 revert_canonical_chain_from_database: Histogram,
117 insert_old_canonical_chain: Histogram,
119 clear_trie_updates_for_other_children: Histogram,
122}
123
124impl MakeCanonicalMetrics {
125 pub(crate) fn record(&self, action: MakeCanonicalAction, duration: Duration) {
127 match action {
128 MakeCanonicalAction::CloneOldBlocks => self.clone_old_blocks.record(duration),
129 MakeCanonicalAction::FindCanonicalHeader => self.find_canonical_header.record(duration),
130 MakeCanonicalAction::SplitChain => self.split_chain.record(duration),
131 MakeCanonicalAction::SplitChainForks => self.split_chain_forks.record(duration),
132 MakeCanonicalAction::MergeAllChains => self.merge_all_chains.record(duration),
133 MakeCanonicalAction::UpdateCanonicalIndex => {
134 self.update_canonical_index.record(duration)
135 }
136 MakeCanonicalAction::RetrieveStateTrieUpdates => {
137 self.retrieve_state_trie_updates.record(duration)
138 }
139 MakeCanonicalAction::CommitCanonicalChainToDatabase => {
140 self.commit_canonical_chain_to_database.record(duration)
141 }
142 MakeCanonicalAction::RevertCanonicalChainFromDatabase => {
143 self.revert_canonical_chain_from_database.record(duration)
144 }
145 MakeCanonicalAction::InsertOldCanonicalChain => {
146 self.insert_old_canonical_chain.record(duration)
147 }
148 MakeCanonicalAction::ClearTrieUpdatesForOtherChildren => {
149 self.clear_trie_updates_for_other_children.record(duration)
150 }
151 }
152 }
153}