Skip to main content

byteflow/scheduler/
metrics.rs

1use std::sync::atomic::{AtomicU64, Ordering};
2
3/// Runtime-wide counters (design notes ยง26). Every field is a plain
4/// `AtomicU64` bumped with `Relaxed` ordering: these are monitoring
5/// counters, not synchronization primitives, so we don't pay for anything
6/// stronger than "eventually visible to a metrics scrape."
7#[derive(Default)]
8pub struct RuntimeMetrics {
9    pub processes_spawned: AtomicU64,
10    pub processes_completed: AtomicU64,
11    pub processes_failed: AtomicU64,
12    pub messages_sent: AtomicU64,
13    pub steals: AtomicU64,
14    pub reschedules: AtomicU64,
15}
16
17impl RuntimeMetrics {
18    #[inline]
19    pub fn inc(counter: &AtomicU64) {
20        counter.fetch_add(1, Ordering::Relaxed);
21    }
22
23    pub fn snapshot(&self) -> RuntimeMetricsSnapshot {
24        RuntimeMetricsSnapshot {
25            processes_spawned: self.processes_spawned.load(Ordering::Relaxed),
26            processes_completed: self.processes_completed.load(Ordering::Relaxed),
27            processes_failed: self.processes_failed.load(Ordering::Relaxed),
28            messages_sent: self.messages_sent.load(Ordering::Relaxed),
29            steals: self.steals.load(Ordering::Relaxed),
30            reschedules: self.reschedules.load(Ordering::Relaxed),
31        }
32    }
33}
34
35/// Point-in-time, non-atomic copy of [`RuntimeMetrics`] suitable for
36/// printing or exporting.
37#[derive(Debug, Clone, Copy, Default)]
38pub struct RuntimeMetricsSnapshot {
39    pub processes_spawned: u64,
40    pub processes_completed: u64,
41    pub processes_failed: u64,
42    pub messages_sent: u64,
43    pub steals: u64,
44    pub reschedules: u64,
45}
46
47impl std::fmt::Display for RuntimeMetricsSnapshot {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        write!(
50            f,
51            "spawned={} completed={} failed={} messages={} steals={} reschedules={}",
52            self.processes_spawned,
53            self.processes_completed,
54            self.processes_failed,
55            self.messages_sent,
56            self.steals,
57            self.reschedules,
58        )
59    }
60}