use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Default)]
pub struct RefreshStats {
pub enqueued: AtomicU64,
pub processed: AtomicU64,
pub rejected: AtomicU64,
pub dedup_skipped: AtomicU64,
pub success: AtomicU64,
pub failed: AtomicU64,
pub timeout: AtomicU64,
}
impl RefreshStats {
pub fn new() -> Self {
Self::default()
}
pub fn record_enqueued(&self) {
self.enqueued.fetch_add(1, Ordering::Relaxed);
}
pub fn record_rejected(&self) {
self.rejected.fetch_add(1, Ordering::Relaxed);
}
pub fn record_dedup_skipped(&self) {
self.dedup_skipped.fetch_add(1, Ordering::Relaxed);
}
pub fn record_processed(&self) {
self.processed.fetch_add(1, Ordering::Relaxed);
}
pub fn record_success(&self) {
self.success.fetch_add(1, Ordering::Relaxed);
}
pub fn record_failed(&self) {
self.failed.fetch_add(1, Ordering::Relaxed);
}
pub fn record_timeout(&self) {
self.timeout.fetch_add(1, Ordering::Relaxed);
}
pub fn total_enqueued(&self) -> u64 {
self.enqueued.load(Ordering::Relaxed)
}
pub fn total_processed(&self) -> u64 {
self.processed.load(Ordering::Relaxed)
}
pub fn total_rejected(&self) -> u64 {
self.rejected.load(Ordering::Relaxed)
}
pub fn total_dedup_skipped(&self) -> u64 {
self.dedup_skipped.load(Ordering::Relaxed)
}
pub fn total_success(&self) -> u64 {
self.success.load(Ordering::Relaxed)
}
pub fn total_failed(&self) -> u64 {
self.failed.load(Ordering::Relaxed)
}
pub fn total_timeout(&self) -> u64 {
self.timeout.load(Ordering::Relaxed)
}
pub fn success_rate(&self) -> f64 {
let processed = self.total_processed();
if processed == 0 {
0.0
} else {
self.total_success() as f64 / processed as f64
}
}
pub fn queue_depth(&self) -> u64 {
let enqueued = self.total_enqueued();
let processed = self.total_processed();
let rejected = self.total_rejected();
let skipped = self.total_dedup_skipped();
enqueued.saturating_sub(processed + rejected + skipped)
}
}