use std::sync::Arc;
use crate::rootcause;
use crate::sink::SpectraSink;
#[derive(Clone)]
pub struct CountingSink {
inner: Arc<dyn SpectraSink>,
}
impl CountingSink {
pub fn new(inner: Arc<dyn SpectraSink>) -> Self {
Self { inner }
}
pub fn install(self) {
crate::set_sink(Arc::new(self));
}
}
impl SpectraSink for CountingSink {
fn record_counter(&self, name: &str, labels: &[(&str, &str)], delta: i64) {
rootcause::record_emit_counter();
self.inner.record_counter(name, labels, delta);
}
fn record_gauge(&self, name: &str, labels: &[(&str, &str)], value: f64) {
rootcause::record_emit_gauge();
self.inner.record_gauge(name, labels, value);
}
fn log_event(&self, table: &str, fields: &serde_json::Value) {
rootcause::record_emit_event();
self.inner.log_event(table, fields);
}
}