From f8ae3b35a006e78ae5efebaf7c35d685b763359d Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 10 Feb 2025 07:45:01 -0500 Subject: [PATCH 1/4] DEBUG-3457 hack probe notifier worker starting --- lib/datadog/di/component.rb | 13 ++++++++++++- lib/datadog/tracing/contrib/rack/middlewares.rb | 4 ++++ .../everything_from_remote_config_spec.rb | 3 +++ spec/datadog/di/integration/instrumentation_spec.rb | 3 +++ 4 files changed, 22 insertions(+), 1 deletion(-) diff --git a/lib/datadog/di/component.rb b/lib/datadog/di/component.rb index c91eed45c63..1ad1e18a29c 100644 --- a/lib/datadog/di/component.rb +++ b/lib/datadog/di/component.rb @@ -84,7 +84,18 @@ def initialize(settings, agent_settings, logger, code_tracker: nil, telemetry: n @probe_notifier_worker = ProbeNotifierWorker.new(settings, transport, logger, telemetry: telemetry) @probe_notification_builder = ProbeNotificationBuilder.new(settings, serializer) @probe_manager = ProbeManager.new(settings, instrumenter, probe_notification_builder, probe_notifier_worker, logger, telemetry: telemetry) - probe_notifier_worker.start + + # If the worker is started here, it will be in the parent process + # of forking web servers like puma rather than in the worker processes + # that actually process HTTP requests, and thus DI will end up not + # sending any events to the agent. + # + # There is currently no "nice" way to handle this situation correctly - + # remote config has the same issue and the tracing Rack middleware + # presently starts the remote config worker. + # + # DI is hacked into that middleware the same way. + #probe_notifier_worker.start end attr_reader :settings diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index fc2662c95ca..9a03bb100ed 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -39,6 +39,10 @@ def call(env) boot = Datadog::Core::Remote::Tie.boot + if defined?(Datadog::DI) + Datadog::DI.current_component&.probe_notifier_worker&.start + end + # Extract distributed tracing context before creating any spans, # so that all spans will be added to the distributed trace. if configuration[:distributed_tracing] diff --git a/spec/datadog/di/integration/everything_from_remote_config_spec.rb b/spec/datadog/di/integration/everything_from_remote_config_spec.rb index 551c53eddd9..2b3dfaead78 100644 --- a/spec/datadog/di/integration/everything_from_remote_config_spec.rb +++ b/spec/datadog/di/integration/everything_from_remote_config_spec.rb @@ -106,6 +106,9 @@ def target_method before do expect(Datadog::DI).to receive(:component).at_least(:once).and_return(component) + + # This is done by tracing Rack middleware in actual applications + component.probe_notifier_worker.start end let(:mock_response) do diff --git a/spec/datadog/di/integration/instrumentation_spec.rb b/spec/datadog/di/integration/instrumentation_spec.rb index 907df2bc9e8..70a2f39e0f7 100644 --- a/spec/datadog/di/integration/instrumentation_spec.rb +++ b/spec/datadog/di/integration/instrumentation_spec.rb @@ -107,6 +107,9 @@ def mutating_method(greeting) allow(agent_settings).to receive(:ssl) allow(Datadog::DI).to receive(:current_component).and_return(component) + + # This is done by tracing Rack middleware in actual applications + component.probe_notifier_worker.start end context 'method probe' do From 86bc72d16896d5bb3bba7cc6f4b5c057deb6b0ca Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 10 Feb 2025 09:38:26 -0500 Subject: [PATCH 2/4] current_component does not always exist? --- lib/datadog/tracing/contrib/rack/middlewares.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index 9a03bb100ed..d80040bb9c2 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -39,7 +39,9 @@ def call(env) boot = Datadog::Core::Remote::Tie.boot - if defined?(Datadog::DI) + if defined?(Datadog::DI.current_component) + # TODO when would Datadog::DI be defined but + # Datadog::DI.current_component not be defined? Datadog::DI.current_component&.probe_notifier_worker&.start end From 95ad25bd27e592b0c34e1791d60f4b7dc671dd27 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 10 Feb 2025 09:47:05 -0500 Subject: [PATCH 3/4] standard --- lib/datadog/di/component.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/datadog/di/component.rb b/lib/datadog/di/component.rb index 1ad1e18a29c..8cbbf275201 100644 --- a/lib/datadog/di/component.rb +++ b/lib/datadog/di/component.rb @@ -95,7 +95,7 @@ def initialize(settings, agent_settings, logger, code_tracker: nil, telemetry: n # presently starts the remote config worker. # # DI is hacked into that middleware the same way. - #probe_notifier_worker.start + # probe_notifier_worker.start end attr_reader :settings From 1293418ba20d116b85899f6401452d0271b9fc82 Mon Sep 17 00:00:00 2001 From: Oleg Pudeyev Date: Mon, 10 Feb 2025 09:53:03 -0500 Subject: [PATCH 4/4] rubocop --- lib/datadog/tracing/contrib/rack/middlewares.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/datadog/tracing/contrib/rack/middlewares.rb b/lib/datadog/tracing/contrib/rack/middlewares.rb index d80040bb9c2..ad4380f21b7 100644 --- a/lib/datadog/tracing/contrib/rack/middlewares.rb +++ b/lib/datadog/tracing/contrib/rack/middlewares.rb @@ -40,7 +40,7 @@ def call(env) boot = Datadog::Core::Remote::Tie.boot if defined?(Datadog::DI.current_component) - # TODO when would Datadog::DI be defined but + # TODO: when would Datadog::DI be defined but # Datadog::DI.current_component not be defined? Datadog::DI.current_component&.probe_notifier_worker&.start end