Skip to main content

qualia_core_db/foundation/
telemetry.rs

1//! Deterministic Compute Metering (Permissive Commons)
2//! Tracks implicit hardware cycles entirely without heap allocation
3//! or high-latency OS-level hardware sensors.
4
5use std::sync::atomic::{AtomicUsize, Ordering};
6
7/// Increments when Core 3 fetches/writes a 40KB SuperBlock
8pub static SUPERBLOCK_IO_COUNT: AtomicUsize = AtomicUsize::new(0);
9
10/// Increments when the GPU/NPU evaluates a bitmask across 850 Quins
11pub static SIEVE_OPS_COUNT: AtomicUsize = AtomicUsize::new(0);
12
13// "Energy of Logic" tracking metrics
14pub static ATOMIC_FLOPS_COUNT: AtomicUsize = AtomicUsize::new(0);
15pub static ATOMIC_INTEGRATION_STEPS: AtomicUsize = AtomicUsize::new(0);
16
17/// Core operational telemetry aggregate dump structed inside the Webizen VM
18pub static VM_CYCLES_COUNT: AtomicUsize = AtomicUsize::new(0);
19
20/// Resets all global deterministic metrics for a new query lifecycle.
21pub 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
29/// Retrieves the current metric snapshot.
30pub 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
38/// Zero-allocation Prometheus Exporter
39/// Writes telemetry metrics directly to a byte buffer without string formatting overhead.
40pub 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 out Prometheus metrics in text format directly (zero heap allocation)
48    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
86/// Logs federated system telemetry (latency, VLM compute load) as a System_Log Quin.
87/// Converts the semantic metric into a 48-byte struct instead of heap strings.
88pub 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        // Mock inline decimal representation for telemetry value
93        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}