diff --git a/.changelog/5241.fixed b/.changelog/5241.fixed new file mode 100644 index 00000000000..0f5d7a626d4 --- /dev/null +++ b/.changelog/5241.fixed @@ -0,0 +1 @@ +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. 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()