datadog 2.10.0 → 2.12.2
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 +72 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +3 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +44 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +4 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
- data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +64 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +7 -0
- data/ext/datadog_profiling_native_extension/profiling.c +7 -0
- data/ext/libdatadog_api/crashtracker.c +4 -4
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +64 -11
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +23 -6
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +63 -15
- data/lib/datadog/appsec/contrib/devise/configuration.rb +76 -0
- data/lib/datadog/appsec/contrib/devise/event.rb +4 -7
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +16 -21
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +8 -15
- data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/devise/tracking.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
- data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +43 -0
- data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
- data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
- data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +42 -0
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -12
- data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rack/ext.rb +20 -0
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +84 -72
- data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +20 -25
- data/lib/datadog/appsec/contrib/rails/patcher.rb +0 -3
- 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/contrib/sinatra/gateway/watcher.rb +38 -49
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +0 -3
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
- data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +19 -25
- data/lib/datadog/appsec/processor/rule_merger.rb +2 -1
- data/lib/datadog/appsec/remote.rb +11 -0
- data/lib/datadog/appsec.rb +3 -0
- data/lib/datadog/core/configuration/components.rb +17 -10
- data/lib/datadog/core/configuration/ext.rb +1 -1
- data/lib/datadog/core/configuration/option_definition.rb +2 -0
- data/lib/datadog/core/configuration/settings.rb +22 -6
- data/lib/datadog/core/encoding.rb +16 -0
- data/lib/datadog/core/environment/agent_info.rb +77 -0
- 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/api.rb +13 -18
- data/lib/datadog/core/remote/transport/http/config.rb +0 -18
- data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -18
- data/lib/datadog/core/remote/transport/http.rb +6 -40
- data/lib/datadog/core/remote/transport/negotiation.rb +13 -1
- data/lib/datadog/core/remote/worker.rb +10 -7
- data/lib/datadog/core/telemetry/component.rb +5 -1
- data/lib/datadog/core/telemetry/event.rb +5 -0
- data/lib/datadog/core/telemetry/worker.rb +9 -5
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/api/spec.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/builder.rb +37 -17
- data/lib/datadog/core/transport/http.rb +38 -0
- data/lib/datadog/core/transport/response.rb +4 -0
- data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
- data/lib/datadog/di/code_tracker.rb +15 -8
- data/lib/datadog/di/component.rb +2 -3
- data/lib/datadog/di/configuration/settings.rb +14 -0
- data/lib/datadog/di/contrib.rb +2 -0
- data/lib/datadog/di/logger.rb +30 -0
- data/lib/datadog/di/probe.rb +3 -6
- data/lib/datadog/di/probe_manager.rb +5 -2
- data/lib/datadog/di/probe_notifier_worker.rb +35 -8
- data/lib/datadog/di/remote.rb +3 -3
- 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/utils.rb +91 -0
- data/lib/datadog/di.rb +5 -1
- data/lib/datadog/profiling/component.rb +2 -8
- data/lib/datadog/profiling/load_native_extension.rb +1 -33
- data/lib/datadog/tracing/component.rb +1 -0
- data/lib/datadog/tracing/configuration/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/extensions.rb +14 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
- data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
- data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
- data/lib/datadog/tracing/metadata.rb +2 -0
- data/lib/datadog/tracing/span.rb +10 -1
- data/lib/datadog/tracing/span_operation.rb +6 -1
- data/lib/datadog/tracing/sync_writer.rb +9 -4
- data/lib/datadog/tracing/tracer.rb +15 -7
- data/lib/datadog/tracing/transport/http/api.rb +11 -2
- data/lib/datadog/tracing/transport/http/traces.rb +0 -3
- data/lib/datadog/tracing/transport/http.rb +7 -31
- data/lib/datadog/tracing/transport/serializable_trace.rb +11 -5
- data/lib/datadog/tracing/transport/traces.rb +25 -8
- 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 +37 -29
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
- data/ext/datadog_profiling_loader/extconf.rb +0 -60
- data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
- data/lib/datadog/appsec/contrib/patcher.rb +0 -12
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
- data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
- data/lib/datadog/appsec/reactive/engine.rb +0 -47
- data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
- data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
- data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
- data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
- data/lib/datadog/di/transport.rb +0 -79
@@ -2,24 +2,9 @@
|
|
2
2
|
|
3
3
|
require_relative '../../../encoding'
|
4
4
|
require_relative '../../../transport/http/api/map'
|
5
|
-
|
6
|
-
|
7
|
-
#
|
8
|
-
# Separate classes are needed because transport/http/traces includes
|
9
|
-
# Trace::API::Instance which closes over and uses a single spec, which is
|
10
|
-
# negotiated as either /v3 or /v4 for the whole API at the spec level, but we
|
11
|
-
# need an independent toplevel path at the endpoint level.
|
12
|
-
#
|
13
|
-
# Separate classes are needed because of `include Trace::API::Instance`.
|
14
|
-
#
|
15
|
-
# Below should be:
|
16
|
-
# require_relative '../../../../datadog/core/transport/http/api/spec'
|
17
|
-
require_relative 'api/spec'
|
18
|
-
|
19
|
-
# TODO: only needed for Negotiation::API::Endpoint
|
5
|
+
require_relative '../../../transport/http/api/instance'
|
6
|
+
require_relative '../../../transport/http/api/spec'
|
20
7
|
require_relative 'negotiation'
|
21
|
-
|
22
|
-
# TODO: only needed for Config::API::Endpoint
|
23
8
|
require_relative 'config'
|
24
9
|
|
25
10
|
module Datadog
|
@@ -36,7 +21,7 @@ module Datadog
|
|
36
21
|
module_function
|
37
22
|
|
38
23
|
def defaults
|
39
|
-
|
24
|
+
Core::Transport::HTTP::API::Map[
|
40
25
|
ROOT => Spec.new do |s|
|
41
26
|
s.info = Negotiation::API::Endpoint.new(
|
42
27
|
'/info',
|
@@ -50,6 +35,16 @@ module Datadog
|
|
50
35
|
end,
|
51
36
|
]
|
52
37
|
end
|
38
|
+
|
39
|
+
class Instance < Core::Transport::HTTP::API::Instance
|
40
|
+
include Config::API::Instance
|
41
|
+
include Negotiation::API::Instance
|
42
|
+
end
|
43
|
+
|
44
|
+
class Spec < Core::Transport::HTTP::API::Spec
|
45
|
+
include Config::API::Spec
|
46
|
+
include Negotiation::API::Spec
|
47
|
+
end
|
53
48
|
end
|
54
49
|
end
|
55
50
|
end
|
@@ -8,22 +8,6 @@ require_relative '../../../utils/base64'
|
|
8
8
|
require_relative '../../../transport/http/response'
|
9
9
|
require_relative '../../../transport/http/api/endpoint'
|
10
10
|
|
11
|
-
# TODO: Decouple standard transport/http/api/instance
|
12
|
-
#
|
13
|
-
# Separate classes are needed because transport/http/trace includes
|
14
|
-
# Trace::API::Instance which closes over and uses a single spec, which is
|
15
|
-
# negotiated as either /v3 or /v4 for the whole API at the spec level, but we
|
16
|
-
# need an independent toplevel path at the endpoint level.
|
17
|
-
#
|
18
|
-
# Separate classes are needed because of `include Trace::API::Instance`.
|
19
|
-
#
|
20
|
-
# Below should be:
|
21
|
-
# require_relative '../../../core/transport/http/api/instance'
|
22
|
-
require_relative 'api/instance'
|
23
|
-
# Below should be:
|
24
|
-
# require_relative '../../../core/transport/http/api/spec'
|
25
|
-
require_relative 'api/spec'
|
26
|
-
|
27
11
|
module Datadog
|
28
12
|
module Core
|
29
13
|
module Remote
|
@@ -270,8 +254,6 @@ module Datadog
|
|
270
254
|
# Add remote configuration behavior to transport components
|
271
255
|
###### overrides send_payload! which calls send_<endpoint>! kills any other possible endpoint!
|
272
256
|
HTTP::Client.include(Config::Client)
|
273
|
-
HTTP::API::Spec.include(Config::API::Spec)
|
274
|
-
HTTP::API::Instance.include(Config::API::Instance)
|
275
257
|
end
|
276
258
|
end
|
277
259
|
end
|
@@ -7,22 +7,6 @@ require_relative 'client'
|
|
7
7
|
require_relative '../../../transport/http/response'
|
8
8
|
require_relative '../../../transport/http/api/endpoint'
|
9
9
|
|
10
|
-
# TODO: Decouple standard transport/http/api/instance
|
11
|
-
#
|
12
|
-
# Separate classes are needed because transport/http/trace includes
|
13
|
-
# Trace::API::Instance which closes over and uses a single spec, which is
|
14
|
-
# negotiated as either /v3 or /v4 for the whole API at the spec level, but we
|
15
|
-
# need an independent toplevel path at the endpoint level.
|
16
|
-
#
|
17
|
-
# Separate classes are needed because of `include Trace::API::Instance`.
|
18
|
-
#
|
19
|
-
# Below should be:
|
20
|
-
# require_relative '../../../../datadog/core/transport/http/api/instance'
|
21
|
-
require_relative 'api/instance'
|
22
|
-
# Below should be:
|
23
|
-
# require_relative '../../../../datadog/core/transport/http/api/spec'
|
24
|
-
require_relative 'api/spec'
|
25
|
-
|
26
10
|
module Datadog
|
27
11
|
module Core
|
28
12
|
module Remote
|
@@ -43,6 +27,7 @@ module Datadog
|
|
43
27
|
@version = options[:version]
|
44
28
|
@endpoints = options[:endpoints]
|
45
29
|
@config = options[:config]
|
30
|
+
@span_events = options[:span_events]
|
46
31
|
end
|
47
32
|
end
|
48
33
|
|
@@ -136,8 +121,6 @@ module Datadog
|
|
136
121
|
|
137
122
|
# Add negotiation behavior to transport components
|
138
123
|
HTTP::Client.include(Negotiation::Client)
|
139
|
-
HTTP::API::Spec.include(Negotiation::API::Spec)
|
140
|
-
HTTP::API::Instance.include(Negotiation::API::Instance)
|
141
124
|
end
|
142
125
|
end
|
143
126
|
end
|
@@ -1,13 +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
|
9
|
-
require_relative '../../transport/http/adapters/unix_socket'
|
10
|
-
require_relative '../../transport/http/adapters/test'
|
6
|
+
require_relative '../../transport/http'
|
11
7
|
|
12
8
|
# TODO: Improve negotiation to allow per endpoint selection
|
13
9
|
#
|
@@ -19,14 +15,6 @@ require_relative '../../transport/http/adapters/test'
|
|
19
15
|
# require_relative '../../transport/http/api'
|
20
16
|
require_relative 'http/api'
|
21
17
|
|
22
|
-
# TODO: Decouple transport/http/builder
|
23
|
-
#
|
24
|
-
# See http/builder
|
25
|
-
#
|
26
|
-
# Below should be:
|
27
|
-
# require_relative '../../transport/http/builder'
|
28
|
-
require_relative 'http/builder'
|
29
|
-
|
30
18
|
# TODO: Decouple transport/http
|
31
19
|
#
|
32
20
|
# Because a new transport is required for every (API, Client, Transport)
|
@@ -39,27 +27,19 @@ module Datadog
|
|
39
27
|
module Transport
|
40
28
|
# Namespace for HTTP transport components
|
41
29
|
module HTTP
|
42
|
-
# NOTE: Due to... legacy reasons... This class likes having a default `AgentSettings` instance to fall back to.
|
43
|
-
# Because we generate this instance with an empty instance of `Settings`, the resulting `AgentSettings` below
|
44
|
-
# represents only settings specified via environment variables + the usual defaults.
|
45
|
-
#
|
46
|
-
# DO NOT USE THIS IN NEW CODE, as it ignores any settings specified by users via `Datadog.configure`.
|
47
|
-
DO_NOT_USE_ENVIRONMENT_AGENT_SETTINGS = Datadog::Core::Configuration::AgentSettingsResolver.call(
|
48
|
-
Datadog::Core::Configuration::Settings.new,
|
49
|
-
logger: nil,
|
50
|
-
)
|
51
|
-
|
52
30
|
module_function
|
53
31
|
|
54
32
|
# Builds a new Transport::HTTP::Client
|
55
33
|
def new(klass, &block)
|
56
|
-
|
34
|
+
Core::Transport::HTTP.build(
|
35
|
+
api_instance_class: API::Instance, &block
|
36
|
+
).to_transport(klass)
|
57
37
|
end
|
58
38
|
|
59
39
|
# Builds a new Transport::HTTP::Client with default settings
|
60
40
|
# Pass a block to override any settings.
|
61
41
|
def root(
|
62
|
-
agent_settings
|
42
|
+
agent_settings:,
|
63
43
|
**options
|
64
44
|
)
|
65
45
|
new(Core::Remote::Transport::Negotiation::Transport) do |transport|
|
@@ -84,7 +64,7 @@ module Datadog
|
|
84
64
|
# Builds a new Transport::HTTP::Client with default settings
|
85
65
|
# Pass a block to override any settings.
|
86
66
|
def v7(
|
87
|
-
agent_settings
|
67
|
+
agent_settings:,
|
88
68
|
**options
|
89
69
|
)
|
90
70
|
new(Core::Remote::Transport::Config::Transport) do |transport|
|
@@ -131,20 +111,6 @@ module Datadog
|
|
131
111
|
def default_adapter
|
132
112
|
Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
133
113
|
end
|
134
|
-
|
135
|
-
# Add adapters to registry
|
136
|
-
Builder::REGISTRY.set(
|
137
|
-
Datadog::Core::Transport::HTTP::Adapters::Net,
|
138
|
-
Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
139
|
-
)
|
140
|
-
Builder::REGISTRY.set(
|
141
|
-
Datadog::Core::Transport::HTTP::Adapters::Test,
|
142
|
-
Datadog::Core::Transport::Ext::Test::ADAPTER
|
143
|
-
)
|
144
|
-
Builder::REGISTRY.set(
|
145
|
-
Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
|
146
|
-
Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
|
147
|
-
)
|
148
114
|
end
|
149
115
|
end
|
150
116
|
end
|
@@ -32,7 +32,19 @@ module Datadog
|
|
32
32
|
|
33
33
|
# Negotiation response
|
34
34
|
module Response
|
35
|
-
|
35
|
+
# @!attribute [r] version
|
36
|
+
# The version of the agent.
|
37
|
+
# @return [String]
|
38
|
+
# @!attribute [r] endpoints
|
39
|
+
# The HTTP endpoints the agent supports.
|
40
|
+
# @return [Array<String>]
|
41
|
+
# @!attribute [r] config
|
42
|
+
# The agent configuration. These are configured by the user when starting the agent, as well as any defaults.
|
43
|
+
# @return [Hash]
|
44
|
+
# @!attribute [r] span_events
|
45
|
+
# Whether the agent supports the top-level span events field in flushed spans.
|
46
|
+
# @return [Boolean,nil]
|
47
|
+
attr_reader :version, :endpoints, :config, :span_events
|
36
48
|
end
|
37
49
|
|
38
50
|
# Negotiation transport
|
@@ -5,7 +5,7 @@ module Datadog
|
|
5
5
|
module Remote
|
6
6
|
# Worker executes a block every interval on a separate Thread
|
7
7
|
class Worker
|
8
|
-
def initialize(interval:, &block)
|
8
|
+
def initialize(interval:, logger:, &block)
|
9
9
|
@mutex = Mutex.new
|
10
10
|
@thr = nil
|
11
11
|
|
@@ -14,18 +14,21 @@ module Datadog
|
|
14
14
|
@stopped = false
|
15
15
|
|
16
16
|
@interval = interval
|
17
|
+
@logger = logger
|
17
18
|
raise ArgumentError, 'can not initialize a worker without a block' unless block
|
18
19
|
|
19
20
|
@block = block
|
20
21
|
end
|
21
22
|
|
23
|
+
attr_reader :logger
|
24
|
+
|
22
25
|
def start
|
23
|
-
|
26
|
+
logger.debug { 'remote worker starting' }
|
24
27
|
|
25
28
|
acquire_lock
|
26
29
|
|
27
30
|
if @stopped
|
28
|
-
|
31
|
+
logger.debug('remote worker: refusing to restart after previous stop')
|
29
32
|
return
|
30
33
|
end
|
31
34
|
|
@@ -41,13 +44,13 @@ module Datadog
|
|
41
44
|
@started = true
|
42
45
|
@starting = false
|
43
46
|
|
44
|
-
|
47
|
+
logger.debug { 'remote worker started' }
|
45
48
|
ensure
|
46
49
|
release_lock
|
47
50
|
end
|
48
51
|
|
49
52
|
def stop
|
50
|
-
|
53
|
+
logger.debug { 'remote worker stopping' }
|
51
54
|
|
52
55
|
acquire_lock
|
53
56
|
|
@@ -62,7 +65,7 @@ module Datadog
|
|
62
65
|
@thr = nil
|
63
66
|
@stopped = true
|
64
67
|
|
65
|
-
|
68
|
+
logger.debug { 'remote worker stopped' }
|
66
69
|
ensure
|
67
70
|
release_lock
|
68
71
|
end
|
@@ -92,7 +95,7 @@ module Datadog
|
|
92
95
|
end
|
93
96
|
|
94
97
|
def call
|
95
|
-
|
98
|
+
logger.debug { 'remote worker perform' }
|
96
99
|
|
97
100
|
@block.call
|
98
101
|
end
|
@@ -16,7 +16,7 @@ module Datadog
|
|
16
16
|
# Telemetry entrypoint, coordinates sending telemetry events at various points in app lifecycle.
|
17
17
|
# Note: Telemetry does not spawn its worker thread in fork processes, thus no telemetry is sent in forked processes.
|
18
18
|
class Component
|
19
|
-
attr_reader :enabled
|
19
|
+
attr_reader :enabled, :logger
|
20
20
|
|
21
21
|
include Core::Utils::Forking
|
22
22
|
include Telemetry::Logging
|
@@ -52,6 +52,7 @@ module Datadog
|
|
52
52
|
heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds,
|
53
53
|
metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds,
|
54
54
|
dependency_collection: settings.telemetry.dependency_collection,
|
55
|
+
logger: logger,
|
55
56
|
shutdown_timeout_seconds: settings.telemetry.shutdown_timeout_seconds,
|
56
57
|
log_collection_enabled: settings.telemetry.log_collection_enabled
|
57
58
|
)
|
@@ -66,6 +67,7 @@ module Datadog
|
|
66
67
|
heartbeat_interval_seconds:,
|
67
68
|
metrics_aggregation_interval_seconds:,
|
68
69
|
dependency_collection:,
|
70
|
+
logger:,
|
69
71
|
http_transport:,
|
70
72
|
shutdown_timeout_seconds:,
|
71
73
|
enabled: true,
|
@@ -74,6 +76,7 @@ module Datadog
|
|
74
76
|
)
|
75
77
|
@enabled = enabled
|
76
78
|
@log_collection_enabled = log_collection_enabled
|
79
|
+
@logger = logger
|
77
80
|
|
78
81
|
@metrics_manager = MetricsManager.new(
|
79
82
|
enabled: enabled && metrics_enabled,
|
@@ -87,6 +90,7 @@ module Datadog
|
|
87
90
|
emitter: Emitter.new(http_transport: http_transport),
|
88
91
|
metrics_manager: @metrics_manager,
|
89
92
|
dependency_collection: dependency_collection,
|
93
|
+
logger: logger,
|
90
94
|
shutdown_timeout: shutdown_timeout_seconds
|
91
95
|
)
|
92
96
|
|
@@ -122,6 +122,11 @@ module Datadog
|
|
122
122
|
config.tracing.contrib.global_default_service_name.enabled,
|
123
123
|
seq_id
|
124
124
|
),
|
125
|
+
conf_value(
|
126
|
+
'DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED',
|
127
|
+
config.tracing.contrib.peer_service_defaults,
|
128
|
+
seq_id
|
129
|
+
),
|
125
130
|
]
|
126
131
|
|
127
132
|
peer_service_mapping_str = ''
|
@@ -25,6 +25,7 @@ module Datadog
|
|
25
25
|
emitter:,
|
26
26
|
metrics_manager:,
|
27
27
|
dependency_collection:,
|
28
|
+
logger:,
|
28
29
|
enabled: true,
|
29
30
|
shutdown_timeout: Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT,
|
30
31
|
buffer_size: DEFAULT_BUFFER_MAX_SIZE
|
@@ -32,6 +33,7 @@ module Datadog
|
|
32
33
|
@emitter = emitter
|
33
34
|
@metrics_manager = metrics_manager
|
34
35
|
@dependency_collection = dependency_collection
|
36
|
+
@logger = logger
|
35
37
|
|
36
38
|
@ticks_per_heartbeat = (heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i
|
37
39
|
@current_ticks = 0
|
@@ -48,6 +50,8 @@ module Datadog
|
|
48
50
|
self.buffer = buffer_klass.new(@buffer_size)
|
49
51
|
end
|
50
52
|
|
53
|
+
attr_reader :logger
|
54
|
+
|
51
55
|
def start
|
52
56
|
return if !enabled? || forked?
|
53
57
|
|
@@ -99,7 +103,7 @@ module Datadog
|
|
99
103
|
|
100
104
|
events = deduplicate_logs(events)
|
101
105
|
|
102
|
-
|
106
|
+
logger.debug { "Sending #{events&.count} telemetry events" }
|
103
107
|
send_event(Event::MessageBatch.new(events))
|
104
108
|
end
|
105
109
|
|
@@ -113,7 +117,7 @@ module Datadog
|
|
113
117
|
return unless enabled?
|
114
118
|
|
115
119
|
if failed_to_start?
|
116
|
-
|
120
|
+
logger.debug('Telemetry app-started event exhausted retries, disabling telemetry worker')
|
117
121
|
disable!
|
118
122
|
return
|
119
123
|
end
|
@@ -122,13 +126,13 @@ module Datadog
|
|
122
126
|
res = send_event(Event::AppStarted.new)
|
123
127
|
|
124
128
|
if res.ok?
|
125
|
-
|
129
|
+
logger.debug('Telemetry app-started event is successfully sent')
|
126
130
|
|
127
131
|
send_event(Event::AppDependenciesLoaded.new) if @dependency_collection
|
128
132
|
|
129
133
|
true
|
130
134
|
else
|
131
|
-
|
135
|
+
logger.debug('Error sending telemetry app-started event, retry after heartbeat interval...')
|
132
136
|
false
|
133
137
|
end
|
134
138
|
end
|
@@ -166,7 +170,7 @@ module Datadog
|
|
166
170
|
def disable_on_not_found!(response)
|
167
171
|
return unless response.not_found?
|
168
172
|
|
169
|
-
|
173
|
+
logger.debug('Agent does not support telemetry; disabling future telemetry events.')
|
170
174
|
disable!
|
171
175
|
end
|
172
176
|
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '
|
4
|
-
require_relative '
|
5
|
-
require_relative '
|
6
|
-
require_relative 'api/instance'
|
7
|
-
require_relative 'client'
|
3
|
+
require_relative '../../configuration/agent_settings_resolver'
|
4
|
+
require_relative 'adapters/registry'
|
5
|
+
require_relative 'api/map'
|
8
6
|
|
9
7
|
module Datadog
|
10
|
-
module
|
8
|
+
module Core
|
11
9
|
module Transport
|
12
10
|
module HTTP
|
13
11
|
# Builds new instances of Transport::HTTP::Client
|
@@ -15,13 +13,14 @@ module Datadog
|
|
15
13
|
REGISTRY = Datadog::Core::Transport::HTTP::Adapters::Registry.new
|
16
14
|
|
17
15
|
attr_reader \
|
16
|
+
:api_instance_class,
|
18
17
|
:apis,
|
19
18
|
:api_options,
|
20
19
|
:default_adapter,
|
21
20
|
:default_api,
|
22
21
|
:default_headers
|
23
22
|
|
24
|
-
def initialize
|
23
|
+
def initialize(api_instance_class:)
|
25
24
|
# Global settings
|
26
25
|
@default_adapter = nil
|
27
26
|
@default_headers = {}
|
@@ -33,6 +32,8 @@ module Datadog
|
|
33
32
|
# API settings
|
34
33
|
@api_options = {}
|
35
34
|
|
35
|
+
@api_instance_class = api_instance_class
|
36
|
+
|
36
37
|
yield(self) if block_given?
|
37
38
|
end
|
38
39
|
|
@@ -82,11 +83,10 @@ module Datadog
|
|
82
83
|
@default_api = key
|
83
84
|
end
|
84
85
|
|
85
|
-
def to_transport
|
86
|
+
def to_transport(klass)
|
86
87
|
raise NoDefaultApiError if @default_api.nil?
|
87
88
|
|
88
|
-
|
89
|
-
Transport::Traces::Transport.new(to_api_instances, @default_api)
|
89
|
+
klass.new(to_api_instances, @default_api)
|
90
90
|
end
|
91
91
|
|
92
92
|
def to_api_instances
|
@@ -117,28 +117,48 @@ module Datadog
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
-
def api_instance_class
|
121
|
-
API::Instance
|
122
|
-
end
|
123
|
-
|
124
120
|
# Raised when the API key does not match known APIs.
|
125
121
|
class UnknownApiError < StandardError
|
122
|
+
attr_reader :key
|
123
|
+
|
126
124
|
def initialize(key)
|
127
|
-
super(
|
125
|
+
super()
|
126
|
+
|
127
|
+
@key = key
|
128
|
+
end
|
129
|
+
|
130
|
+
def message
|
131
|
+
"Unknown transport API '#{key}'!"
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
131
135
|
# Raised when the identifier cannot be matched to an adapter.
|
132
136
|
class UnknownAdapterError < StandardError
|
137
|
+
attr_reader :type
|
138
|
+
|
133
139
|
def initialize(type)
|
134
|
-
super(
|
140
|
+
super()
|
141
|
+
|
142
|
+
@type = type
|
143
|
+
end
|
144
|
+
|
145
|
+
def message
|
146
|
+
"Unknown transport adapter '#{type}'!"
|
135
147
|
end
|
136
148
|
end
|
137
149
|
|
138
150
|
# Raised when an adapter cannot be resolved for an API instance.
|
139
151
|
class NoAdapterForApiError < StandardError
|
152
|
+
attr_reader :key
|
153
|
+
|
140
154
|
def initialize(key)
|
141
|
-
super(
|
155
|
+
super()
|
156
|
+
|
157
|
+
@key = key
|
158
|
+
end
|
159
|
+
|
160
|
+
def message
|
161
|
+
"No adapter resolved for transport API '#{key}'!"
|
142
162
|
end
|
143
163
|
end
|
144
164
|
|
@@ -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)
|
@@ -140,16 +140,23 @@ module Datadog
|
|
140
140
|
exact = registry[suffix]
|
141
141
|
return [suffix, exact] if exact
|
142
142
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
143
|
+
suffix = suffix.dup
|
144
|
+
loop do
|
145
|
+
inexact = []
|
146
|
+
registry.each do |path, iseq|
|
147
|
+
if Utils.path_matches_suffix?(path, suffix)
|
148
|
+
inexact << [path, iseq]
|
149
|
+
end
|
147
150
|
end
|
151
|
+
if inexact.length > 1
|
152
|
+
raise Error::MultiplePathsMatch, "Multiple paths matched requested suffix"
|
153
|
+
end
|
154
|
+
if inexact.any?
|
155
|
+
return inexact.first
|
156
|
+
end
|
157
|
+
return nil unless suffix.include?('/')
|
158
|
+
suffix.sub!(%r{.*/+}, '')
|
148
159
|
end
|
149
|
-
if inexact.length > 1
|
150
|
-
raise Error::MultiplePathsMatch, "Multiple paths matched requested suffix"
|
151
|
-
end
|
152
|
-
inexact.first
|
153
160
|
end
|
154
161
|
end
|
155
162
|
|