use std::sync::OnceLock;
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
#[cfg(feature = "opentelemetry")]
mod otel;
#[cfg(feature = "opentelemetry")]
pub use otel::{OtelConfig, OtelError, init_with_otel, shutdown_otel};
#[cfg(test)]
mod tests;
static TRACING: OnceLock<()> = OnceLock::new();
pub fn init(filter: Option<&str>, default_filter: &str) {
TRACING.get_or_init(|| {
let env_filter = build_filter(filter, default_filter);
let fmt_layer = build_fmt_layer();
tracing_subscriber::registry()
.with(env_filter)
.with(fmt_layer)
.init();
});
}
pub(crate) fn build_filter(filter: Option<&str>, default_filter: &str) -> EnvFilter {
if let Some(explicit) = filter {
EnvFilter::try_new(explicit).unwrap_or_else(|_| EnvFilter::new(default_filter))
} else if let Ok(env_filter) = EnvFilter::try_from_default_env() {
env_filter
} else {
EnvFilter::new(default_filter)
}
}
pub(crate) fn build_fmt_layer<S>() -> impl tracing_subscriber::Layer<S>
where
S: tracing::Subscriber + for<'a> tracing_subscriber::registry::LookupSpan<'a>,
{
fmt::layer()
.compact()
.with_level(true)
.with_target(false)
.with_file(false)
.with_line_number(false)
}
pub fn is_initialized() -> bool {
TRACING.get().is_some()
}