ddtrace 1.14.0 → 1.15.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 (270) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +178 -2
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +207 -32
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +8 -2
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +26 -10
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -16
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +17 -12
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +0 -2
  22. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +74 -37
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  24. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  26. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  28. data/lib/datadog/appsec/assets.rb +8 -0
  29. data/lib/datadog/appsec/component.rb +9 -2
  30. data/lib/datadog/appsec/configuration/settings.rb +61 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  32. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  33. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  34. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +2 -5
  35. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  36. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +23 -9
  37. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  38. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  39. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  40. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  41. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  42. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  43. data/lib/datadog/appsec/event.rb +106 -50
  44. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  45. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  46. data/lib/datadog/appsec/processor/actions.rb +49 -0
  47. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  48. data/lib/datadog/appsec/processor.rb +34 -6
  49. data/lib/datadog/appsec/remote.rb +4 -1
  50. data/lib/datadog/appsec/response.rb +82 -4
  51. data/lib/datadog/appsec/sample_rate.rb +21 -0
  52. data/lib/datadog/appsec.rb +2 -2
  53. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  54. data/lib/datadog/core/configuration/base.rb +1 -11
  55. data/lib/datadog/core/configuration/components.rb +7 -2
  56. data/lib/datadog/core/configuration/ext.rb +21 -0
  57. data/lib/datadog/core/configuration/option.rb +2 -4
  58. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  59. data/lib/datadog/core/configuration/options.rb +5 -5
  60. data/lib/datadog/core/configuration/settings.rb +47 -45
  61. data/lib/datadog/core/environment/execution.rb +47 -9
  62. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  63. data/lib/datadog/core/error.rb +1 -0
  64. data/lib/datadog/core/git/ext.rb +2 -0
  65. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  66. data/lib/datadog/core/remote/component.rb +2 -2
  67. data/lib/datadog/core/remote/negotiation.rb +2 -2
  68. data/lib/datadog/core/remote/transport/config.rb +60 -0
  69. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  70. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  71. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  72. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  73. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  74. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  75. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  76. data/lib/datadog/core/remote/transport/http.rb +179 -0
  77. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  78. data/lib/datadog/core/telemetry/collector.rb +3 -2
  79. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  80. data/lib/datadog/core/transport/ext.rb +47 -0
  81. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  82. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  83. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  84. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  85. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  86. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  87. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  88. data/lib/datadog/core/transport/http/env.rb +62 -0
  89. data/lib/datadog/core/transport/http/response.rb +60 -0
  90. data/lib/datadog/core/transport/parcel.rb +22 -0
  91. data/lib/datadog/core/transport/request.rb +17 -0
  92. data/lib/datadog/core/transport/response.rb +64 -0
  93. data/lib/datadog/core/workers/polling.rb +2 -2
  94. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  95. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  96. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  97. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  98. data/lib/datadog/opentelemetry/trace.rb +58 -0
  99. data/lib/datadog/opentelemetry.rb +1 -0
  100. data/lib/datadog/opentracer.rb +9 -0
  101. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -18
  102. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  103. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  104. data/lib/datadog/profiling/component.rb +24 -99
  105. data/lib/datadog/profiling/ext.rb +0 -12
  106. data/lib/datadog/profiling/flush.rb +0 -3
  107. data/lib/datadog/profiling/http_transport.rb +6 -3
  108. data/lib/datadog/profiling/native_extension.rb +0 -21
  109. data/lib/datadog/profiling/profiler.rb +11 -12
  110. data/lib/datadog/profiling.rb +8 -81
  111. data/lib/datadog/tracing/component.rb +10 -4
  112. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  113. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  114. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  115. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  117. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  118. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +104 -197
  119. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  120. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  121. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  122. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  123. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  124. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  125. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  126. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  127. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  128. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  129. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  130. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  131. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  132. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  133. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  134. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  135. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  136. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  137. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  138. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  139. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  140. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  141. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  142. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  143. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  144. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  145. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  146. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  147. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  148. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  149. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  150. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  151. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  152. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  153. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -0
  154. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  155. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  156. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  157. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  158. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  159. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  160. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  161. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  162. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  163. data/lib/datadog/tracing/sync_writer.rb +3 -3
  164. data/lib/datadog/tracing/tracer.rb +2 -0
  165. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  166. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  167. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  168. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  169. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  170. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  171. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  172. data/lib/datadog/tracing/transport/http.rb +124 -0
  173. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  174. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  175. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  176. data/lib/datadog/tracing/transport/io.rb +30 -0
  177. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  178. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  179. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  180. data/lib/datadog/tracing/transport/traces.rb +224 -0
  181. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  182. data/lib/datadog/tracing/workers.rb +3 -2
  183. data/lib/datadog/tracing/writer.rb +5 -2
  184. data/lib/ddtrace/transport/ext.rb +17 -15
  185. data/lib/ddtrace/version.rb +1 -1
  186. data/lib/ddtrace.rb +1 -1
  187. metadata +72 -96
  188. data/lib/datadog/ci/configuration/components.rb +0 -32
  189. data/lib/datadog/ci/configuration/settings.rb +0 -51
  190. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  191. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  192. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  193. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  194. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  195. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  196. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  197. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  198. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  199. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  200. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  201. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  202. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  203. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  204. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  205. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  206. data/lib/datadog/ci/ext/app_types.rb +0 -9
  207. data/lib/datadog/ci/ext/environment.rb +0 -575
  208. data/lib/datadog/ci/ext/settings.rb +0 -10
  209. data/lib/datadog/ci/ext/test.rb +0 -35
  210. data/lib/datadog/ci/extensions.rb +0 -19
  211. data/lib/datadog/ci/flush.rb +0 -38
  212. data/lib/datadog/ci/test.rb +0 -81
  213. data/lib/datadog/ci.rb +0 -21
  214. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  215. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  216. data/lib/datadog/core/configuration/option_set.rb +0 -10
  217. data/lib/datadog/core/transport/config.rb +0 -58
  218. data/lib/datadog/core/transport/http/api.rb +0 -57
  219. data/lib/datadog/core/transport/http/client.rb +0 -45
  220. data/lib/datadog/core/transport/http/config.rb +0 -278
  221. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  222. data/lib/datadog/core/transport/http.rb +0 -169
  223. data/lib/datadog/core/utils/object_set.rb +0 -43
  224. data/lib/datadog/core/utils/string_table.rb +0 -47
  225. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  226. data/lib/datadog/profiling/buffer.rb +0 -43
  227. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  228. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  229. data/lib/datadog/profiling/event.rb +0 -15
  230. data/lib/datadog/profiling/events/stack.rb +0 -82
  231. data/lib/datadog/profiling/old_recorder.rb +0 -107
  232. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  233. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  234. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  235. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  236. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  237. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  238. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  239. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  240. data/lib/datadog/profiling/pprof/template.rb +0 -118
  241. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  242. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  243. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  244. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  245. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  246. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  247. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  248. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  249. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  250. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  251. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  252. data/lib/ddtrace/transport/http/api.rb +0 -39
  253. data/lib/ddtrace/transport/http/builder.rb +0 -176
  254. data/lib/ddtrace/transport/http/client.rb +0 -52
  255. data/lib/ddtrace/transport/http/env.rb +0 -58
  256. data/lib/ddtrace/transport/http/response.rb +0 -58
  257. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  258. data/lib/ddtrace/transport/http/traces.rb +0 -144
  259. data/lib/ddtrace/transport/http.rb +0 -117
  260. data/lib/ddtrace/transport/io/client.rb +0 -85
  261. data/lib/ddtrace/transport/io/response.rb +0 -25
  262. data/lib/ddtrace/transport/io/traces.rb +0 -99
  263. data/lib/ddtrace/transport/io.rb +0 -28
  264. data/lib/ddtrace/transport/parcel.rb +0 -20
  265. data/lib/ddtrace/transport/request.rb +0 -15
  266. data/lib/ddtrace/transport/response.rb +0 -60
  267. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  268. data/lib/ddtrace/transport/statistics.rb +0 -75
  269. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  270. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -16,6 +16,7 @@ require_relative 'opentelemetry/api/context'
