diff --git a/lib/datadog/tracing/correlation.rb b/lib/datadog/tracing/correlation.rb index 5d1eb77f7d2..831608c83d0 100644 --- a/lib/datadog/tracing/correlation.rb +++ b/lib/datadog/tracing/correlation.rb @@ -73,12 +73,7 @@ def to_log_format end def trace_id - if Datadog.configuration.tracing.trace_id_128_bit_logging_enabled && - !Tracing::Utils::TraceId.to_high_order(@trace_id).zero? - Kernel.format('%032x', @trace_id) - else - Tracing::Utils::TraceId.to_low_order(@trace_id).to_s - end + Correlation.format_trace_id(@trace_id) end end @@ -97,6 +92,15 @@ def identifier_from_digest(digest) trace_id: digest.trace_id, ) end + + def format_trace_id(trace_id) + if Datadog.configuration.tracing.trace_id_128_bit_logging_enabled && + !Tracing::Utils::TraceId.to_high_order(trace_id).zero? + Kernel.format('%032x', trace_id) + else + Tracing::Utils::TraceId.to_low_order(trace_id).to_s + end + end end end end diff --git a/spec/datadog/tracing/correlation_spec.rb b/spec/datadog/tracing/correlation_spec.rb index ef2c8ac6f89..9b0946499fe 100644 --- a/spec/datadog/tracing/correlation_spec.rb +++ b/spec/datadog/tracing/correlation_spec.rb @@ -81,6 +81,74 @@ end end + describe '#trace_id' do + context 'when 128 bit trace id logging is not enabled' do + before do + allow(Datadog.configuration.tracing).to receive(:trace_id_128_bit_logging_enabled).and_return(false) + end + + context 'when given 64 bit trace id' do + it 'returns to lower 64 bits of trace id' do + trace_id = 0xaaaaaaaaaaaaaaaa + + result = described_class.format_trace_id(trace_id) + + # `0xaaaaaaaaaaaaaaaa.to_s` => '12297829382473034410' + expect(result).to eq('12297829382473034410') + end + end + + context 'when given 128 bit trace id' do + it 'returns to lower 64 bits of trace id' do + trace_id = 0xaaaaaaaaaaaaaaaaffffffffffffffff + + result = described_class.format_trace_id(trace_id) + + # `0xffffffffffffffff.to_s` => '18446744073709551615' + expect(result).to eq('18446744073709551615') + end + end + end + + context 'when 128 bit trace id logging is enabled' do + before do + allow(Datadog.configuration.tracing).to receive(:trace_id_128_bit_logging_enabled).and_return(true) + end + + context 'when given 64 bit trace id' do + it 'returns lower 64 bits of trace id' do + trace_id = 0xaaaaaaaaaaaaaaaa + + result = described_class.format_trace_id(trace_id) + + # `0xaaaaaaaaaaaaaaaa.to_s` => '12297829382473034410' + expect(result).to eq('12297829382473034410') + end + end + + context 'when given > 64 bit trace id' do + it 'returns the entire trace id in hex encoded and zero padded format' do + trace_id = 0x00ffffffffffffffaaaaaaaaaaaaaaaa + + result = described_class.format_trace_id(trace_id) + + expect(result).to eq('00ffffffffffffffaaaaaaaaaaaaaaaa') + end + end + + context 'when given > 64 bit trace id but high order is 0' do + it 'returns to lower 64 bits of trace id' do + trace_id = 0x00000000000000000aaaaaaaaaaaaaaaa + + result = described_class.format_trace_id(trace_id) + + # `0xaaaaaaaaaaaaaaaa.to_s` => '12297829382473034410' + expect(result).to eq('12297829382473034410') + end + end + end + end + describe described_class::Identifier do describe '#new' do context 'given no arguments' do