datadog 2.11.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -2
  3. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +23 -6
  4. data/lib/datadog/appsec/contrib/active_record/patcher.rb +63 -12
  5. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  6. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  7. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +39 -0
  8. data/lib/datadog/appsec.rb +1 -0
  9. data/lib/datadog/core/configuration/components.rb +10 -9
  10. data/lib/datadog/core/metrics/client.rb +9 -8
  11. data/lib/datadog/core/remote/client.rb +5 -4
  12. data/lib/datadog/core/remote/component.rb +14 -12
  13. data/lib/datadog/core/remote/negotiation.rb +1 -1
  14. data/lib/datadog/core/remote/transport/http.rb +4 -33
  15. data/lib/datadog/core/remote/worker.rb +10 -7
  16. data/lib/datadog/core/telemetry/component.rb +5 -1
  17. data/lib/datadog/core/telemetry/worker.rb +9 -5
  18. data/lib/datadog/core/transport/http.rb +38 -0
  19. data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
  20. data/lib/datadog/di/component.rb +1 -3
  21. data/lib/datadog/di/probe_notifier_worker.rb +20 -4
  22. data/lib/datadog/di/transport/diagnostics.rb +61 -0
  23. data/lib/datadog/di/transport/http/api.rb +52 -0
  24. data/lib/datadog/di/transport/http/client.rb +46 -0
  25. data/lib/datadog/di/transport/http/diagnostics.rb +92 -0
  26. data/lib/datadog/di/transport/http/input.rb +94 -0
  27. data/lib/datadog/di/transport/http.rb +105 -0
  28. data/lib/datadog/di/transport/input.rb +61 -0
  29. data/lib/datadog/di.rb +2 -1
  30. data/lib/datadog/tracing/component.rb +1 -0
  31. data/lib/datadog/tracing/sync_writer.rb +9 -4
  32. data/lib/datadog/tracing/tracer.rb +15 -7
  33. data/lib/datadog/tracing/transport/http.rb +3 -32
  34. data/lib/datadog/tracing/workers/trace_writer.rb +10 -3
  35. data/lib/datadog/tracing/workers.rb +5 -4
  36. data/lib/datadog/tracing/writer.rb +12 -4
  37. data/lib/datadog/version.rb +2 -2
  38. metadata +15 -5
  39. data/lib/datadog/di/transport.rb +0 -79
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+
5
+ require_relative '../../core/environment/container'
6
+ require_relative '../../core/environment/ext'
7
+ require_relative '../../core/transport/ext'
8
+ require_relative 'diagnostics'
9
+ require_relative 'input'
10
+ require_relative 'http/api'
11
+ require_relative '../../core/transport/http'
12
+ require_relative '../../../datadog/version'
13
+
14
+ module Datadog
15
+ module DI
16
+ module Transport
17
+ # Namespace for HTTP transport components
18
+ module HTTP
19
+ module_function
20
+
21
+ # Builds a new Transport::HTTP::Client
22
+ def new(klass, &block)
23
+ Core::Transport::HTTP.build(
24
+ api_instance_class: API::Instance, &block
25
+ ).to_transport(klass)
26
+ end
27
+
28
+ # Builds a new Transport::HTTP::Client with default settings
29
+ # Pass a block to override any settings.
30
+ def diagnostics(
31
+ agent_settings:,
32
+ **options
33
+ )
34
+ new(DI::Transport::Diagnostics::Transport) do |transport|
35
+ transport.adapter(agent_settings)
36
+ transport.headers default_headers
37
+
38
+ apis = API.defaults
39
+
40
+ transport.api API::DIAGNOSTICS, apis[API::DIAGNOSTICS]
41
+
42
+ # Apply any settings given by options
43
+ unless options.empty?
44
+ transport.default_api = options[:api_version] if options.key?(:api_version)
45
+ transport.headers options[:headers] if options.key?(:headers)
46
+ end
47
+
48
+ # Call block to apply any customization, if provided
49
+ yield(transport) if block_given?
50
+ end
51
+ end
52
+
53
+ # Builds a new Transport::HTTP::Client with default settings
54
+ # Pass a block to override any settings.
55
+ def input(
56
+ agent_settings:,
57
+ **options
58
+ )
59
+ new(DI::Transport::Input::Transport) do |transport|
60
+ transport.adapter(agent_settings)
61
+ transport.headers default_headers
62
+
63
+ apis = API.defaults
64
+
65
+ transport.api API::INPUT, apis[API::INPUT]
66
+
67
+ # Apply any settings given by options
68
+ unless options.empty?
69
+ transport.default_api = options[:api_version] if options.key?(:api_version)
70
+ transport.headers options[:headers] if options.key?(:headers)
71
+ end
72
+
73
+ # Call block to apply any customization, if provided
74
+ yield(transport) if block_given?
75
+ end
76
+ end
77
+
78
+ def default_headers
79
+ {
80
+ Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
81
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG => Datadog::Core::Environment::Ext::LANG,
82
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION => Datadog::Core::Environment::Ext::LANG_VERSION,
83
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
84
+ Datadog::Core::Environment::Ext::LANG_INTERPRETER,
85
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR => Core::Environment::Ext::LANG_ENGINE,
86
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
87
+ Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
88
+ }.tap do |headers|
89
+ # Add container ID, if present.
90
+ container_id = Datadog::Core::Environment::Container.container_id
91
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
92
+ # Pretend that stats computation are already done by the client
93
+ if Datadog.configuration.appsec.standalone.enabled
94
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
95
+ end
96
+ end
97
+ end
98
+
99
+ def default_adapter
100
+ Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/transport/parcel'
4
+ require_relative 'http/client'
5
+
6
+ module Datadog
7
+ module DI
8
+ module Transport
9
+ module Input
10
+ class EncodedParcel
11
+ include Datadog::Core::Transport::Parcel
12
+ end
13
+
14
+ class Request < Datadog::Core::Transport::Request
15
+ end
16
+
17
+ class Transport
18
+ attr_reader :client, :apis, :default_api, :current_api_id
19
+
20
+ def initialize(apis, default_api)
21
+ @apis = apis
22
+
23
+ @client = HTTP::Client.new(current_api)
24
+ end
25
+
26
+ def current_api
27
+ @apis[HTTP::API::INPUT]
28
+ end
29
+
30
+ def send_input(payload)
31
+ json = JSON.dump(payload)
32
+ parcel = EncodedParcel.new(json)
33
+ request = Request.new(parcel)
34
+
35
+ response = @client.send_input_payload(request)
36
+ unless response.ok?
37
+ # TODO Datadog::Core::Transport::InternalErrorResponse
38
+ # does not have +code+ method, what is the actual API of
39
+ # these response objects?
40
+ raise Error::AgentCommunicationError, "send_input failed: #{begin
41
+ response.code
42
+ rescue
43
+ "???"
44
+ end}: #{response.payload}"
45
+ end
46
+ rescue Error::AgentCommunicationError
47
+ raise
48
+ # Datadog::Core::Transport does not perform any exception mapping,
49
+ # therefore we could have any exception here from failure to parse
50
+ # agent URI for example.
51
+ # If we ever implement retries for network errors, we should distinguish
52
+ # actual network errors from non-network errors that are raised by
53
+ # transport code.
54
+ rescue => exc
55
+ raise Error::AgentCommunicationError, "send_input failed: #{exc.class}: #{exc}"
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
data/lib/datadog/di.rb CHANGED
@@ -16,7 +16,8 @@ require_relative 'di/probe_notifier_worker'
16
16
  require_relative 'di/redactor'