16
16
  # DEV: This is different from our existing OpenTracer API, but there are many safety
17
17
  # DEV: features built into Contrib instrumentation today.
18
18
  require_relative 'opentelemetry/sdk/configurator' if defined?(OpenTelemetry::SDK)
19
+ require_relative 'opentelemetry/sdk/trace/span' if defined?(OpenTelemetry::SDK)
19
20
 
20
21
  module Datadog
21
22
  # Datadog OpenTelemetry integration.
@@ -22,3 +22,12 @@ require_relative 'opentracer/global_tracer'
22
22
 
23
23
  # Modify the OpenTracing module functions
24
24
  ::OpenTracing.singleton_class.prepend(Datadog::OpenTracer::GlobalTracer)
25
+
26
+ module Datadog
27
+ # Datadog OpenTracing integration.
28
+ # DEV: This module should be named `Datadog::OpenTracing` to match the gem (`opentracing`).
29
+ module OpenTracer
30
+ # Used by Telemetry to decide if OpenTracing instrumentation is enabled
31
+ LOADED = true
32
+ end
33
+ end
@@ -14,25 +14,15 @@ module Datadog
14
14
  public
15
15
 
16
16
  def initialize(
17
- recorder:,
18
- max_frames:,
19
- tracer:,
20
- endpoint_collection_enabled:,
21
17
  gc_profiling_enabled:,
22
18
  allocation_counting_enabled:,
23
19
  no_signals_workaround_enabled:,
24
- timeline_enabled:,
25
- thread_context_collector: ThreadContext.new(
26
- recorder: recorder,
27
- max_frames: max_frames,
28
- tracer: tracer,
29
- endpoint_collection_enabled: endpoint_collection_enabled,
30
- timeline_enabled: timeline_enabled,
31
- ),
20
+ thread_context_collector:,
32
21
  idle_sampling_helper: IdleSamplingHelper.new,
33
22
  # **NOTE**: This should only be used for testing; disabling the dynamic sampling rate will increase the
34
23
  # profiler overhead!
35
- dynamic_sampling_rate_enabled: true
24
+ dynamic_sampling_rate_enabled: true,
25
+ allocation_sample_every: 0 # Currently only for testing; Setting this to > 0 can add a lot of overhead!
36
26
  )
