Skip to content

Commit 2703064

Browse files
authored
feat: add metrics to node and block-processor (#41)
* feat: add metrics to node and block-processor * chore: document better * chore: bump version
1 parent c213994 commit 2703064

File tree

9 files changed

+322
-18
lines changed

9 files changed

+322
-18
lines changed

Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ members = ["crates/*"]
33
resolver = "2"
44

55
[workspace.package]
6-
version = "0.11.2"
6+
version = "0.11.4"
77
edition = "2024"
88
rust-version = "1.88"
99
authors = ["init4"]
@@ -105,10 +105,12 @@ parking_lot = "0.12"
105105
chrono = "0.4.38"
106106
clap = "4"
107107
eyre = "0.6.12"
108+
futures-util = "0.3.31"
108109
hex = { package = "const-hex", version = "1.10", default-features = false, features = [
109110
"alloc",
110111
] }
111112
itertools = "0.14.0"
113+
metrics = "0.24.2"
112114
openssl = { version = "0.10", features = ["vendored"] }
113115
proptest = "1.6.0"
114116
reqwest = "0.12.9"

crates/block-processor/Cargo.toml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,27 @@ homepage.workspace = true
1010
repository.workspace = true
1111

1212
[dependencies]
13+
signet-constants.workspace = true
1314
signet-evm.workspace = true
1415
signet-extract.workspace = true
1516
signet-journal.workspace = true
17+
signet-types.workspace = true
1618

1719
init4-bin-base.workspace = true
1820

21+
trevm.workspace = true
22+
1923
signet-blobber.workspace = true
2024
signet-db.workspace = true
2125
signet-node-types.workspace = true
2226

27+
alloy.workspace = true
28+
2329
reth.workspace = true
2430
reth-exex.workspace = true
2531
reth-node-api.workspace = true
32+
reth-chainspec.workspace = true
2633

27-
tracing.workspace = true
2834
eyre.workspace = true
29-
alloy.workspace = true
30-
signet-constants.workspace = true
31-
trevm.workspace = true
32-
reth-chainspec.workspace = true
35+
metrics.workspace = true
36+
tracing.workspace = true

crates/block-processor/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#![deny(unused_must_use, rust_2018_idioms)]
1212
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
1313

14+
pub(crate) mod metrics;
15+
1416
mod v1;
1517
pub use v1::SignetBlockProcessor as SignetBlockProcessorV1;
1618

Lines changed: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
1+
//! Metrics to track
2+
//!
3+
//! - Counters:
4+
//! - Number of builder blocks extracted
5+
//! - Number of builder blocks processed
6+
//! - Number of transactions processed
7+
//! - Host blocks without builder blocks
8+
//! - Histograms:
9+
//! - enter events extracted per block
10+
//! - enter token events extracted per block
11+
//! - transact events extracted per block
12+
//! - enter events processed per block
13+
//! - enter token events processed per block
14+
//! - transact events processed
15+
//! - Transaction counts per builder block
16+
17+
use metrics::{Counter, Histogram, counter, describe_counter, describe_histogram, histogram};
18+
use signet_evm::BlockResult;
19+
use signet_extract::{Extractable, Extracts, HasTxns};
20+
use signet_types::{MagicSig, MagicSigInfo};
21+
use std::sync::LazyLock;
22+
23+
const BUILDER_BLOCKS_EXTRACTED: &str = "signet.block_processor.builder_blocks.extracted";
24+
const BUILDER_BLOCKS_EXTRACTED_HELP: &str = "Number of builder blocks extracted from host";
25+
26+
const BLOCKS_PROCESSED: &str = "signet.block_processor.processed";
27+
const BLOCKS_PROCESSED_HELP: &str = "Number of signet blocks processed";
28+
29+
const TRANSACTIONS_PROCESSED: &str = "signet.block_processor.transactions_processed";
30+
const TRANSACTIONS_PROCESSED_HELP: &str = "Number of transactions processed in signet blocks";
31+
32+
const HOST_WITHOUT_BUILDER_BLOCK: &str = "signet.block_processor.host_without_builder_block";
33+
const HOST_WITHOUT_BUILDER_BLOCK_HELP: &str = "Number of host blocks without builder blocks";
34+
35+
const TRANSACTIONS_PER_BUILDER_BLOCK: &str = "signet.block_processor.txns_per_builder_block";
36+
const TRANSACTIONS_PER_BUILDER_BLOCK_HELP: &str =
37+
"Histogram of number of transactions per builder block";
38+
39+
const TRANSACT_EXTRACTS: &str = "signet.block_processor.transact_events.extracted";
40+
const TRANSACT_EXTRACTS_HELP: &str = "Transact events extracted from host per block";
41+
42+
const ENTER_EXTRACTS: &str = "signet.block_processor.enter_events.extracted";
43+
const ENTER_EXTRACTS_HELP: &str = "Enter events extracted from host per block";
44+
45+
const ENTER_TOKEN_EXTRACTS: &str = "signet.block_processor.enter_token_events.extracted";
46+
const ENTER_TOKEN_EXTRACTS_HELP: &str =
47+
"Enter token events extracted from host per block, labeled by token";
48+
49+
const ENTER_PROCESSED: &str = "signet.block_processor.enter_events.processed";
50+
const ENTER_PROCESSED_HELP: &str = "Histogram of number of enter events processed per block";
51+
52+
const ENTER_TOKEN_PROCESSED: &str = "signet.block_processor.enter_token_events.processed";
53+
const ENTER_TOKEN_PROCESSED_HELP: &str =
54+
"Histogram of number of enter token events processed per block";
55+
56+
const TRANSACT_PROCESSED: &str = "signet.block_processor.transact_events.processed";
57+
const TRANSACT_PROCESSED_HELP: &str = "Histogram of number of transact events processed per block";
58+
59+
static DESCRIBE: LazyLock<()> = LazyLock::new(|| {
60+
describe_counter!(BUILDER_BLOCKS_EXTRACTED, BUILDER_BLOCKS_EXTRACTED_HELP);
61+
describe_counter!(BLOCKS_PROCESSED, BLOCKS_PROCESSED_HELP);
62+
describe_counter!(TRANSACTIONS_PROCESSED, TRANSACTIONS_PROCESSED_HELP);
63+
describe_counter!(HOST_WITHOUT_BUILDER_BLOCK, HOST_WITHOUT_BUILDER_BLOCK_HELP);
64+
65+
describe_histogram!(TRANSACTIONS_PER_BUILDER_BLOCK, TRANSACTIONS_PER_BUILDER_BLOCK_HELP);
66+
describe_histogram!(TRANSACT_EXTRACTS, TRANSACT_EXTRACTS_HELP);
67+
describe_histogram!(ENTER_EXTRACTS, ENTER_EXTRACTS_HELP);
68+
describe_histogram!(ENTER_TOKEN_EXTRACTS, ENTER_TOKEN_EXTRACTS_HELP);
69+
describe_histogram!(ENTER_PROCESSED, ENTER_PROCESSED_HELP);
70+
describe_histogram!(ENTER_TOKEN_PROCESSED, ENTER_TOKEN_PROCESSED_HELP);
71+
describe_histogram!(TRANSACT_PROCESSED, TRANSACT_PROCESSED_HELP);
72+
});
73+
74+
fn blocks_extracted() -> Counter {
75+
LazyLock::force(&DESCRIBE);
76+
counter!(BUILDER_BLOCKS_EXTRACTED)
77+
}
78+
79+
fn inc_blocks_extracted() {
80+
blocks_extracted().increment(1);
81+
}
82+
83+
fn blocks_processed() -> Counter {
84+
LazyLock::force(&DESCRIBE);
85+
counter!(BLOCKS_PROCESSED)
86+
}
87+
88+
fn inc_blocks_processed() {
89+
blocks_processed().increment(1);
90+
}
91+
92+
fn transactions_processed() -> Counter {
93+
LazyLock::force(&DESCRIBE);
94+
counter!(TRANSACTIONS_PROCESSED)
95+
}
96+
97+
fn inc_transactions_processed(value: u64) {
98+
transactions_processed().increment(value);
99+
}
100+
101+
fn host_without_builder_block() -> Counter {
102+
LazyLock::force(&DESCRIBE);
103+
counter!(HOST_WITHOUT_BUILDER_BLOCK)
104+
}
105+
106+
fn inc_host_without_builder_block() {
107+
host_without_builder_block().increment(1);
108+
}
109+
110+
fn transactions_per_builder_block() -> Histogram {
111+
LazyLock::force(&DESCRIBE);
112+
histogram!(TRANSACTIONS_PER_BUILDER_BLOCK)
113+
}
114+
115+
fn record_transactions_per_builder_block(value: u64) {
116+
transactions_per_builder_block().record(value as f64);
117+
}
118+
119+
fn transact_extracts() -> Histogram {
120+
LazyLock::force(&DESCRIBE);
121+
histogram!(TRANSACT_EXTRACTS)
122+
}
123+
124+
fn record_transact_extracts(value: u64) {
125+
transact_extracts().record(value as f64);
126+
}
127+
128+
fn enter_extracts() -> Histogram {
129+
LazyLock::force(&DESCRIBE);
130+
histogram!(ENTER_EXTRACTS)
131+
}
132+
133+
fn record_enter_extracts(value: u64) {
134+
enter_extracts().record(value as f64);
135+
}
136+
137+
fn enter_token_extracts() -> Histogram {
138+
LazyLock::force(&DESCRIBE);
139+
histogram!(ENTER_TOKEN_EXTRACTS)
140+
}
141+
142+
fn record_enter_token_events(value: u64) {
143+
enter_token_extracts().record(value as f64);
144+
}
145+
146+
fn enters_processed() -> Histogram {
147+
LazyLock::force(&DESCRIBE);
148+
histogram!(ENTER_PROCESSED)
149+
}
150+
151+
fn record_enters_processed(value: u64) {
152+
enters_processed().record(value as f64);
153+
}
154+
155+
fn enter_token_processed() -> Histogram {
156+
LazyLock::force(&DESCRIBE);
157+
histogram!(ENTER_TOKEN_PROCESSED)
158+
}
159+
160+
fn record_enter_token_processed(value: u64) {
161+
enter_token_processed().record(value as f64);
162+
}
163+
164+
fn transacts_processed() -> Histogram {
165+
LazyLock::force(&DESCRIBE);
166+
histogram!(TRANSACT_PROCESSED)
167+
}
168+
169+
fn record_transacts_processed(value: u64) {
170+
transacts_processed().record(value as f64);
171+
}
172+
173+
pub(crate) fn record_extracts<T: Extractable>(extracts: &Extracts<'_, T>) {
174+
record_enter_extracts(extracts.enters.len() as u64);
175+
record_enter_token_events(extracts.enter_tokens.len() as u64);
176+
record_transact_extracts(extracts.transacts.len() as u64);
177+
if extracts.events.submitted.is_some() {
178+
inc_blocks_extracted();
179+
} else {
180+
inc_host_without_builder_block();
181+
}
182+
}
183+
184+
pub(crate) fn record_block_result(block: &BlockResult) {
185+
inc_blocks_processed();
186+
inc_transactions_processed(block.sealed_block.transactions().len() as u64);
187+
188+
// find the index of the first magic sig transaction
189+
// That index is the count of builder block transactions
190+
let txns = block.sealed_block.transactions();
191+
192+
let txns_processed =
193+
txns.partition_point(|tx| MagicSig::try_from_signature(tx.signature()).is_none());
194+
195+
let sys_txns = &txns[txns_processed..];
196+
197+
let mut enters = 0;
198+
let mut enter_tokens = 0;
199+
let mut transacts = 0;
200+
for tx in sys_txns.iter() {
201+
match MagicSig::try_from_signature(tx.signature()) {
202+
Some(MagicSig { ty: MagicSigInfo::Enter, .. }) => {
203+
enters += 1;
204+
}
205+
Some(MagicSig { ty: MagicSigInfo::EnterToken, .. }) => {
206+
enter_tokens += 1;
207+
}
208+
Some(MagicSig { ty: MagicSigInfo::Transact { .. }, .. }) => {
209+
transacts += 1;
210+
}
211+
Some(_) | None => unreachable!(),
212+
};
213+
}
214+
215+
record_transactions_per_builder_block(txns_processed as u64);
216+
record_enters_processed(enters);
217+
record_enter_token_processed(enter_tokens);
218+
record_transacts_processed(transacts);
219+
}

crates/block-processor/src/v1/processor.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::Chain;
1+
use crate::{Chain, metrics};
22
use alloy::{consensus::BlockHeader, primitives::B256};
33
use eyre::ContextCompat;
44
use init4_bin_base::utils::calc::SlotCalculator;
@@ -146,6 +146,8 @@ where
146146
}
147147
start = Some(new_ru_height);
148148
}
149+
150+
metrics::record_extracts(&block_extracts);
149151
current = block_extracts.ru_height;
150152
let spec_id = self.spec_id(block_extracts.host_block.timestamp());
151153

