From 695add173c67e040f9c13bf72d3dde4fec56978f Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 12 May 2025 14:29:26 -0400 Subject: [PATCH 1/9] Implement debug flag for telemetry --- lib/datadog/core/configuration/settings.rb | 10 ++++++++++ lib/datadog/core/telemetry/emitter.rb | 4 ++-- lib/datadog/core/telemetry/request.rb | 4 ++-- sig/datadog/core/telemetry/emitter.rbs | 2 +- sig/datadog/core/telemetry/request.rbs | 2 +- 5 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/datadog/core/configuration/settings.rb b/lib/datadog/core/configuration/settings.rb index fc8ca84d504..aa64d383341 100644 --- a/lib/datadog/core/configuration/settings.rb +++ b/lib/datadog/core/configuration/settings.rb @@ -946,6 +946,16 @@ def initialize(*_) # @default `nil`. # @return [String,nil] option :service + + # For internal use only. + # Enables telemetry debugging through the Datadog platform. + # + # @default `false`. + # @return [Boolean] + option :debug do |o| + o.type :bool + o.default false + end end settings :crashtracking do diff --git a/lib/datadog/core/telemetry/emitter.rb b/lib/datadog/core/telemetry/emitter.rb index b26cd59ea98..32cf710b4a9 100644 --- a/lib/datadog/core/telemetry/emitter.rb +++ b/lib/datadog/core/telemetry/emitter.rb @@ -22,9 +22,9 @@ def initialize(transport, logger: Datadog.logger) end # Retrieves and emits a TelemetryRequest object based on the request type specified - def request(event) + def request(event, debug: false) seq_id = self.class.sequence.next - payload = Request.build_payload(event, seq_id) + payload = Request.build_payload(event, seq_id, debug: debug) res = @transport.send_telemetry(request_type: event.type, payload: payload) logger.debug { "Telemetry sent for event `#{event.type}` (response code: #{res.code})" } res diff --git a/lib/datadog/core/telemetry/request.rb b/lib/datadog/core/telemetry/request.rb index 18acdb92222..213831e02d7 100644 --- a/lib/datadog/core/telemetry/request.rb +++ b/lib/datadog/core/telemetry/request.rb @@ -11,11 +11,11 @@ module Request class << self using Core::Utils::Hash::Refinement - def build_payload(event, seq_id, api_version: 'v2') + def build_payload(event, seq_id, api_version: 'v2', debug: false) hash = { api_version: api_version, application: application, - debug: false, + debug: debug, host: host, payload: event.payload, request_type: event.type, diff --git a/sig/datadog/core/telemetry/emitter.rbs b/sig/datadog/core/telemetry/emitter.rbs index 7ac2b741c84..437eff5218e 100644 --- a/sig/datadog/core/telemetry/emitter.rbs +++ b/sig/datadog/core/telemetry/emitter.rbs @@ -9,7 +9,7 @@ module Datadog extend Core::Utils::Forking def initialize: (untyped transport, ?logger: Core::Logger) -> void - def request: (Datadog::Core::Telemetry::Event::Base event) -> (Datadog::Core::Transport::HTTP::Adapters::Net::Response | Datadog::Core::Transport::InternalErrorResponse) + def request: (Datadog::Core::Telemetry::Event::Base event, ?debug: bool) -> (Datadog::Core::Transport::HTTP::Adapters::Net::Response | Datadog::Core::Transport::InternalErrorResponse) def self.sequence: () -> Datadog::Core::Utils::Sequence end end diff --git a/sig/datadog/core/telemetry/request.rbs b/sig/datadog/core/telemetry/request.rbs index eddf5ce9c35..9ee8bedbada 100644 --- a/sig/datadog/core/telemetry/request.rbs +++ b/sig/datadog/core/telemetry/request.rbs @@ -2,7 +2,7 @@ module Datadog module Core module Telemetry module Request - def self.build_payload: (Event::Base event, int seq_id) -> ::Hash[Symbol, untyped] + def self.build_payload: (Event::Base event, int seq_id, ?debug: bool) -> ::Hash[Symbol, untyped] private From d2d5e4d42d752ab50376f7447b6f34347ad7894c Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 01:15:46 -0400 Subject: [PATCH 2/9] test --- lib/datadog/core/configuration/settings.rb | 20 ++++++------- .../telemetry/integration/telemetry_spec.rb | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/lib/datadog/core/configuration/settings.rb b/lib/datadog/core/configuration/settings.rb index aa64d383341..6e786780c71 100644 --- a/lib/datadog/core/configuration/settings.rb +++ b/lib/datadog/core/configuration/settings.rb @@ -888,6 +888,16 @@ def initialize(*_) o.env Core::Telemetry::Ext::ENV_LOG_COLLECTION o.default true end + + # For internal use only. + # Enables telemetry debugging through the Datadog platform. + # + # @default `false`. + # @return [Boolean] + option :debug do |o| + o.type :bool + o.default false + end end # Remote configuration @@ -946,16 +956,6 @@ def initialize(*_) # @default `nil`. # @return [String,nil] option :service - - # For internal use only. - # Enables telemetry debugging through the Datadog platform. - # - # @default `false`. - # @return [Boolean] - option :debug do |o| - o.type :bool - o.default false - end end settings :crashtracking do diff --git a/spec/datadog/core/telemetry/integration/telemetry_spec.rb b/spec/datadog/core/telemetry/integration/telemetry_spec.rb index 8a4f5636d6a..ec62594015d 100644 --- a/spec/datadog/core/telemetry/integration/telemetry_spec.rb +++ b/spec/datadog/core/telemetry/integration/telemetry_spec.rb @@ -209,6 +209,36 @@ ) end end + + context 'when telemetry debugging is enabled in settings' do + mark_telemetry_started + + before do + settings.telemetry.debug = true + end + + it 'sets debug to true in payload' do + component.worker.send(:heartbeat!) + component.worker.flush + expect(sent_payloads.length).to eq 1 + + payload = sent_payloads[0] + expect(payload.fetch(:payload)).to match( + 'api_version' => 'v2', + 'application' => expected_application_hash, + 'debug' => true, + 'host' => expected_host_hash, + 'payload' => {}, + 'request_type' => 'app-heartbeat', + 'runtime_id' => String, + 'seq_id' => Integer, + 'tracer_time' => Integer, + ) + expect(payload.fetch(:headers)).to include( + expected_headers.merge('dd-telemetry-request-type' => %w[app-heartbeat]) + ) + end + end end let(:handler_proc) do From a4c9bcba28210a51d3a51a41060cb6c2780cf52a Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 01:18:36 -0400 Subject: [PATCH 3/9] debug mode --- lib/datadog/core/telemetry/component.rb | 1 + lib/datadog/core/telemetry/worker.rb | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/datadog/core/telemetry/component.rb b/lib/datadog/core/telemetry/component.rb index 00a82250eb6..d90cd6f33ab 100644 --- a/lib/datadog/core/telemetry/component.rb +++ b/lib/datadog/core/telemetry/component.rb @@ -82,6 +82,7 @@ def initialize( # rubocop: disable Metrics/MethodLength @worker = Telemetry::Worker.new( enabled: @enabled, + debug: settings.telemetry.debug, heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds, metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds, emitter: Emitter.new(@transport, logger: @logger), diff --git a/lib/datadog/core/telemetry/worker.rb b/lib/datadog/core/telemetry/worker.rb index 7e33be4efb7..2c636570688 100644 --- a/lib/datadog/core/telemetry/worker.rb +++ b/lib/datadog/core/telemetry/worker.rb @@ -27,6 +27,7 @@ def initialize( dependency_collection:, logger:, enabled: true, + debug: false, shutdown_timeout: Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT, buffer_size: DEFAULT_BUFFER_MAX_SIZE ) @@ -34,6 +35,7 @@ def initialize( @metrics_manager = metrics_manager @dependency_collection = dependency_collection @logger = logger + @debug = !!debug @ticks_per_heartbeat = (heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i @current_ticks = 0 @@ -52,6 +54,10 @@ def initialize( attr_reader :logger + def debug? + @debug + end + def start return if !enabled? || forked? @@ -172,7 +178,7 @@ def started! end def send_event(event) - res = @emitter.request(event) + res = @emitter.request(event, debug: debug?) disable_on_not_found!(res) From cbccbc585a101c47939b1b70751ff045d723c836 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 01:19:53 -0400 Subject: [PATCH 4/9] refactor --- lib/datadog/core/telemetry/emitter.rb | 11 ++++++++--- lib/datadog/core/telemetry/worker.rb | 8 +------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/lib/datadog/core/telemetry/emitter.rb b/lib/datadog/core/telemetry/emitter.rb index 32cf710b4a9..22d4d24086b 100644 --- a/lib/datadog/core/telemetry/emitter.rb +++ b/lib/datadog/core/telemetry/emitter.rb @@ -16,15 +16,20 @@ class Emitter # @param transport [Datadog::Core::Telemetry::Transport::Telemetry::Transport] # Transport object that can be used to send telemetry requests - def initialize(transport, logger: Datadog.logger) + def initialize(transport, debug: false, logger: Datadog.logger) @transport = transport @logger = logger + @debug = !!debug + end + + def debug? + @debug end # Retrieves and emits a TelemetryRequest object based on the request type specified - def request(event, debug: false) + def request(event) seq_id = self.class.sequence.next - payload = Request.build_payload(event, seq_id, debug: debug) + payload = Request.build_payload(event, seq_id, debug: debug?) res = @transport.send_telemetry(request_type: event.type, payload: payload) logger.debug { "Telemetry sent for event `#{event.type}` (response code: #{res.code})" } res diff --git a/lib/datadog/core/telemetry/worker.rb b/lib/datadog/core/telemetry/worker.rb index 2c636570688..7e33be4efb7 100644 --- a/lib/datadog/core/telemetry/worker.rb +++ b/lib/datadog/core/telemetry/worker.rb @@ -27,7 +27,6 @@ def initialize( dependency_collection:, logger:, enabled: true, - debug: false, shutdown_timeout: Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT, buffer_size: DEFAULT_BUFFER_MAX_SIZE ) @@ -35,7 +34,6 @@ def initialize( @metrics_manager = metrics_manager @dependency_collection = dependency_collection @logger = logger - @debug = !!debug @ticks_per_heartbeat = (heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i @current_ticks = 0 @@ -54,10 +52,6 @@ def initialize( attr_reader :logger - def debug? - @debug - end - def start return if !enabled? || forked? @@ -178,7 +172,7 @@ def started! end def send_event(event) - res = @emitter.request(event, debug: debug?) + res = @emitter.request(event) disable_on_not_found!(res) From d7037d5bd0d90b95cb2b12028b5f6eb45e68ae19 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 01:20:29 -0400 Subject: [PATCH 5/9] refactor --- lib/datadog/core/telemetry/component.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/datadog/core/telemetry/component.rb b/lib/datadog/core/telemetry/component.rb index d90cd6f33ab..55254076231 100644 --- a/lib/datadog/core/telemetry/component.rb +++ b/lib/datadog/core/telemetry/component.rb @@ -82,10 +82,11 @@ def initialize( # rubocop: disable Metrics/MethodLength @worker = Telemetry::Worker.new( enabled: @enabled, - debug: settings.telemetry.debug, heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds, metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds, - emitter: Emitter.new(@transport, logger: @logger), + emitter: Emitter.new(@transport, + debug: settings.telemetry.debug, + logger: @logger), metrics_manager: @metrics_manager, dependency_collection: settings.telemetry.dependency_collection, logger: logger, From 95e667f27fcf585412e216fe6efabb733b90cded Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 10:42:04 -0400 Subject: [PATCH 6/9] rubocop --- lib/datadog/core/telemetry/component.rb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/datadog/core/telemetry/component.rb b/lib/datadog/core/telemetry/component.rb index 55254076231..3e4c744b1c4 100644 --- a/lib/datadog/core/telemetry/component.rb +++ b/lib/datadog/core/telemetry/component.rb @@ -84,9 +84,11 @@ def initialize( # rubocop: disable Metrics/MethodLength enabled: @enabled, heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds, metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds, - emitter: Emitter.new(@transport, + emitter: Emitter.new( + @transport, debug: settings.telemetry.debug, - logger: @logger), + logger: @logger + ), metrics_manager: @metrics_manager, dependency_collection: settings.telemetry.dependency_collection, logger: logger, From f2857872a7fbbc688f0515f0df9570eb40cee0ff Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 10:42:46 -0400 Subject: [PATCH 7/9] fix test --- spec/datadog/core/telemetry/emitter_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/datadog/core/telemetry/emitter_spec.rb b/spec/datadog/core/telemetry/emitter_spec.rb index 7e88cb41320..3ce1500050e 100644 --- a/spec/datadog/core/telemetry/emitter_spec.rb +++ b/spec/datadog/core/telemetry/emitter_spec.rb @@ -82,7 +82,7 @@ let(:payload) { { foo: 'bar' } } it 'creates a telemetry event with data' do - allow(Datadog::Core::Telemetry::Request).to receive(:build_payload).with(event, 1).and_return(payload) + allow(Datadog::Core::Telemetry::Request).to receive(:build_payload).with(event, 1, debug: false).and_return(payload) request From 9edc1620a2be376043ede891855e1c9a5b76de57 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Wed, 14 May 2025 12:14:38 -0400 Subject: [PATCH 8/9] types --- sig/datadog/core/telemetry/emitter.rbs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sig/datadog/core/telemetry/emitter.rbs b/sig/datadog/core/telemetry/emitter.rbs index 437eff5218e..6c127fd1811 100644 --- a/sig/datadog/core/telemetry/emitter.rbs +++ b/sig/datadog/core/telemetry/emitter.rbs @@ -6,10 +6,12 @@ module Datadog attr_reader transport: untyped attr_reader logger: Core::Logger + + def debug?: -> bool extend Core::Utils::Forking - def initialize: (untyped transport, ?logger: Core::Logger) -> void - def request: (Datadog::Core::Telemetry::Event::Base event, ?debug: bool) -> (Datadog::Core::Transport::HTTP::Adapters::Net::Response | Datadog::Core::Transport::InternalErrorResponse) + def initialize: (untyped transport, ?logger: Core::Logger, ?debug: bool) -> void + def request: (Datadog::Core::Telemetry::Event::Base event) -> (Datadog::Core::Transport::HTTP::Adapters::Net::Response | Datadog::Core::Transport::InternalErrorResponse) def self.sequence: () -> Datadog::Core::Utils::Sequence end end From f4ce99cb82fafab7d3c89063fed67374b1a4da98 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Thu, 15 May 2025 09:08:38 -0400 Subject: [PATCH 9/9] move to end --- lib/datadog/core/telemetry/component.rb | 2 +- lib/datadog/core/telemetry/emitter.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/datadog/core/telemetry/component.rb b/lib/datadog/core/telemetry/component.rb index 3e4c744b1c4..cd2d8eca9de 100644 --- a/lib/datadog/core/telemetry/component.rb +++ b/lib/datadog/core/telemetry/component.rb @@ -86,8 +86,8 @@ def initialize( # rubocop: disable Metrics/MethodLength metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds, emitter: Emitter.new( @transport, + logger: @logger, debug: settings.telemetry.debug, - logger: @logger ), metrics_manager: @metrics_manager, dependency_collection: settings.telemetry.dependency_collection, diff --git a/lib/datadog/core/telemetry/emitter.rb b/lib/datadog/core/telemetry/emitter.rb index 22d4d24086b..c7afeb327da 100644 --- a/lib/datadog/core/telemetry/emitter.rb +++ b/lib/datadog/core/telemetry/emitter.rb @@ -16,7 +16,7 @@ class Emitter # @param transport [Datadog::Core::Telemetry::Transport::Telemetry::Transport] # Transport object that can be used to send telemetry requests - def initialize(transport, debug: false, logger: Datadog.logger) + def initialize(transport, logger: Datadog.logger, debug: false) @transport = transport @logger = logger @debug = !!debug