37
27
  unless dynamic_sampling_rate_enabled
38
28
  Datadog.logger.warn(
@@ -40,6 +30,13 @@ module Datadog
40
30
  )
41
31
  end
42
32
 
33
+ if allocation_counting_enabled && allocation_sample_every > 0
34
+ Datadog.logger.warn(
35
+ "Enabled experimental allocation profiling: allocation_sample_every=#{allocation_sample_every}. This is " \
36
+ 'experimental, not recommended, and will increase overhead!'
37
+ )
38
+ end
39
+
43
40
  self.class._native_initialize(
44
41
  self,
45
42
  thread_context_collector,
@@ -48,6 +45,7 @@ module Datadog
48
45
  allocation_counting_enabled,
49
46
  no_signals_workaround_enabled,
50
47
  dynamic_sampling_rate_enabled,
48
+ allocation_sample_every,
51
49
  )
52
50
  @worker_thread = nil
53
51
  @failure_exception = nil
@@ -84,11 +82,7 @@ module Datadog
84
82
  true
85
83
  end
86
84
 
87
- # TODO: Provided only for compatibility with the API for Collectors::OldStack used in the Profiler class.
88
- # Can be removed once we remove OldStack.
89
- def enabled=(_); end
90
-
91
- def stop(*_)
85
+ def stop
92
86
  @start_stop_mutex.synchronize do
93
87
  Datadog.logger.debug('Requesting CpuAndWallTimeWorker thread shut down')
94
88
 
@@ -48,7 +48,7 @@ module Datadog
48
48
  true
49
49
  end
50
50
 
51
- def stop(*_unused)
51
+ def stop
52
52
  @start_stop_mutex.synchronize do
53
53
  Datadog.logger.debug('Requesting IdleSamplingHelper thread shut down')
54
54
 
@@ -14,7 +14,14 @@ module Datadog
14
14
  #
15
15
  # Methods prefixed with _native_ are implemented in `collectors_thread_context.c`
16
16
  class ThreadContext
17
- def initialize(recorder:, max_frames:, tracer:, endpoint_collection_enabled:, timeline_enabled:)
17
+ def initialize(
18
+ recorder:,
19
+ max_frames:,
20
+ tracer:,
21
+ endpoint_collection_enabled:,
22
+ timeline_enabled:,
23
+ allocation_type_enabled: true
24
+ )
18
25
  tracer_context_key = safely_extract_context_key_from(tracer)
19
26
  self.class._native_initialize(
20
27
  self,
@@ -23,6 +30,7 @@ module Datadog
23
30
  tracer_context_key,
24
31
  endpoint_collection_enabled,
25
32
  timeline_enabled,
33
+ allocation_type_enabled,
26
34
  )
27
35
  end
28
36
 
@@ -7,8 +7,9 @@ module Datadog
7
7
  # Passing in a `nil` tracer is supported and will disable the following profiling features:
8
8
  # * Code Hotspots panel in the trace viewer, as well as scoping a profile down to a span
9
9
  # * Endpoint aggregation in the profiler UX, including normalization (resource per endpoint call)
10
- def self.build_profiler_component(settings:, agent_settings:, optional_tracer:) # rubocop:disable Metrics/MethodLength
10
+ def self.build_profiler_component(settings:, agent_settings:, optional_tracer:)
11
11
  require_relative '../profiling/diagnostics/environment_logger'
12
+
12
13
  Profiling::Diagnostics::EnvironmentLogger.collect_and_log!
13
14
 
14
15
  return unless settings.profiling.enabled
@@ -33,67 +34,32 @@ module Datadog
33
34
  require_relative '../profiling'
34
35
  return unless Profiling.supported?
35
36
 
