diff --git a/lib/datadog/tracing/distributed/propagation.rb b/lib/datadog/tracing/distributed/propagation.rb index 8bf9547a029..5b0ed12b80f 100644 --- a/lib/datadog/tracing/distributed/propagation.rb +++ b/lib/datadog/tracing/distributed/propagation.rb @@ -101,17 +101,20 @@ def extract(data) # Only parse if it represent the same trace as the successfully extracted one next unless tracecontext_digest.trace_id == extracted_trace_digest.trace_id - tracecontext_digest.trace_distributed_tags |= {} - extracted_trace_digest.trace_distributed_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID] = if tracecontext_digest.span_id == extracted_trace_digest.span_id - "%.16x" % tracecontext_digest.span_id - else - # Preserve the last datadog parent id in `trace_distributed_tags` - tracecontext_digest.trace_distributed_tags.fetch(Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID, Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT) + distributed_tags = extracted_trace_digest.trace_distributed_tags + unless tracecontext_digest.span_id == extracted_trace_digest.span_id + distributed_tags = distributed_tags&.dup || {} + distributed_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID] = + tracecontext_digest.trace_distributed_tags.fetch( + Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID, + Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT + ) end - # Preserve the `tracestate` + # Preserve the trace state and last datadog span id extracted_trace_digest = extracted_trace_digest.merge( trace_state: tracecontext_digest.trace_state, - trace_state_unknown_fields: tracecontext_digest.trace_state_unknown_fields + trace_state_unknown_fields: tracecontext_digest.trace_state_unknown_fields, + trace_distributed_tags: distributed_tags ) end rescue => e