qualia_core_db/foundation/
telemetry.rs1use std::sync::atomic::{AtomicUsize, Ordering};
6
7pub static SUPERBLOCK_IO_COUNT: AtomicUsize = AtomicUsize::new(0);
9
10pub static SIEVE_OPS_COUNT: AtomicUsize = AtomicUsize::new(0);
12
13pub static ATOMIC_FLOPS_COUNT: AtomicUsize = AtomicUsize::new(0);
15pub static ATOMIC_INTEGRATION_STEPS: AtomicUsize = AtomicUsize::new(0);
16
17pub static VM_CYCLES_COUNT: AtomicUsize = AtomicUsize::new(0);
19
20pub fn reset_telemetry() {
22 SUPERBLOCK_IO_COUNT.store(0, Ordering::SeqCst);
23 SIEVE_OPS_COUNT.store(0, Ordering::SeqCst);
24 ATOMIC_FLOPS_COUNT.store(0, Ordering::SeqCst);
25 ATOMIC_INTEGRATION_STEPS.store(0, Ordering::SeqCst);
26 VM_CYCLES_COUNT.store(0, Ordering::SeqCst);
27}
28
29pub fn get_telemetry_snapshot() -> (usize, usize, usize) {
31 (
32 SUPERBLOCK_IO_COUNT.load(Ordering::Relaxed),
33 SIEVE_OPS_COUNT.load(Ordering::Relaxed),
34 VM_CYCLES_COUNT.load(Ordering::Relaxed),
35 )
36}
37
38pub fn export_prometheus_metrics<W: std::io::Write>(mut writer: W) -> std::io::Result<()> {
41 let io = SUPERBLOCK_IO_COUNT.load(Ordering::Relaxed);
42 let sieve = SIEVE_OPS_COUNT.load(Ordering::Relaxed);
43 let vm = VM_CYCLES_COUNT.load(Ordering::Relaxed);
44 let flops = ATOMIC_FLOPS_COUNT.load(Ordering::Relaxed);
45 let steps = ATOMIC_INTEGRATION_STEPS.load(Ordering::Relaxed);
46
47 write!(
49 writer,
50 "# HELP qualia_superblock_io_total Total NVMe SuperBlock flushes\n"
51 )?;
52 write!(writer, "# TYPE qualia_superblock_io_total counter\n")?;
53 write!(writer, "qualia_superblock_io_total {}\n", io)?;
54
55 write!(
56 writer,
57 "# HELP qualia_sieve_ops_total GPU/NPU mask operations\n"
58 )?;
59 write!(writer, "# TYPE qualia_sieve_ops_total counter\n")?;
60 write!(writer, "qualia_sieve_ops_total {}\n", sieve)?;
61
62 write!(
63 writer,
64 "# HELP qualia_vm_cycles_total Webizen VM opcodes evaluated\n"
65 )?;
66 write!(writer, "# TYPE qualia_vm_cycles_total counter\n")?;
67 write!(writer, "qualia_vm_cycles_total {}\n", vm)?;
68
69 write!(
70 writer,
71 "# HELP qualia_atomic_flops_total Atomic integration float ops\n"
72 )?;
73 write!(writer, "# TYPE qualia_atomic_flops_total counter\n")?;
74 write!(writer, "qualia_atomic_flops_total {}\n", flops)?;
75
76 write!(
77 writer,
78 "# HELP qualia_atomic_steps_total Total integration steps\n"
79 )?;
80 write!(writer, "# TYPE qualia_atomic_steps_total counter\n")?;
81 write!(writer, "qualia_atomic_steps_total {}\n", steps)?;
82
83 Ok(())
84}
85
86pub fn log_federated_telemetry(metric_hash: u64, value: f64) -> crate::NQuin {
89 crate::NQuin {
90 subject: crate::q_hash("did:q42:local-node"),
91 predicate: metric_hash,
92 object: (0b010u64 << 60) | (value.to_bits() & 0x0FFF_FFFF_FFFF_FFFF),
94 context: 0,
95 metadata: 0,
96 parity: 0,
97 }
98}
99
100#[cfg(test)]
101mod tests {
102 use super::*;
103
104 #[test]
105 fn test_telemetry_atomics() {
106 reset_telemetry();
107
108 SUPERBLOCK_IO_COUNT.fetch_add(1, Ordering::Relaxed);
109 SIEVE_OPS_COUNT.fetch_add(5, Ordering::Relaxed);
110 VM_CYCLES_COUNT.fetch_add(100, Ordering::Relaxed);
111
112 let (io, sieve, vm) = get_telemetry_snapshot();
113 assert_eq!(io, 1);
114 assert_eq!(sieve, 5);
115 assert_eq!(vm, 100);
116 }
117}