diff --git a/lib/datadog/tracing/distributed/datadog.rb b/lib/datadog/tracing/distributed/datadog.rb index 1d5d496fad5..d4c8bf10f39 100644 --- a/lib/datadog/tracing/distributed/datadog.rb +++ b/lib/datadog/tracing/distributed/datadog.rb @@ -116,6 +116,8 @@ def build_tags(digest) def extract_trace_id!(trace_id, tags) return trace_id unless tags return trace_id unless (high_order = tags.delete(Tracing::Metadata::Ext::Distributed::TAG_TID)) + return trace_id unless high_order.size == 16 + return trace_id unless /\A[0-9a-f]+\z/i.match?(high_order) Tracing::Utils::TraceId.concatenate(high_order.to_i(16), trace_id) end diff --git a/spec/datadog/tracing/distributed/datadog_spec.rb b/spec/datadog/tracing/distributed/datadog_spec.rb index 4bd1e5ef100..69d83ce7cbc 100644 --- a/spec/datadog/tracing/distributed/datadog_spec.rb +++ b/spec/datadog/tracing/distributed/datadog_spec.rb @@ -503,6 +503,28 @@ it { expect(digest.span_id).to eq(0xbbbbbbbbbbbbbbbb) } it { expect(digest.trace_distributed_tags).not_to include('_dd.p.tid') } end + + context 'with a trace id and an invalid distributed tags `_dd.p.tid`' do + [ + '00123456789abcdef', # too long + '234567890abcdef', # too short + 'g123456789abcdef', # invalid character + ].each do |invalid_trace_id| + context "when given invalid trace_id: #{invalid_trace_id}" do + let(:data) do + { + prepare_key['x-datadog-trace-id'] => 0xffffffffffffffff.to_s, + prepare_key['x-datadog-parent-id'] => 0xbbbbbbbbbbbbbbbb.to_s, + prepare_key['x-datadog-tags'] => "_dd.p.tid= #{invalid_trace_id}" + } + end + + it { expect(digest.trace_id).to eq(0xffffffffffffffff) } + it { expect(digest.span_id).to eq(0xbbbbbbbbbbbbbbbb) } + it { expect(digest.trace_distributed_tags).not_to include('_dd.p.tid') } + end + end + end end end