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.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +72 -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 +64 -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/instrumentation.rb +23 -6
  16. data/lib/datadog/appsec/contrib/active_record/patcher.rb +63 -15
  17. data/lib/datadog/appsec/contrib/devise/configuration.rb +76 -0
  18. data/lib/datadog/appsec/contrib/devise/event.rb +4 -7
  19. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +16 -21
  20. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +8 -15
  21. data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +1 -1
  22. data/lib/datadog/appsec/contrib/devise/patcher.rb +0 -3
  23. data/lib/datadog/appsec/contrib/devise/tracking.rb +1 -1
  24. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  25. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  26. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +43 -0
  27. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  28. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  29. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  30. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  31. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +42 -0
  32. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -12
  33. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  34. data/lib/datadog/appsec/contrib/rack/ext.rb +20 -0
  35. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +84 -72
  36. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  37. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -0
  38. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +20 -25
  39. data/lib/datadog/appsec/contrib/rails/patcher.rb +0 -3
  40. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  41. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  42. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +39 -0
  43. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +38 -49
  44. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +0 -3
  45. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  46. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  47. data/lib/datadog/appsec/monitor/gateway/watcher.rb +19 -25
  48. data/lib/datadog/appsec/processor/rule_merger.rb +2 -1
  49. data/lib/datadog/appsec/remote.rb +11 -0
  50. data/lib/datadog/appsec.rb +3 -0
  51. data/lib/datadog/core/configuration/components.rb +17 -10
  52. data/lib/datadog/core/configuration/ext.rb +1 -1
  53. data/lib/datadog/core/configuration/option_definition.rb +2 -0
  54. data/lib/datadog/core/configuration/settings.rb +22 -6
  55. data/lib/datadog/core/encoding.rb +16 -0
  56. data/lib/datadog/core/environment/agent_info.rb +77 -0
  57. data/lib/datadog/core/metrics/client.rb +9 -8
  58. data/lib/datadog/core/remote/client.rb +5 -4
  59. data/lib/datadog/core/remote/component.rb +14 -12
  60. data/lib/datadog/core/remote/negotiation.rb +1 -1
  61. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  62. data/lib/datadog/core/remote/transport/http/config.rb +0 -18
  63. data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -18
  64. data/lib/datadog/core/remote/transport/http.rb +6 -40
  65. data/lib/datadog/core/remote/transport/negotiation.rb +13 -1
  66. data/lib/datadog/core/remote/worker.rb +10 -7
  67. data/lib/datadog/core/telemetry/component.rb +5 -1
  68. data/lib/datadog/core/telemetry/event.rb +5 -0
  69. data/lib/datadog/core/telemetry/worker.rb +9 -5
  70. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  71. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +1 -1
  72. data/lib/datadog/{tracing → core}/transport/http/api/spec.rb +1 -1
  73. data/lib/datadog/{tracing → core}/transport/http/builder.rb +37 -17
  74. data/lib/datadog/core/transport/http.rb +38 -0
  75. data/lib/datadog/core/transport/response.rb +4 -0
  76. data/lib/datadog/core/workers/runtime_metrics.rb +1 -1
  77. data/lib/datadog/di/code_tracker.rb +15 -8
  78. data/lib/datadog/di/component.rb +2 -3
  79. data/lib/datadog/di/configuration/settings.rb +14 -0
  80. data/lib/datadog/di/contrib.rb +2 -0
  81. data/lib/datadog/di/logger.rb +30 -0
  82. data/lib/datadog/di/probe.rb +3 -6
  83. data/lib/datadog/di/probe_manager.rb +5 -2
  84. data/lib/datadog/di/probe_notifier_worker.rb +35 -8
  85. data/lib/datadog/di/remote.rb +3 -3
  86. data/lib/datadog/di/transport/diagnostics.rb +61 -0
  87. data/lib/datadog/di/transport/http/api.rb +52 -0
  88. data/lib/datadog/di/transport/http/client.rb +46 -0
  89. data/lib/datadog/di/transport/http/diagnostics.rb +92 -0
  90. data/lib/datadog/di/transport/http/input.rb +94 -0
  91. data/lib/datadog/di/transport/http.rb +105 -0
  92. data/lib/datadog/di/transport/input.rb +61 -0
  93. data/lib/datadog/di/utils.rb +91 -0
  94. data/lib/datadog/di.rb +5 -1
  95. data/lib/datadog/profiling/component.rb +2 -8
  96. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  97. data/lib/datadog/tracing/component.rb +1 -0
  98. data/lib/datadog/tracing/configuration/ext.rb +1 -0
  99. data/lib/datadog/tracing/contrib/extensions.rb +14 -0
  100. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  101. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  102. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  103. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  104. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  105. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  106. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  107. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  108. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  109. data/lib/datadog/tracing/metadata.rb +2 -0
  110. data/lib/datadog/tracing/span.rb +10 -1
  111. data/lib/datadog/tracing/span_operation.rb +6 -1
  112. data/lib/datadog/tracing/sync_writer.rb +9 -4
  113. data/lib/datadog/tracing/tracer.rb +15 -7
  114. data/lib/datadog/tracing/transport/http/api.rb +11 -2
  115. data/lib/datadog/tracing/transport/http/traces.rb +0 -3
  116. data/lib/datadog/tracing/transport/http.rb +7 -31
  117. data/lib/datadog/tracing/transport/serializable_trace.rb +11 -5
  118. data/lib/datadog/tracing/transport/traces.rb +25 -8
  119. data/lib/datadog/tracing/workers/trace_writer.rb +10 -3
  120. data/lib/datadog/tracing/workers.rb +5 -4
  121. data/lib/datadog/tracing/writer.rb +12 -4
  122. data/lib/datadog/version.rb +2 -2
  123. metadata +37 -29
  124. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  125. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  126. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  127. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  128. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  129. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  130. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  131. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  132. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  133. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  134. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  135. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  136. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  137. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  138. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  139. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  140. 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
- # 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
@@ -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/adapters/net'
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
- Builder.new(&block).to_transport(klass)
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: DO_NOT_USE_ENVIRONMENT_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: DO_NOT_USE_ENVIRONMENT_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
- 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
@@ -1,13 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../../core/configuration/agent_settings_resolver'
4
- require_relative '../../../core/transport/http/adapters/registry'
5
- require_relative '../../../core/transport/http/api/map'
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 Tracing
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
- # DEV: Should not be specific to traces
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("Unknown transport API '#{key}'!")
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("Unknown transport adapter '#{type}'!")
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("No adapter resolved for transport API '#{key}'!")
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
@@ -55,6 +55,10 @@ module Datadog
55
55
  true
56
56
  end
57
57
 
58
+ def to_s
59
+ "#{super}, error_type:#{error.class} error:#{error}"
60
+ end
61
+
58
62
  def inspect
59
63
  "#{super}, error_type:#{error.class} error:#{error}"
60
64
  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
- inexact = []
144
- registry.each do |path, iseq|
145
- if Utils.path_matches_suffix?(path, suffix)
146
- inexact << [path, iseq]
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