Skip to content

Commit 66e895c

Browse files
committed
feat: add metrics to node and block-processor
1 parent c213994 commit 66e895c

File tree

9 files changed

+309
-17
lines changed

9 files changed

+309
-17
lines changed

Cargo.toml

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

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

crates/node/src/metrics.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use std::sync::LazyLock;
2+
3+
use metrics::{Counter, counter, describe_counter};
4+
use reth_exex::ExExNotification;
5+
6+
const NOTIFICATION_RECEIVED: &str = "signet.node.notification_received";
7+
const NOTIFICATION_RECEIVED_HELP: &str = "Number of notifications received";
8+
9+
const REORGS_RECEIVED: &str = "signet.node.reorgs_received";
10+
const REORGS_RECEIVED_HELP: &str = "Number of reorgs received";
11+
12+
const NOTIFICATIONS_PROCESSED: &str = "signet.node.notifications_processed";
13+
const NOTIFICATIONS_PROCESSED_HELP: &str = "Number of notifications processed";
14+
15+
const REORGS_PROCESSED: &str = "signet.node.reorgs_processed";
16+
const REORGS_PROCESSED_HELP: &str = "Number of reorgs processed";
17+
18+
static DESCRIBE: LazyLock<()> = LazyLock::new(|| {
19+
describe_counter!(NOTIFICATION_RECEIVED, NOTIFICATION_RECEIVED_HELP);
20+
describe_counter!(REORGS_RECEIVED, REORGS_RECEIVED_HELP);
21+
describe_counter!(NOTIFICATIONS_PROCESSED, NOTIFICATIONS_PROCESSED_HELP);
22+
describe_counter!(REORGS_PROCESSED, REORGS_PROCESSED_HELP);
23+
});
24+
25+
fn reorgs_processed() -> Counter {
26+
LazyLock::force(&DESCRIBE);
27+
counter!(REORGS_PROCESSED)
28+
}
29+
30+
fn inc_reorgs_processed() {
31+
reorgs_processed().increment(1);
32+
}
33+
34+
fn notifications_processed() -> Counter {
35+
LazyLock::force(&DESCRIBE);
36+
counter!(NOTIFICATIONS_PROCESSED)
37+
}
38+
39+
fn inc_notifications_processed() {
40+
notifications_processed().increment(1);
41+
}
42+
43+
pub(crate) fn record_notification_received(notification: &ExExNotification) {
44+
inc_notifications_processed();
45+
if notification.reverted_chain().is_some() {
46+
inc_reorgs_processed();
47+
}
48+
}
49+
50+
pub(crate) fn record_notification_processed(notification: &ExExNotification) {
51+
inc_notifications_processed();
52+
if notification.reverted_chain().is_some() {
53+
inc_reorgs_processed();
54+
}
55+
}

0 commit comments

Comments
 (0)