Skip to main content

road_runner_common/
observability.rs

1#[cfg(feature = "observability")]
2use once_cell::sync::OnceCell;
3
4#[cfg(feature = "observability")]
5static TRACING_INIT: OnceCell<()> = OnceCell::new();
6
7pub fn init_tracing(service_name: &str, log_level: Option<&str>, log_format: Option<&str>) {
8    #[cfg(feature = "observability")]
9    {
10        use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
11
12        if TRACING_INIT.get().is_some() {
13            return;
14        }
15
16        let format = log_format
17            .map(|s| s.to_lowercase())
18            .or_else(|| std::env::var("LOG_FORMAT").ok().map(|s| s.to_lowercase()))
19            .unwrap_or_else(|| "pretty".to_string());
20
21        let env_filter = tracing_subscriber::EnvFilter::try_from_default_env()
22            .or_else(|_| {
23                let lvl = log_level
24                    .map(|s| s.to_string())
25                    .or_else(|| std::env::var("LOG_LEVEL").ok())
26                    .unwrap_or_else(|| "info".to_string());
27
28                let fallback = format!("{},{}=debug", lvl, service_name);
29                Ok::<_, anyhow::Error>(tracing_subscriber::EnvFilter::new(fallback))
30            })
31            .unwrap_or_else(|_| tracing_subscriber::EnvFilter::new("info"));
32
33        let registry = tracing_subscriber::registry().with(env_filter);
34
35        if format == "pretty" {
36
37            let layer = tracing_subscriber::fmt::layer()
38                .with_target(true)
39                .with_thread_ids(true)
40                .compact();
41
42            let _ = registry.with(layer).try_init();
43        } else {
44            let layer = tracing_subscriber::fmt::layer()
45                .json()
46                .with_target(true)
47                .with_thread_ids(true);
48
49            let _ = registry.with(layer).try_init();
50        }
51
52        TRACING_INIT.set(()).ok();
53        tracing::info!("Observability initialized for service: {}", service_name);
54    }
55
56    #[cfg(not(feature = "observability"))]
57    {
58        let _ = (service_name, log_level, log_format);
59    }
60}