road_runner_common/
observability.rs1#[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}