drogue_bazaar/app/init/
tracing.rs1#[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 pub fn is_enabled(&self) -> bool {
17 !matches!(self, Self::Disabled)
18 }
19}
20
21fn 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}