Skip to main content

oxanus/
stats.rs

1//! Stats types for Oxanus job queue monitoring.
2
3use serde::{Deserialize, Serialize};
4
5use crate::job_envelope::JobEnvelope;
6
7/// Overall statistics for the Oxanus job queue system.
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct Stats {
10    /// Global aggregate statistics.
11    pub global: StatsGlobal,
12    /// List of active processes.
13    pub processes: Vec<Process>,
14    /// Jobs currently being processed.
15    pub processing: Vec<StatsProcessing>,
16    /// Per-queue statistics.
17    pub queues: Vec<QueueStats>,
18}
19
20/// Global aggregate statistics.
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct StatsGlobal {
23    /// Total number of jobs (enqueued + scheduled).
24    pub jobs: usize,
25    /// Number of jobs currently enqueued.
26    pub enqueued: usize,
27    /// Total number of jobs processed.
28    pub processed: i64,
29    /// Number of dead jobs.
30    pub dead: usize,
31    /// Number of scheduled jobs.
32    pub scheduled: usize,
33    /// Number of jobs in retry queue.
34    pub retries: usize,
35    /// Maximum latency across all queues in seconds.
36    pub latency_s_max: f64,
37}
38
39/// Information about a job currently being processed.
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct StatsProcessing {
42    /// The process ID handling the job.
43    pub process_id: String,
44    /// The job envelope being processed.
45    pub job_envelope: JobEnvelope,
46}
47
48/// Statistics for a specific queue.
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct QueueStats {
51    /// The queue key/name.
52    pub key: String,
53
54    /// Number of jobs currently enqueued.
55    pub enqueued: usize,
56    /// Total number of jobs processed.
57    pub processed: i64,
58    /// Total number of jobs succeeded.
59    pub succeeded: i64,
60    /// Total number of jobs panicked.
61    pub panicked: i64,
62    /// Total number of jobs failed.
63    pub failed: i64,
64    /// Current latency in seconds.
65    pub latency_s: f64,
66
67    /// Dynamic sub-queue statistics (if any).
68    #[serde(skip_serializing_if = "Vec::is_empty")]
69    pub queues: Vec<DynamicQueueStats>,
70}
71
72/// Statistics for a dynamic sub-queue.
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct DynamicQueueStats {
75    /// The dynamic queue suffix.
76    pub suffix: String,
77
78    /// Number of jobs currently enqueued.
79    pub enqueued: usize,
80    /// Total number of jobs processed.
81    pub processed: i64,
82    /// Total number of jobs succeeded.
83    pub succeeded: i64,
84    /// Total number of jobs panicked.
85    pub panicked: i64,
86    /// Total number of jobs failed.
87    pub failed: i64,
88    /// Current latency in seconds.
89    pub latency_s: f64,
90}
91
92/// Information about an Oxanus worker process.
93#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct Process {
95    /// The hostname where the process is running.
96    pub hostname: String,
97    /// The process ID.
98    pub pid: u32,
99    /// Last heartbeat timestamp (Unix timestamp).
100    pub heartbeat_at: i64,
101    /// Process start timestamp (Unix timestamp).
102    pub started_at: i64,
103}
104
105impl Process {
106    /// Returns a unique identifier for the process.
107    #[must_use]
108    pub fn id(&self) -> String {
109        format!("{}-{}", self.hostname, self.pid)
110    }
111}