use std::sync::atomic::{AtomicU64, Ordering}; #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub enum OperationalIncident { InvocationHistoryLost, } static INVOCATION_HISTORY_LOST_TOTAL: AtomicU64 = AtomicU64::new(0); pub fn record_operational_incident(incident: OperationalIncident) { let counter = counter(incident); let _ = counter.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |value| { value.checked_add(1) }); match incident { OperationalIncident::InvocationHistoryLost => { metrics::counter!("crank_invocation_history_lost_total").increment(1); metrics::counter!( "crank_telemetry_export_failures_total", "signal_type" => "invocation_history", "exporter" => "postgres" ) .increment(1); } } } pub fn operational_incident_total(incident: OperationalIncident) -> u64 { counter(incident).load(Ordering::Relaxed) } fn counter(incident: OperationalIncident) -> &'static AtomicU64 { match incident { OperationalIncident::InvocationHistoryLost => &INVOCATION_HISTORY_LOST_TOTAL, } }