1use opentelemetry::global;
2use opentelemetry_sdk::trace::Tracer;
3use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, Registry};
4
5pub fn init_tracer(service_name: &str) -> Result<(), Box<dyn std::error::Error>> {
7 let tracer = opentelemetry_otlp::new_pipeline()
9 .tracing()
10 .with_exporter(opentelemetry_otlp::new_exporter().tonic())
11 .install_batch(opentelemetry_sdk::runtime::Tokio)?;
12
13 let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
15
16 let env_filter = tracing_subscriber::EnvFilter::try_from_default_env()
18 .unwrap_or_else(|_| "info".into());
19
20 Registry::default()
21 .with(env_filter)
22 .with(telemetry)
23 .with(tracing_subscriber::fmt::layer())
24 .try_init()?;
25
26 tracing::info!("OpenTelemetry tracing initialized for service: {}", service_name);
27
28 Ok(())
29}
30
31pub fn shutdown_tracer() {
32 global::shutdown_tracer_provider();
33}