17
17
  require_relative 'di/remote'
18
18
  require_relative 'di/serializer'
19
- require_relative 'di/transport'
19
+ #require_relative 'di/transport'
20
+ require_relative 'di/transport/http'
20
21
  require_relative 'di/utils'
21
22
 
22
23
  module Datadog
@@ -49,6 +49,7 @@ module Datadog
49
49
  Tracing::Tracer.new(
50
50
  default_service: settings.service,
51
51
  enabled: settings.tracing.enabled,
52
+ logger: logger,
52
53
  trace_flush: trace_flush,
53
54
  sampler: sampler_delegator,
54
55
  span_sampler: build_span_sampler(settings),
@@ -17,17 +17,22 @@ module Datadog
17
17
  # @public_api
18
18
  class SyncWriter
19
19
  attr_reader \
20
+ :logger,
20
21
  :events,
21
- :transport
22
+ :transport,
23
+ :agent_settings
22
24
 
23
25
  # @param [Datadog::Tracing::Transport::Traces::Transport] transport a custom transport instance.
24
26
  # If provided, overrides `transport_options` and `agent_settings`.
25
27
  # @param [Hash<Symbol,Object>] transport_options options for the default transport instance.
26
28
  # @param [Datadog::Tracing::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
27
29
  # the default transport instance.
28
- def initialize(transport: nil, transport_options: {}, agent_settings: nil)
30
+ def initialize(transport: nil, transport_options: {}, agent_settings: nil, logger: Datadog.logger)
31
+ @logger = logger
32
+ @agent_settings = agent_settings
33
+
29
34
  @transport = transport || begin
30
- transport_options[:agent_settings] = agent_settings if agent_settings
35
+ transport_options = transport_options.merge(agent_settings: agent_settings) if agent_settings
31
36
  Transport::HTTP.default(**transport_options)
32
37
  end
33
38
 
@@ -40,7 +45,7 @@ module Datadog
40
45
  def write(trace)
41
46
  flush_trace(trace)
42
47
  rescue => e
43
- Datadog.logger.debug(e)
48
+ logger.debug(e)
44
49
  end
45
50
 
46
51
  # Does nothing.
@@ -28,7 +28,8 @@ module Datadog
28
28
  :provider,
29
29
  :sampler,
30
30
  :span_sampler,
31
- :tags
31
+ :tags,
32
+ :logger
32
33
 
33
34
  attr_accessor \
34
35
  :default_service,
@@ -48,21 +49,28 @@ module Datadog
48
49
  # @param tags [Hash] default tags added to all spans
49
50
  # @param writer [Datadog::Tracing::Writer] consumes traces returned by the provided +trace_flush+
50
51
  def initialize(
52
+ # rubocop:disable Style/KeywordParametersOrder
53
+ # https://github.com/rubocop/rubocop/issues/13933
51
54
  trace_flush: Flush::Finished.new,
52
55
  context_provider: DefaultContextProvider.new,
53
56
  default_service: Core::Environment::Ext::FALLBACK_SERVICE_NAME,
54
57
  enabled: true,
58
+ logger: Datadog.logger,
55
59
  sampler: Sampling::PrioritySampler.new(
56
60
  base_sampler: Sampling::AllSampler.new,
57
61
  post_sampler: Sampling::RuleSampler.new
58
62
  ),
59
63
  span_sampler: Sampling::Span::Sampler.new,
60
64
  tags: {},
61
- writer: Writer.new
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
62
69
  )
63
70
  @trace_flush = trace_flush
64
71
  @default_service = default_service
65
72
  @enabled = enabled
73
+ @logger = logger
66
74
  @provider = context_provider
67
75
  @sampler = sampler
68
76
  @span_sampler = span_sampler
@@ -146,7 +154,7 @@ module Datadog
146
154
  active_trace
147
155
  end
148
156
  rescue StandardError => e
149
- Datadog.logger.debug { "Failed to trace: #{e}" }
157
+ logger.debug { "Failed to trace: #{e}" }
150
158
 
151
159
  # Tracing failed: fallback and run code without tracing.
152
160
  return skip_trace(name, &block)
@@ -268,7 +276,7 @@ module Datadog
268
276
  @sampler.sample!(trace_op)
269
277
  rescue StandardError => e
270
278
  SAMPLE_TRACE_LOG_ONLY_ONCE.run do
271
- Datadog.logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
279
+ logger.warn { "Failed to sample trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
272
280
  end
273
281
  end
274
282
  end
@@ -488,7 +496,7 @@ module Datadog
488
496
  @span_sampler.sample!(trace_op, span)
489
497
  rescue StandardError => e
490
498
  SAMPLE_SPAN_LOG_ONLY_ONCE.run do
491
- Datadog.logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
499
+ logger.warn { "Failed to sample span: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
492
500
  end
493
501
  end
494
502
  end
@@ -504,7 +512,7 @@ module Datadog
504
512
  write(trace) if trace && !trace.empty?
505
513
  rescue StandardError => e
506
514
  FLUSH_TRACE_LOG_ONLY_ONCE.run do
507
- Datadog.logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
515
+ logger.warn { "Failed to flush trace: #{e.class.name} #{e} at #{Array(e.backtrace).first}" }
508
516
  end
509
517
  end
510
518
  end
@@ -518,7 +526,7 @@ module Datadog
518
526
  return unless trace && @writer
519
527
 
520
528
  if Datadog.configuration.diagnostics.debug
521
- Datadog.logger.debug { "Writing #{trace.length} spans (enabled: #{@enabled})\n#{trace.spans.pretty_inspect}" }
529
+ logger.debug { "Writing #{trace.length} spans (enabled: #{@enabled})\n#{trace.spans.pretty_inspect}" }
522
530
  end
523
531
 
524
532
  @writer.write(trace)
@@ -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
@@ -17,13 +17,20 @@ module Datadog
17
17
  # Writes traces to transport synchronously
18
18
  class TraceWriter < Core::Worker
19
19
  attr_reader \
20
- :transport
20
+ :logger,
21
+ :transport,
22
+ :agent_settings
21
23
 
22
24
  # rubocop:disable Lint/MissingSuper
23
25
  def initialize(options = {})
26
+ @logger = options[:logger] || Datadog.logger
27
+
24
28
  transport_options = options.fetch(:transport_options, {})
25
29
 
26
- 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
27
34
 
28
35
  @transport = options.fetch(:transport) do
29
36
  Datadog::Tracing::Transport::HTTP.default(**transport_options)
@@ -43,7 +50,7 @@ module Datadog
43
50
  traces = process_traces(traces)
44
51
  flush_traces(traces)
45
52
  rescue StandardError => e
46
- Datadog.logger.warn(
53
+ logger.warn(
47
54
  "Error while writing traces: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
48
55
  )
49
56
  end
@@ -18,8 +18,7 @@ module Datadog
18
18
  BACK_OFF_MAX = 5
19
19
  DEFAULT_SHUTDOWN_TIMEOUT = 1
20
20
 
21
- attr_reader \
22
- :trace_buffer
21
+ attr_reader :trace_buffer, :logger
23
22
 
24
23
  def initialize(options = {})
25
24
  @transport = options[:transport]
@@ -42,6 +41,8 @@ module Datadog
42
41
  @mutex = Mutex.new
43
42
  @worker = nil
44
43
  @run = false
44
+
45
+ @logger = options.fetch(:logger)
45
46
  end
46
47
 
47
48
  # Callback function that process traces and executes the +send_traces()+ method.
@@ -56,7 +57,7 @@ module Datadog
56
57
  # ensures that the thread will not die because of an exception.
57
58
  # TODO[manu]: findout the reason and reschedule the send if it's not
58
59
  # a fatal exception
59
- Datadog.logger.warn(
60
+ logger.warn(
60
61
  "Error during traces flush: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
61
62
  )
62
63
  end
@@ -68,7 +69,7 @@ module Datadog
68
69
  return if @run
69
70
 
70
71
  @run = true
71
- Datadog.logger.debug { "Starting thread for: #{self}" }
72
+ logger.debug { "Starting thread for: #{self}" }
72
73
  @worker = Thread.new { perform }
73
74
  @worker.name = self.class.name
74
75
  @worker.thread_variable_set(:fork_safe, true)
@@ -13,17 +13,24 @@ module Datadog
13
13
  # @public_api
14
14
  class Writer
15
15
  attr_reader \
16
+ :logger,
16
17
  :transport,
17
18
  :worker,
18
- :events
19
+ :events,
20
+ :agent_settings
19
21
 
20
22
  def initialize(options = {})
23
+ @logger = options[:logger] || Datadog.logger
24
+
21
25
  # writer and transport parameters
22
26
  @buff_size = options.fetch(:buffer_size, Workers::AsyncTransport::DEFAULT_BUFFER_MAX_SIZE)
23
27
  @flush_interval = options.fetch(:flush_interval, Workers::AsyncTransport::DEFAULT_FLUSH_INTERVAL)
24
28
  transport_options = options.fetch(:transport_options, {})
25
29
 
26
- 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
27
34
 
28
35
  # transport and buffers
29
36
  @transport = options.fetch(:transport) do
@@ -119,7 +126,7 @@ module Datadog
119
126
  if worker_local
120
127
  worker_local.enqueue_trace(trace)
121
128
  elsif !@stopped
122
- Datadog.logger.debug('Writer either failed to start or was stopped before #write could complete')
129
+ logger.debug('Writer either failed to start or was stopped before #write could complete')
123
130
  end
124
131
  end
125
132
 
@@ -160,7 +167,8 @@ module Datadog
160
167
  buffer_size: @buff_size,
161
168
  on_trace: @trace_handler,
162
169
  interval: @flush_interval,
163
- shutdown_timeout: @shutdown_timeout
170
+ shutdown_timeout: @shutdown_timeout,
171
+ logger: logger,
164
172
  )
165
173
 
166
174
  @worker.start
@@ -3,8 +3,8 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 11
7
- PATCH = 0
6
+ MINOR = 12
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.11.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-24 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
@@ -210,6 +210,9 @@ files:
210
210
  - lib/datadog/appsec/contrib/rails/patcher.rb
211
211
  - lib/datadog/appsec/contrib/rails/request.rb
212
212
  - lib/datadog/appsec/contrib/rails/request_middleware.rb
213
+ - lib/datadog/appsec/contrib/rest_client/integration.rb
214
+ - lib/datadog/appsec/contrib/rest_client/patcher.rb
215
+ - lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb
213
216
  - lib/datadog/appsec/contrib/sinatra/framework.rb
214
217
  - lib/datadog/appsec/contrib/sinatra/gateway/request.rb
215
218
  - lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb
@@ -339,6 +342,7 @@ files:
339
342
  - lib/datadog/core/telemetry/request.rb
340
343
  - lib/datadog/core/telemetry/worker.rb
341
344
  - lib/datadog/core/transport/ext.rb
345
+ - lib/datadog/core/transport/http.rb
342
346
  - lib/datadog/core/transport/http/adapters/net.rb
343
347
  - lib/datadog/core/transport/http/adapters/registry.rb
344
348
  - lib/datadog/core/transport/http/adapters/test.rb
@@ -403,7 +407,13 @@ files:
403
407
  - lib/datadog/di/redactor.rb
404
408
  - lib/datadog/di/remote.rb
405
409
  - lib/datadog/di/serializer.rb
406
- - lib/datadog/di/transport.rb
410
+ - lib/datadog/di/transport/diagnostics.rb
411
+ - lib/datadog/di/transport/http.rb
412
+ - lib/datadog/di/transport/http/api.rb
413
+ - lib/datadog/di/transport/http/client.rb
414
+ - lib/datadog/di/transport/http/diagnostics.rb
415
+ - lib/datadog/di/transport/http/input.rb
416
+ - lib/datadog/di/transport/input.rb
407
417
  - lib/datadog/di/utils.rb
408
418
  - lib/datadog/kit.rb
409
419
  - lib/datadog/kit/appsec/events.rb
@@ -920,8 +930,8 @@ licenses:
920
930
  - Apache-2.0
921
931
  metadata:
922
932
  allowed_push_host: https://rubygems.org
923
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.11.0/CHANGELOG.md
924
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.11.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
925
935
  post_install_message:
926
936
  rdoc_options: []
927
937
  require_paths:
@@ -1,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'error'
4
- require_relative '../core/transport/http/adapters/net'
5
-
6
- module Datadog
7
- module DI
8
- # Transport for sending probe statuses and snapshots to local agent.
9
- #
10
- # Handles encoding of the payloads into multipart posts if necessary,
11
- # body formatting/encoding, setting correct headers, etc.
12
- #
13
- # The transport does not handle batching of statuses or snapshots -
14
- # the batching should be implemented upstream of this class.
15
- #
16
- # Timeout settings are forwarded from agent settings to the Net adapter.
17
- #
18
- # The send_* methods raise Error::AgentCommunicationError on errors
19
- # (network errors and HTTP protocol errors). It is the responsibility
20
- # of upstream code to rescue these exceptions appropriately to prevent them
21
- # from being propagated to the application.
22
- #
23
- # @api private
24
- class Transport
25
- DIAGNOSTICS_PATH = '/debugger/v1/diagnostics'
26
- INPUT_PATH = '/debugger/v1/input'
27
-
28
- def initialize(agent_settings)
29
- # Note that this uses host, port, timeout and TLS flag from
30
- # agent settings.
31
- @client = Core::Transport::HTTP::Adapters::Net.new(agent_settings)
32
- end
33
-
34
- def send_diagnostics(payload)
35
- event_payload = Core::Vendor::Multipart::Post::UploadIO.new(
36
- StringIO.new(JSON.dump(payload)), 'application/json', 'event.json'
37
- )
38
- payload = {'event' => event_payload}
39
- # Core transport unconditionally specifies headers to underlying
40
- # Net::HTTP client, ends up passing 'nil' as headers if none are
41
- # specified by us, which then causes Net::HTTP to die with an exception.
42
- send_request('Probe status submission',
43
- path: DIAGNOSTICS_PATH, form: payload, headers: {})
44
- end
45
-
46
- def send_input(payload)
47
- send_request('Probe snapshot submission',
48
- path: INPUT_PATH, body: payload.to_json,
49
- headers: {'content-type' => 'application/json'},)
50
- end
51
-
52
- # TODO status should use either input or diagnostics endpoints
53
- # depending on agent version.
54
- alias_method :send_status, :send_diagnostics
55
-
56
- alias_method :send_snapshot, :send_input
57
-
58
- private
59
-
60
- attr_reader :client
61
-
62
- def send_request(desc, **options)
63
- env = Core::Transport::HTTP::Env.new(nil, options)
64
- response = client.post(env)
65
- unless response.ok?
66
- raise Error::AgentCommunicationError, "#{desc} failed: #{response.code}: #{response.payload}"
67
- end
68
- # Datadog::Core::Transport does not perform any exception mapping,
69
- # therefore we could have any exception here from failure to parse
70
- # agent URI for example.
71
- # If we ever implement retries for network errors, we should distinguish
72
- # actual network errors from non-network errors that are raised by
73
- # transport code.
74
- rescue => exc
75
- raise Error::AgentCommunicationError, "#{desc} failed: #{exc.class}: #{exc}"
76
- end
77
- end
78
- end
79
- end