36
- unless defined?(Profiling::Tasks::Setup)
37
- # In #1545 a user reported a NameError due to this constant being uninitialized
38
- # I've documented my suspicion on why that happened in
39
- # https://github.com/DataDog/dd-trace-rb/issues/1545#issuecomment-856049025
40
- #
41
- # > Thanks for the info! It seems to feed into my theory: there's two moments in the code where we check if
42
- # > profiler is "supported": 1) when loading ddtrace (inside preload) and 2) when starting the profile
43
- # > after Datadog.configure gets run.
44
- # > The problem is that the code assumes that both checks 1) and 2) will always reach the same conclusion:
45
- # > either profiler is supported, or profiler is not supported.
46
- # > In the problematic case, it looks like in your case check 1 decides that profiler is not
47
- # > supported => doesn't load it, and then check 2 decides that it is => assumes it is loaded and tries to
48
- # > start it.
49
- #
50
- # I was never able to validate if this was the issue or why exactly .supported? would change its mind BUT
51
- # just in case it happens again, I've left this check which avoids breaking the user's application AND
52
- # would instead direct them to report it to us instead, so that we can investigate what's wrong.
53
- #
54
- # TODO: As of June 2021, most checks in .supported? are related to the google-protobuf gem; so it's
55
- # very likely that it was the origin of the issue we saw. Thus, if, as planned we end up moving away from
56
- # protobuf OR enough time has passed and no users saw the issue again, we can remove this check altogether.
57
- Datadog.logger.error(
58
- 'Profiling was marked as supported and enabled, but setup task was not loaded properly. ' \
59
- 'Please report this at https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug'
60
- )
61
-
62
- return
63
- end
64
-
65
- # Load extensions needed to support some of the Profiling features
37
+ # Activate forking extensions
66
38
  Profiling::Tasks::Setup.new.run
67
39
 
68
40
  # NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
69
41
 
70
- no_signals_workaround_enabled = false
71
- timeline_enabled = false
72
-
73
- if enable_new_profiler?(settings)
74
- no_signals_workaround_enabled = no_signals_workaround_enabled?(settings)
75
- timeline_enabled = settings.profiling.advanced.experimental_timeline_enabled
42
+ no_signals_workaround_enabled = no_signals_workaround_enabled?(settings)
43
+ timeline_enabled = settings.profiling.advanced.experimental_timeline_enabled
76
44
 
77
- recorder = Datadog::Profiling::StackRecorder.new(
78
- cpu_time_enabled: RUBY_PLATFORM.include?('linux'), # Only supported on Linux currently
79
- alloc_samples_enabled: false, # Always disabled for now -- work in progress
80
- )
81
- collector = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
82
- recorder: recorder,
83
- max_frames: settings.profiling.advanced.max_frames,
84
- tracer: optional_tracer,
85
- endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
86
- gc_profiling_enabled: enable_gc_profiling?(settings),
87
- allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled,
88
- no_signals_workaround_enabled: no_signals_workaround_enabled,
89
- timeline_enabled: timeline_enabled,
90
- )
91
- else
92
- load_pprof_support
93
-
94
- recorder = build_profiler_old_recorder(settings)
95
- collector = build_profiler_oldstack_collector(settings, recorder, optional_tracer)
96
- end
45
+ recorder = Datadog::Profiling::StackRecorder.new(
46
+ cpu_time_enabled: RUBY_PLATFORM.include?('linux'), # Only supported on Linux currently
47
+ alloc_samples_enabled: false, # Always disabled for now -- work in progress
48
+ )
49
+ thread_context_collector = Datadog::Profiling::Collectors::ThreadContext.new(
50
+ recorder: recorder,
51
+ max_frames: settings.profiling.advanced.max_frames,
52
+ tracer: optional_tracer,
53
+ endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
54
+ timeline_enabled: timeline_enabled,
55
+ )
56
+ worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
57
+ gc_profiling_enabled: enable_gc_profiling?(settings),
58
+ allocation_counting_enabled: settings.profiling.advanced.allocation_counting_enabled,
59
+ no_signals_workaround_enabled: no_signals_workaround_enabled,
60
+ thread_context_collector: thread_context_collector,
61
+ allocation_sample_every: 0,
62
+ )
97
63
 
98
64
  internal_metadata = {
99
65
  no_signals_workaround_enabled: no_signals_workaround_enabled,
@@ -104,11 +70,7 @@ module Datadog
104
70
  transport = build_profiler_transport(settings, agent_settings)
105
71
  scheduler = Profiling::Scheduler.new(exporter: exporter, transport: transport)
106
72
 
107
- Profiling::Profiler.new([collector], scheduler)
108
- end
109
-
110
- private_class_method def self.build_profiler_old_recorder(settings)
111
- Profiling::OldRecorder.new([Profiling::Events::StackSample], settings.profiling.advanced.max_events)
73
+ Profiling::Profiler.new(worker: worker, scheduler: scheduler)
112
74
  end
113
75
 
114
76
  private_class_method def self.build_profiler_exporter(settings, recorder, internal_metadata:)
@@ -122,19 +84,6 @@ module Datadog
122
84
  )
