use std::sync::atomic::{AtomicUsize, Ordering};
use tracing::info;
#[derive(Debug, Default)]
pub struct TenantMeter {
pub query_count: AtomicUsize,
pub rows_scanned: AtomicUsize,
pub gpu_ms: AtomicUsize,
}
impl TenantMeter {
pub fn new() -> Self {
Self::default()
}
pub fn record_query(&self, rows: usize, gpu_time_ms: usize) {
self.query_count.fetch_add(1, Ordering::Relaxed);
self.rows_scanned.fetch_add(rows, Ordering::Relaxed);
self.gpu_ms.fetch_add(gpu_time_ms, Ordering::Relaxed);
}
pub fn flush(&self) -> (usize, usize, usize) {
let q = self.query_count.swap(0, Ordering::Relaxed);
let r = self.rows_scanned.swap(0, Ordering::Relaxed);
let g = self.gpu_ms.swap(0, Ordering::Relaxed);
(q, r, g)
}
}
pub struct MeteringSystem {
}
impl MeteringSystem {
pub fn new() -> Self {
Self {}
}
pub async fn start_flush_loop(&self) {
info!("metering flush loop started (stub — no billing backend configured)");
}
}
impl Default for MeteringSystem {
fn default() -> Self {
Self::new()
}
}