datadog 2.10.0 → 2.12.0
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 +56 -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 +56 -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/patcher.rb +0 -3
- 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/gateway/watcher.rb +65 -73
- data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
- 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/monitor/gateway/watcher.rb +19 -25
- data/lib/datadog/appsec/remote.rb +4 -0
- data/lib/datadog/appsec.rb +3 -0
- data/lib/datadog/core/configuration/components.rb +8 -2
- 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/remote/component.rb +11 -9
- 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 +7 -12
- 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/response.rb +4 -0
- 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 +119 -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/sync_writer.rb +5 -2
- data/lib/datadog/tracing/tracer.rb +10 -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 +12 -7
- data/lib/datadog/tracing/transport/serializable_trace.rb +8 -4
- data/lib/datadog/tracing/transport/traces.rb +25 -8
- data/lib/datadog/tracing/workers/trace_writer.rb +4 -1
- data/lib/datadog/tracing/workers.rb +5 -4
- data/lib/datadog/tracing/writer.rb +6 -2
- data/lib/datadog/version.rb +1 -1
- metadata +33 -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
@@ -10,6 +10,7 @@ module Datadog
|
|
10
10
|
# Encoder interface that provides the logic to encode traces and service
|
11
11
|
# @abstract
|
12
12
|
module Encoder
|
13
|
+
# :nocov:
|
13
14
|
def content_type
|
14
15
|
raise NotImplementedError
|
15
16
|
end
|
@@ -23,6 +24,13 @@ module Datadog
|
|
23
24
|
def encode(_)
|
24
25
|
raise NotImplementedError
|
25
26
|
end
|
27
|
+
|
28
|
+
# Deserializes a value serialized with {#encode}.
|
29
|
+
# This method is used for debugging purposes.
|
30
|
+
def decode(_)
|
31
|
+
raise NotImplementedError
|
32
|
+
end
|
33
|
+
# :nocov:
|
26
34
|
end
|
27
35
|
|
28
36
|
# Encoder for the JSON format
|
@@ -41,6 +49,10 @@ module Datadog
|
|
41
49
|
JSON.dump(obj)
|
42
50
|
end
|
43
51
|
|
52
|
+
def decode(obj)
|
53
|
+
JSON.parse(obj)
|
54
|
+
end
|
55
|
+
|
44
56
|
def join(encoded_data)
|
45
57
|
"[#{encoded_data.join(',')}]"
|
46
58
|
end
|
@@ -62,6 +74,10 @@ module Datadog
|
|
62
74
|
MessagePack.pack(obj)
|
63
75
|
end
|
64
76
|
|
77
|
+
def decode(obj)
|
78
|
+
MessagePack.unpack(obj)
|
79
|
+
end
|
80
|
+
|
65
81
|
def join(encoded_data)
|
66
82
|
packer = MessagePack::Packer.new
|
67
83
|
packer.write_array_header(encoded_data.size)
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module Core
|
5
|
+
module Environment
|
6
|
+
# Retrieves the agent's `/info` endpoint data.
|
7
|
+
# This data can be used to determine the capabilities of the local Datadog agent.
|
8
|
+
#
|
9
|
+
# @example Example response payload
|
10
|
+
# {
|
11
|
+
# "version" : "7.57.2",
|
12
|
+
# "git_commit" : "38ba0c7",
|
13
|
+
# "endpoints" : [ "/v0.4/traces", "/v0.4/services", "/v0.7/traces", "/v0.7/config" ],
|
14
|
+
# "client_drop_p0s" : true,
|
15
|
+
# "span_meta_structs" : true,
|
16
|
+
# "long_running_spans" : true,
|
17
|
+
# "evp_proxy_allowed_headers" : [ "Content-Type", "Accept-Encoding", "Content-Encoding", "User-Agent" ],
|
18
|
+
# "config" : {
|
19
|
+
# "default_env" : "none",
|
20
|
+
# "target_tps" : 10,
|
21
|
+
# "max_eps" : 200,
|
22
|
+
# "receiver_port" : 8126,
|
23
|
+
# "receiver_socket" : "/var/run/datadog/apm.socket",
|
24
|
+
# "connection_limit" : 0,
|
25
|
+
# "receiver_timeout" : 0,
|
26
|
+
# "max_request_bytes" : 26214400,
|
27
|
+
# "statsd_port" : 8125,
|
28
|
+
# "analyzed_spans_by_service" : { },
|
29
|
+
# "obfuscation" : {
|
30
|
+
# "elastic_search" : true,
|
31
|
+
# "mongo" : true,
|
32
|
+
# "sql_exec_plan" : false,
|
33
|
+
# "sql_exec_plan_normalize" : false,
|
34
|
+
# "http" : {
|
35
|
+
# "remove_query_string" : false,
|
36
|
+
# "remove_path_digits" : false
|
37
|
+
# },
|
38
|
+
# "remove_stack_traces" : false,
|
39
|
+
# "redis" : {
|
40
|
+
# "Enabled" : true,
|
41
|
+
# "RemoveAllArgs" : false
|
42
|
+
# },
|
43
|
+
# "memcached" : {
|
44
|
+
# "Enabled" : true,
|
45
|
+
# "KeepCommand" : false
|
46
|
+
# }
|
47
|
+
# }
|
48
|
+
# },
|
49
|
+
# "peer_tags" : null
|
50
|
+
# }
|
51
|
+
#
|
52
|
+
# @see https://github.com/DataDog/datadog-agent/blob/f07df0a3c1fca0c83b5a15f553bd994091b0c8ac/pkg/trace/api/info.go#L20
|
53
|
+
class AgentInfo
|
54
|
+
attr_reader :agent_settings
|
55
|
+
|
56
|
+
def initialize(agent_settings)
|
57
|
+
@agent_settings = agent_settings
|
58
|
+
@client = Remote::Transport::HTTP.root(agent_settings: agent_settings)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Fetches the information from the agent.
|
62
|
+
# @return [Datadog::Core::Remote::Transport::HTTP::Negotiation::Response] the response from the agent
|
63
|
+
# @return [nil] if an error occurred while fetching the information
|
64
|
+
def fetch
|
65
|
+
res = @client.send_info
|
66
|
+
return unless res.ok?
|
67
|
+
|
68
|
+
res
|
69
|
+
end
|
70
|
+
|
71
|
+
def ==(other)
|
72
|
+
other.is_a?(self.class) && other.agent_settings == agent_settings
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -13,9 +13,11 @@ module Datadog
|
|
13
13
|
# Configures the HTTP transport to communicate with the agent
|
14
14
|
# to fetch and sync the remote configuration
|
15
15
|
class Component
|
16
|
-
attr_reader :client, :healthy
|
16
|
+
attr_reader :logger, :client, :healthy
|
17
|
+
|
18
|
+
def initialize(settings, capabilities, agent_settings, logger:)
|
19
|
+
@logger = logger
|
17
20
|
|
18
|
-
def initialize(settings, capabilities, agent_settings)
|
19
21
|
transport_options = {}
|
20
22
|
transport_options[:agent_settings] = agent_settings if agent_settings
|
21
23
|
|
@@ -26,9 +28,9 @@ module Datadog
|
|
26
28
|
|
27
29
|
@client = Client.new(transport_v7, capabilities)
|
28
30
|
@healthy = false
|
29
|
-
|
31
|
+
logger.debug { "new remote configuration client: #{@client.id}" }
|
30
32
|
|
31
|
-
@worker = Worker.new(interval: settings.remote.poll_interval_seconds) do
|
33
|
+
@worker = Worker.new(interval: settings.remote.poll_interval_seconds, logger: logger) do
|
32
34
|
unless @healthy || negotiation.endpoint?('/v0.7/config')
|
33
35
|
@barrier.lift
|
34
36
|
|
@@ -40,7 +42,7 @@ module Datadog
|
|
40
42
|
@healthy ||= true
|
41
43
|
rescue Client::SyncError => e
|
42
44
|
# Transient errors due to network or agent. Logged the error but not via telemetry
|
43
|
-
|
45
|
+
logger.error do
|
44
46
|
"remote worker client sync error: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
|
45
47
|
end
|
46
48
|
rescue StandardError => e
|
@@ -50,7 +52,7 @@ module Datadog
|
|
50
52
|
negotiation = Negotiation.new(settings, agent_settings)
|
51
53
|
|
52
54
|
# Transient errors due to network or agent. Logged the error but not via telemetry
|
53
|
-
|
55
|
+
logger.error do
|
54
56
|
"remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. "\
|
55
57
|
'reseting client state'
|
56
58
|
end
|
@@ -58,7 +60,7 @@ module Datadog
|
|
58
60
|
# client state is unknown, state might be corrupted
|
59
61
|
@client = Client.new(transport_v7, capabilities)
|
60
62
|
@healthy = false
|
61
|
-
|
63
|
+
logger.debug { "new remote configuration client: #{@client.id}" }
|
62
64
|
|
63
65
|
# TODO: bail out if too many errors?
|
64
66
|
end
|
@@ -152,10 +154,10 @@ module Datadog
|
|
152
154
|
#
|
153
155
|
# Those checks are instead performed inside the worker loop.
|
154
156
|
# This allows users to upgrade their agent while keeping their application running.
|
155
|
-
def build(settings, agent_settings, telemetry:)
|
157
|
+
def build(settings, agent_settings, logger:, telemetry:)
|
156
158
|
return unless settings.remote.enabled
|
157
159
|
|
158
|
-
new(settings, Client::Capabilities.new(settings, telemetry), agent_settings)
|
160
|
+
new(settings, Client::Capabilities.new(settings, telemetry), agent_settings, logger: logger)
|
159
161
|
end
|
160
162
|
end
|
161
163
|
end
|
@@ -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
|
@@ -5,6 +5,7 @@ require 'uri'
|
|
5
5
|
require_relative '../../environment/container'
|
6
6
|
require_relative '../../environment/ext'
|
7
7
|
require_relative '../../transport/ext'
|
8
|
+
require_relative '../../transport/http/builder'
|
8
9
|
require_relative '../../transport/http/adapters/net'
|
9
10
|
require_relative '../../transport/http/adapters/unix_socket'
|
10
11
|
require_relative '../../transport/http/adapters/test'
|
@@ -19,14 +20,6 @@ require_relative '../../transport/http/adapters/test'
|
|
19
20
|
# require_relative '../../transport/http/api'
|
20
21
|
require_relative 'http/api'
|
21
22
|
|
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
23
|
# TODO: Decouple transport/http
|
31
24
|
#
|
32
25
|
# Because a new transport is required for every (API, Client, Transport)
|
@@ -53,7 +46,9 @@ module Datadog
|
|
53
46
|
|
54
47
|
# Builds a new Transport::HTTP::Client
|
55
48
|
def new(klass, &block)
|
56
|
-
Builder.new(
|
49
|
+
Core::Transport::HTTP::Builder.new(
|
50
|
+
api_instance_class: API::Instance, &block
|
51
|
+
).to_transport(klass)
|
57
52
|
end
|
58
53
|
|
59
54
|
# Builds a new Transport::HTTP::Client with default settings
|
@@ -133,15 +128,15 @@ module Datadog
|
|
133
128
|
end
|
134
129
|
|
135
130
|
# Add adapters to registry
|
136
|
-
Builder::REGISTRY.set(
|
131
|
+
Core::Transport::HTTP::Builder::REGISTRY.set(
|
137
132
|
Datadog::Core::Transport::HTTP::Adapters::Net,
|
138
133
|
Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
|
139
134
|
)
|
140
|
-
Builder::REGISTRY.set(
|
135
|
+
Core::Transport::HTTP::Builder::REGISTRY.set(
|
141
136
|
Datadog::Core::Transport::HTTP::Adapters::Test,
|
142
137
|
Datadog::Core::Transport::Ext::Test::ADAPTER
|
143
138
|
)
|
144
|
-
Builder::REGISTRY.set(
|
139
|
+
Core::Transport::HTTP::Builder::REGISTRY.set(
|
145
140
|
Datadog::Core::Transport::HTTP::Adapters::UnixSocket,
|
146
141
|
Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
|
147
142
|
)
|
@@ -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
|
|