123
85
  end
124
86
 
125
- private_class_method def self.build_profiler_oldstack_collector(settings, old_recorder, tracer)
126
- trace_identifiers_helper = Profiling::TraceIdentifiers::Helper.new(
127
- tracer: tracer,
128
- endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled
129
- )
130
-
131
- Profiling::Collectors::OldStack.new(
132
- old_recorder,
133
- trace_identifiers_helper: trace_identifiers_helper,
134
- max_frames: settings.profiling.advanced.max_frames
135
- )
136
- end
137
-
138
87
  private_class_method def self.build_profiler_transport(settings, agent_settings)
139
88
  settings.profiling.exporter.transport ||
140
89
  Profiling::HttpTransport.new(
@@ -161,17 +110,6 @@ module Datadog
161
110
  end
162
111
  end
163
112
 
164
- private_class_method def self.enable_new_profiler?(settings)
165
- if settings.profiling.advanced.force_enable_legacy_profiler
166
- Datadog.logger.warn(
167
- 'Legacy profiler has been force-enabled via configuration. Do not use unless instructed to by support.'
168
- )
169
- return false
170
- end
171
-
172
- true
173
- end
174
-
175
113
  private_class_method def self.no_signals_workaround_enabled?(settings) # rubocop:disable Metrics/MethodLength
176
114
  setting_value = settings.profiling.advanced.no_signals_workaround_enabled
177
115
  legacy_ruby_that_should_use_workaround = RUBY_VERSION.start_with?('2.3.', '2.4.', '2.5.')
@@ -299,19 +237,6 @@ module Datadog
299
237
  true
300
238
  end
301
239
  end
302
-
303
- # The old profiler's pprof support conflicts with the ruby-cloud-profiler gem.
304
- #
305
- # This is not a problem for almost all customers, since we now default everyone to use the new CPU Profiling 2.0
306
- # profiler. But the issue was still triggered, because currently we still _load_ both the old and new profiling
307
- # code paths.
308
- #
309
- # To work around this issue, and because we plan on deleting the old profiler soon, rather than poking at the
310
- # pprof support code, we only load the conflicting file when the old profiler is in use. This way customers using
311
- # the new profiler will not be affected by the issue any longer.
312
- private_class_method def self.load_pprof_support
313
- require_relative 'pprof/pprof_pb'
314
- end
315
240
  end
316
241
  end
317
242
  end
@@ -9,18 +9,6 @@ module Datadog
9
9
  ENV_AGENTLESS = 'DD_PROFILING_AGENTLESS'
10
10
  ENV_ENDPOINT_COLLECTION_ENABLED = 'DD_PROFILING_ENDPOINT_COLLECTION_ENABLED'
11
11
 
12
- # TODO: Consider removing this once the Ruby-based pprof encoding is removed and replaced by libdatadog
13
- module Pprof
14
- LABEL_KEY_LOCAL_ROOT_SPAN_ID = 'local root span id'
15
- LABEL_KEY_SPAN_ID = 'span id'
16
- LABEL_KEY_THREAD_ID = 'thread id'
17
- LABEL_KEY_TRACE_ENDPOINT = 'trace endpoint'
18
- SAMPLE_VALUE_NO_VALUE = 0
19
- VALUE_TYPE_CPU = 'cpu-time'
20
- VALUE_TYPE_WALL = 'wall-time'
21
- VALUE_UNIT_NANOSECONDS = 'nanoseconds'
22
- end
23
-
24
12
  module Transport
25
13
  module HTTP
26
14
  FORM_FIELD_TAG_ENV = 'env'
@@ -4,9 +4,6 @@ require 'json'
4
4
 
5
5
  module Datadog
6
6
  module Profiling
7
- # Represents a collection of events of a specific type being flushed.
8
- EventGroup = Struct.new(:event_class, :events)
9
-
10
7
  # Entity class used to represent metadata for a given profile
11
8
  class Flush
12
9
  attr_reader \
@@ -1,3 +1,5 @@
1
+ require_relative '../core/transport/ext'
2
+
1
3
  module Datadog
2
4
  module Profiling
3
5
  # Used to report profiling data to Datadog.
@@ -70,9 +72,9 @@ module Datadog
70
72
 
71
73
  def base_url_from(agent_settings)
72
74
  case agent_settings.adapter
73
- when Datadog::Transport::Ext::HTTP::ADAPTER
75
+ when Datadog::Core::Transport::Ext::HTTP::ADAPTER
74
76
  "#{agent_settings.ssl ? 'https' : 'http'}://#{agent_settings.hostname}:#{agent_settings.port}/"
75
- when Datadog::Transport::Ext::UnixSocket::ADAPTER
77
+ when Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
76
78
  "unix://#{agent_settings.uds_path}"
77
79
  else
78
80
  raise ArgumentError, "Unexpected adapter: #{agent_settings.adapter}"
@@ -80,7 +82,8 @@ module Datadog
80
82
  end
81
83
 
82
84
  def validate_agent_settings(agent_settings)
83
- supported_adapters = [Datadog::Transport::Ext::HTTP::ADAPTER, Datadog::Transport::Ext::UnixSocket::ADAPTER]
85
+ supported_adapters = [Datadog::Core::Transport::Ext::HTTP::ADAPTER,
86
+ Datadog::Core::Transport::Ext::UnixSocket::ADAPTER]
84
87
  unless supported_adapters.include?(agent_settings.adapter)
85
88
  raise ArgumentError,
86
89
  "Unsupported transport configuration for profiling: Adapter #{agent_settings.adapter} " \
@@ -15,27 +15,6 @@ module Datadog
15
15
  false
16
16
  end
17
17
  end
18
-
19
- unless singleton_class.method_defined?(:clock_id_for)
20
- def self.clock_id_for(_)
21
- nil
22
- end
23
- end
24
-
25
- def self.cpu_time_ns_for(thread)
26
- clock_id =
27
- begin
28
- clock_id_for(thread)
29
- rescue Errno::ESRCH
30
- nil
31
- end
32
-
33
- begin
34
- ::Process.clock_gettime(clock_id, :nanosecond) if clock_id
35
- rescue Errno::EINVAL
36
- nil
37
- end
38
- end
39
18
  end
40
19
  end
41
20
  end
@@ -1,35 +1,34 @@
1
1
  module Datadog
2
2
  module Profiling
3
- # Profiling entry point, which coordinates collectors and a scheduler
3
+ # Profiling entry point, which coordinates the worker and scheduler threads
4
4
  class Profiler
5
5
  include Datadog::Core::Utils::Forking
6
6
 
7
- attr_reader \
8
- :collectors,
9
- :scheduler
7
+ private
10
8
 
11
- def initialize(collectors, scheduler)
12
- @collectors = collectors
9
+ attr_reader :worker, :scheduler
10
+
11
+ public
12
+
13
+ def initialize(worker:, scheduler:)
14
+ @worker = worker
13
15
  @scheduler = scheduler
14
16
  end
15
17
 
16
18
  def start
17
19
  after_fork! do
18
- collectors.each(&:reset_after_fork)
20
+ worker.reset_after_fork
19
21
  scheduler.reset_after_fork
20
22
  end
21
23
 
22
- collectors.each(&:start)
24
+ worker.start
23
25
  scheduler.start
24
26
  end
25
27
 
26
28
  def shutdown!
27
29
  Datadog.logger.debug('Shutting down profiler')
28
30
 
29
- collectors.each do |collector|
30
- collector.enabled = false
31
- collector.stop(true)
32
- end
31
+ worker.stop
33
32
 
34
33
  scheduler.enabled = false
35
34
  scheduler.stop(true)
@@ -5,22 +5,15 @@ require_relative 'core/utils/only_once'
5
5
  module Datadog
6
6
  # Datadog Continuous Profiler implementation: https://docs.datadoghq.com/profiler/
7
7
  module Profiling
8
- GOOGLE_PROTOBUF_MINIMUM_VERSION = Gem::Version.new('3.0')
9
- private_constant :GOOGLE_PROTOBUF_MINIMUM_VERSION
10
-
11
8
  def self.supported?
12
9
  unsupported_reason.nil?
13
10
  end
14
11
 
15
12
  def self.unsupported_reason
16
13
  # NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons -- e.g. tell users
17
- # first that they can't use this on JRuby before telling them that they are missing protobuf
14
+ # first that they can't use this on JRuby before telling them that something else failed
18
15
 
19
- native_library_compilation_skipped? ||
20
- native_library_failed_to_load? ||
21
- protobuf_gem_unavailable? ||
22
- protobuf_version_unsupported? ||
23
- protobuf_failed_to_load?
16
+ native_library_compilation_skipped? || native_library_failed_to_load?
24
17
  end
25
18
 
26
19
  # Starts the profiler, if the profiler is supported by in
@@ -53,9 +46,7 @@ module Datadog
53
46
  #
54
47
  # Note 2: All fibers in the same thread will share the same counter values.
55
48
  #
56
- # Only available when the profiler is running, the new CPU Profiling 2.0 profiler is in use, and allocation-related
57
- # features are not disabled via configuration.
58
- # For instructions on enabling CPU Profiling 2.0 see the ddtrace release notes.
49
+ # Only available when the profiler is running, and allocation-related features are not disabled via configuration.
59
50
  #
60
51
  # @return [Integer] number of allocations observed in the current thread.
61
52
  # @return [nil] when not available.
@@ -68,11 +59,12 @@ module Datadog
68
59
 
69
60
  def self.enabled?
70
61
  profiler = Datadog.send(:components).profiler
71
- !!(profiler.scheduler.running? if profiler)
62
+ # Use .send(...) to avoid exposing the attr_reader as an API to the outside
63
+ !!(profiler.send(:scheduler).running? if profiler)
72
64
  end
73
65
 
74
66
  private_class_method def self.replace_noop_allocation_count
75
- def self.allocation_count # rubocop:disable Lint/DuplicateMethods, Lint/NestedMethodDefinition (On purpose!)
67
+ def self.allocation_count # rubocop:disable Lint/NestedMethodDefinition (On purpose!)
76
68
  Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_allocation_count
77
69
  end
78
70
  end
@@ -97,66 +89,6 @@ module Datadog
97
89
  end
98
90
  end
99
91
 
100
- private_class_method def self.protobuf_gem_unavailable?
101
- # NOTE: On environments where protobuf is already loaded, we skip the check. This allows us to support environments
102
- # where no Gem.loaded_version is NOT available but customers are able to load protobuf; see for instance
103
- # https://github.com/teamcapybara/capybara/commit/caf3bcd7664f4f2691d0ca9ef3be9a2a954fecfb
104
- if !protobuf_already_loaded? && Gem.loaded_specs['google-protobuf'].nil?
105
- "Missing google-protobuf dependency; please add `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
106
- end
107
- end
108
-
109
- private_class_method def self.protobuf_version_unsupported?
110
- # See above for why we skip the check when protobuf is already loaded; note that when protobuf was already loaded
111
- # we skip the version check to avoid the call to Gem.loaded_specs. Unfortunately, protobuf does not seem to
112
- # expose the gem version constant elsewhere, so in that setup we are not able to check the version.
113
- if !protobuf_already_loaded? && Gem.loaded_specs['google-protobuf'].version < GOOGLE_PROTOBUF_MINIMUM_VERSION
114
- 'Your google-protobuf is too old; ensure that you have google-protobuf >= 3.0 by ' \
115
- "adding `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
116
- end
117
- end
118
-
119
- private_class_method def self.protobuf_already_loaded?
120
- defined?(::Google::Protobuf) && !defined?(::Protobuf)
121
- !!(defined?(::Google::Protobuf) && !defined?(::Protobuf))
122
- end
123
-
124
- private_class_method def self.protobuf_failed_to_load?
125
- unless protobuf_loaded_successfully?
126
- 'There was an error loading the google-protobuf library; see previous warning message for details'
127
- end
128
- end
129
-
130
- # The `google-protobuf` gem depends on a native component, and its creators helpfully tried to provide precompiled
131
- # versions of this extension on rubygems.org.
132
- #
133
- # Unfortunately, for a long time, the supported Ruby versions metadata on these precompiled versions of the extension
134
- # was not correctly set. (This is fixed in newer versions -- but not all Ruby versions we want to support can use
135
- # these.)
136
- #
137
- # Thus, the gem can still be installed, but can be in a broken state. To avoid breaking customer applications, we
138
- # use this helper to load it and gracefully handle failures.
139
- private_class_method def self.protobuf_loaded_successfully?
140
- return @protobuf_loaded if defined?(@protobuf_loaded)
141
-
142
- begin
143
- require 'google/protobuf'
144
- @protobuf_loaded = true
145
- rescue LoadError => e
146
- # NOTE: We use Kernel#warn here because this code gets run BEFORE Datadog.logger is actually set up.
147
- # In the future it'd be nice to shuffle the logger startup to happen first to avoid this special case.
148
- Kernel.warn(
149
- '[ddtrace] Error while loading google-protobuf gem. ' \
150
- "Cause: '#{e.class.name} #{e.message}' Location: '#{Array(e.backtrace).first}'. " \
151
- 'This can happen when google-protobuf is missing its native components. ' \
152
- 'To fix this, try removing and reinstalling the gem, forcing it to recompile the components: ' \
153
- '`gem uninstall google-protobuf -a; BUNDLE_FORCE_RUBY_PLATFORM=true bundle install`. ' \
154
- 'If the error persists, please contact Datadog support at <https://docs.datadoghq.com/help/>.'
155
- )
156
- @protobuf_loaded = false
157
- end
158
- end
159
-
160
92
  private_class_method def self.native_library_failed_to_load?
161
93
  success, exception = try_loading_native_library
162
94
 
@@ -184,7 +116,7 @@ module Datadog
184
116
  end
185
117
 
186
118
  # All requires for the profiler should be directly added here; and everything should be loaded eagerly.
187
- # (Currently there's a few exceptions for the old profiler, but we should avoid other exceptions.)
119
+ # (Currently there's a leftovers that need to be cleaned up, but we should avoid other exceptions.)
188
120
  #
189
121
  # All of the profiler should be loaded and ready to go when this method returns `true`.
190
122
  private_class_method def self.load_profiling
@@ -195,21 +127,16 @@ module Datadog
195
127
  require_relative 'profiling/collectors/cpu_and_wall_time_worker'
196
128
  require_relative 'profiling/collectors/dynamic_sampling_rate'
197
129
  require_relative 'profiling/collectors/idle_sampling_helper'
198
- require_relative 'profiling/collectors/old_stack'
199
130
  require_relative 'profiling/collectors/stack'
200
131
  require_relative 'profiling/collectors/thread_context'
201
132
  require_relative 'profiling/diagnostics/environment_logger'
202
133
  require_relative 'profiling/stack_recorder'
203
- require_relative 'profiling/old_recorder'
204
134
  require_relative 'profiling/exporter'
135
+ require_relative 'profiling/flush'
205
136
  require_relative 'profiling/scheduler'
206
137
  require_relative 'profiling/tasks/setup'
207
138
  require_relative 'profiling/profiler'
208
139
  require_relative 'profiling/native_extension'
209
- require_relative 'profiling/trace_identifiers/helper'
210
- # This file is no longer eagerly loaded as a workaround for an issue. It only gets loaded dynamically if the old
211
- # profiler is in use. See Profiling::Component#load_pprof_support for more details.
212
- # require_relative 'profiling/pprof/pprof_pb'
213
140
  require_relative 'profiling/tag_builder'
214
141
  require_relative 'profiling/http_transport'
215
142
 
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'tracer'
4
+ require_relative 'configuration/agent_settings_resolver'
4
5
  require_relative 'flush'
5
6
  require_relative 'sync_writer'
6
7
  require_relative 'sampling/span/rule_parser'
@@ -22,12 +23,14 @@ module Datadog
22
23
  end
23
24
  end
24
25
 
25
- def build_tracer(settings, agent_settings)
26
+ def build_tracer(settings, logger:)
26
27
  # If a custom tracer has been provided, use it instead.
27
28
  # Ignore all other options (they should already be configured.)
28
29
  tracer = settings.tracing.instance
29
30
  return tracer unless tracer.nil?
30
31
 
32
+ agent_settings = Configuration::AgentSettingsResolver.call(settings, logger: logger)
33
+
31
34
  # Apply test mode settings if test mode is activated
32
35
  if settings.tracing.test_mode.enabled
33
36
  trace_flush = build_test_mode_trace_flush(settings)
@@ -131,12 +134,12 @@ module Datadog
131
134
  # process, but can take a variety of options (including
132
135
  # a fully custom instance) that makes the Tracer
133
136
  # initialization process complex.
134
- def build_writer(settings, agent_settings)
137
+ def build_writer(settings, agent_settings, options = settings.tracing.writer_options)
135
138
  if (writer = settings.tracing.writer)
136
139
  return writer
137
140
  end
138
141
 
139
- Tracing::Writer.new(agent_settings: agent_settings, **settings.tracing.writer_options)
142
+ Tracing::Writer.new(agent_settings: agent_settings, **options)
140
143
  end
141
144
 
142
145
  def subscribe_to_writer_events!(writer, sampler_delegator, test_mode)
@@ -220,8 +223,11 @@ module Datadog
220
223
  end
221
224
 
222
225
  def build_test_mode_writer(settings, agent_settings)
223
- # Flush traces synchronously, to guarantee they are written.
224
226
  writer_options = settings.tracing.test_mode.writer_options || {}
227
+
228
+ return build_writer(settings, agent_settings, writer_options) if settings.tracing.test_mode.async
229
+
230
+ # Flush traces synchronously, to guarantee they are written.
225
231
  Tracing::SyncWriter.new(agent_settings: agent_settings, **writer_options)
226
232
  end
227
233
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/configuration/agent_settings_resolver'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Configuration
8
+ # This class encapsulates any tracing specific agent settings
9
+ class AgentSettingsResolver < Datadog::Core::Configuration::AgentSettingsResolver
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../core/configuration/ext'
4
+
3
5
  module Datadog
4
6
  module Tracing
5
7
  module Configuration
@@ -88,8 +90,8 @@ module Datadog
88
90
 
89
91
  # @public_api
90
92
  module Transport
91
- ENV_DEFAULT_PORT = 'DD_TRACE_AGENT_PORT'
92
- ENV_DEFAULT_URL = 'DD_TRACE_AGENT_URL'
93
+ ENV_DEFAULT_PORT = Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_PORT
94
+ ENV_DEFAULT_URL = Datadog::Core::Configuration::Ext::Agent::ENV_DEFAULT_URL
93
95
  end
94
96
 
95
97
  # @public_api