use crate::serve::logs::LogHub;
use metrics_exporter_prometheus::{PrometheusBuilder, PrometheusHandle};
use std::sync::OnceLock;
static LOG_HUB: OnceLock<LogHub> = OnceLock::new();
pub fn install(level: &str) -> (Option<PrometheusHandle>, LogHub) {
let handle = match PrometheusBuilder::new().install_recorder() {
Ok(h) => Some(h),
Err(e) => {
tracing::warn!("Prometheus recorder already installed or failed: {e}");
None
}
};
faucet_core::register_build_info();
let hub = LOG_HUB.get_or_init(LogHub::new).clone();
install_subscriber(level, hub.clone());
(handle, hub)
}
#[cfg(feature = "observability")]
fn install_subscriber(level: &str, hub: LogHub) {
use crate::secrets::registry::RedactingMakeWriter;
use crate::serve::logs::RunLogLayer;
use tracing_subscriber::EnvFilter;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::util::SubscriberInitExt;
let filter = EnvFilter::try_new(level).unwrap_or_else(|_| EnvFilter::new("info"));
let registry = tracing_subscriber::registry()
.with(filter)
.with(tracing_subscriber::fmt::layer().with_writer(RedactingMakeWriter))
.with(RunLogLayer::new(hub));
if registry.try_init().is_err() {
tracing::warn!("tracing subscriber already installed; continuing");
}
}
#[cfg(not(feature = "observability"))]
fn install_subscriber(_level: &str, _hub: LogHub) {}