Skip to content

Commit 062292e

Browse files
authored
feat: more metrics (#55)
* add more metrics * range adjustment * fix * update grafana
1 parent 27905d3 commit 062292e

File tree

8 files changed

+689
-230
lines changed

8 files changed

+689
-230
lines changed

crates/bin/src/utils.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ pub fn verify<T: Block + Clone>(
99
l2_trace: T,
1010
fork_config: &HardforkConfig,
1111
) -> Result<(), VerificationError> {
12-
measure_duration_histogram!(
13-
total_block_verification_duration_microseconds,
12+
measure_duration_millis!(
13+
total_block_verification_duration_milliseconds,
1414
verify_inner(l2_trace, fork_config)
1515
)
1616
}
@@ -40,8 +40,8 @@ fn verify_inner<T: Block + Clone>(
4040
let zktrie_db = cycle_track!(
4141
{
4242
let mut zktrie_db = ZkMemoryDb::new();
43-
measure_duration_histogram!(
44-
build_zktrie_db_duration_microseconds,
43+
measure_duration_millis!(
44+
build_zktrie_db_duration_milliseconds,
4545
l2_trace.build_zktrie_db(&mut zktrie_db)
4646
);
4747
Rc::new(zktrie_db)

crates/core/src/chunk.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ impl ChunkInfo {
4343

4444
let mut zktrie_db = ZkMemoryDb::new();
4545
for trace in traces.iter() {
46-
measure_duration_histogram!(
47-
build_zktrie_db_duration_microseconds,
46+
measure_duration_millis!(
47+
build_zktrie_db_duration_milliseconds,
4848
trace.build_zktrie_db(&mut zktrie_db)
4949
);
5050
}

crates/core/src/database.rs

+49-45
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ impl ReadOnlyDB {
121121

122122
/// Update the database with a new block trace.
123123
pub fn update<T: Block>(&mut self, l2_trace: T) -> Result<()> {
124-
measure_duration_histogram!(update_db_duration_microseconds, self.update_inner(l2_trace))
124+
measure_duration_millis!(update_db_duration_milliseconds, self.update_inner(l2_trace))
125125
}
126126

127127
fn update_inner<T: Block>(&mut self, l2_trace: T) -> Result<()> {
@@ -162,41 +162,42 @@ impl DatabaseRef for ReadOnlyDB {
162162

163163
/// Get basic account information.
164164
fn basic_ref(&self, address: Address) -> Result<Option<AccountInfo>, Self::Error> {
165-
Ok(self
166-
.zktrie_db_ref
167-
.get_account(address.as_slice())
168-
.map(|account_data| {
169-
let code_size =
170-
u64::from_be_bytes((&account_data[0][16..24]).try_into().unwrap()) as usize;
171-
let nonce = u64::from_be_bytes((&account_data[0][24..]).try_into().unwrap());
172-
let balance = U256::from_be_bytes(account_data[1]);
173-
let code_hash = B256::from(account_data[3]);
174-
let poseidon_code_hash = B256::from(account_data[4]);
175-
176-
let storage_root = B256::from(account_data[2]);
177-
self.prev_storage_roots
178-
.borrow_mut()
179-
.entry(address)
180-
.or_insert(storage_root.0.into());
181-
182-
let zktrie_db = self.zktrie_db.clone();
183-
self.storage_trie_refs.borrow_mut().insert(
184-
address,
185-
Lazy::new(Box::new(move || {
186-
zktrie_db
187-
.new_ref_trie(&storage_root.0)
188-
.expect("storage trie associated with account not found")
189-
})),
190-
);
191-
AccountInfo {
192-
balance,
193-
nonce,
194-
code_size,
195-
code_hash,
196-
poseidon_code_hash,
197-
code: self.code_db.get(&code_hash).cloned(),
198-
}
199-
}))
165+
Ok(measure_duration_micros!(
166+
zktrie_get_duration_microseconds,
167+
self.zktrie_db_ref.get_account(address.as_slice())
168+
)
169+
.map(|account_data| {
170+
let code_size =
171+
u64::from_be_bytes((&account_data[0][16..24]).try_into().unwrap()) as usize;
172+
let nonce = u64::from_be_bytes((&account_data[0][24..]).try_into().unwrap());
173+
let balance = U256::from_be_bytes(account_data[1]);
174+
let code_hash = B256::from(account_data[3]);
175+
let poseidon_code_hash = B256::from(account_data[4]);
176+
177+
let storage_root = B256::from(account_data[2]);
178+
self.prev_storage_roots
179+
.borrow_mut()
180+
.entry(address)
181+
.or_insert(storage_root.0.into());
182+
183+
let zktrie_db = self.zktrie_db.clone();
184+
self.storage_trie_refs.borrow_mut().insert(
185+
address,
186+
Lazy::new(Box::new(move || {
187+
zktrie_db
188+
.new_ref_trie(&storage_root.0)
189+
.expect("storage trie associated with account not found")
190+
})),
191+
);
192+
AccountInfo {
193+
balance,
194+
nonce,
195+
code_size,
196+
code_hash,
197+
poseidon_code_hash,
198+
code: self.code_db.get(&code_hash).cloned(),
199+
}
200+
}))
200201
}
201202

202203
/// Get account code by its code hash.
@@ -220,11 +221,12 @@ impl DatabaseRef for ReadOnlyDB {
220221
let trie = storage_trie_refs
221222
.entry(address)
222223
.or_insert_with_key(|address| {
223-
let storage_root = self
224-
.zktrie_db_ref
225-
.get_account(address.as_slice())
226-
.map(|account_data| B256::from(account_data[2]))
227-
.unwrap_or_default();
224+
let storage_root = measure_duration_micros!(
225+
zktrie_get_duration_microseconds,
226+
self.zktrie_db_ref.get_account(address.as_slice())
227+
)
228+
.map(|account_data| B256::from(account_data[2]))
229+
.unwrap_or_default();
228230
let zktrie_db = self.zktrie_db.clone();
229231
Lazy::new(Box::new(move || {
230232
zktrie_db
@@ -234,10 +236,12 @@ impl DatabaseRef for ReadOnlyDB {
234236
}))
235237
});
236238

237-
Ok(trie
238-
.get_store(&index.to_be_bytes::<32>())
239-
.map(|store_data| U256::from_be_bytes(store_data))
240-
.unwrap_or_default())
239+
Ok(measure_duration_micros!(
240+
zktrie_get_duration_microseconds,
241+
trie.get_store(&index.to_be_bytes::<32>())
242+
)
243+
.map(|store_data| U256::from_be_bytes(store_data))
244+
.unwrap_or_default())
241245
}
242246

243247
/// Get block hash by block number.

crates/core/src/executor/mod.rs

+42-25
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ impl EvmExecutor<'_> {
4343

4444
/// Handle a block.
4545
pub fn handle_block<T: Block>(&mut self, l2_trace: &T) -> Result<(), VerificationError> {
46-
measure_duration_histogram!(
47-
handle_block_duration_microseconds,
46+
measure_duration_millis!(
47+
handle_block_duration_milliseconds,
4848
self.handle_block_inner(l2_trace)
4949
)?;
5050

@@ -139,13 +139,15 @@ impl EvmExecutor<'_> {
139139

140140
dev_trace!("handler cfg: {:?}", revm.handler.cfg);
141141

142-
let _result =
142+
let _result = measure_duration_millis!(
143+
transact_commit_duration_milliseconds,
143144
cycle_track!(revm.transact_commit(), "transact_commit").map_err(|e| {
144145
VerificationError::EvmExecution {
145146
tx_hash: *tx.tx_hash(),
146147
source: e,
147148
}
148-
})?;
149+
})?
150+
);
149151

150152
dev_trace!("{_result:#?}");
151153
}
@@ -159,8 +161,8 @@ impl EvmExecutor<'_> {
159161

160162
/// Commit pending changes in cache db to zktrie
161163
pub fn commit_changes(&mut self, zktrie_db: &Rc<ZkMemoryDb>) -> B256 {
162-
measure_duration_histogram!(
163-
commit_changes_duration_microseconds,
164+
measure_duration_millis!(
165+
commit_changes_duration_milliseconds,
164166
cycle_track!(self.commit_changes_inner(zktrie_db), "commit_changes")
165167
)
166168
}
@@ -203,26 +205,35 @@ impl EvmExecutor<'_> {
203205
.expect("unable to get storage trie");
204206
for (key, value) in db_acc.storage.iter() {
205207
if !value.is_zero() {
206-
cycle_track!(
207-
storage_trie
208-
.update_store(&key.to_be_bytes::<32>(), &value.to_be_bytes())
209-
.expect("failed to update storage"),
210-
"Zktrie::update_store"
208+
measure_duration_micros!(
209+
zktrie_update_duration_microseconds,
210+
cycle_track!(
211+
storage_trie
212+
.update_store(&key.to_be_bytes::<32>(), &value.to_be_bytes())
213+
.expect("failed to update storage"),
214+
"Zktrie::update_store"
215+
)
211216
);
212217
} else {
213-
cycle_track!(
214-
storage_trie.delete(&key.to_be_bytes::<32>()),
215-
"Zktrie::delete"
218+
measure_duration_micros!(
219+
zktrie_delete_duration_microseconds,
220+
cycle_track!(
221+
storage_trie.delete(&key.to_be_bytes::<32>()),
222+
"Zktrie::delete"
223+
)
216224
);
217225
}
218226

219227
#[cfg(feature = "debug-storage")]
220228
debug_recorder.record_storage(*addr, *key, *value);
221229
}
222230

223-
if storage_trie.is_trie_dirty() {
224-
storage_trie.prepare_root();
225-
}
231+
measure_duration_micros!(
232+
zktrie_commit_duration_microseconds,
233+
if storage_trie.is_trie_dirty() {
234+
storage_trie.prepare_root();
235+
}
236+
);
226237

227238
cycle_tracker_end!("update storage_tire");
228239
storage_root = storage_trie.root().into();
@@ -268,19 +279,25 @@ impl EvmExecutor<'_> {
268279
code_hash.0,
269280
poseidon_code_hash.0,
270281
];
271-
cycle_track!(
272-
zktrie
273-
.update_account(addr.as_slice(), &acc_data)
274-
.expect("failed to update account"),
275-
"Zktrie::update_account"
282+
measure_duration_micros!(
283+
zktrie_update_duration_microseconds,
284+
cycle_track!(
285+
zktrie
286+
.update_account(addr.as_slice(), &acc_data)
287+
.expect("failed to update account"),
288+
"Zktrie::update_account"
289+
)
276290
);
277291

278292
cycle_tracker_end!("commit account {}", addr);
279293
}
280294

281-
if zktrie.is_trie_dirty() {
282-
zktrie.prepare_root();
283-
}
295+
measure_duration_micros!(
296+
zktrie_commit_duration_microseconds,
297+
if zktrie.is_trie_dirty() {
298+
zktrie.prepare_root();
299+
}
300+
);
284301

285302
let root_after = zktrie.root();
286303

crates/sbv/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ pub use sbv_utils as utils;
66

77
pub use sbv_utils::{
88
cycle_track, cycle_tracker_end, cycle_tracker_start, dev_debug, dev_error, dev_info, dev_trace,
9-
dev_warn, measure_duration_histogram, update_metrics_counter, update_metrics_gauge,
9+
dev_warn, measure_duration_millis, update_metrics_counter, update_metrics_gauge,
1010
};

crates/utils/src/macros.rs

+34-4
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,37 @@ macro_rules! dev_warn {
9292

9393
/// This macro is for measuring duration to metrics
9494
#[macro_export]
95-
macro_rules! measure_duration_histogram {
95+
macro_rules! measure_duration_millis {
96+
($label:ident, $e:expr) => {{
97+
#[cfg(feature = "metrics")]
98+
let __measure_duration_histogram_start = std::time::Instant::now();
99+
100+
#[allow(clippy::let_and_return)]
101+
let __measure_duration_histogram_result = $e;
102+
103+
#[cfg(feature = "metrics")]
104+
let __measure_duration_histogram_elasped = __measure_duration_histogram_start.elapsed();
105+
#[cfg(feature = "metrics")]
106+
let __duration_millis = __measure_duration_histogram_elasped.as_secs() as f64 * 1_000.0
107+
+ __measure_duration_histogram_elasped.subsec_nanos() as f64 / 1_000_000.0;
108+
109+
#[cfg(feature = "metrics")]
110+
$crate::metrics::REGISTRY.$label.observe(__duration_millis);
111+
112+
#[cfg(feature = "metrics")]
113+
dev_debug!(
114+
"measured duration {} = {:?}ms",
115+
stringify!($label),
116+
__duration_millis,
117+
);
118+
119+
__measure_duration_histogram_result
120+
}};
121+
}
122+
123+
/// This macro is for measuring duration to metrics
124+
#[macro_export]
125+
macro_rules! measure_duration_micros {
96126
($label:ident, $e:expr) => {{
97127
#[cfg(feature = "metrics")]
98128
let __measure_duration_histogram_start = std::time::Instant::now();
@@ -103,13 +133,13 @@ macro_rules! measure_duration_histogram {
103133
#[cfg(feature = "metrics")]
104134
$crate::metrics::REGISTRY
105135
.$label
106-
.observe(__measure_duration_histogram_start.elapsed().as_millis() as f64);
136+
.observe(__measure_duration_histogram_start.elapsed().as_micros() as f64);
107137

108138
#[cfg(feature = "metrics")]
109139
dev_debug!(
110-
"measured duration {} = {:?}",
140+
"measured duration {} = {:?}us",
111141
stringify!($label),
112-
__measure_duration_histogram_start.elapsed(),
142+
__measure_duration_histogram_start.elapsed().as_micros() as f64,
113143
);
114144

115145
__measure_duration_histogram_result

0 commit comments

Comments
 (0)