diff --git a/lib/datadog/core/configuration/components.rb b/lib/datadog/core/configuration/components.rb index ab0bc255e0c..04d5fc7a857 100644 --- a/lib/datadog/core/configuration/components.rb +++ b/lib/datadog/core/configuration/components.rb @@ -26,12 +26,12 @@ class Components class << self include Datadog::Tracing::Component - def build_health_metrics(settings) + def build_health_metrics(settings, logger) settings = settings.health_metrics options = { enabled: settings.enabled } options[:statsd] = settings.statsd unless settings.statsd.nil? - Core::Diagnostics::Health::Metrics.new(**options) + Core::Diagnostics::Health::Metrics.new(logger: logger, **options) end def build_logger(settings) @@ -41,19 +41,20 @@ def build_logger(settings) logger end - def build_runtime_metrics(settings) + def build_runtime_metrics(settings, logger) options = { enabled: settings.runtime_metrics.enabled } options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil? options[:services] = [settings.service] unless settings.service.nil? - Core::Runtime::Metrics.new(**options) + Core::Runtime::Metrics.new(logger: logger, **options) end - def build_runtime_metrics_worker(settings) + def build_runtime_metrics_worker(settings, logger) # NOTE: Should we just ignore building the worker if its not enabled? options = settings.runtime_metrics.opts.merge( enabled: settings.runtime_metrics.enabled, - metrics: build_runtime_metrics(settings) + metrics: build_runtime_metrics(settings, logger), + logger: logger, ) Core::Workers::RuntimeMetrics.new(options) @@ -116,8 +117,8 @@ def initialize(settings) ) @environment_logger_extra.merge!(profiler_logger_extra) if profiler_logger_extra - @runtime_metrics = self.class.build_runtime_metrics_worker(settings) - @health_metrics = self.class.build_health_metrics(settings) + @runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger) + @health_metrics = self.class.build_health_metrics(settings, @logger) @appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry) @dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry) @environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation diff --git a/lib/datadog/core/metrics/client.rb b/lib/datadog/core/metrics/client.rb index cde34bb32db..c062168e8f3 100644 --- a/lib/datadog/core/metrics/client.rb +++ b/lib/datadog/core/metrics/client.rb @@ -21,9 +21,10 @@ class Client extend Options extend Helpers - attr_reader :statsd + attr_reader :statsd, :logger - def initialize(statsd: nil, enabled: true, **_) + def initialize(logger:, statsd: nil, enabled: true, **_) + @logger = logger @statsd = if supported? statsd || default_statsd_client @@ -98,7 +99,7 @@ def count(stat, value = nil, options = nil, &block) statsd.count(stat, value, metric_options(options)) rescue StandardError => e - Datadog.logger.error( + logger.error( "Failed to send count stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}" ) Telemetry::Logger.report(e, description: 'Failed to send count stat') @@ -112,7 +113,7 @@ def distribution(stat, value = nil, options = nil, &block) statsd.distribution(stat, value, metric_options(options)) rescue StandardError => e - Datadog.logger.error( + logger.error( "Failed to send distribution stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}" ) Telemetry::Logger.report(e, description: 'Failed to send distribution stat') @@ -125,7 +126,7 @@ def increment(stat, options = nil) statsd.increment(stat, metric_options(options)) rescue StandardError => e - Datadog.logger.error( + logger.error( "Failed to send increment stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}" ) Telemetry::Logger.report(e, description: 'Failed to send increment stat') @@ -139,7 +140,7 @@ def gauge(stat, value = nil, options = nil, &block) statsd.gauge(stat, value, metric_options(options)) rescue StandardError => e - Datadog.logger.error( + logger.error( "Failed to send gauge stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}" ) Telemetry::Logger.report(e, description: 'Failed to send gauge stat') @@ -159,7 +160,7 @@ def time(stat, options = nil) end rescue StandardError => e # TODO: Likely to be redundant, since `distribution` handles its own errors. - Datadog.logger.error( + logger.error( "Failed to send time stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}" ) Telemetry::Logger.report(e, description: 'Failed to send time stat') @@ -194,7 +195,7 @@ def dogstatsd_version def ignored_statsd_warning IGNORED_STATSD_ONLY_ONCE.run do - Datadog.logger.warn( + logger.warn( 'Ignoring user-supplied statsd instance as currently-installed version of dogstastd-ruby is incompatible. ' \ "To fix this, ensure that you have `gem 'dogstatsd-ruby', '~> 5.3'` on your Gemfile or gems.rb file." ) diff --git a/lib/datadog/core/remote/client.rb b/lib/datadog/core/remote/client.rb index 978aff5b84c..9c8591890b9 100644 --- a/lib/datadog/core/remote/client.rb +++ b/lib/datadog/core/remote/client.rb @@ -13,10 +13,11 @@ class Client class TransportError < StandardError; end class SyncError < StandardError; end - attr_reader :transport, :repository, :id, :dispatcher + attr_reader :transport, :repository, :id, :dispatcher, :logger - def initialize(transport, capabilities, repository: Configuration::Repository.new) + def initialize(transport, capabilities, logger:, repository: Configuration::Repository.new) @transport = transport + @logger = logger @repository = repository @id = SecureRandom.uuid @@ -40,7 +41,7 @@ def sync def process_response(response) # when response is completely empty, do nothing as in: leave as is if response.empty? - Datadog.logger.debug { 'remote: empty response => NOOP' } + logger.debug { 'remote: empty response => NOOP' } return end @@ -112,7 +113,7 @@ def apply_config(paths, targets, contents) end if changes.empty? - Datadog.logger.debug { 'remote: no changes' } + logger.debug { 'remote: no changes' } else dispatcher.dispatch(changes, repository) end diff --git a/lib/datadog/core/remote/component.rb b/lib/datadog/core/remote/component.rb index 3fbe943e8fb..e1c9b82e8a5 100644 --- a/lib/datadog/core/remote/component.rb +++ b/lib/datadog/core/remote/component.rb @@ -26,7 +26,7 @@ def initialize(settings, capabilities, agent_settings, logger:) @barrier = Barrier.new(settings.remote.boot_timeout_seconds) - @client = Client.new(transport_v7, capabilities) + @client = Client.new(transport_v7, capabilities, logger: logger) @healthy = false logger.debug { "new remote configuration client: #{@client.id}" } @@ -58,7 +58,7 @@ def initialize(settings, capabilities, agent_settings, logger:) end # client state is unknown, state might be corrupted - @client = Client.new(transport_v7, capabilities) + @client = Client.new(transport_v7, capabilities, logger: logger) @healthy = false logger.debug { "new remote configuration client: #{@client.id}" } diff --git a/lib/datadog/core/workers/runtime_metrics.rb b/lib/datadog/core/workers/runtime_metrics.rb index a738af23f84..b20678410a1 100644 --- a/lib/datadog/core/workers/runtime_metrics.rb +++ b/lib/datadog/core/workers/runtime_metrics.rb @@ -21,7 +21,7 @@ class RuntimeMetrics < Worker :metrics def initialize(options = {}) - @metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new } + @metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new(logger: options[:logger]) } # Workers::Async::Thread settings self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_STOP) diff --git a/sig/datadog/core/configuration/components.rbs b/sig/datadog/core/configuration/components.rbs index b7d96f7b728..4b299672115 100644 --- a/sig/datadog/core/configuration/components.rbs +++ b/sig/datadog/core/configuration/components.rbs @@ -6,9 +6,9 @@ module Datadog def self.build_logger: (untyped settings) -> untyped - def self.build_runtime_metrics: (untyped settings) -> untyped + def self.build_runtime_metrics: (untyped settings, Core::Logger logger) -> untyped - def self.build_runtime_metrics_worker: (untyped settings) -> untyped + def self.build_runtime_metrics_worker: (untyped settings, Core::Logger logger) -> untyped def self.build_tracer: (untyped settings, untyped agent_settings) -> untyped diff --git a/sig/datadog/core/metrics/client.rbs b/sig/datadog/core/metrics/client.rbs index ec91db42e90..cbbf09dd405 100644 --- a/sig/datadog/core/metrics/client.rbs +++ b/sig/datadog/core/metrics/client.rbs @@ -7,10 +7,13 @@ module Datadog extend Options extend Helpers + + @logger: Core::Logger attr_reader statsd: untyped + attr_reader logger: Core::Logger - def initialize: (?statsd: untyped?, ?enabled: bool, **untyped _) -> void + def initialize: (?statsd: untyped?, ?enabled: bool, logger: Core::Logger, **untyped _) -> void def supported?: () -> untyped diff --git a/sig/datadog/core/remote/client.rbs b/sig/datadog/core/remote/client.rbs index a0147823c45..15276cca8ba 100644 --- a/sig/datadog/core/remote/client.rbs +++ b/sig/datadog/core/remote/client.rbs @@ -17,8 +17,10 @@ module Datadog attr_reader dispatcher: Remote::Dispatcher attr_reader capabilities: Capabilities + + attr_reader logger: Core::Logger - def initialize: (Datadog::Core::Remote::Transport::Config::Transport transport, Capabilities capabilities, ?repository: Configuration::Repository) -> void + def initialize: (Datadog::Core::Remote::Transport::Config::Transport transport, Capabilities capabilities, ?repository: Configuration::Repository, logger: Core::Logger) -> void def sync: () -> void @@ -28,6 +30,7 @@ module Datadog @native_platform: ::String @ruby_engine_version: ::String @tracer_version: ::String + @logger: Core::Logger def payload: () -> ::Hash[Symbol, untyped] def service_name: () -> ::String diff --git a/sig/datadog/core/remote/component.rbs b/sig/datadog/core/remote/component.rbs index 84fabc06ee5..06436a3f6a8 100644 --- a/sig/datadog/core/remote/component.rbs +++ b/sig/datadog/core/remote/component.rbs @@ -7,12 +7,12 @@ module Datadog attr_reader client: Datadog::Core::Remote::Client attr_reader worker: Datadog::Core::Remote::Worker attr_reader healthy: bool - attr_reader logger: ::Logger + attr_reader logger: Core::Logger @barrier: Barrier - @logger: ::Logger + @logger: Core::Logger - def initialize: (untyped settings, Datadog::Core::Remote::Client::Capabilities capabilities, Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings agent_settings, logger: ::Logger) -> void + def initialize: (untyped settings, Datadog::Core::Remote::Client::Capabilities capabilities, Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings agent_settings, logger: Core::Logger) -> void def start: -> void @@ -27,7 +27,7 @@ module Datadog def self.build: ( untyped settings, Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings agent_settings, - logger: ::Logger, + logger: Core::Logger, telemetry: Datadog::Core::Telemetry::Component ) -> Datadog::Core::Remote::Component? diff --git a/spec/datadog/core/configuration/components_spec.rb b/spec/datadog/core/configuration/components_spec.rb index 234ad054044..ba7d0cb42c9 100644 --- a/spec/datadog/core/configuration/components_spec.rb +++ b/spec/datadog/core/configuration/components_spec.rb @@ -82,11 +82,11 @@ ).and_return([profiler, environment_logger_extra]) expect(described_class).to receive(:build_runtime_metrics_worker) - .with(settings) + .with(settings, logger) .and_return(runtime_metrics) expect(described_class).to receive(:build_health_metrics) - .with(settings) + .with(settings, logger) .and_return(health_metrics) end @@ -155,7 +155,7 @@ end describe '::build_health_metrics' do - subject(:build_health_metrics) { described_class.build_health_metrics(settings) } + subject(:build_health_metrics) { described_class.build_health_metrics(settings, logger) } context 'given settings' do shared_examples_for 'new health metrics' do @@ -165,7 +165,7 @@ before do expect(Datadog::Core::Diagnostics::Health::Metrics).to receive(:new) - .with(default_options.merge(options)) + .with(default_options.merge(options).merge(logger: logger)) .and_return(health_metrics) end @@ -386,7 +386,7 @@ end describe '::build_runtime_metrics' do - subject(:build_runtime_metrics) { described_class.build_runtime_metrics(settings) } + subject(:build_runtime_metrics) { described_class.build_runtime_metrics(settings, logger) } context 'given settings' do shared_examples_for 'new runtime metrics' do @@ -396,7 +396,7 @@ before do expect(Datadog::Core::Runtime::Metrics).to receive(:new) - .with(default_options.merge(options)) + .with(default_options.merge(options).merge(logger: logger)) .and_return(runtime_metrics) end @@ -452,7 +452,7 @@ end describe '::build_runtime_metrics_worker' do - subject(:build_runtime_metrics_worker) { described_class.build_runtime_metrics_worker(settings) } + subject(:build_runtime_metrics_worker) { described_class.build_runtime_metrics_worker(settings, logger) } context 'given settings' do shared_examples_for 'new runtime metrics worker' do @@ -468,11 +468,11 @@ before do allow(described_class).to receive(:build_runtime_metrics) - .with(settings) + .with(settings, logger) .and_return(runtime_metrics) expect(Datadog::Core::Workers::RuntimeMetrics).to receive(:new) - .with(default_options.merge(options)) + .with(default_options.merge(options).merge(logger: logger)) .and_return(runtime_metrics_worker) end diff --git a/spec/datadog/core/metrics/client_spec.rb b/spec/datadog/core/metrics/client_spec.rb index 91af802a322..d161404f426 100644 --- a/spec/datadog/core/metrics/client_spec.rb +++ b/spec/datadog/core/metrics/client_spec.rb @@ -6,16 +6,17 @@ RSpec.describe Datadog::Core::Metrics::Client do include_context 'metrics' - subject(:metrics) { described_class.new(**options) } - after { metrics.close } - + let(:logger) { Logger.new($stderr) } let(:options) { { statsd: statsd } } + subject(:metrics) { described_class.new(logger: logger, **options) } + after { metrics.close } + it { is_expected.to have_attributes(statsd: statsd) } shared_examples_for 'logs an error without raising' do |action| it do - expect(Datadog.logger).to receive(:error).with( + expect(logger).to receive(:error).with( /Failed to send #{action} stat/ ) expect(Datadog::Core::Telemetry::Logger).to receive(:report).with( @@ -75,7 +76,7 @@ before do described_class.const_get('IGNORED_STATSD_ONLY_ONCE').send(:reset_ran_once_state_for_tests) - allow(Datadog.logger).to receive(:warn) + allow(logger).to receive(:warn) end it 'does not use the provided instance' do @@ -83,7 +84,7 @@ end it 'logs a warning' do - expect(Datadog.logger).to receive(:warn).with(/Ignoring .* statsd instance/) + expect(logger).to receive(:warn).with(/Ignoring .* statsd instance/) metrics end @@ -713,7 +714,7 @@ # Expect the given block to raise its errors through it do - expect(Datadog.logger).not_to receive(:error) + expect(logger).not_to receive(:error) expect { time }.to raise_error(error) end end @@ -757,7 +758,7 @@ context 'which raises an error' do before do expect(statsd).to receive(:distribution).and_raise(StandardError) - expect(Datadog.logger).to receive(:error) + expect(logger).to receive(:error) end it { expect { time }.to_not raise_error } diff --git a/spec/datadog/core/metrics/logging_spec.rb b/spec/datadog/core/metrics/logging_spec.rb index 9dfcf95878a..a336ddad3fe 100644 --- a/spec/datadog/core/metrics/logging_spec.rb +++ b/spec/datadog/core/metrics/logging_spec.rb @@ -121,7 +121,7 @@ def have_received_json_metric(expected_hash) end context 'when used in Datadog::Metrics' do - subject(:metrics) { Datadog::Core::Metrics::Client.new(statsd: adapter) } + subject(:metrics) { Datadog::Core::Metrics::Client.new(statsd: adapter, logger: logger) } describe 'and #count is sent' do subject(:count) { metrics.count(stat, value, options) } diff --git a/spec/datadog/core/remote/client_spec.rb b/spec/datadog/core/remote/client_spec.rb index 288b27eaa80..7183c4d7e44 100644 --- a/spec/datadog/core/remote/client_spec.rb +++ b/spec/datadog/core/remote/client_spec.rb @@ -248,7 +248,9 @@ capabilities end - subject(:client) { described_class.new(transport, capabilities, repository: repository) } + let(:logger) { logger_allowing_debug } + + subject(:client) { described_class.new(transport, capabilities, repository: repository, logger: logger) } describe '#sync' do include_context 'HTTP connection stub' diff --git a/spec/datadog/core/remote/component_spec.rb b/spec/datadog/core/remote/component_spec.rb index 9663368fc76..78541a7bcfa 100644 --- a/spec/datadog/core/remote/component_spec.rb +++ b/spec/datadog/core/remote/component_spec.rb @@ -10,11 +10,7 @@ let(:capabilities) { Datadog::Core::Remote::Client::Capabilities.new(settings, telemetry) } let(:component) { described_class.new(settings, capabilities, agent_settings, logger: logger) } - let(:logger) do - instance_double(Logger).tap do |logger| - allow(logger).to receive(:debug) - end - end + let(:logger) { logger_allowing_debug } around do |example| ClimateControl.modify('DD_REMOTE_CONFIGURATION_ENABLED' => nil) { example.run } diff --git a/spec/datadog/core/remote/worker_spec.rb b/spec/datadog/core/remote/worker_spec.rb index 768ef84d7bd..7706e55fde4 100644 --- a/spec/datadog/core/remote/worker_spec.rb +++ b/spec/datadog/core/remote/worker_spec.rb @@ -5,13 +5,9 @@ RSpec.describe Datadog::Core::Remote::Worker do let(:task) { proc { 1 + 1 } } - let(:logger) { double(Datadog::Core::Logger) } + let(:logger) { logger_allowing_debug } subject(:worker) { described_class.new(interval: 1, logger: logger, &task) } - before do - allow(logger).to receive(:debug) - end - describe '#initialize' do it 'raises ArgumentError when no block is provided' do expect do diff --git a/spec/datadog/core/runtime/metrics_spec.rb b/spec/datadog/core/runtime/metrics_spec.rb index b7d2d957b40..52b3e161b88 100644 --- a/spec/datadog/core/runtime/metrics_spec.rb +++ b/spec/datadog/core/runtime/metrics_spec.rb @@ -4,9 +4,9 @@ require 'datadog/core/runtime/metrics' RSpec.describe Datadog::Core::Runtime::Metrics do - subject(:runtime_metrics) { described_class.new(**options) } - + let(:logger) { logger_allowing_debug } let(:options) { {} } + subject(:runtime_metrics) { described_class.new(logger: logger, **options) } describe '::new' do context 'given :services' do diff --git a/spec/datadog/core/telemetry/worker_spec.rb b/spec/datadog/core/telemetry/worker_spec.rb index a6d0bf427df..35d7373b44b 100644 --- a/spec/datadog/core/telemetry/worker_spec.rb +++ b/spec/datadog/core/telemetry/worker_spec.rb @@ -21,7 +21,7 @@ let(:metrics_manager) { instance_double(Datadog::Core::Telemetry::MetricsManager, flush!: [], disable!: nil) } let(:emitter) { instance_double(Datadog::Core::Telemetry::Emitter) } let(:dependency_collection) { false } - let(:logger) { double(Datadog::Core::Logger) } + let(:logger) { instance_double(Datadog::Core::Logger) } let(:backend_supports_telemetry?) { true } let(:response) do diff --git a/spec/datadog/core/workers/runtime_metrics_spec.rb b/spec/datadog/core/workers/runtime_metrics_spec.rb index 7addaf20c81..59cdb7fb759 100644 --- a/spec/datadog/core/workers/runtime_metrics_spec.rb +++ b/spec/datadog/core/workers/runtime_metrics_spec.rb @@ -9,6 +9,8 @@ let(:metrics) { instance_double(Datadog::Core::Runtime::Metrics, close: nil) } let(:options) { { metrics: metrics, enabled: true } } + let(:logger) { logger_allowing_debug } + before { allow(metrics).to receive(:flush) } after { worker.stop(true, 1) } @@ -17,7 +19,7 @@ it { expect(worker).to be_a_kind_of(Datadog::Core::Workers::Polling) } context 'by default' do - subject(:worker) { described_class.new } + subject(:worker) { described_class.new(logger: logger) } it { expect(worker.enabled?).to be false } it { expect(worker.loop_base_interval).to eq 10 } diff --git a/spec/datadog/tracing/diagnostics/health_spec.rb b/spec/datadog/tracing/diagnostics/health_spec.rb index cf7949145c7..7794649ecf6 100644 --- a/spec/datadog/tracing/diagnostics/health_spec.rb +++ b/spec/datadog/tracing/diagnostics/health_spec.rb @@ -7,7 +7,9 @@ # TODO: Core::Health::Metrics directly extends Tracing::Health::Metrics # In the future, have tracing add this behavior itself. For now, # just use the core metrics class to drive the tests. - subject(:health_metrics) { Datadog::Core::Diagnostics::Health::Metrics.new } + subject(:health_metrics) { Datadog::Core::Diagnostics::Health::Metrics.new(logger: logger) } + + let(:logger) { logger_allowing_debug } shared_examples_for 'a health metric' do |type, name, stat| subject(:health_metric) { health_metrics.send(name, *args, &block) } diff --git a/spec/datadog/tracing/workers_integration_spec.rb b/spec/datadog/tracing/workers_integration_spec.rb index 9a8bc2082b7..0dcfb73cb83 100644 --- a/spec/datadog/tracing/workers_integration_spec.rb +++ b/spec/datadog/tracing/workers_integration_spec.rb @@ -11,7 +11,7 @@ require 'datadog/tracing/writer' RSpec.describe 'Datadog::Workers::AsyncTransport integration tests' do - let(:logger) { double(Datadog::Core::Logger) } + let(:logger) { logger_allowing_debug } let(:hostname) { 'http://127.0.0.1' } let(:writer) do @@ -47,8 +47,6 @@ let(:tracer) { Datadog::Tracing.send(:tracer) } before do - allow(logger).to receive(:debug) - Datadog.configure do |c| c.tracing.writer = writer end diff --git a/spec/datadog/tracing/workers_spec.rb b/spec/datadog/tracing/workers_spec.rb index e4d2448f2b5..66df60011f6 100644 --- a/spec/datadog/tracing/workers_spec.rb +++ b/spec/datadog/tracing/workers_spec.rb @@ -18,11 +18,7 @@ ) end - let(:logger) do - instance_double(Logger).tap do |logger| - allow(logger).to receive(:debug) - end - end + let(:logger) { logger_allowing_debug } after do worker.stop diff --git a/spec/support/log_helpers.rb b/spec/support/log_helpers.rb index 991fd6ab725..4fa8a3a4f1c 100644 --- a/spec/support/log_helpers.rb +++ b/spec/support/log_helpers.rb @@ -109,4 +109,10 @@ def supports_value_expectations? false end end + + def logger_allowing_debug + instance_double(Datadog::Core::Logger).tap do |logger| + allow(logger).to receive(:debug) + end + end end