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
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(