From bb09935e2f4e5615e1bb067e6a14b2fedb14d010 Mon Sep 17 00:00:00 2001 From: Guillaume Marty Date: Sun, 25 Oct 2026 19:35:23 +0100 Subject: [PATCH 1/2] fix(jaeger): accept URL-encoded uber-trace-id on extract Some Jaeger clients URL-encode the uber-trace-id value, turning the ':' delimiter into '%3A'. The Java and .NET Jaeger propagators decode such values, but the Python propagator rejected them and dropped the trace context. Decode the header when no plain delimiter is present. --- .changelog/jaeger-encoded-trace-id.fixed | 1 + .../src/opentelemetry/propagators/jaeger/__init__.py | 5 +++++ .../tests/test_jaeger_propagator.py | 8 ++++++++ 3 files changed, 14 insertions(+) create mode 100644 .changelog/jaeger-encoded-trace-id.fixed diff --git a/.changelog/jaeger-encoded-trace-id.fixed b/.changelog/jaeger-encoded-trace-id.fixed new file mode 100644 index 0000000000..b7c232806b --- /dev/null +++ b/.changelog/jaeger-encoded-trace-id.fixed @@ -0,0 +1 @@ +`opentelemetry-propagator-jaeger`: Accept a URL-encoded `uber-trace-id` header on extract diff --git a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py index 98c95d0ae6..3470bc90a7 100644 --- a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py +++ b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py @@ -185,6 +185,11 @@ def _parse_trace_id_header( if header is None: return invalid_header_result + # some Jaeger clients URL-encode the header value, including the ":" + # delimiter, so decode it when no plain delimiter can be found + if ":" not in header: + header = urllib.parse.unquote(header) + fields = header.split(":") if len(fields) != 4: return invalid_header_result diff --git a/propagator/opentelemetry-propagator-jaeger/tests/test_jaeger_propagator.py b/propagator/opentelemetry-propagator-jaeger/tests/test_jaeger_propagator.py index 9d318a0886..3f59953c21 100644 --- a/propagator/opentelemetry-propagator-jaeger/tests/test_jaeger_propagator.py +++ b/propagator/opentelemetry-propagator-jaeger/tests/test_jaeger_propagator.py @@ -66,6 +66,14 @@ def test_extract_valid_span(self): self.assertEqual(span_context.trace_id, self.trace_id) self.assertEqual(span_context.span_id, self.span_id) + def test_extract_url_encoded_span(self): + # some Jaeger clients URL-encode the ':' delimiter of uber-trace-id + old_carrier = {FORMAT.TRACE_ID_KEY: self.serialized_uber_trace_id.replace(":", "%3A")} + ctx = FORMAT.extract(old_carrier) + span_context = trace_api.get_current_span(ctx).get_span_context() + self.assertEqual(span_context.trace_id, self.trace_id) + self.assertEqual(span_context.span_id, self.span_id) + def test_missing_carrier(self): old_carrier = {} ctx = FORMAT.extract(old_carrier) From 7596bfdbad122b50b3cd75ba2547dfb3f5f2e498 Mon Sep 17 00:00:00 2001 From: Guillaume Marty Date: Sun, 25 Oct 2026 19:35:26 +0100 Subject: [PATCH 2/2] Rename changelog fragment to PR number --- .changelog/{jaeger-encoded-trace-id.fixed => 5793.fixed} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changelog/{jaeger-encoded-trace-id.fixed => 5793.fixed} (100%) diff --git a/.changelog/jaeger-encoded-trace-id.fixed b/.changelog/5793.fixed similarity index 100% rename from .changelog/jaeger-encoded-trace-id.fixed rename to .changelog/5793.fixed