@@ -159,6 +161,8 @@ where
159161

160162
tracing::trace!("Running EVM");
161163
let block_result = self.run_evm(&block_extracts, spec_id).instrument(span).await?;
164+
metrics::record_block_result(&block_result);
165+
162166
tracing::trace!("Committing EVM results");
163167
let journal =
164168
self.commit_evm_results(&block_extracts, &block_result, prev_block_journal)?;

crates/node/Cargo.toml

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,28 @@ homepage.workspace = true
99
repository.workspace = true
1010

1111
[dependencies]
12-
alloy.workspace = true
13-
eyre.workspace = true
14-
futures-util = "0.3.31"
15-
reqwest.workspace = true
16-
reth.workspace = true
17-
reth-chainspec.workspace = true
18-
reth-db.workspace = true
19-
reth-db-common.workspace = true
20-
reth-exex.workspace = true
21-
reth-node-api.workspace = true
22-
signet-blobber.workspace = true
2312
signet-block-processor.workspace = true
2413
signet-db.workspace = true
2514
signet-node-config.workspace = true
2615
signet-node-types.workspace = true
2716
signet-rpc.workspace = true
17+
18+
signet-blobber.workspace = true
2819
signet-tx-cache.workspace = true
2920
signet-types.workspace = true
21+
22+
alloy.workspace = true
23+
24+
reth.workspace = true
25+
reth-chainspec.workspace = true
26+
reth-db.workspace = true
27+
reth-db-common.workspace = true
28+
reth-exex.workspace = true
29+
reth-node-api.workspace = true
30+
31+
eyre.workspace = true
32+
futures-util.workspace = true
33+
metrics.workspace = true
34+
reqwest.workspace = true
3035
tokio.workspace = true
3136
tracing.workspace = true

crates/node/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#![deny(unused_must_use, rust_2018_idioms)]
1212
#![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))]
1313

14+
mod metrics;
15+
1416
mod node;
1517
pub use node::{GENESIS_JOURNAL_HASH, SignetNode};
1618

0 commit comments

Comments
 (0)