Skip to main content

alun_task/
metrics.rs

1//! 任务指标(原子计数器,并发安全)
2
3use std::sync::atomic::AtomicU64;
4
5/// 任务执行指标 —— 原子计数器,并发安全
6///
7/// 工作线程通过 AtomicU64 递增,避免锁开销。
8pub struct TaskMetrics {
9    /// 提交任务总数
10    pub total: AtomicU64,
11    /// 待处理任务数
12    pub pending: AtomicU64,
13    /// 执行中任务数
14    pub running: AtomicU64,
15    /// 已完成任务数
16    pub completed: AtomicU64,
17    /// 失败任务数
18    pub failed: AtomicU64,
19    /// 已取消任务数
20    pub cancelled: AtomicU64,
21    /// 重试任务数
22    pub retried: AtomicU64,
23}
24
25impl TaskMetrics {
26    /// 创建零初始化的指标实例
27    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    /// 获取指标快照(JSON 格式,用于监控/API 接口)
40    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
57/// AtomicU64 原子递增扩展 trait
58pub(crate) trait AtomicInc {
59    /// 原子递增并返回递增后的值
60    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}