drogue_bazaar/app/init/
tracing.rs

1#[derive(Clone, Debug, serde::Deserialize)]
2#[serde(rename_all = "camelCase")]
3pub enum Tracing {
4    Disabled,
5    Jaeger,
6}
7
8impl Default for Tracing {
9    fn default() -> Self {
10        Self::Disabled
11    }
12}
13
14impl Tracing {
15    /// Check if tracing is enabled, or not.
16    pub fn is_enabled(&self) -> bool {
17        !matches!(self, Self::Disabled)
18    }
19}
20
21/// Try getting the sampling rate from the environment variables
22fn sampling_from_env() -> Option<f64> {
23    std::env::var_os("OTEL_TRACES_SAMPLER_ARG")
24        .and_then(|s| s.to_str().map(|s| s.parse::<f64>().ok()).unwrap())
25}
26
27fn sampler() -> opentelemetry::sdk::trace::Sampler {
28    if let Some(p) = sampling_from_env() {
29        opentelemetry::sdk::trace::Sampler::TraceIdRatioBased(p)
30    } else {
31        opentelemetry::sdk::trace::Sampler::TraceIdRatioBased(0.001)
32    }
33}
34
35pub fn init_tracing(name: &str, tracing: Tracing) {
36    match tracing {
37        Tracing::Disabled => {
38            init_no_tracing();
39        }
40        Tracing::Jaeger => {
41            init_jaeger(name);
42        }
43    }
44}
45
46pub fn init_jaeger(name: &str) {
47    use tracing_subscriber::prelude::*;
48
49    opentelemetry::global::set_text_map_propagator(
50        opentelemetry::sdk::propagation::TraceContextPropagator::new(),
51    );
52    let pipeline = opentelemetry_jaeger::new_agent_pipeline()
53        .with_service_name(name)
54        .with_auto_split_batch(true)
55        .with_trace_config(opentelemetry::sdk::trace::Config::default().with_sampler(
56            opentelemetry::sdk::trace::Sampler::ParentBased(Box::new(sampler())),
57        ));
58
59    println!("Using Jaeger tracing.");
60    println!("{:#?}", pipeline);
61    println!("Tracing is enabled. This console will not show any logging information.");
62
63    let tracer = pipeline
64        .install_batch(opentelemetry::runtime::Tokio)
65        .unwrap();
66
67    tracing_subscriber::Registry::default()
68        .with(tracing_subscriber::EnvFilter::from_default_env())
69        .with(tracing_opentelemetry::layer().with_tracer(tracer))
70        .init();
71}
72
73fn init_no_tracing() {
74    env_logger::builder().format_timestamp_millis().init();
75    log::info!("No tracing subscriber is active, logging stays active");
76}