1use std::sync::atomic::{AtomicU64, Ordering};
4
5#[derive(Debug, Default)]
7pub(crate) struct RuntimeStats {
8 pub(crate) lookup_hits: AtomicU64,
10 pub(crate) lookup_misses: AtomicU64,
12 pub(crate) events_dropped: AtomicU64,
14 pub(crate) commands_dropped: AtomicU64,
16 pub(crate) evictions: AtomicU64,
18 pub(crate) compilations_dispatched: AtomicU64,
20 pub(crate) compilations_succeeded: AtomicU64,
22 pub(crate) compilations_failed: AtomicU64,
24 pub(crate) jit_helper_spawns: AtomicU64,
26 pub(crate) jit_helper_spawn_failures: AtomicU64,
28 pub(crate) jit_helper_restarts: AtomicU64,
30 pub(crate) jit_helper_timeouts: AtomicU64,
32 pub(crate) jit_helper_disconnects: AtomicU64,
34 pub(crate) jit_helper_pause_requests: AtomicU64,
36 pub(crate) jit_helper_pause_acknowledgements: AtomicU64,
38 pub(crate) jit_helper_pause_failures: AtomicU64,
40 pub(crate) jit_helper_pause_timeouts: AtomicU64,
42 pub(crate) jit_helper_resume_requests: AtomicU64,
44 pub(crate) jit_helper_resume_failures: AtomicU64,
46}
47
48#[derive(Clone, Copy, Debug, Default)]
50pub(crate) struct RuntimeStatsGauges {
51 pub(crate) resident_entries: u64,
52 pub(crate) events_queued: u64,
53 pub(crate) command_queue_len: u64,
54}
55
56#[derive(Clone, Copy, Debug, Default)]
58pub struct RuntimeStatsSnapshot {
59 pub lookup_hits: u64,
61 pub lookup_misses: u64,
63 pub events_dropped: u64,
65 pub commands_dropped: u64,
70 pub resident_entries: u64,
72 pub events_queued: u64,
74 pub command_queue_len: u64,
76 pub pending_jobs: u64,
78 pub jit_code_bytes: u64,
84 pub jit_data_bytes: u64,
88 pub evictions: u64,
90 pub compilations_dispatched: u64,
92 pub compilations_succeeded: u64,
94 pub compilations_failed: u64,
96 pub jit_helper_spawns: u64,
98 pub jit_helper_spawn_failures: u64,
100 pub jit_helper_restarts: u64,
102 pub jit_helper_timeouts: u64,
104 pub jit_helper_disconnects: u64,
106 pub jit_helper_pause_requests: u64,
108 pub jit_helper_pause_acknowledgements: u64,
110 pub jit_helper_pause_failures: u64,
112 pub jit_helper_pause_timeouts: u64,
114 pub jit_helper_resume_requests: u64,
116 pub jit_helper_resume_failures: u64,
118}
119
120impl RuntimeStatsSnapshot {
121 pub fn jit_total_bytes(&self) -> u64 {
123 self.jit_code_bytes + self.jit_data_bytes
124 }
125}
126
127impl RuntimeStats {
128 pub(crate) fn snapshot(&self, gauges: RuntimeStatsGauges) -> RuntimeStatsSnapshot {
129 #[cfg(feature = "llvm")]
130 let (jit_code_bytes, jit_data_bytes) = crate::llvm::jit_memory_usage()
131 .map(|u| (u.code_bytes as u64, u.data_bytes as u64))
132 .unwrap_or((0, 0));
133 #[cfg(not(feature = "llvm"))]
134 let (jit_code_bytes, jit_data_bytes) = (0, 0);
135
136 let dispatched = self.compilations_dispatched.load(Ordering::Relaxed);
137 let succeeded = self.compilations_succeeded.load(Ordering::Relaxed);
138 let failed = self.compilations_failed.load(Ordering::Relaxed);
139 let pending_jobs = dispatched.saturating_sub(succeeded.saturating_add(failed));
140
141 RuntimeStatsSnapshot {
142 lookup_hits: self.lookup_hits.load(Ordering::Relaxed),
143 lookup_misses: self.lookup_misses.load(Ordering::Relaxed),
144 events_dropped: self.events_dropped.load(Ordering::Relaxed),
145 commands_dropped: self.commands_dropped.load(Ordering::Relaxed),
146 resident_entries: gauges.resident_entries,
147 events_queued: gauges.events_queued,
148 command_queue_len: gauges.command_queue_len,
149 pending_jobs,
150 jit_code_bytes,
151 jit_data_bytes,
152 evictions: self.evictions.load(Ordering::Relaxed),
153 compilations_dispatched: dispatched,
154 compilations_succeeded: succeeded,
155 compilations_failed: failed,
156 jit_helper_spawns: self.jit_helper_spawns.load(Ordering::Relaxed),
157 jit_helper_spawn_failures: self.jit_helper_spawn_failures.load(Ordering::Relaxed),
158 jit_helper_restarts: self.jit_helper_restarts.load(Ordering::Relaxed),
159 jit_helper_timeouts: self.jit_helper_timeouts.load(Ordering::Relaxed),
160 jit_helper_disconnects: self.jit_helper_disconnects.load(Ordering::Relaxed),
161 jit_helper_pause_requests: self.jit_helper_pause_requests.load(Ordering::Relaxed),
162 jit_helper_pause_acknowledgements: self
163 .jit_helper_pause_acknowledgements
164 .load(Ordering::Relaxed),
165 jit_helper_pause_failures: self.jit_helper_pause_failures.load(Ordering::Relaxed),
166 jit_helper_pause_timeouts: self.jit_helper_pause_timeouts.load(Ordering::Relaxed),
167 jit_helper_resume_requests: self.jit_helper_resume_requests.load(Ordering::Relaxed),
168 jit_helper_resume_failures: self.jit_helper_resume_failures.load(Ordering::Relaxed),
169 }
170 }
171}