gesha_core/trace/
mod.rs

1mod message_layer;
2use message_layer::MessageLayer;
3
4use std::io;
5use std::time::Duration;
6use tokio::time::sleep;
7use tracing::Subscriber;
8use tracing::metadata::LevelFilter;
9use tracing_subscriber::filter::filter_fn;
10use tracing_subscriber::layer::{Filter, SubscriberExt};
11use tracing_subscriber::registry::LookupSpan;
12use tracing_subscriber::util::SubscriberInitExt;
13use tracing_subscriber::{EnvFilter, Layer, Registry};
14
15pub fn init() {
16    Registry::default().with(stdout_layer()).init();
17}
18
19/// wait for the otel exporter to finish
20pub async fn wait_to_export() {
21    sleep(duration()).await
22}
23
24pub(crate) fn duration() -> Duration {
25    Duration::from_millis(100)
26}
27
28pub(crate) fn filter_non_otel<S>() -> impl Filter<S>
29where
30    S: Subscriber + for<'a> LookupSpan<'a>,
31{
32    filter_fn(|metadata| !metadata.target().starts_with("opentelemetry"))
33}
34
35pub(crate) fn stdout_layer<S>() -> impl Layer<S>
36where
37    S: Subscriber + for<'a> LookupSpan<'a>,
38{
39    let env_filter = EnvFilter::builder()
40        .with_default_directive(LevelFilter::INFO.into())
41        .from_env_lossy();
42
43    MessageLayer::new(io::stdout)
44        .with_filter(filter_non_otel())
45        .with_filter(env_filter)
46}