Use global text map propagator for traceparent extraction
Register TraceContextPropagator as the global propagator in init_tracing,
then read the traceparent via get_text_map_propagator at the call site.
This delegates W3C formatting to the library rather than reimplementing it.

https://claude.ai/code/session_01Tbgz29e8A9KS4Bh94skkFX
change
commit 141618717df03942c01c061f88662f66e3ce4571
author Claude <noreply@anthropic.com>
date
parent 0f09a842
diff --git a/quire-core/src/telemetry.rs b/quire-core/src/telemetry.rs
index 0903d24..8ebcc08 100644
--- a/quire-core/src/telemetry.rs
+++ b/quire-core/src/telemetry.rs
@@ -224,6 +224,9 @@ pub fn init_tracing(miette_layer: MietteLayer, fmt_mode: FmtMode) -> miette::Res
         }
     };
 
+    opentelemetry::global::set_text_map_propagator(
+        opentelemetry_sdk::propagation::TraceContextPropagator::new(),
+    );
     let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder()
         .with_span_processor(sentry_opentelemetry::SentrySpanProcessor::new())
         .build();
diff --git a/quire-server/src/ci/mod.rs b/quire-server/src/ci/mod.rs
index 6c74b34..5b0b503 100644
--- a/quire-server/src/ci/mod.rs
+++ b/quire-server/src/ci/mod.rs
@@ -5,7 +5,7 @@ mod run;
 pub(crate) mod error;
 
 pub use error::{Error, Result};
-use opentelemetry::trace::TraceContextExt as _;
+use opentelemetry::propagation::TextMapPropagator as _;
 pub use quire_core::ci::pipeline::{
     DefinitionError, Diagnostic, Job, Pipeline, PipelineError, StructureError,
 };
@@ -169,15 +169,13 @@ fn run_ref(ctx: &TriggerContext<'_>, pushed_at: jiff::Timestamp, push_ref: &Push
     let session = ApiSession::new(ctx.port);
 
     let span = tracing::info_span!("quire.ci.run", repo = %ctx.event_repo);
-    let sc = span.context().span().span_context().clone();
-    let traceparent = sc.is_valid().then(|| {
-        format!(
-            "00-{}-{}-{:02x}",
-            sc.trace_id(),
-            sc.span_id(),
-            sc.trace_flags()
-        )
-    });
+    let traceparent = {
+        let mut carrier = std::collections::HashMap::new();
+        opentelemetry::global::get_text_map_propagator(|p| {
+            p.inject_context(&span.context(), &mut carrier)
+        });
+        carrier.remove("traceparent")
+    };
     let _guard = span.enter();
 
     sentry::with_scope(