diff --git a/crates/blockchain/src/metrics.rs b/crates/blockchain/src/metrics.rs index 751d02a..8bd39db 100644 --- a/crates/blockchain/src/metrics.rs +++ b/crates/blockchain/src/metrics.rs @@ -150,3 +150,56 @@ pub fn time_attestation_validation() -> TimingGuard { }); TimingGuard::new(&LEAN_ATTESTATION_VALIDATION_TIME_SECONDS) } + +/// Increment the PQ aggregated signatures counter. +pub fn inc_pq_sig_aggregated_signatures() { + static LEAN_PQ_SIG_AGGREGATED_SIGNATURES_TOTAL: std::sync::LazyLock = + std::sync::LazyLock::new(|| { + register_int_counter!( + "lean_pq_sig_aggregated_signatures_total", + "Total number of aggregated signatures" + ) + .unwrap() + }); + LEAN_PQ_SIG_AGGREGATED_SIGNATURES_TOTAL.inc(); +} + +/// Increment the attestations in aggregated signatures counter. +pub fn inc_pq_sig_attestations_in_aggregated_signatures(count: u64) { + static LEAN_PQ_SIG_ATTESTATIONS_IN_AGGREGATED_SIGNATURES_TOTAL: std::sync::LazyLock< + IntCounter, + > = std::sync::LazyLock::new(|| { + register_int_counter!( + "lean_pq_sig_attestations_in_aggregated_signatures_total", + "Total number of attestations included into aggregated signatures" + ) + .unwrap() + }); + LEAN_PQ_SIG_ATTESTATIONS_IN_AGGREGATED_SIGNATURES_TOTAL.inc_by(count); +} + +/// Increment the valid aggregated signatures counter. +pub fn inc_pq_sig_aggregated_signatures_valid() { + static LEAN_PQ_SIG_AGGREGATED_SIGNATURES_VALID_TOTAL: std::sync::LazyLock = + std::sync::LazyLock::new(|| { + register_int_counter!( + "lean_pq_sig_aggregated_signatures_valid_total", + "Total number of valid aggregated signatures" + ) + .unwrap() + }); + LEAN_PQ_SIG_AGGREGATED_SIGNATURES_VALID_TOTAL.inc(); +} + +/// Increment the invalid aggregated signatures counter. +pub fn inc_pq_sig_aggregated_signatures_invalid() { + static LEAN_PQ_SIG_AGGREGATED_SIGNATURES_INVALID_TOTAL: std::sync::LazyLock = + std::sync::LazyLock::new(|| { + register_int_counter!( + "lean_pq_sig_aggregated_signatures_invalid_total", + "Total number of invalid aggregated signatures" + ) + .unwrap() + }); + LEAN_PQ_SIG_AGGREGATED_SIGNATURES_INVALID_TOTAL.inc(); +} diff --git a/crates/blockchain/src/store.rs b/crates/blockchain/src/store.rs index de17767..71d280f 100644 --- a/crates/blockchain/src/store.rs +++ b/crates/blockchain/src/store.rs @@ -875,6 +875,9 @@ fn compute_aggregated_signatures( }; let aggregate_proof = AggregatedSignatureProof::new(participants, proof_data); results.push((aggregated_attestation, aggregate_proof)); + + metrics::inc_pq_sig_aggregated_signatures(); + metrics::inc_pq_sig_attestations_in_aggregated_signatures(gossip_ids.len() as u64); } // Phase 2: Fallback to existing proofs @@ -910,6 +913,10 @@ fn compute_aggregated_signatures( data: data.clone(), }; results.push((aggregate, proof.clone())); + + metrics::inc_pq_sig_aggregated_signatures(); + metrics::inc_pq_sig_attestations_in_aggregated_signatures(covered.len() as u64); + for vid in covered { remaining.remove(&vid); } @@ -962,8 +969,18 @@ fn verify_signatures( }) .collect::>()?; - verify_aggregated_signature(&aggregated_proof.proof_data, public_keys, &message, epoch) - .map_err(StoreError::AggregateVerificationFailed)?; + match verify_aggregated_signature( + &aggregated_proof.proof_data, + public_keys, + &message, + epoch, + ) { + Ok(()) => metrics::inc_pq_sig_aggregated_signatures_valid(), + Err(e) => { + metrics::inc_pq_sig_aggregated_signatures_invalid(); + return Err(StoreError::AggregateVerificationFailed(e)); + } + } } let proposer_attestation = &signed_block.message.proposer_attestation; diff --git a/docs/metrics.md b/docs/metrics.md index 7613d8e..77586ab 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -20,12 +20,12 @@ The exposed metrics follow [the leanMetrics specification](https://github.com/le |--------|-------|-------|-------------------------|--------|---------|-----------| | `lean_pq_sig_attestation_signing_time_seconds` | Histogram | Time taken to sign an attestation | On each attestation signing | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | | `lean_pq_sig_attestation_verification_time_seconds` | Histogram | Time taken to verify an attestation signature | On each `signature.verify()` on an attestation | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | -| `lean_pq_sig_aggregated_signatures_total` | Counter | Total number of aggregated signatures | On `build_attestation_signatures()` | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | -| `lean_pq_sig_attestations_in_aggregated_signatures_total` | Counter | Total number of attestations included into aggregated signatures | On `build_attestation_signatures()` | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | +| `lean_pq_sig_aggregated_signatures_total` | Counter | Total number of aggregated signatures | On `build_attestation_signatures()` | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | ✅ | +| `lean_pq_sig_attestations_in_aggregated_signatures_total` | Counter | Total number of attestations included into aggregated signatures | On `build_attestation_signatures()` | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | ✅ | | `lean_pq_sig_attestation_signatures_building_time_seconds` | Histogram | Time taken to verify an aggregated attestation signature | On `build_attestation_signatures()` | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | | `lean_pq_sig_aggregated_signatures_verification_time_seconds` | Histogram | Time taken to verify an aggregated attestation signature | On validate aggregated signature | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | -| `lean_pq_sig_aggregated_signatures_valid_total`| Counter | Total number of valid aggregated signatures | On validate aggregated signature | | | □ | -| `lean_pq_sig_aggregated_signatures_invalid_total`| Counter | Total number of invalid aggregated signatures | On validate aggregated signature | | | □ | +| `lean_pq_sig_aggregated_signatures_valid_total`| Counter | Total number of valid aggregated signatures | On validate aggregated signature | | | ✅ | +| `lean_pq_sig_aggregated_signatures_invalid_total`| Counter | Total number of invalid aggregated signatures | On validate aggregated signature | | | ✅ | ## Fork-Choice Metrics @@ -34,10 +34,10 @@ The exposed metrics follow [the leanMetrics specification](https://github.com/le | `lean_head_slot` | Gauge | Latest slot of the lean chain | On get fork choice head | | | ✅ | | `lean_current_slot` | Gauge | Current slot of the lean chain | On scrape | | | ✅(*) | | `lean_safe_target_slot` | Gauge | Safe target slot | On safe target update | | | ✅ | -|`lean_fork_choice_block_processing_time_seconds`| Histogram | Time taken to process block | On fork choice process block | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | +|`lean_fork_choice_block_processing_time_seconds`| Histogram | Time taken to process block | On fork choice process block | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | ✅ | |`lean_attestations_valid_total`| Counter | Total number of valid attestations | On validate attestation | source=block,gossip | | ✅ | |`lean_attestations_invalid_total`| Counter | Total number of invalid attestations | On validate attestation | source=block,gossip | | ✅ | -|`lean_attestation_validation_time_seconds`| Histogram | Time taken to validate attestation | On validate attestation | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | □ | +|`lean_attestation_validation_time_seconds`| Histogram | Time taken to validate attestation | On validate attestation | | 0.005, 0.01, 0.025, 0.05, 0.1, 1 | ✅ | | `lean_fork_choice_reorgs_total` | Counter | Total number of fork choice reorgs | On fork choice reorg | | | ✅ | | `lean_fork_choice_reorg_depth` | Histogram | Depth of fork choice reorgs (in blocks) | On fork choice reorg | | 1, 2, 3, 5, 7, 10, 20, 30, 50, 100 | □ |