From 33de25491552304fbdc5d98b34c6b77c8dcbd45c Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Wed, 20 May 2026 22:25:10 -0500 Subject: [PATCH 1/3] fix: preserve random trace flag for child spans Assisted-by: OpenAI Codex --- .../src/opentelemetry/sdk/trace/__init__.py | 7 ++++- opentelemetry-sdk/tests/trace/test_trace.py | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 9cdfebeb475..3817408690e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -1225,7 +1225,12 @@ def start_span( # pylint: disable=too-many-locals else trace_api.TraceFlags(trace_api.TraceFlags.DEFAULT) ) - if self.id_generator.is_trace_id_random(): + if parent_span_context is None: + random_trace_id = self.id_generator.is_trace_id_random() + else: + random_trace_id = parent_span_context.trace_flags.random_trace_id + + if random_trace_id: trace_flags = trace_api.TraceFlags( trace_flags | trace_api.TraceFlags.RANDOM_TRACE_ID ) diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index 6221da51cb2..0b07908ec5b 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -517,6 +517,35 @@ def test_start_span_explicit(self): self.assertIs(trace_api.get_current_span(), root) self.assertIsNotNone(child.end_time) + def test_start_span_preserves_parent_random_trace_id_flag(self): + tracer = new_tracer() + + for parent_trace_flags in ( + trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED), + trace_api.TraceFlags( + trace_api.TraceFlags.SAMPLED + | trace_api.TraceFlags.RANDOM_TRACE_ID + ), + ): + with self.subTest(parent_trace_flags=parent_trace_flags): + parent_context = trace_api.SpanContext( + trace_id=0x000000000000000000000000DEADBEEF, + span_id=0x00000000DEADBEF0, + is_remote=True, + trace_flags=parent_trace_flags, + ) + context = trace_api.set_span_in_context( + trace_api.NonRecordingSpan(parent_context) + ) + + child = tracer.start_span("child", context) + child_trace_flags = child.get_span_context().trace_flags + + self.assertEqual( + parent_trace_flags.random_trace_id, + child_trace_flags.random_trace_id, + ) + def test_start_as_current_span_implicit(self): tracer = new_tracer() From 4f4b4ad308bac6983310032dc964bced51de3d99 Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Wed, 20 May 2026 22:26:08 -0500 Subject: [PATCH 2/3] chore: add changelog for random trace flag fix Assisted-by: OpenAI Codex --- .changelog/5241.fixed | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/5241.fixed diff --git a/.changelog/5241.fixed b/.changelog/5241.fixed new file mode 100644 index 00000000000..aa5137a643e --- /dev/null +++ b/.changelog/5241.fixed @@ -0,0 +1 @@ +Preserve the random trace ID flag when creating child spans. From 61425321fa4989159eee53fdfaaeecfcf6c59c5a Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Thu, 21 May 2026 09:11:26 -0500 Subject: [PATCH 3/3] chore: clarify random trace flag changelog Assisted-by: OpenAI Codex --- .changelog/5241.fixed | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changelog/5241.fixed b/.changelog/5241.fixed index aa5137a643e..0f5d7a626d4 100644 --- a/.changelog/5241.fixed +++ b/.changelog/5241.fixed @@ -1 +1 @@ -Preserve the random trace ID flag when creating child spans. +Preserve the random trace ID flag when creating child spans instead of always setting the random trace id bit depending on the available trace id generator.