Skip to main content

ferrox_tracing/
lib.rs

1use opentelemetry::global;
2use opentelemetry_sdk::trace::Tracer;
3use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, Registry};
4
5/// Initializes OpenTelemetry and Tracing for Distributed Systems
6pub fn init_tracer(service_name: &str) -> Result<(), Box<dyn std::error::Error>> {
7    // 1. Initialize OTLP pipeline
8    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    // 2. Setup tracing subscriber with OTLP layer and console output
14    let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
15    
16    // Add environment filter (e.g. RUST_LOG=info)
17    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}