use crate::Error;
use opentelemetry::trace::TraceError;
use opentelemetry_sdk::trace::Tracer;
use tracing::{info, Subscriber};
use tracing_opentelemetry::OpenTelemetryLayer;
use tracing_subscriber::filter::EnvFilter;
use tracing_subscriber::fmt::format::FmtSpan;
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::registry::LookupSpan;
use tracing_subscriber::Layer;
#[must_use]
pub fn build_logger_text<S>() -> Box<dyn Layer<S> + Send + Sync + 'static>
where
S: Subscriber + for<'a> LookupSpan<'a>,
{
if cfg!(debug_assertions) {
Box::new(
tracing_subscriber::fmt::layer()
.pretty()
.with_line_number(true)
.with_thread_names(true)
.with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)
.with_timer(tracing_subscriber::fmt::time::uptime()),
)
} else {
Box::new(
tracing_subscriber::fmt::layer()
.json()
.with_timer(tracing_subscriber::fmt::time::uptime()),
)
}
}
#[must_use]
pub fn build_loglevel_filter_layer() -> tracing_subscriber::filter::EnvFilter {
std::env::set_var(
"RUST_LOG",
format!(
"{},otel::tracing=trace,otel=debug",
std::env::var("RUST_LOG")
.or_else(|_| std::env::var("OTEL_LOG_LEVEL"))
.unwrap_or_else(|_| "info".to_string())
),
);
EnvFilter::from_default_env()
}
pub fn build_otel_layer<S>() -> Result<OpenTelemetryLayer<S, Tracer>, TraceError>
where
S: Subscriber + for<'a> LookupSpan<'a>,
{
use crate::{
init_propagator, otlp,
resource::DetectResource,
};
let otel_rsrc = DetectResource::default()
.build();
let otel_tracer = otlp::init_tracer(otel_rsrc, otlp::identity)?;
init_propagator()?;
Ok(tracing_opentelemetry::layer()
.with_error_records_to_exceptions(true)
.with_tracer(otel_tracer))
}
pub fn init_subscribers() -> Result<(), Error> {
let subscriber = tracing_subscriber::registry()
.with(build_loglevel_filter_layer())
.with(build_logger_text());
let _guard = tracing::subscriber::set_default(subscriber);
info!("init logging & tracing");
let subscriber = tracing_subscriber::registry()
.with(build_otel_layer()?)
.with(build_loglevel_filter_layer())
.with(build_logger_text());
tracing::subscriber::set_global_default(subscriber)?;
Ok(())
}