trace2e_core/
lib.rs

1//! A distributed traceability middleware.
2//!
3//! This software provides a mediation layer that provides provenance recording
4//! and compliance enforcement on I/O objects such as files or streams. The use
5//! of a custom I/O library is required to wrap standard I/O library methods to
6//! make input/output conditional on middleware authorization.
7//!
8//! A unique instance of this software should run on each node where
9//! traceability is enforced.
10//!
11//! Process/middleware and middleware/middleware communication relies on [`tonic`],
12//! a Rust implementation of gRPC, a high performance, open source RPC framework.
13//!
14//! [`tonic`]: https://docs.rs/tonic
15
16#[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}