datadog 2.12.0 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5687b95de2487329c4b7e6d6eab86704f8eb2cdcedd5588bcf11af0fdc266f7e
4
- data.tar.gz: 837992da8e2c14754b6eb12eb6b26de83a20b68d2bdc369ba925ddd404c2d91b
3
+ metadata.gz: d150a054dd119a853c1f7c0653a2ea2dedb1b20ce4b538168ead98ed3abc8720
4
+ data.tar.gz: 69ff582e245644c0c867d48ecd20fd2b493fc97b778235d163bef193aa8ea298
5
5
  SHA512:
6
- metadata.gz: de9312020663a01030298e462fa5b86e12b151203c6c2a555fc091954c39ecebb36c49a6dee31f9b337c35d3cad7df24c93a883f0d7da426f78d62581200d272
7
- data.tar.gz: 26b49b0f342521eccdafe2390ab13c2762abfb1791cf27faf68c75be5727a949f888ccfc8ebff39ae69de267563ea38c1abea1faaafcfef166dd25226b340c9d
6
+ metadata.gz: 8845d2c09585196054cdf50b353dbf1a226a58d468c3ed9c99b8a12bfa12e659b41c4e67abf6e20288fa740692c9bd4ea874004e523bbe29b1a30b6bc997a53b
7
+ data.tar.gz: c4e4b6a42acc8af8675287440b437db002201d5eb5a1371e141b6ffdef82c752f063f8c4fd679fdaa4196530612bdc066e81897a1c14c41ec62ac77e65afafe2
data/CHANGELOG.md CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.12.1] - 2025-03-05
6
+
7
+ ### Fixed
8
+
9
+ * AppSec: Fix `ArgumentError` from ActiveRecord for Ruby < 2.7 ([#4437][])
10
+
5
11
  ## [2.12.0] - 2025-02-27
6
12
 
7
13
  ### Added
@@ -3133,7 +3139,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
3133
3139
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3134
3140
 
3135
3141
 
3136
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.12.0...master
3142
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.12.1...master
3143
+ [2.12.1]: https://github.com/DataDog/dd-trace-rb/compare/v2.12.0...v2.12.1
3137
3144
  [2.12.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.11.0...v2.12.0
3138
3145
  [2.11.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.10.0...v2.11.0
3139
3146
  [2.10.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.9.0...v2.10.0
@@ -4635,6 +4642,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4635
4642
  [#4424]: https://github.com/DataDog/dd-trace-rb/issues/4424
4636
4643
  [#4425]: https://github.com/DataDog/dd-trace-rb/issues/4425
4637
4644
  [#4426]: https://github.com/DataDog/dd-trace-rb/issues/4426
4645
+ [#4437]: https://github.com/DataDog/dd-trace-rb/issues/4437
4638
4646
  [@AdrianLC]: https://github.com/AdrianLC
4639
4647
  [@Azure7111]: https://github.com/Azure7111
4640
4648
  [@BabyGroot]: https://github.com/BabyGroot
@@ -4786,4 +4794,4 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4786
4794
  [@y-yagi]: https://github.com/y-yagi
4787
4795
  [@yujideveloper]: https://github.com/yujideveloper
4788
4796
  [@yukimurasawa]: https://github.com/yukimurasawa
4789
- [@zachmccormick]: https://github.com/zachmccormick
4797
+ [@zachmccormick]: https://github.com/zachmccormick
@@ -43,7 +43,7 @@ module Datadog
43
43
  end
44
44
  end
45
45
 
46
- # patch for all adapters in ActiveRecord >= 7.1
46
+ # patch for mysql2, sqlite3, and postgres+jdbc adapters in ActiveRecord >= 7.1
47
47
  module InternalExecQueryAdapterPatch
48
48
  def internal_exec_query(sql, *args, **rest)
49
49
  Instrumentation.detect_sql_injection(sql, adapter_name)
@@ -52,7 +52,25 @@ module Datadog
52
52
  end
53
53
  end
54
54
 
55
- # patch for postgres adapter in ActiveRecord < 7.1
55
+ # patch for mysql2, sqlite3, and postgres+jdbc adapters in ActiveRecord < 7.1
56
+ module ExecQueryAdapterPatch
57
+ def exec_query(sql, *args, **rest)
58
+ Instrumentation.detect_sql_injection(sql, adapter_name)
59
+
60
+ super
61
+ end
62
+ end
63
+
64
+ # patch for mysql2, sqlite3, and postgres+jdbc db adapters in ActiveRecord 4
65
+ module Rails4ExecQueryAdapterPatch
66
+ def exec_query(sql, *args)
67
+ Instrumentation.detect_sql_injection(sql, adapter_name)
68
+
69
+ super
70
+ end
71
+ end
72
+
73
+ # patch for non-jdbc postgres adapter in ActiveRecord > 4
56
74
  module ExecuteAndClearAdapterPatch
57
75
  def execute_and_clear(sql, *args, **rest)
58
76
  Instrumentation.detect_sql_injection(sql, adapter_name)
@@ -61,10 +79,9 @@ module Datadog
61
79
  end
62
80
  end
63
81
 
64
- # patch for mysql2 and sqlite3 adapters in ActiveRecord < 7.1
65
- # this patch is also used when using JDBC adapter
66
- module ExecQueryAdapterPatch
67
- def exec_query(sql, *args, **rest)
82
+ # patch for non-jdbc postgres adapter in ActiveRecord 4
83
+ module Rails4ExecuteAndClearAdapterPatch
84
+ def execute_and_clear(sql, name, binds)
68
85
  Instrumentation.detect_sql_injection(sql, adapter_name)
69
86
 
70
87
  super
@@ -19,30 +19,81 @@ module Datadog
19
19
  end
20
20
 
21
21
  def patch
22
+ # Rails 7.0 intruduced new on-load hooks for sqlite3 and postgresql adapters
23
+ # The load hook for mysql2 adapter was introduced in Rails 7.1
24
+ #
25
+ # If the adapter is not loaded when the :active_record load hook is called,
26
+ # we need to add a load hook for the adapter
22
27
  ActiveSupport.on_load :active_record do
23
- instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
24
- Instrumentation::InternalExecQueryAdapterPatch
25
- else
26
- Instrumentation::ExecQueryAdapterPatch
27
- end
28
-
29
28
  if defined?(::ActiveRecord::ConnectionAdapters::SQLite3Adapter)
30
- ::ActiveRecord::ConnectionAdapters::SQLite3Adapter.prepend(instrumentation_module)
29
+ ::Datadog::AppSec::Contrib::ActiveRecord::Patcher.patch_sqlite3_adapter
30
+ else
31
+ ActiveSupport.on_load :active_record_sqlite3adapter do
32
+ ::Datadog::AppSec::Contrib::ActiveRecord::Patcher.patch_sqlite3_adapter
33
+ end
31
34
  end
32
35
 
33
36
  if defined?(::ActiveRecord::ConnectionAdapters::Mysql2Adapter)
34
- ::ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(instrumentation_module)
37
+ ::Datadog::AppSec::Contrib::ActiveRecord::Patcher.patch_mysql2_adapter
38
+ else
39
+ ActiveSupport.on_load :active_record_mysql2adapter do
40
+ ::Datadog::AppSec::Contrib::ActiveRecord::Patcher.patch_mysql2_adapter
41
+ end
35
42
  end
36
43
 
37
44
  if defined?(::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
38
- unless defined?(::ActiveRecord::ConnectionAdapters::JdbcAdapter)
39
- instrumentation_module = Instrumentation::ExecuteAndClearAdapterPatch
45
+ ::Datadog::AppSec::Contrib::ActiveRecord::Patcher.patch_postgresql_adapter
46
+ else
47
+ ActiveSupport.on_load :active_record_postgresqladapter do
48
+ ::Datadog::AppSec::Contrib::ActiveRecord::Patcher.patch_postgresql_adapter
40
49
  end
41
-
42
- ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(instrumentation_module)
43
50
  end
44
51
  end
45
52
  end
53
+
54
+ def patch_sqlite3_adapter
55
+ instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
56
+ Instrumentation::InternalExecQueryAdapterPatch
57
+ elsif ::ActiveRecord.gem_version.segments.first == 4
58
+ Instrumentation::Rails4ExecQueryAdapterPatch
59
+ else
60
+ Instrumentation::ExecQueryAdapterPatch
61
+ end
62
+
63
+ ::ActiveRecord::ConnectionAdapters::SQLite3Adapter.prepend(instrumentation_module)
64
+ end
65
+
66
+ def patch_mysql2_adapter
67
+ instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
68
+ Instrumentation::InternalExecQueryAdapterPatch
69
+ elsif ::ActiveRecord.gem_version.segments.first == 4
70
+ Instrumentation::Rails4ExecQueryAdapterPatch
71
+ else
72
+ Instrumentation::ExecQueryAdapterPatch
73
+ end
74
+
75
+ ::ActiveRecord::ConnectionAdapters::Mysql2Adapter.prepend(instrumentation_module)
76
+ end
77
+
78
+ def patch_postgresql_adapter
79
+ instrumentation_module = if ::ActiveRecord.gem_version.segments.first == 4
80
+ Instrumentation::Rails4ExecuteAndClearAdapterPatch
81
+ else
82
+ Instrumentation::ExecuteAndClearAdapterPatch
83
+ end
84
+
85
+ if defined?(::ActiveRecord::ConnectionAdapters::JdbcAdapter)
86
+ instrumentation_module = if ::ActiveRecord.gem_version >= Gem::Version.new('7.1')
87
+ Instrumentation::InternalExecQueryAdapterPatch
88
+ elsif ::ActiveRecord.gem_version.segments.first == 4
89
+ Instrumentation::Rails4ExecQueryAdapterPatch
90
+ else
91
+ Instrumentation::ExecQueryAdapterPatch
92
+ end
93
+ end
94
+
95
+ ::ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(instrumentation_module)
96
+ end
46
97
  end
47
98
  end
48
99
  end
@@ -26,12 +26,12 @@ module Datadog
26
26
  class << self
27
27
  include Datadog::Tracing::Component
28
28
 
29
- def build_health_metrics(settings)
29
+ def build_health_metrics(settings, logger)
30
30
  settings = settings.health_metrics
31
31
  options = { enabled: settings.enabled }
32
32
  options[:statsd] = settings.statsd unless settings.statsd.nil?
33
33
 
34
- Core::Diagnostics::Health::Metrics.new(**options)
34
+ Core::Diagnostics::Health::Metrics.new(logger: logger, **options)
35
35
  end
36
36
 
37
37
  def build_logger(settings)
@@ -41,19 +41,20 @@ module Datadog
41
41
  logger
42
42
  end
43
43
 
44
- def build_runtime_metrics(settings)
44
+ def build_runtime_metrics(settings, logger)
45
45
  options = { enabled: settings.runtime_metrics.enabled }
46
46
  options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
47
47
  options[:services] = [settings.service] unless settings.service.nil?
48
48
 
49
- Core::Runtime::Metrics.new(**options)
49
+ Core::Runtime::Metrics.new(logger: logger, **options)
50
50
  end
51
51
 
52
- def build_runtime_metrics_worker(settings)
52
+ def build_runtime_metrics_worker(settings, logger)
53
53
  # NOTE: Should we just ignore building the worker if its not enabled?
54
54
  options = settings.runtime_metrics.opts.merge(
55
55
  enabled: settings.runtime_metrics.enabled,
56
- metrics: build_runtime_metrics(settings)
56
+ metrics: build_runtime_metrics(settings, logger),
57
+ logger: logger,
57
58
  )
58
59
 
59
60
  Core::Workers::RuntimeMetrics.new(options)
@@ -116,8 +117,8 @@ module Datadog
116
117
  )
117
118
  @environment_logger_extra.merge!(profiler_logger_extra) if profiler_logger_extra
118
119
 
119
- @runtime_metrics = self.class.build_runtime_metrics_worker(settings)
120
- @health_metrics = self.class.build_health_metrics(settings)
120
+ @runtime_metrics = self.class.build_runtime_metrics_worker(settings, @logger)
121
+ @health_metrics = self.class.build_health_metrics(settings, @logger)
121
122
  @appsec = Datadog::AppSec::Component.build_appsec_component(settings, telemetry: telemetry)
122
123
  @dynamic_instrumentation = Datadog::DI::Component.build(settings, agent_settings, @logger, telemetry: telemetry)
123
124
  @environment_logger_extra[:dynamic_instrumentation_enabled] = !!@dynamic_instrumentation
@@ -21,9 +21,10 @@ module Datadog
21
21
  extend Options
22
22
  extend Helpers
23
23
 
24
- attr_reader :statsd
24
+ attr_reader :statsd, :logger
25
25
 
26
- def initialize(statsd: nil, enabled: true, **_)
26
+ def initialize(logger:, statsd: nil, enabled: true, **_)
27
+ @logger = logger
27
28
  @statsd =
28
29
  if supported?
29
30
  statsd || default_statsd_client
@@ -98,7 +99,7 @@ module Datadog
98
99
 
99
100
  statsd.count(stat, value, metric_options(options))
100
101
  rescue StandardError => e
101
- Datadog.logger.error(
102
+ logger.error(
102
103
  "Failed to send count stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
103
104
  )
104
105
  Telemetry::Logger.report(e, description: 'Failed to send count stat')
@@ -112,7 +113,7 @@ module Datadog
112
113
 
113
114
  statsd.distribution(stat, value, metric_options(options))
114
115
  rescue StandardError => e
115
- Datadog.logger.error(
116
+ logger.error(
116
117
  "Failed to send distribution stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
117
118
  )
118
119
  Telemetry::Logger.report(e, description: 'Failed to send distribution stat')
@@ -125,7 +126,7 @@ module Datadog
125
126
 
126
127
  statsd.increment(stat, metric_options(options))
127
128
  rescue StandardError => e
128
- Datadog.logger.error(
129
+ logger.error(
129
130
  "Failed to send increment stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
130
131
  )
131
132
  Telemetry::Logger.report(e, description: 'Failed to send increment stat')
@@ -139,7 +140,7 @@ module Datadog
139
140
 
140
141
  statsd.gauge(stat, value, metric_options(options))
141
142
  rescue StandardError => e
142
- Datadog.logger.error(
143
+ logger.error(
143
144
  "Failed to send gauge stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
144
145
  )
145
146
  Telemetry::Logger.report(e, description: 'Failed to send gauge stat')
@@ -159,7 +160,7 @@ module Datadog
159
160
  end
160
161
  rescue StandardError => e
161
162
  # TODO: Likely to be redundant, since `distribution` handles its own errors.
162
- Datadog.logger.error(
163
+ logger.error(
163
164
  "Failed to send time stat. Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
164
165
  )
165
166
  Telemetry::Logger.report(e, description: 'Failed to send time stat')
@@ -194,7 +195,7 @@ module Datadog
194
195
 
195
196
  def ignored_statsd_warning
196
197
  IGNORED_STATSD_ONLY_ONCE.run do
197
- Datadog.logger.warn(
198
+ logger.warn(
198
199
  'Ignoring user-supplied statsd instance as currently-installed version of dogstastd-ruby is incompatible. ' \
199
200
  "To fix this, ensure that you have `gem 'dogstatsd-ruby', '~> 5.3'` on your Gemfile or gems.rb file."
200
201
  )
@@ -13,10 +13,11 @@ module Datadog
13
13
  class TransportError < StandardError; end
14
14
  class SyncError < StandardError; end
15
15
 
16
- attr_reader :transport, :repository, :id, :dispatcher
16
+ attr_reader :transport, :repository, :id, :dispatcher, :logger
17
17
 
18
- def initialize(transport, capabilities, repository: Configuration::Repository.new)
18
+ def initialize(transport, capabilities, logger:, repository: Configuration::Repository.new)
19
19
  @transport = transport
20
+ @logger = logger
20
21
 
21
22
  @repository = repository
22
23
  @id = SecureRandom.uuid
@@ -40,7 +41,7 @@ module Datadog
40
41
  def process_response(response)
41
42
  # when response is completely empty, do nothing as in: leave as is
42
43
  if response.empty?
43
- Datadog.logger.debug { 'remote: empty response => NOOP' }
44
+ logger.debug { 'remote: empty response => NOOP' }
44
45
 
45
46
  return
46
47
  end
@@ -112,7 +113,7 @@ module Datadog
112
113
  end
113
114
 
114
115
  if changes.empty?
115
- Datadog.logger.debug { 'remote: no changes' }
116
+ logger.debug { 'remote: no changes' }
116
117
  else
117
118
  dispatcher.dispatch(changes, repository)
118
119
  end
@@ -22,11 +22,11 @@ module Datadog
22
22
  transport_options[:agent_settings] = agent_settings if agent_settings
23
23
 
24
24
  negotiation = Negotiation.new(settings, agent_settings)
25
- transport_v7 = Datadog::Core::Remote::Transport::HTTP.v7(**transport_options.dup)
25
+ transport_v7 = Datadog::Core::Remote::Transport::HTTP.v7(**transport_options) # steep:ignore
26
26
 
27
27
  @barrier = Barrier.new(settings.remote.boot_timeout_seconds)
28
28
 
29
- @client = Client.new(transport_v7, capabilities)
29
+ @client = Client.new(transport_v7, capabilities, logger: logger)
30
30
  @healthy = false
31
31
  logger.debug { "new remote configuration client: #{@client.id}" }
32
32
 
@@ -58,7 +58,7 @@ module Datadog
58
58
  end
59
59
 
60
60
  # client state is unknown, state might be corrupted
61
- @client = Client.new(transport_v7, capabilities)
61
+ @client = Client.new(transport_v7, capabilities, logger: logger)
62
62
  @healthy = false
63
63
  logger.debug { "new remote configuration client: #{@client.id}" }
64
64
 
@@ -11,7 +11,7 @@ module Datadog
11
11
  transport_options = {}
12
12
  transport_options[:agent_settings] = agent_settings if agent_settings
13
13
 
14
- @transport_root = Datadog::Core::Remote::Transport::HTTP.root(**transport_options.dup)
14
+ @transport_root = Datadog::Core::Remote::Transport::HTTP.root(**transport_options) # steep:ignore
15
15
  @logged = suppress_logging
16
16
  end
17
17
 
@@ -1,14 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
-
5
3
  require_relative '../../environment/container'
6
4
  require_relative '../../environment/ext'
7
5
  require_relative '../../transport/ext'
8
- require_relative '../../transport/http/builder'
9
- require_relative '../../transport/http/adapters/net'
10
- require_relative '../../transport/http/adapters/unix_socket'
11
- require_relative '../../transport/http/adapters/test'
6
+ require_relative '../../transport/http'
12
7
 
13
8
  # TODO: Improve negotiation to allow per endpoint selection
14
9
  #
@@ -32,21 +27,11 @@ module Datadog
32
27
  module Transport
33
28
  # Namespace for HTTP transport components
34
29
  module HTTP
35
- # NOTE: Due to... legacy reasons... This class likes having a default `AgentSettings` instance to fall back to.
36
- # Because we generate this instance with an empty instance of `Settings`, the resulting `AgentSettings` below
37
- # represents only settings specified via environment variables + the usual defaults.
38
- #
39
- # DO NOT USE THIS IN NEW CODE, as it ignores any settings specified by users via `Datadog.configure`.
40
- DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS = Datadog::Core::Configuration::AgentSettingsResolver.call(
41
- Datadog::Core::Configuration::Settings.new,
42
- logger: nil,
43
- )
44
-
45
30
  module_function
46
31
 
47
32
  # Builds a new Transport::HTTP::Client
48
33
  def new(klass, &block)
49
- Core::Transport::HTTP::Builder.new(
34
+ Core::Transport::HTTP.build(
50
35
  api_instance_class: API::Instance, &block
51
36
  ).to_transport(klass)
52
37
  end
@@ -54,7 +39,7 @@ module Datadog
54
39
  # Builds a new Transport::HTTP::Client with default settings
55
40
  # Pass a block to override any settings.
56
41
  def root(
57
- agent_settings: DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS,
42
+ agent_settings:,
58
43
  **options
59
44
  )
60
45
  new(Core::Remote::Transport::Negotiation::Transport) do |transport|
@@ -79,7 +64,7 @@ module Datadog
79
64
  # Builds a new Transport::HTTP::Client with default settings
80
65
  # Pass a block to override any settings.
81
66
  def v7(
82
- agent_settings: DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS,
67
+ agent_settings:,
83
68
  **options
84
69
  )
85
70
  new(Core::Remote::Transport::Config::Transport) do |transport|
@@ -126,20 +111,6 @@ module Datadog
126
111
  def default_adapter
127
112
  Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
128
113
  end
129
-
130
- # Add adapters to registry
131
- Core::Transport::HTTP::Builder::REGISTRY.set(
132
- Datadog::Core::Transport::HTTP::Adapters::Net,
133
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
134
- )
135
- Core::Transport::HTTP::Builder::REGISTRY.set(
136
- Datadog::Core::Transport::HTTP::Adapters::Test,
137
- Datadog::Core::Transport::Ext::Test::ADAPTER
138
- )
139
- Core::Transport::HTTP::Builder::REGISTRY.set(
140
- Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
141
- Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
142
- )
143
114
  end
144
115
  end
145
116
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'http/builder'
4
+ require_relative 'http/adapters/net'
5
+ require_relative 'http/adapters/unix_socket'
6
+ require_relative 'http/adapters/test'
7
+
8
+ module Datadog
9
+ module Core
10
+ module Transport
11
+ # HTTP transport
12
+ module HTTP
13
+ # Add adapters to registry
14
+ Builder::REGISTRY.set(
15
+ Transport::HTTP::Adapters::Net,
16
+ Core::Configuration::Ext::Agent::HTTP::ADAPTER
17
+ )
18
+ Builder::REGISTRY.set(
19
+ Transport::HTTP::Adapters::Test,
20
+ Transport::Ext::Test::ADAPTER
21
+ )
22
+ Builder::REGISTRY.set(
23
+ Transport::HTTP::Adapters::UnixSocket,
24
+ Transport::Ext::UnixSocket::ADAPTER
25
+ )
26
+
27
+ module_function
28
+
29
+ # Helper function that delegates to Builder.new
30
+ # but is under HTTP namespace so that client code requires this file
31
+ # to get the adapters configured, and not the builder directly.
32
+ def build(api_instance_class:, &block)
33
+ Builder.new(api_instance_class: api_instance_class, &block)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -21,7 +21,7 @@ module Datadog
21
21
  :metrics
22
22
 
23
23
  def initialize(options = {})
24
- @metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new }
24
+ @metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new(logger: options[:logger]) }
25
25
 
26
26
  # Workers::Async::Thread settings
27
27
  self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_STOP)
@@ -5,13 +5,10 @@ require 'uri'
5
5
  require_relative '../../core/environment/container'
6
6
  require_relative '../../core/environment/ext'
7
7
  require_relative '../../core/transport/ext'
8
- require_relative '../../core/transport/http/adapters/net'
9
- require_relative '../../core/transport/http/adapters/test'
10
- require_relative '../../core/transport/http/adapters/unix_socket'
11
8
  require_relative 'diagnostics'
12
9
  require_relative 'input'
13
10
  require_relative 'http/api'
14
- require_relative '../../core/transport/http/builder'
11
+ require_relative '../../core/transport/http'
15
12
  require_relative '../../../datadog/version'
16
13
 
17
14
  module Datadog
@@ -23,7 +20,7 @@ module Datadog
23
20
 
24
21
  # Builds a new Transport::HTTP::Client
25
22
  def new(klass, &block)
26
- Core::Transport::HTTP::Builder.new(
23
+ Core::Transport::HTTP.build(
27
24
  api_instance_class: API::Instance, &block
28
25
  ).to_transport(klass)
29
26
  end
@@ -102,17 +99,6 @@ module Datadog
102
99
  def default_adapter
103
100
  Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
104
101
  end
105
-
106
- # Add adapters to registry
107
- Datadog::Core::Transport::HTTP::Builder::REGISTRY.set(
108
- Datadog::Core::Transport::HTTP::Adapters::Net,
109
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
110
- )
111
- Datadog::Core::Transport::HTTP::Builder::REGISTRY.set(Datadog::Core::Transport::HTTP::Adapters::Test, Datadog::Core::Transport::Ext::Test::ADAPTER)
112
- Datadog::Core::Transport::HTTP::Builder::REGISTRY.set(
113
- Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
114
- Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
115
- )
116
102
  end
117
103
  end
118
104
  end
@@ -19,7 +19,8 @@ module Datadog
19
19
  attr_reader \
20
20
  :logger,
21
21
  :events,
22
- :transport
22
+ :transport,
23
+ :agent_settings
23
24
 
24
25
  # @param [Datadog::Tracing::Transport::Traces::Transport] transport a custom transport instance.
25
26
  # If provided, overrides `transport_options` and `agent_settings`.
@@ -28,9 +29,10 @@ module Datadog
28
29
  # the default transport instance.
29
30
  def initialize(transport: nil, transport_options: {}, agent_settings: nil, logger: Datadog.logger)
30
31
  @logger = logger
32
+ @agent_settings = agent_settings
31
33
 
32
34
  @transport = transport || begin
33
- transport_options[:agent_settings] = agent_settings if agent_settings
35
+ transport_options = transport_options.merge(agent_settings: agent_settings) if agent_settings
34
36
  Transport::HTTP.default(**transport_options)
35
37
  end
36
38
 
@@ -49,6 +49,8 @@ module Datadog
49
49
  # @param tags [Hash] default tags added to all spans
50
50
  # @param writer [Datadog::Tracing::Writer] consumes traces returned by the provided +trace_flush+
51
51
  def initialize(
52
+ # rubocop:disable Style/KeywordParametersOrder
53
+ # https://github.com/rubocop/rubocop/issues/13933
52
54
  trace_flush: Flush::Finished.new,
53
55
  context_provider: DefaultContextProvider.new,
54
56
  default_service: Core::Environment::Ext::FALLBACK_SERVICE_NAME,
@@ -60,7 +62,10 @@ module Datadog
60
62
  ),
61
63
  span_sampler: Sampling::Span::Sampler.new,
62
64
  tags: {},
63
- writer: Writer.new(logger: logger)
65
+ # writer is not defaulted because creating it requires agent_settings,
66
+ # which we do not have here and otherwise do not need.
67
+ writer:
68
+ # rubocop:enable Style/KeywordParametersOrder
64
69
  )
65
70
  @trace_flush = trace_flush
66
71
  @default_service = default_service
@@ -1,14 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'uri'
4
-
5
3
  require_relative '../../core/environment/container'
6
4
  require_relative '../../core/environment/ext'
7
5
  require_relative '../../core/transport/ext'
8
- require_relative '../../core/transport/http/adapters/net'
9
- require_relative '../../core/transport/http/adapters/test'
10
- require_relative '../../core/transport/http/adapters/unix_socket'
11
- require_relative '../../core/transport/http/builder'
6
+ require_relative '../../core/transport/http'
12
7
  require_relative 'http/api'
13
8
  require_relative '../../../datadog/version'
14
9
 
@@ -17,21 +12,11 @@ module Datadog
17
12
  module Transport
18
13
  # Namespace for HTTP transport components
19
14
  module HTTP
20
- # NOTE: Due to... legacy reasons... This class likes having a default `AgentSettings` instance to fall back to.
21
- # Because we generate this instance with an empty instance of `Settings`, the resulting `AgentSettings` below
22
- # represents only settings specified via environment variables + the usual defaults.
23
- #
24
- # DO NOT USE THIS IN NEW CODE, as it ignores any settings specified by users via `Datadog.configure`.
25
- DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS = Datadog::Core::Configuration::AgentSettingsResolver.call(
26
- Datadog::Core::Configuration::Settings.new,
27
- logger: nil,
28
- )
29
-
30
15
  module_function
31
16
 
32
17
  # Builds a new Transport::HTTP::Client
33
18
  def new(klass, &block)
34
- Core::Transport::HTTP::Builder.new(
19
+ Core::Transport::HTTP.build(
35
20
  api_instance_class: API::Instance, &block
36
21
  ).to_transport(klass)
37
22
  end
@@ -39,7 +24,7 @@ module Datadog
39
24
  # Builds a new Transport::HTTP::Client with default settings
40
25
  # Pass a block to override any settings.
41
26
  def default(
42
- agent_settings: DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS,
27
+ agent_settings:,
43
28
  **options
44
29
  )
45
30
  new(Transport::Traces::Transport) do |transport|
@@ -86,20 +71,6 @@ module Datadog
86
71
  def default_adapter
87
72
  Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
88
73
  end
89
-
90
- # Add adapters to registry
91
- Core::Transport::HTTP::Builder::REGISTRY.set(
92
- Datadog::Core::Transport::HTTP::Adapters::Net,
93
- Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
94
- )
95
- Core::Transport::HTTP::Builder::REGISTRY.set(
96
- Datadog::Core::Transport::HTTP::Adapters::Test,
97
- Datadog::Core::Transport::Ext::Test::ADAPTER
98
- )
99
- Core::Transport::HTTP::Builder::REGISTRY.set(
100
- Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
101
- Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
102
- )
103
74
  end
104
75
  end
105
76
  end
@@ -18,7 +18,8 @@ module Datadog
18
18
  class TraceWriter < Core::Worker
19
19
  attr_reader \
20
20
  :logger,
21
- :transport
21
+ :transport,
22
+ :agent_settings
22
23
 
23
24
  # rubocop:disable Lint/MissingSuper
24
25
  def initialize(options = {})
@@ -26,7 +27,10 @@ module Datadog
26
27
 
27
28
  transport_options = options.fetch(:transport_options, {})
28
29
 
29
- transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
30
+ if options.key?(:agent_settings)
31
+ @agent_settings = options[:agent_settings]
32
+ transport_options = transport_options.merge(agent_settings: @agent_settings)
33
+ end
30
34
 
31
35
  @transport = options.fetch(:transport) do
32
36
  Datadog::Tracing::Transport::HTTP.default(**transport_options)
@@ -16,7 +16,8 @@ module Datadog
16
16
  :logger,
17
17
  :transport,
18
18
  :worker,
19
- :events
19
+ :events,
20
+ :agent_settings
20
21
 
21
22
  def initialize(options = {})
22
23
  @logger = options[:logger] || Datadog.logger
@@ -26,7 +27,10 @@ module Datadog
26
27
  @flush_interval = options.fetch(:flush_interval, Workers::AsyncTransport::DEFAULT_FLUSH_INTERVAL)
27
28
  transport_options = options.fetch(:transport_options, {})
28
29
 
29
- transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
30
+ if options.key?(:agent_settings)
31
+ @agent_settings = options[:agent_settings]
32
+ transport_options = transport_options.merge(agent_settings: @agent_settings)
33
+ end
30
34
 
31
35
  # transport and buffers
32
36
  @transport = options.fetch(:transport) do
@@ -4,7 +4,7 @@ module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
6
  MINOR = 12
7
- PATCH = 0
7
+ PATCH = 1
8
8
  PRE = nil
9
9
  BUILD = nil
10
10
  # PRE and BUILD above are modified for dev gems during gem build GHA workflow
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.12.0
4
+ version: 2.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-02-27 00:00:00.000000000 Z
11
+ date: 2025-03-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -342,6 +342,7 @@ files:
342
342
  - lib/datadog/core/telemetry/request.rb
343
343
  - lib/datadog/core/telemetry/worker.rb
344
344
  - lib/datadog/core/transport/ext.rb
345
+ - lib/datadog/core/transport/http.rb
345
346
  - lib/datadog/core/transport/http/adapters/net.rb
346
347
  - lib/datadog/core/transport/http/adapters/registry.rb
347
348
  - lib/datadog/core/transport/http/adapters/test.rb
@@ -929,8 +930,8 @@ licenses:
929
930
  - Apache-2.0
930
931
  metadata:
931
932
  allowed_push_host: https://rubygems.org
932
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.12.0/CHANGELOG.md
933
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.12.0
933
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.12.1/CHANGELOG.md
934
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.12.1
934
935
  post_install_message:
935
936
  rdoc_options: []
936
937
  require_paths: