diff --git a/.changelog/5793.fixed b/.changelog/5793.fixed new file mode 100644 index 0000000000..b7c232806b --- /dev/null +++ b/.changelog/5793.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)