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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -2
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +23 -6
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +63 -12
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +39 -0
- data/lib/datadog/appsec.rb +1 -0
- data/lib/datadog/core/configuration/components.rb +10 -9
- data/lib/datadog/core/metrics/client.rb +9 -8
- data/lib/datadog/core/remote/client.rb +5 -4
- data/lib/datadog/core/remote/component.rb +14 -12
- data/lib/datadog/core/remote/negotiation.rb +1 -1
- data/lib/datadog/core/remote/transport/http.rb +4 -33
- data/lib/datadog/core/remote/worker.rb +10 -7
- data/lib/datadog/core/telemetry/component.rb +5 -1
- data/lib/datadog/core/telemetry/worker.rb +9 -5
- data/lib/datadog/core/transport/http.rb +38 -0
- data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
- data/lib/datadog/di/component.rb +1 -3
- data/lib/datadog/di/probe_notifier_worker.rb +20 -4
- data/lib/datadog/di/transport/diagnostics.rb +61 -0
- data/lib/datadog/di/transport/http/api.rb +52 -0
- data/lib/datadog/di/transport/http/client.rb +46 -0
- data/lib/datadog/di/transport/http/diagnostics.rb +92 -0
- data/lib/datadog/di/transport/http/input.rb +94 -0
- data/lib/datadog/di/transport/http.rb +105 -0
- data/lib/datadog/di/transport/input.rb +61 -0
- data/lib/datadog/di.rb +2 -1
- data/lib/datadog/tracing/component.rb +1 -0
- data/lib/datadog/tracing/sync_writer.rb +9 -4
- data/lib/datadog/tracing/tracer.rb +15 -7
- data/lib/datadog/tracing/transport/http.rb +3 -32
- data/lib/datadog/tracing/workers/trace_writer.rb +10 -3
- data/lib/datadog/tracing/workers.rb +5 -4
- data/lib/datadog/tracing/writer.rb +12 -4
- data/lib/datadog/version.rb +2 -2
- metadata +15 -5
- 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
|
@@ -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
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
-
:
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
data/lib/datadog/version.rb
CHANGED
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.
|
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-
|
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.
|
924
|
-
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.
|
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:
|
data/lib/datadog/di/transport.rb
DELETED
@@ -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
|