diff --git a/Cargo.lock b/Cargo.lock index 0f424bf169..12b9904257 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10248,6 +10248,7 @@ dependencies = [ "strum 0.27.2", "thiserror 2.0.18", "toml", + "tracing", ] [[package]] diff --git a/crates/prune/prune/src/pruner.rs b/crates/prune/prune/src/pruner.rs index b700d61028..bb55f75cb0 100644 --- a/crates/prune/prune/src/pruner.rs +++ b/crates/prune/prune/src/pruner.rs @@ -149,21 +149,7 @@ where let elapsed = start.elapsed(); self.metrics.duration_seconds.record(elapsed); - let message = match output.progress { - PruneProgress::HasMoreData(_) => "Pruner interrupted and has more data to prune", - PruneProgress::Finished => "Pruner finished", - }; - - debug!( - target: "pruner", - %tip_block_number, - ?elapsed, - ?deleted_entries, - ?limiter, - ?output, - ?stats, - "{message}", - ); + output.debug_log(tip_block_number, deleted_entries, elapsed); self.event_sender.notify(PrunerEvent::Finished { tip_block_number, elapsed, stats }); diff --git a/crates/prune/types/Cargo.toml b/crates/prune/types/Cargo.toml index 30adbb14d9..5eba313683 100644 --- a/crates/prune/types/Cargo.toml +++ b/crates/prune/types/Cargo.toml @@ -18,6 +18,7 @@ alloy-primitives.workspace = true derive_more.workspace = true strum = { workspace = true, features = ["derive"] } thiserror.workspace = true +tracing.workspace = true modular-bitfield = { workspace = true, optional = true } serde = { workspace = true, features = ["derive"], optional = true } @@ -42,8 +43,9 @@ std = [ "derive_more/std", "serde?/std", "serde_json/std", - "thiserror/std", "strum/std", + "thiserror/std", + "tracing/std", ] test-utils = [ "std", diff --git a/crates/prune/types/src/pruner.rs b/crates/prune/types/src/pruner.rs index fcac3da139..1ad3ca4ecd 100644 --- a/crates/prune/types/src/pruner.rs +++ b/crates/prune/types/src/pruner.rs @@ -1,7 +1,9 @@ use crate::{PruneCheckpoint, PruneMode, PruneSegment}; -use alloc::vec::Vec; +use alloc::{format, string::ToString, vec::Vec}; use alloy_primitives::{BlockNumber, TxNumber}; +use core::time::Duration; use derive_more::Display; +use tracing::debug; /// Pruner run output. #[derive(Debug)] @@ -18,6 +20,49 @@ impl From for PrunerOutput { } } +impl PrunerOutput { + /// Logs a human-readable summary of the pruner run at DEBUG level. + /// + /// Format: `"Pruner finished tip=24328929 deleted=10886 elapsed=148ms + /// segments=AccountHistory[24318865, done] ..."` + #[inline] + pub fn debug_log( + &self, + tip_block_number: BlockNumber, + deleted_entries: usize, + elapsed: Duration, + ) { + let message = match self.progress { + PruneProgress::HasMoreData(_) => "Pruner interrupted, has more data", + PruneProgress::Finished => "Pruner finished", + }; + + let segments: Vec<_> = self + .segments + .iter() + .filter(|(_, seg)| seg.pruned > 0) + .map(|(segment, seg)| { + let block = seg + .checkpoint + .and_then(|c| c.block_number) + .map(|b| b.to_string()) + .unwrap_or_else(|| "?".to_string()); + let status = if seg.progress.is_finished() { "done" } else { "in_progress" }; + format!("{segment}[{block}, {status}]") + }) + .collect(); + + debug!( + target: "pruner", + %tip_block_number, + deleted_entries, + ?elapsed, + segments = %segments.join(" "), + "{message}", + ); + } +} + /// Represents information of a pruner run for a segment. #[derive(Debug, Clone, PartialEq, Eq, Display)] #[display("(table={segment}, pruned={pruned}, status={progress})")]