controller/
telemetry.rs

1use opentelemetry::trace::TraceId;
2
3///  Fetch an opentelemetry::trace::TraceId as hex through the full tracing stack
4pub fn get_trace_id() -> TraceId {
5    use opentelemetry::trace::TraceContextExt as _; // opentelemetry::Context -> opentelemetry::trace::Span
6    use tracing_opentelemetry::OpenTelemetrySpanExt as _; // tracing::Span to opentelemetry::Context
7
8    tracing::Span::current()
9        .context()
10        .span()
11        .span_context()
12        .trace_id()
13}
14
15#[cfg(feature = "telemetry")]
16pub async fn init_tracer() -> opentelemetry::sdk::trace::Tracer {
17    let otlp_endpoint =
18        std::env::var("OPENTELEMETRY_ENDPOINT_URL").expect("Need a otel tracing collector configured");
19
20    let channel = tonic::transport::Channel::from_shared(otlp_endpoint)
21        .unwrap()
22        .connect()
23        .await
24        .unwrap();
25
26    opentelemetry_otlp::new_pipeline()
27        .tracing()
28        .with_exporter(opentelemetry_otlp::new_exporter().tonic().with_channel(channel))
29        .with_trace_config(opentelemetry::sdk::trace::config().with_resource(
30            opentelemetry::sdk::Resource::new(vec![opentelemetry::KeyValue::new(
31                "service.name",
32                "cdb-controller",
33            )]),
34        ))
35        .install_batch(opentelemetry::runtime::Tokio)
36        .unwrap()
37}