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}