pub trait MetricsRecorder: Send + Sync {
fn record_step_completed(&self, connector: &str, duration_secs: f64);
fn record_step_failed(&self, connector: &str);
fn record_connector_invocation(&self, connector: &str);
fn record_contextstore_write(&self);
fn record_flow_completed(&self);
fn record_flow_failed(&self);
}
pub struct NoopMetricsRecorder;
impl MetricsRecorder for NoopMetricsRecorder {
fn record_step_completed(&self, _: &str, _: f64) {}
fn record_step_failed(&self, _: &str) {}
fn record_connector_invocation(&self, _: &str) {}
fn record_contextstore_write(&self) {}
fn record_flow_completed(&self) {}
fn record_flow_failed(&self) {}
}
#[cfg(test)]
mod tests {
use std::sync::Arc;
use super::*;
#[test]
fn noop_recorder_does_not_panic() {
let recorder = NoopMetricsRecorder;
recorder.record_step_completed("delay", 0.5);
recorder.record_step_failed("http.request");
recorder.record_connector_invocation("fs.write");
recorder.record_contextstore_write();
recorder.record_flow_completed();
recorder.record_flow_failed();
}
#[test]
fn noop_recorder_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<NoopMetricsRecorder>();
}
#[test]
fn metrics_recorder_trait_object_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<Arc<dyn MetricsRecorder>>();
}
}