1#[cfg(test)]
17pub mod tests;
18
19pub mod traceability;
20pub mod transport;
21
22pub mod trace2e_tracing {
23 use std::sync::{Once, OnceLock};
24
25 use opentelemetry_sdk::logs::SdkLoggerProvider;
26 use tracing_subscriber::{
27 EnvFilter, Layer, fmt, layer::SubscriberExt, util::SubscriberInitExt,
28 };
29
30 static INIT: Once = Once::new();
31 static LOGGER_PROVIDER: OnceLock<SdkLoggerProvider> = OnceLock::new();
32
33 pub fn init() {
34 INIT.call_once(|| {
35 let filter =
36 EnvFilter::try_from_default_env().or_else(|_| EnvFilter::try_new("off")).unwrap();
37
38 if std::env::var("OTEL_EXPORTER_OTLP_ENDPOINT").is_ok() {
39 let exporter = opentelemetry_otlp::LogExporter::builder()
40 .with_tonic()
41 .build()
42 .expect("failed to build OTLP log exporter");
43
44 let provider = SdkLoggerProvider::builder().with_batch_exporter(exporter).build();
45
46 let otel_layer =
47 opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge::new(
48 &provider,
49 );
50 let otel_filter = EnvFilter::new("info")
51 .add_directive("hyper=off".parse().unwrap())
52 .add_directive("tonic=off".parse().unwrap())
53 .add_directive("h2=off".parse().unwrap())
54 .add_directive("reqwest=off".parse().unwrap());
55
56 let fmt_layer = fmt::layer().with_target(false);
57
58 tracing_subscriber::registry()
59 .with(otel_layer.with_filter(otel_filter))
60 .with(fmt_layer.with_filter(filter))
61 .init();
62
63 let _ = LOGGER_PROVIDER.set(provider);
64 } else {
65 fmt().with_target(false).with_test_writer().with_env_filter(filter).init();
66 }
67 });
68 }
69
70 pub fn shutdown() {
71 if let Some(provider) = LOGGER_PROVIDER.get()
72 && let Err(e) = provider.shutdown()
73 {
74 eprintln!("failed to shut down OTEL logger provider: {e}");
75 }
76 }
77}