mod log;
mod multi;
mod noop;
pub mod traits;
pub use self::log::LogObserver;
pub use self::multi::MultiObserver;
pub use self::noop::NoopObserver;
pub use self::traits::{Observer, ObserverEvent, ObserverMetric};
#[derive(Debug, Clone)]
pub struct ObservabilityConfig {
pub backend: String,
}
impl Default for ObservabilityConfig {
fn default() -> Self {
Self {
backend: "none".into(),
}
}
}
pub fn create_observer(config: &ObservabilityConfig) -> Box<dyn Observer> {
match config.backend.as_str() {
"log" => Box::new(LogObserver),
_ => Box::new(NoopObserver),
}
}
#[cfg(test)]
mod tests {
use crate::observability::*;
#[test]
fn default_config_is_none() {
let cfg = ObservabilityConfig::default();
assert_eq!(cfg.backend, "none");
}
#[test]
fn factory_returns_noop_for_none() {
let cfg = ObservabilityConfig {
backend: "none".into(),
};
let obs = create_observer(&cfg);
assert_eq!(obs.name(), "noop");
}
#[test]
fn factory_returns_noop_for_empty() {
let cfg = ObservabilityConfig {
backend: String::new(),
};
let obs = create_observer(&cfg);
assert_eq!(obs.name(), "noop");
}
#[test]
fn factory_returns_noop_for_unknown() {
let cfg = ObservabilityConfig {
backend: "prometheus".into(),
};
let obs = create_observer(&cfg);
assert_eq!(obs.name(), "noop");
}
#[test]
fn factory_returns_log_for_log() {
let cfg = ObservabilityConfig {
backend: "log".into(),
};
let obs = create_observer(&cfg);
assert_eq!(obs.name(), "log");
}
#[test]
fn factory_returns_noop_for_noop() {
let cfg = ObservabilityConfig {
backend: "noop".into(),
};
let obs = create_observer(&cfg);
assert_eq!(obs.name(), "noop");
}
}