Skip to content

Commit d7470c7

Browse files
Configure external env with origin detection (#316)
1 parent e5c20a3 commit d7470c7

File tree

4 files changed

+66
-17
lines changed

4 files changed

+66
-17
lines changed

lib/datadog/statsd.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def initialize(
124124
origin_detection_enabled = origin_detection_enabled?(origin_detection)
125125
container_id = get_container_id(container_id, origin_detection_enabled)
126126

127-
external_data = sanitize(ENV['DD_EXTERNAL_ENV'])
127+
external_data = sanitize(ENV['DD_EXTERNAL_ENV']) if origin_detection_enabled
128128

129129
@serializer = Serialization::Serializer.new(prefix: @prefix,
130130
container_id: container_id,

lib/datadog/statsd/telemetry.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def initialize(flush_interval, container_id, external_data, cardinality, global_
4040
end
4141

4242
def would_fit_in?(max_buffer_payload_size)
43-
MAX_TELEMETRY_MESSAGE_SIZE_WT_TAGS + serialized_tags.size < max_buffer_payload_size
43+
MAX_TELEMETRY_MESSAGE_SIZE_WT_TAGS + serialized_tags.size + serialized_fields.size < max_buffer_payload_size
4444
end
4545

4646
def reset

spec/matchers/telemetry_matcher.rb

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,24 @@ def add_telemetry(text,
1616
packets_dropped: 0,
1717
packets_dropped_queue: 0,
1818
packets_dropped_writer: 0,
19-
transport: 'udp')
19+
transport: 'udp',
20+
external_env: '',
21+
container: '')
22+
external_env = "|e:#{external_env}" unless external_env.empty?
23+
container = "|c:#{container}" unless container.empty?
2024
[
2125
text,
22-
"datadog.dogstatsd.client.metrics:#{metrics}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
23-
"datadog.dogstatsd.client.events:#{events}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
24-
"datadog.dogstatsd.client.service_checks:#{service_checks}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
25-
"datadog.dogstatsd.client.bytes_sent:#{bytes_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
26-
"datadog.dogstatsd.client.bytes_dropped:#{bytes_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
27-
"datadog.dogstatsd.client.bytes_dropped_queue:#{bytes_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
28-
"datadog.dogstatsd.client.bytes_dropped_writer:#{bytes_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
29-
"datadog.dogstatsd.client.packets_sent:#{packets_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
30-
"datadog.dogstatsd.client.packets_dropped:#{packets_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
31-
"datadog.dogstatsd.client.packets_dropped_queue:#{packets_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
32-
"datadog.dogstatsd.client.packets_dropped_writer:#{packets_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}",
26+
"datadog.dogstatsd.client.metrics:#{metrics}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
27+
"datadog.dogstatsd.client.events:#{events}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
28+
"datadog.dogstatsd.client.service_checks:#{service_checks}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
29+
"datadog.dogstatsd.client.bytes_sent:#{bytes_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
30+
"datadog.dogstatsd.client.bytes_dropped:#{bytes_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
31+
"datadog.dogstatsd.client.bytes_dropped_queue:#{bytes_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
32+
"datadog.dogstatsd.client.bytes_dropped_writer:#{bytes_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
33+
"datadog.dogstatsd.client.packets_sent:#{packets_sent}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
34+
"datadog.dogstatsd.client.packets_dropped:#{packets_dropped}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
35+
"datadog.dogstatsd.client.packets_dropped_queue:#{packets_dropped_queue}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
36+
"datadog.dogstatsd.client.packets_dropped_writer:#{packets_dropped_writer}|c|#client:ruby,client_version:#{Datadog::Statsd::VERSION},client_transport:#{transport}#{container}#{external_env}",
3337
].join("\n")
3438
end
3539

spec/statsd_spec.rb

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
tags: tags,
1111
logger: logger,
1212
telemetry_flush_interval: -1,
13-
# Only turn off origin detection for linux, other
14-
# platforms should work as before even with it enabled.
15-
origin_detection: !RUBY_PLATFORM.include?("linux"),
13+
origin_detection: origin_detection,
14+
container_id: container_id,
1615
)
1716
end
1817

18+
let(:container_id) { nil }
1919
let(:namespace) { 'sample_ns' }
2020
let(:sample_rate) { nil }
2121
let(:tags) { %w[abc def] }
@@ -25,6 +25,11 @@
2525
end
2626
end
2727
let(:log) { StringIO.new }
28+
let(:origin_detection) do
29+
# Only turn off origin detection for linux, other
30+
# platforms should work as before even with it enabled.
31+
!RUBY_PLATFORM.include?("linux")
32+
end
2833

2934
before do
3035
allow(Socket).to receive(:new).and_return(socket)
@@ -1295,4 +1300,44 @@ class Datadog::Statsd::SomeClass; end
12951300
expect(socket.recv[0]).to eq_with_telemetry 'stat:1|c|#yolo'
12961301
end
12971302
end
1303+
1304+
describe 'External env' do
1305+
let(:tags) { nil }
1306+
1307+
before do
1308+
ENV['DD_EXTERNAL_ENV'] = 'it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759'
1309+
end
1310+
1311+
context 'with origin detection configured on' do
1312+
let(:origin_detection) { true }
1313+
let(:container_id) { "container" }
1314+
1315+
it 'outputs the external env value' do
1316+
subject.gauge('thing', 42)
1317+
subject.flush(sync: true)
1318+
1319+
# With the lengthy external env being included in the telemetry payload, we send multiple payloads
1320+
# and need to capture them all.
1321+
packets = []
1322+
while (packet = socket.recv)
1323+
packets << packet[0]
1324+
end
1325+
combined_message = packets.join("\n")
1326+
1327+
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',
1328+
container: 'container', external_env: 'it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759')
1329+
end
1330+
end
1331+
1332+
context 'with origin detection configured off' do
1333+
let(:origin_detection) { false }
1334+
1335+
it 'does not output the external env value' do
1336+
subject.gauge('thing', 42)
1337+
subject.flush(sync: true)
1338+
1339+
expect(socket.recv[0]).to eq_with_telemetry 'sample_ns.thing:42|g'
1340+
end
1341+
end
1342+
end
12981343
end

0 commit comments

Comments
 (0)