diff --git a/lib/datadog/statsd.rb b/lib/datadog/statsd.rb index d666fad2..86d1797a 100644 --- a/lib/datadog/statsd.rb +++ b/lib/datadog/statsd.rb @@ -124,7 +124,7 @@ def initialize( origin_detection_enabled = origin_detection_enabled?(origin_detection) container_id = get_container_id(container_id, origin_detection_enabled) - external_data = sanitize(ENV['DD_EXTERNAL_ENV']) + external_data = sanitize(ENV['DD_EXTERNAL_ENV']) if origin_detection_enabled @serializer = Serialization::Serializer.new(prefix: @prefix, container_id: container_id, diff --git a/lib/datadog/statsd/telemetry.rb b/lib/datadog/statsd/telemetry.rb index 69a13418..c9905b62 100644 --- a/lib/datadog/statsd/telemetry.rb +++ b/lib/datadog/statsd/telemetry.rb @@ -40,7 +40,7 @@ def initialize(flush_interval, container_id, external_data, cardinality, global_ end def would_fit_in?(max_buffer_payload_size) - MAX_TELEMETRY_MESSAGE_SIZE_WT_TAGS + serialized_tags.size < max_buffer_payload_size + MAX_TELEMETRY_MESSAGE_SIZE_WT_TAGS + serialized_tags.size + serialized_fields.size < max_buffer_payload_size end def reset diff --git a/spec/matchers/telemetry_matcher.rb b/spec/matchers/telemetry_matcher.rb index 55a59509..673c1439 100644 --- a/spec/matchers/telemetry_matcher.rb +++ b/spec/matchers/telemetry_matcher.rb @@ -16,20 +16,24 @@ def add_telemetry(text, packets_dropped: 0, packets_dropped_queue: 0, packets_dropped_writer: 0, - transport: 'udp') + transport: 'udp', + external_env: '', + container: '') + external_env = "|e:#{external_env}" unless external_env.empty? + container = "|c:#{container}" unless container.empty? [ text, - "datadog.dogstatsd.client.metrics:#{metrics}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.events:#{events}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.service_checks:#{service_checks}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.bytes_sent:#{bytes_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.bytes_dropped:#{bytes_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.bytes_dropped_queue:#{bytes_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.bytes_dropped_writer:#{bytes_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.packets_sent:#{packets_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.packets_dropped:#{packets_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.packets_dropped_queue:#{packets_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", - "datadog.dogstatsd.client.packets_dropped_writer:#{packets_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}", + "datadog.dogstatsd.client.metrics:#{metrics}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.events:#{events}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.service_checks:#{service_checks}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.bytes_sent:#{bytes_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.bytes_dropped:#{bytes_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.bytes_dropped_queue:#{bytes_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.bytes_dropped_writer:#{bytes_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.packets_sent:#{packets_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.packets_dropped:#{packets_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.packets_dropped_queue:#{packets_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", + "datadog.dogstatsd.client.packets_dropped_writer:#{packets_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}", ].join("\n") end diff --git a/spec/statsd_spec.rb b/spec/statsd_spec.rb index f56d28a6..04848ddb 100644 --- a/spec/statsd_spec.rb +++ b/spec/statsd_spec.rb @@ -10,12 +10,12 @@ tags: tags, logger: logger, telemetry_flush_interval: -1, - # Only turn off origin detection for linux, other - # platforms should work as before even with it enabled. - origin_detection: !RUBY_PLATFORM.include?("linux"), + origin_detection: origin_detection, + container_id: container_id, ) end + let(:container_id) { nil } let(:namespace) { 'sample_ns' } let(:sample_rate) { nil } let(:tags) { %w[abc def] } @@ -25,6 +25,11 @@ end end let(:log) { StringIO.new } + let(:origin_detection) do + # Only turn off origin detection for linux, other + # platforms should work as before even with it enabled. + !RUBY_PLATFORM.include?("linux") + end before do allow(Socket).to receive(:new).and_return(socket) @@ -1295,4 +1300,44 @@ class Datadog::Statsd::SomeClass; end expect(socket.recv[0]).to eq_with_telemetry 'stat:1|c|#yolo' end end + + describe 'External env' do + let(:tags) { nil } + + before do + ENV['DD_EXTERNAL_ENV'] = 'it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759' + end + + context 'with origin detection configured on' do + let(:origin_detection) { true } + let(:container_id) { "container" } + + it 'outputs the external env value' do + subject.gauge('thing', 42) + subject.flush(sync: true) + + # With the lengthy external env being included in the telemetry payload, we send multiple payloads + # and need to capture them all. + packets = [] + while (packet = socket.recv) + packets << packet[0] + end + combined_message = packets.join("\n") + + expect(combined_message).to eq_with_telemetry('sample_ns.thing:42|g|c:container|e:it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759', + container: 'container', external_env: 'it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759') + end + end + + context 'with origin detection configured off' do + let(:origin_detection) { false } + + it 'does not output the external env value' do + subject.gauge('thing', 42) + subject.flush(sync: true) + + expect(socket.recv[0]).to eq_with_telemetry 'sample_ns.thing:42|g' + end + end + end end