Skip to content

Commit fd8e504

Browse files
Preserve random trace ID flag for child spans (#5241) (#5242)
* fix: preserve random trace flag for child spans Assisted-by: OpenAI Codex * chore: add changelog for random trace flag fix Assisted-by: OpenAI Codex * chore: clarify random trace flag changelog Assisted-by: OpenAI Codex Co-authored-by: Tasdiqul Islam <tasdiq088@gmail.com>
1 parent 013045e commit fd8e504

3 files changed

Lines changed: 36 additions & 1 deletion

File tree

.changelog/5241.fixed

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
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.

opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1225,7 +1225,12 @@ def start_span( # pylint: disable=too-many-locals
12251225
else trace_api.TraceFlags(trace_api.TraceFlags.DEFAULT)
12261226
)
12271227

1228-
if self.id_generator.is_trace_id_random():
1228+
if parent_span_context is None:
1229+
random_trace_id = self.id_generator.is_trace_id_random()
1230+
else:
1231+
random_trace_id = parent_span_context.trace_flags.random_trace_id
1232+
1233+
if random_trace_id:
12291234
trace_flags = trace_api.TraceFlags(
12301235
trace_flags | trace_api.TraceFlags.RANDOM_TRACE_ID
12311236
)

opentelemetry-sdk/tests/trace/test_trace.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,35 @@ def test_start_span_explicit(self):
517517
self.assertIs(trace_api.get_current_span(), root)
518518
self.assertIsNotNone(child.end_time)
519519

520+
def test_start_span_preserves_parent_random_trace_id_flag(self):
521+
tracer = new_tracer()
522+
523+
for parent_trace_flags in (
524+
trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED),
525+
trace_api.TraceFlags(
526+
trace_api.TraceFlags.SAMPLED
527+
| trace_api.TraceFlags.RANDOM_TRACE_ID
528+
),
529+
):
530+
with self.subTest(parent_trace_flags=parent_trace_flags):
531+
parent_context = trace_api.SpanContext(
532+
trace_id=0x000000000000000000000000DEADBEEF,
533+
span_id=0x00000000DEADBEF0,
534+
is_remote=True,
535+
trace_flags=parent_trace_flags,
536+
)
537+
context = trace_api.set_span_in_context(
538+
trace_api.NonRecordingSpan(parent_context)
539+
)
540+
541+
child = tracer.start_span("child", context)
542+
child_trace_flags = child.get_span_context().trace_flags
543+
544+
self.assertEqual(
545+
parent_trace_flags.random_trace_id,
546+
child_trace_flags.random_trace_id,
547+
)
548+
520549
def test_start_as_current_span_implicit(self):
521550
tracer = new_tracer()
522551

0 commit comments

Comments
 (0)