1use std::sync::atomic::AtomicU64;
4
5pub struct TaskMetrics {
9 pub total: AtomicU64,
11 pub pending: AtomicU64,
13 pub running: AtomicU64,
15 pub completed: AtomicU64,
17 pub failed: AtomicU64,
19 pub cancelled: AtomicU64,
21 pub retried: AtomicU64,
23}
24
25impl TaskMetrics {
26 pub fn new() -> Self {
28 Self {
29 total: AtomicU64::new(0u64),
30 pending: AtomicU64::new(0u64),
31 running: AtomicU64::new(0u64),
32 completed: AtomicU64::new(0u64),
33 failed: AtomicU64::new(0u64),
34 cancelled: AtomicU64::new(0u64),
35 retried: AtomicU64::new(0u64),
36 }
37 }
38
39 pub fn snapshot(&self) -> serde_json::Value {
41 serde_json::json!({
42 "total": self.total.load(std::sync::atomic::Ordering::Relaxed),
43 "pending": self.pending.load(std::sync::atomic::Ordering::Relaxed),
44 "running": self.running.load(std::sync::atomic::Ordering::Relaxed),
45 "completed": self.completed.load(std::sync::atomic::Ordering::Relaxed),
46 "failed": self.failed.load(std::sync::atomic::Ordering::Relaxed),
47 "cancelled": self.cancelled.load(std::sync::atomic::Ordering::Relaxed),
48 "retried": self.retried.load(std::sync::atomic::Ordering::Relaxed),
49 })
50 }
51}
52
53impl Default for TaskMetrics {
54 fn default() -> Self { Self::new() }
55}
56
57pub(crate) trait AtomicInc {
59 fn inc(&self) -> u64;
61}
62
63impl AtomicInc for AtomicU64 {
64 fn inc(&self) -> u64 {
65 self.fetch_add(1u64, std::sync::atomic::Ordering::Relaxed) + 1u64
66 }
67}