use std::sync::atomic::AtomicU64;
pub struct TaskMetrics {
pub total: AtomicU64,
pub pending: AtomicU64,
pub running: AtomicU64,
pub completed: AtomicU64,
pub failed: AtomicU64,
pub cancelled: AtomicU64,
pub retried: AtomicU64,
}
impl TaskMetrics {
pub fn new() -> Self {
Self {
total: AtomicU64::new(0u64),
pending: AtomicU64::new(0u64),
running: AtomicU64::new(0u64),
completed: AtomicU64::new(0u64),
failed: AtomicU64::new(0u64),
cancelled: AtomicU64::new(0u64),
retried: AtomicU64::new(0u64),
}
}
pub fn snapshot(&self) -> serde_json::Value {
serde_json::json!({
"total": self.total.load(std::sync::atomic::Ordering::Relaxed),
"pending": self.pending.load(std::sync::atomic::Ordering::Relaxed),
"running": self.running.load(std::sync::atomic::Ordering::Relaxed),
"completed": self.completed.load(std::sync::atomic::Ordering::Relaxed),
"failed": self.failed.load(std::sync::atomic::Ordering::Relaxed),
"cancelled": self.cancelled.load(std::sync::atomic::Ordering::Relaxed),
"retried": self.retried.load(std::sync::atomic::Ordering::Relaxed),
})
}
}
impl Default for TaskMetrics {
fn default() -> Self { Self::new() }
}
pub(crate) trait AtomicInc {
fn inc(&self) -> u64;
}
impl AtomicInc for AtomicU64 {
fn inc(&self) -> u64 {
self.fetch_add(1u64, std::sync::atomic::Ordering::Relaxed) + 1u64
}
}