Skip to content

Commit fa88415

Browse files
authored
Dependency inject logger (partial) (#4432)
1 parent 2941dc2 commit fa88415

23 files changed

+151
-62
lines changed

lib/datadog/core/configuration/components.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def initialize(settings)
104104

105105
@telemetry = self.class.build_telemetry(settings, agent_settings, @logger)
106106

107-
@remote = Remote::Component.build(settings, agent_settings, telemetry: telemetry)
107+
@remote = Remote::Component.build(settings, agent_settings, logger: @logger, telemetry: telemetry)
108108
@tracer = self.class.build_tracer(settings, agent_settings, logger: @logger)
109109
@crashtracker = self.class.build_crashtracker(settings, agent_settings, logger: @logger)
110110

lib/datadog/core/remote/component.rb

+11-9
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ module Remote
1313
# Configures the HTTP transport to communicate with the agent
1414
# to fetch and sync the remote configuration
1515
class Component
16-
attr_reader :client, :healthy
16+
attr_reader :logger, :client, :healthy
17+
18+
def initialize(settings, capabilities, agent_settings, logger:)
19+
@logger = logger
1720

18-
def initialize(settings, capabilities, agent_settings)
1921
transport_options = {}
2022
transport_options[:agent_settings] = agent_settings if agent_settings
2123

@@ -26,9 +28,9 @@ def initialize(settings, capabilities, agent_settings)
2628

2729
@client = Client.new(transport_v7, capabilities)
2830
@healthy = false
29-
Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
31+
logger.debug { "new remote configuration client: #{@client.id}" }
3032

31-
@worker = Worker.new(interval: settings.remote.poll_interval_seconds) do
33+
@worker = Worker.new(interval: settings.remote.poll_interval_seconds, logger: logger) do
3234
unless @healthy || negotiation.endpoint?('/v0.7/config')
3335
@barrier.lift
3436

@@ -40,7 +42,7 @@ def initialize(settings, capabilities, agent_settings)
4042
@healthy ||= true
4143
rescue Client::SyncError => e
4244
# Transient errors due to network or agent. Logged the error but not via telemetry
43-
Datadog.logger.error do
45+
logger.error do
4446
"remote worker client sync error: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
4547
end
4648
rescue StandardError => e
@@ -50,15 +52,15 @@ def initialize(settings, capabilities, agent_settings)
5052
negotiation = Negotiation.new(settings, agent_settings)
5153

5254
# Transient errors due to network or agent. Logged the error but not via telemetry
53-
Datadog.logger.error do
55+
logger.error do
5456
"remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. "\
5557
'reseting client state'
5658
end
5759

5860
# client state is unknown, state might be corrupted
5961
@client = Client.new(transport_v7, capabilities)
6062
@healthy = false
61-
Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
63+
logger.debug { "new remote configuration client: #{@client.id}" }
6264

6365
# TODO: bail out if too many errors?
6466
end
@@ -152,10 +154,10 @@ class << self
152154
#
153155
# Those checks are instead performed inside the worker loop.
154156
# This allows users to upgrade their agent while keeping their application running.
155-
def build(settings, agent_settings, telemetry:)
157+
def build(settings, agent_settings, logger:, telemetry:)
156158
return unless settings.remote.enabled
157159

158-
new(settings, Client::Capabilities.new(settings, telemetry), agent_settings)
160+
new(settings, Client::Capabilities.new(settings, telemetry), agent_settings, logger: logger)
159161
end
160162
end
161163
end

lib/datadog/core/remote/worker.rb

+10-7
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Core
55
module Remote
66
# Worker executes a block every interval on a separate Thread
77
class Worker
8-
def initialize(interval:, &block)
8+
def initialize(interval:, logger:, &block)
99
@mutex = Mutex.new
1010
@thr = nil
1111

@@ -14,18 +14,21 @@ def initialize(interval:, &block)
1414
@stopped = false
1515

1616
@interval = interval
17+
@logger = logger
1718
raise ArgumentError, 'can not initialize a worker without a block' unless block
1819

1920
@block = block
2021
end
2122

23+
attr_reader :logger
24+
2225
def start
23-
Datadog.logger.debug { 'remote worker starting' }
26+
logger.debug { 'remote worker starting' }
2427

2528
acquire_lock
2629

2730
if @stopped
28-
Datadog.logger.debug('remote worker: refusing to restart after previous stop')
31+
logger.debug('remote worker: refusing to restart after previous stop')
2932
return
3033
end
3134

@@ -41,13 +44,13 @@ def start
4144
@started = true
4245
@starting = false
4346

44-
Datadog.logger.debug { 'remote worker started' }
47+
logger.debug { 'remote worker started' }
4548
ensure
4649
release_lock
4750
end
4851

4952
def stop
50-
Datadog.logger.debug { 'remote worker stopping' }
53+
logger.debug { 'remote worker stopping' }
5154

5255
acquire_lock
5356

@@ -62,7 +65,7 @@ def stop
6265
@thr = nil
6366
@stopped = true
6467

65-
Datadog.logger.debug { 'remote worker stopped' }
68+
logger.debug { 'remote worker stopped' }
6669
ensure
6770
release_lock
6871
end
@@ -92,7 +95,7 @@ def poll(interval)
9295
end
9396

9497
def call
95-
Datadog.logger.debug { 'remote worker perform' }
98+
logger.debug { 'remote worker perform' }
9699

97100
@block.call
98101
end

lib/datadog/core/telemetry/component.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ module Telemetry
1616
# Telemetry entrypoint, coordinates sending telemetry events at various points in app lifecycle.
1717
# Note: Telemetry does not spawn its worker thread in fork processes, thus no telemetry is sent in forked processes.
1818
class Component
19-
attr_reader :enabled
19+
attr_reader :enabled, :logger
2020

2121
include Core::Utils::Forking
2222
include Telemetry::Logging
@@ -52,6 +52,7 @@ def self.build(settings, agent_settings, logger)
5252
heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds,
5353
metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds,
5454
dependency_collection: settings.telemetry.dependency_collection,
55+
logger: logger,
5556
shutdown_timeout_seconds: settings.telemetry.shutdown_timeout_seconds,
5657
log_collection_enabled: settings.telemetry.log_collection_enabled
5758
)
@@ -66,6 +67,7 @@ def initialize(
6667
heartbeat_interval_seconds:,
6768
metrics_aggregation_interval_seconds:,
6869
dependency_collection:,
70+
logger:,
6971
http_transport:,
7072
shutdown_timeout_seconds:,
7173
enabled: true,
@@ -74,6 +76,7 @@ def initialize(
7476
)
7577
@enabled = enabled
7678
@log_collection_enabled = log_collection_enabled
79+
@logger = logger
7780

7881
@metrics_manager = MetricsManager.new(
7982
enabled: enabled && metrics_enabled,
@@ -87,6 +90,7 @@ def initialize(
8790
emitter: Emitter.new(http_transport: http_transport),
8891
metrics_manager: @metrics_manager,
8992
dependency_collection: dependency_collection,
93+
logger: logger,
9094
shutdown_timeout: shutdown_timeout_seconds
9195
)
9296

lib/datadog/core/telemetry/worker.rb

+9-5
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ def initialize(
2525
emitter:,
2626
metrics_manager:,
2727
dependency_collection:,
28+
logger:,
2829
enabled: true,
2930
shutdown_timeout: Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT,
3031
buffer_size: DEFAULT_BUFFER_MAX_SIZE
3132
)
3233
@emitter = emitter
3334
@metrics_manager = metrics_manager
3435
@dependency_collection = dependency_collection
36+
@logger = logger
3537

3638
@ticks_per_heartbeat = (heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i
3739
@current_ticks = 0
@@ -48,6 +50,8 @@ def initialize(
4850
self.buffer = buffer_klass.new(@buffer_size)
4951
end
5052

53+
attr_reader :logger
54+
5155
def start
5256
return if !enabled? || forked?
5357

@@ -99,7 +103,7 @@ def flush_events(events)
99103

100104
events = deduplicate_logs(events)
101105

102-
Datadog.logger.debug { "Sending #{events&.count} telemetry events" }
106+
logger.debug { "Sending #{events&.count} telemetry events" }
103107
send_event(Event::MessageBatch.new(events))
104108
end
105109

@@ -113,7 +117,7 @@ def started!
113117
return unless enabled?
114118

115119
if failed_to_start?
116-
Datadog.logger.debug('Telemetry app-started event exhausted retries, disabling telemetry worker')
120+
logger.debug('Telemetry app-started event exhausted retries, disabling telemetry worker')
117121
disable!
118122
return
119123
end
@@ -122,13 +126,13 @@ def started!
122126
res = send_event(Event::AppStarted.new)
123127

124128
if res.ok?
125-
Datadog.logger.debug('Telemetry app-started event is successfully sent')
129+
logger.debug('Telemetry app-started event is successfully sent')
126130

127131
send_event(Event::AppDependenciesLoaded.new) if @dependency_collection
128132

129133
true
130134
else
131-
Datadog.logger.debug('Error sending telemetry app-started event, retry after heartbeat interval...')
135+
logger.debug('Error sending telemetry app-started event, retry after heartbeat interval...')
132136
false
133137
end
134138
end
@@ -166,7 +170,7 @@ def disable!
166170
def disable_on_not_found!(response)
167171
return unless response.not_found?
168172

169-
Datadog.logger.debug('Agent does not support telemetry; disabling future telemetry events.')
173+
logger.debug('Agent does not support telemetry; disabling future telemetry events.')
170174
disable!
171175
end
172176

lib/datadog/tracing/component.rb

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def build_tracer(settings, agent_settings, logger:)
4949
Tracing::Tracer.new(
5050
default_service: settings.service,
5151
enabled: settings.tracing.enabled,
52+
logger: logger,
5253
trace_flush: trace_flush,
5354
sampler: sampler_delegator,
5455
span_sampler: build_span_sampler(settings),

lib/datadog/tracing/sync_writer.rb

+5-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ module Tracing
1717
# @public_api
1818
class SyncWriter
1919
attr_reader \
20+
:logger,
2021
:events,
2122
:transport
2223

@@ -25,7 +26,9 @@ class SyncWriter
2526
# @param [Hash<Symbol,Object>] transport_options options for the default transport instance.
2627
# @param [Datadog::Tracing::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
2728
# the default transport instance.
28-
def initialize(transport: nil, transport_options: {}, agent_settings: nil)
29+
def initialize(transport: nil, transport_options: {}, agent_settings: nil, logger: Datadog.logger)
30+
@logger = logger
31+
2932
@transport = transport || begin
3033
transport_options[:agent_settings] = agent_settings if agent_settings
3134
Transport::HTTP.default(**transport_options)
@@ -40,7 +43,7 @@ def initialize(transport: nil, transport_options: {}, agent_settings: nil)
4043
def write(trace)
4144
flush_trace(trace)
4245
rescue => e
43-
Datadog.logger.debug(e)
46+
logger.debug(e)
4447
end
4548

4649
# Does nothing.

lib/datadog/tracing/tracer.rb

+10-7
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ class Tracer
2828
:provider,
2929
:sampler,
3030
:span_sampler,
31-
:tags
31+
:tags,
32+
:logger
3233

3334
attr_accessor \
3435
:default_service,
@@ -52,17 +53,19 @@ def initialize(
5253
context_provider: DefaultContextProvider.new,
5354
default_service: Core::Environment::Ext::FALLBACK_SERVICE_NAME,
5455
enabled: true,
56+
logger: Datadog.logger,
5557
sampler: Sampling::PrioritySampler.new(
5658
base_sampler: Sampling::AllSampler.new,
5759
post_sampler: Sampling::RuleSampler.new
5860
),
5961
span_sampler: Sampling::Span::Sampler.new,
6062
tags: {},
61-
writer: Writer.new
63+
writer: Writer.new(logger: logger)
6264
)
6365
@trace_flush = trace_flush
6466
@default_service = default_service
6567
@enabled = enabled
68+
@logger = logger
6669
@provider = context_provider
6770
@sampler = sampler
6871
@span_sampler = span_sampler
@@ -146,7 +149,7 @@ def trace(
146149
active_trace
147150
end
148151
rescue StandardError => e
149-
Datadog.logger.debug { "Failed to trace: #{e}" }
152+
logger.debug { "Failed to trace: #{e}" }
150153

151154
# Tracing failed: fallback and run code without tracing.
152155
return skip_trace(name, &block)
@@ -268,7 +271,7 @@ def sample_trace(trace_op)
268271
@sampler.sample!(trace_op)
269272
rescue StandardError => e
270273
SAMPLE_TRACE_LOG_ONLY_ONCE.run do
271-
Datadog.logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
274+
logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
272275
end
273276
end
274277
end
@@ -488,7 +491,7 @@ def sample_span(trace_op, span)
488491
@span_sampler.sample!(trace_op, span)
489492
rescue StandardError => e
490493
SAMPLE_SPAN_LOG_ONLY_ONCE.run do
491-
Datadog.logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
494+
logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
492495
end
493496
end
494497
end
@@ -504,7 +507,7 @@ def flush_trace(trace_op)
504507
write(trace) if trace && !trace.empty?
505508
rescue StandardError => e
506509
FLUSH_TRACE_LOG_ONLY_ONCE.run do
507-
Datadog.logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
510+
logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
508511
end
509512
end
510513
end
@@ -518,7 +521,7 @@ def write(trace)
518521
return unless trace && @writer
519522

520523
if Datadog.configuration.diagnostics.debug
521-
Datadog.logger.debug { "Writing #{trace.length} spans (enabled: #{@enabled})\n#{trace.spans.pretty_inspect}" }
524+
logger.debug { "Writing #{trace.length} spans (enabled: #{@enabled})\n#{trace.spans.pretty_inspect}" }
522525
end
523526

524527
@writer.write(trace)

lib/datadog/tracing/workers.rb

+5-4
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ class AsyncTransport
1818
BACK_OFF_MAX = 5
1919
DEFAULT_SHUTDOWN_TIMEOUT = 1
2020

21-
attr_reader \
22-
:trace_buffer
21+
attr_reader :trace_buffer, :logger
2322

2423
def initialize(options = {})
2524
@transport = options[:transport]
@@ -42,6 +41,8 @@ def initialize(options = {})
4241
@mutex = Mutex.new
4342
@worker = nil
4443
@run = false
44+
45+
@logger = options.fetch(:logger)
4546
end
4647

4748
# Callback function that process traces and executes the +send_traces()+ method.
@@ -56,7 +57,7 @@ def callback_traces
5657
# ensures that the thread will not die because of an exception.
5758
# TODO[manu]: findout the reason and reschedule the send if it's not
5859
# a fatal exception
59-
Datadog.logger.warn(
60+
logger.warn(
6061
"Error during traces flush: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
6162
)
6263
end
@@ -68,7 +69,7 @@ def start
6869
return if @run
6970

7071
@run = true
71-
Datadog.logger.debug { "Starting thread for: #{self}" }
72+
logger.debug { "Starting thread for: #{self}" }
7273
@worker = Thread.new { perform }
7374
@worker.name = self.class.name
7475
@worker.thread_variable_set(:fork_safe, true)

0 commit comments

Comments
 (0)