use crate::{Result, TracingFormat};
use opentelemetry_sdk::trace::SdkTracerProvider;
use tracing_subscriber::{
EnvFilter, fmt::format::FmtSpan, layer::SubscriberExt, util::SubscriberInitExt,
};
#[derive(Debug)]
pub(super) struct Guard {
tracer: Option<SdkTracerProvider>,
}
impl Drop for Guard {
fn drop(&mut self) {
if let Some(tracer) = self.tracer.as_ref()
&& let Err(err) = tracer.shutdown()
{
eprintln!("{err:?}")
}
}
}
pub(super) fn init_tracing_subscriber(tracing_format: TracingFormat) -> Result<Guard> {
match tracing_format {
TracingFormat::Text => tracing_subscriber::registry()
.with(EnvFilter::from_default_env())
.with(
tracing_subscriber::fmt::layer()
.with_level(true)
.with_line_number(true)
.with_thread_ids(false)
.with_span_events(FmtSpan::FULL),
)
.init(),
TracingFormat::Json => tracing_subscriber::registry()
.with(EnvFilter::from_default_env())
.with(tracing_subscriber::fmt::layer().json())
.init(),
}
Ok(Guard { tracer: None })
}