zebra_state/service/finalized_state/zebra_db/
metrics.rs

1//! Provides high-level database metrics.
2
3use zebra_chain::block::{self, Block};
4
5/// Update metrics before committing a block.
6///
7/// The metrics are updated after contextually validating a block,
8/// but before writing its batch to the state.
9pub(crate) fn block_precommit_metrics(block: &Block, hash: block::Hash, height: block::Height) {
10    let transaction_count = block.transactions.len();
11    let transparent_prevout_count = block
12        .transactions
13        .iter()
14        .flat_map(|t| t.inputs().iter())
15        .count()
16        // Each block has a single coinbase input which is not a previous output.
17        - 1;
18    let transparent_newout_count = block
19        .transactions
20        .iter()
21        .flat_map(|t| t.outputs().iter())
22        .count();
23
24    let sprout_nullifier_count = block.sprout_nullifiers().count();
25    let sapling_nullifier_count = block.sapling_nullifiers().count();
26    let orchard_nullifier_count = block.orchard_nullifiers().count();
27
28    tracing::debug!(
29        ?hash,
30        ?height,
31        transaction_count,
32        transparent_prevout_count,
33        transparent_newout_count,
34        sprout_nullifier_count,
35        sapling_nullifier_count,
36        orchard_nullifier_count,
37        "preparing to commit finalized {:?}block",
38        if height.is_min() { "genesis " } else { "" }
39    );
40
41    metrics::counter!("state.finalized.block.count").increment(1);
42    metrics::gauge!("state.finalized.block.height").set(height.0 as f64);
43
44    metrics::counter!("state.finalized.cumulative.transactions")
45        .increment(transaction_count as u64);
46
47    metrics::counter!("state.finalized.cumulative.sprout_nullifiers")
48        .increment(sprout_nullifier_count as u64);
49    metrics::counter!("state.finalized.cumulative.sapling_nullifiers")
50        .increment(sapling_nullifier_count as u64);
51    metrics::counter!("state.finalized.cumulative.orchard_nullifiers")
52        .increment(orchard_nullifier_count as u64);
53
54    // The outputs from the genesis block can't be spent, so we skip them here.
55    if !height.is_min() {
56        metrics::counter!("state.finalized.cumulative.transparent_prevouts")
57            .increment(transparent_prevout_count as u64);
58        metrics::counter!("state.finalized.cumulative.transparent_newouts")
59            .increment(transparent_newout_count as u64);
60    }
61}