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.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -1
  3. data/ext/datadog_profiling_native_extension/collectors_stack.c +3 -3
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +44 -1
  5. data/ext/datadog_profiling_native_extension/extconf.rb +4 -0
  6. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  7. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
  9. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +56 -0
  10. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +7 -0
  11. data/ext/datadog_profiling_native_extension/profiling.c +7 -0
  12. data/ext/libdatadog_api/crashtracker.c +4 -4
  13. data/ext/libdatadog_extconf_helpers.rb +1 -1
  14. data/lib/datadog/appsec/configuration/settings.rb +64 -11
  15. data/lib/datadog/appsec/contrib/active_record/patcher.rb +0 -3
  16. data/lib/datadog/appsec/contrib/devise/configuration.rb +76 -0
  17. data/lib/datadog/appsec/contrib/devise/event.rb +4 -7
  18. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +16 -21
  19. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +8 -15
  20. data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +1 -1
  21. data/lib/datadog/appsec/contrib/devise/patcher.rb +0 -3
  22. data/lib/datadog/appsec/contrib/devise/tracking.rb +1 -1
  23. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  24. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  25. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +43 -0
  26. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  27. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  28. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  29. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  30. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +42 -0
  31. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -12
  32. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  33. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +65 -73
  34. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  35. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +20 -25
  36. data/lib/datadog/appsec/contrib/rails/patcher.rb +0 -3
  37. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  38. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  39. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +39 -0
  40. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +38 -49
  41. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +0 -3
  42. data/lib/datadog/appsec/monitor/gateway/watcher.rb +19 -25
  43. data/lib/datadog/appsec/remote.rb +4 -0
  44. data/lib/datadog/appsec.rb +3 -0
  45. data/lib/datadog/core/configuration/components.rb +8 -2
  46. data/lib/datadog/core/configuration/ext.rb +1 -1
  47. data/lib/datadog/core/configuration/option_definition.rb +2 -0
  48. data/lib/datadog/core/configuration/settings.rb +22 -6
  49. data/lib/datadog/core/encoding.rb +16 -0
  50. data/lib/datadog/core/environment/agent_info.rb +77 -0
  51. data/lib/datadog/core/remote/component.rb +11 -9
  52. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  53. data/lib/datadog/core/remote/transport/http/config.rb +0 -18
  54. data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -18
  55. data/lib/datadog/core/remote/transport/http.rb +7 -12
  56. data/lib/datadog/core/remote/transport/negotiation.rb +13 -1
  57. data/lib/datadog/core/remote/worker.rb +10 -7
  58. data/lib/datadog/core/telemetry/component.rb +5 -1
  59. data/lib/datadog/core/telemetry/event.rb +5 -0
  60. data/lib/datadog/core/telemetry/worker.rb +9 -5
  61. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  62. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +1 -1
  63. data/lib/datadog/{tracing → core}/transport/http/api/spec.rb +1 -1
  64. data/lib/datadog/{tracing → core}/transport/http/builder.rb +37 -17
  65. data/lib/datadog/core/transport/response.rb +4 -0
  66. data/lib/datadog/di/code_tracker.rb +15 -8
  67. data/lib/datadog/di/component.rb +2 -3
  68. data/lib/datadog/di/configuration/settings.rb +14 -0
  69. data/lib/datadog/di/contrib.rb +2 -0
  70. data/lib/datadog/di/logger.rb +30 -0
  71. data/lib/datadog/di/probe.rb +3 -6
  72. data/lib/datadog/di/probe_manager.rb +5 -2
  73. data/lib/datadog/di/probe_notifier_worker.rb +35 -8
  74. data/lib/datadog/di/remote.rb +3 -3
  75. data/lib/datadog/di/transport/diagnostics.rb +61 -0
  76. data/lib/datadog/di/transport/http/api.rb +52 -0
  77. data/lib/datadog/di/transport/http/client.rb +46 -0
  78. data/lib/datadog/di/transport/http/diagnostics.rb +92 -0
  79. data/lib/datadog/di/transport/http/input.rb +94 -0
  80. data/lib/datadog/di/transport/http.rb +119 -0
  81. data/lib/datadog/di/transport/input.rb +61 -0
  82. data/lib/datadog/di/utils.rb +91 -0
  83. data/lib/datadog/di.rb +5 -1
  84. data/lib/datadog/profiling/component.rb +2 -8
  85. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  86. data/lib/datadog/tracing/component.rb +1 -0
  87. data/lib/datadog/tracing/configuration/ext.rb +1 -0
  88. data/lib/datadog/tracing/contrib/extensions.rb +14 -0
  89. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  90. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  91. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  92. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  93. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  94. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  95. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  96. data/lib/datadog/tracing/sync_writer.rb +5 -2
  97. data/lib/datadog/tracing/tracer.rb +10 -7
  98. data/lib/datadog/tracing/transport/http/api.rb +11 -2
  99. data/lib/datadog/tracing/transport/http/traces.rb +0 -3
  100. data/lib/datadog/tracing/transport/http.rb +12 -7
  101. data/lib/datadog/tracing/transport/serializable_trace.rb +8 -4
  102. data/lib/datadog/tracing/transport/traces.rb +25 -8
  103. data/lib/datadog/tracing/workers/trace_writer.rb +4 -1
  104. data/lib/datadog/tracing/workers.rb +5 -4
  105. data/lib/datadog/tracing/writer.rb +6 -2
  106. data/lib/datadog/version.rb +1 -1
  107. metadata +33 -29
  108. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  109. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  110. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  111. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  112. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  113. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  114. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  115. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  116. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  117. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  118. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  119. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  120. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  121. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  122. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  123. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  124. 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
- Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
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
- Datadog.logger.error do
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
- Datadog.logger.error do
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
- Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
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
- # TODO: Decouple standard transport/http/api/instance
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
- Datadog::Core::Transport::HTTP::API::Map[
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(&block).to_transport(klass)
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
- attr_reader :version, :endpoints, :config
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
- Datadog.logger.debug { 'remote worker starting' }
26
+ logger.debug { 'remote worker starting' }
24
27
 
25
28
  acquire_lock
26
29
 
27
30
  if @stopped
28
- Datadog.logger.debug('remote worker: refusing to restart after previous stop')
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
- Datadog.logger.debug { 'remote worker started' }
47
+ logger.debug { 'remote worker started' }
45
48
  ensure
46
49
  release_lock
47
50
  end
48
51
 
49
52
  def stop
50
- Datadog.logger.debug { 'remote worker stopping' }
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
- Datadog.logger.debug { 'remote worker stopped' }
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
- Datadog.logger.debug { 'remote worker perform' }
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
- Datadog.logger.debug { "Sending #{events&.count} telemetry events" }
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
- Datadog.logger.debug('Telemetry app-started event exhausted retries, disabling telemetry worker')
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
- Datadog.logger.debug('Telemetry app-started event is successfully sent')
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
- Datadog.logger.debug('Error sending telemetry app-started event, retry after heartbeat interval...')
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
- Datadog.logger.debug('Agent does not support telemetry; disabling future telemetry events.')
173
+ logger.debug('Agent does not support telemetry; disabling future telemetry events.')
170
174
  disable!
171
175
  end
172
176
 
@@ -49,7 +49,7 @@ module Datadog
49
49
 
50
50
  # Re-implements Net:HTTP with underlying Unix socket
51
51
  class HTTP < ::Net::HTTP
52
- DEFAULT_TIMEOUT = 1
52
+ DEFAULT_TIMEOUT = 30
53
53
 
54
54
  attr_reader \
55
55
  :filepath, # DEV(1.0): Rename to `uds_path`
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Datadog
4
- module Tracing
4
+ module Core
5
5
  module Transport
6
6
  module HTTP
7
7
  module API
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Datadog
4
- module Tracing
4
+ module Core
5
5
  module Transport
6
6
  module HTTP
7
7
  module API