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, format: crate::cli::LogFormat) -> (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, format, hub.clone());
(handle, hub)
}
#[cfg(feature = "observability")]
fn install_subscriber(level: &str, format: crate::cli::LogFormat, 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 stderr_layer = tracing_subscriber::fmt::layer().with_writer(RedactingMakeWriter);
let initialised = match format {
crate::cli::LogFormat::Text => tracing_subscriber::registry()
.with(filter)
.with(stderr_layer)
.with(RunLogLayer::new(hub))
.try_init(),
crate::cli::LogFormat::Json => tracing_subscriber::registry()
.with(filter)
.with(
stderr_layer
.json()
.flatten_event(true)
.with_current_span(true)
.with_span_list(false),
)
.with(RunLogLayer::new(hub))
.try_init(),
};
if initialised.is_err() {
tracing::warn!("tracing subscriber already installed; continuing");
}
}
#[cfg(not(feature = "observability"))]
fn install_subscriber(_level: &str, _format: crate::cli::LogFormat, _hub: LogHub) {}