agave-votor 4.2.0

Blockchain, Rebuilt for Scale
Documentation
use {
    solana_metrics::datapoint_info,
    std::{
        num::Saturating,
        time::{Duration, Instant},
    },
};

const STATS_REPORT_INTERVAL: Duration = Duration::from_secs(10);

#[derive(Debug)]
pub(super) struct ConsensusPoolServiceStats {
    pub(super) add_message_failed: Saturating<usize>,
    pub(super) certificates_sent: Saturating<usize>,
    pub(super) certificates_dropped: Saturating<usize>,
    pub(super) certificates_skipped_unstaked: Saturating<usize>,
    pub(super) new_finalized_slot: Saturating<usize>,
    pub(super) parent_ready_missed_window: Saturating<usize>,
    pub(super) parent_ready_produce_window: Saturating<usize>,
    pub(super) received_votes: Saturating<usize>,
    pub(super) received_certificates: Saturating<usize>,
    pub(super) standstill: bool,
    pub(super) prune_old_state_called: Saturating<usize>,
    pub(crate) pending_safe_to_notar_repair_sent: Saturating<usize>,
    pub(crate) pending_safe_to_notar_resolved: Saturating<usize>,
    last_request_time: Instant,
}

impl ConsensusPoolServiceStats {
    pub fn new() -> Self {
        Self {
            add_message_failed: Saturating(0),
            certificates_sent: Saturating(0),
            certificates_dropped: Saturating(0),
            certificates_skipped_unstaked: Saturating(0),
            new_finalized_slot: Saturating(0),
            parent_ready_missed_window: Saturating(0),
            parent_ready_produce_window: Saturating(0),
            received_votes: Saturating(0),
            received_certificates: Saturating(0),
            standstill: false,
            prune_old_state_called: Saturating(0),
            pending_safe_to_notar_repair_sent: Saturating(0),
            pending_safe_to_notar_resolved: Saturating(0),
            last_request_time: Instant::now(),
        }
    }

    fn report(&self) {
        let &Self {
            add_message_failed: Saturating(add_message_failed),
            certificates_sent: Saturating(certificates_sent),
            certificates_dropped: Saturating(certificates_dropped),
            certificates_skipped_unstaked: Saturating(certificates_skipped_unstaked),
            new_finalized_slot: Saturating(new_finalized_slot),
            parent_ready_missed_window: Saturating(parent_ready_missed_window),
            parent_ready_produce_window: Saturating(parent_ready_produce_window),
            received_votes: Saturating(received_votes),
            received_certificates: Saturating(received_certificates),
            standstill,
            prune_old_state_called: Saturating(prune_old_state_called),
            pending_safe_to_notar_repair_sent: Saturating(pending_safe_to_notar_repair_sent),
            pending_safe_to_notar_resolved: Saturating(pending_safe_to_notar_resolved),
            last_request_time: _,
        } = self;
        datapoint_info!(
            "consensus_pool_service",
            ("add_message_failed", add_message_failed, i64),
            ("certificates_sent", certificates_sent, i64),
            ("certificates_dropped", certificates_dropped, i64),
            (
                "certificates_skipped_unstaked",
                certificates_skipped_unstaked,
                i64
            ),
            ("new_finalized_slot", new_finalized_slot, i64),
            (
                "parent_ready_missed_window",
                parent_ready_missed_window,
                i64
            ),
            (
                "parent_ready_produce_window",
                parent_ready_produce_window,
                i64
            ),
            ("received_votes", received_votes, i64),
            ("received_certificates", received_certificates, i64),
            ("in_standstill_bool", standstill, bool),
            ("prune_old_state_called", prune_old_state_called, i64),
            (
                "pending_safe_to_notar_repair_sent",
                pending_safe_to_notar_repair_sent,
                i64
            ),
            (
                "pending_safe_to_notar_resolved",
                pending_safe_to_notar_resolved,
                i64
            ),
        );
    }

    pub(super) fn maybe_report(&mut self) {
        if self.last_request_time.elapsed() >= STATS_REPORT_INTERVAL {
            self.report();
            *self = Self::new();
        }
    }
}