ddtrace 1.14.0 → 1.16.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 (282) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +165 -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/request.rb +6 -2
  32. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  33. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  34. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  35. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +2 -5
  36. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  37. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +24 -10
  38. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  39. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  40. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  41. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  42. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  43. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  44. data/lib/datadog/appsec/event.rb +106 -50
  45. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  46. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  47. data/lib/datadog/appsec/processor/actions.rb +49 -0
  48. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  49. data/lib/datadog/appsec/processor.rb +34 -6
  50. data/lib/datadog/appsec/remote.rb +4 -1
  51. data/lib/datadog/appsec/response.rb +82 -4
  52. data/lib/datadog/appsec/sample_rate.rb +21 -0
  53. data/lib/datadog/appsec.rb +2 -2
  54. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  55. data/lib/datadog/core/configuration/base.rb +1 -11
  56. data/lib/datadog/core/configuration/components.rb +7 -2
  57. data/lib/datadog/core/configuration/ext.rb +21 -0
  58. data/lib/datadog/core/configuration/option.rb +2 -4
  59. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  60. data/lib/datadog/core/configuration/options.rb +5 -5
  61. data/lib/datadog/core/configuration/settings.rb +47 -45
  62. data/lib/datadog/core/environment/execution.rb +47 -9
  63. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  64. data/lib/datadog/core/error.rb +1 -0
  65. data/lib/datadog/core/git/ext.rb +2 -0
  66. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  67. data/lib/datadog/core/remote/component.rb +2 -2
  68. data/lib/datadog/core/remote/negotiation.rb +2 -2
  69. data/lib/datadog/core/remote/transport/config.rb +60 -0
  70. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  71. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  72. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  73. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  74. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  75. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  76. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  77. data/lib/datadog/core/remote/transport/http.rb +179 -0
  78. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  79. data/lib/datadog/core/remote/worker.rb +3 -1
  80. data/lib/datadog/core/telemetry/collector.rb +3 -2
  81. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  82. data/lib/datadog/core/transport/ext.rb +47 -0
  83. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  84. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  85. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  86. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  87. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  88. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  89. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  90. data/lib/datadog/core/transport/http/env.rb +62 -0
  91. data/lib/datadog/core/transport/http/response.rb +60 -0
  92. data/lib/datadog/core/transport/parcel.rb +22 -0
  93. data/lib/datadog/core/transport/request.rb +17 -0
  94. data/lib/datadog/core/transport/response.rb +64 -0
  95. data/lib/datadog/core/workers/polling.rb +2 -2
  96. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  97. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  98. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  99. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  100. data/lib/datadog/opentelemetry/trace.rb +58 -0
  101. data/lib/datadog/opentelemetry.rb +1 -0
  102. data/lib/datadog/opentracer.rb +9 -0
  103. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -19
  104. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  105. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  106. data/lib/datadog/profiling/component.rb +24 -99
  107. data/lib/datadog/profiling/ext.rb +0 -12
  108. data/lib/datadog/profiling/flush.rb +0 -3
  109. data/lib/datadog/profiling/http_transport.rb +6 -3
  110. data/lib/datadog/profiling/native_extension.rb +0 -21
  111. data/lib/datadog/profiling/profiler.rb +36 -13
  112. data/lib/datadog/profiling/scheduler.rb +16 -9
  113. data/lib/datadog/profiling.rb +8 -81
  114. data/lib/datadog/tracing/component.rb +10 -4
  115. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  116. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  117. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  118. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  119. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  121. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -197
  122. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  123. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  124. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  125. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  126. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  127. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  128. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  129. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  130. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  131. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  132. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  133. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  134. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  135. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  136. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  137. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  138. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  139. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  140. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  141. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  142. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  143. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  144. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  145. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  146. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  147. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  148. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  149. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  150. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  151. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  152. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  153. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  154. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  155. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  156. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  157. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  158. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  159. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  160. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  161. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  162. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  163. data/lib/datadog/tracing/contrib/redis/tags.rb +7 -2
  164. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  165. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  166. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  167. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  168. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  169. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  170. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  171. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  172. data/lib/datadog/tracing/diagnostics/environment_logger.rb +6 -0
  173. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  174. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  175. data/lib/datadog/tracing/sync_writer.rb +3 -3
  176. data/lib/datadog/tracing/tracer.rb +2 -0
  177. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  178. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  179. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  180. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  181. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  182. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  183. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  184. data/lib/datadog/tracing/transport/http.rb +124 -0
  185. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  186. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  187. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  188. data/lib/datadog/tracing/transport/io.rb +30 -0
  189. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  190. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  191. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  192. data/lib/datadog/tracing/transport/traces.rb +224 -0
  193. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  194. data/lib/datadog/tracing/workers.rb +3 -2
  195. data/lib/datadog/tracing/writer.rb +5 -2
  196. data/lib/ddtrace/transport/ext.rb +17 -15
  197. data/lib/ddtrace/version.rb +2 -2
  198. data/lib/ddtrace.rb +1 -1
  199. metadata +73 -96
  200. data/lib/datadog/ci/configuration/components.rb +0 -32
  201. data/lib/datadog/ci/configuration/settings.rb +0 -51
  202. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  203. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  204. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  205. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  206. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  207. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  208. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  209. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  210. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  211. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  212. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  213. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  214. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  215. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  216. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  217. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  218. data/lib/datadog/ci/ext/app_types.rb +0 -9
  219. data/lib/datadog/ci/ext/environment.rb +0 -575
  220. data/lib/datadog/ci/ext/settings.rb +0 -10
  221. data/lib/datadog/ci/ext/test.rb +0 -35
  222. data/lib/datadog/ci/extensions.rb +0 -19
  223. data/lib/datadog/ci/flush.rb +0 -38
  224. data/lib/datadog/ci/test.rb +0 -81
  225. data/lib/datadog/ci.rb +0 -21
  226. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  227. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  228. data/lib/datadog/core/configuration/option_set.rb +0 -10
  229. data/lib/datadog/core/transport/config.rb +0 -58
  230. data/lib/datadog/core/transport/http/api.rb +0 -57
  231. data/lib/datadog/core/transport/http/client.rb +0 -45
  232. data/lib/datadog/core/transport/http/config.rb +0 -278
  233. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  234. data/lib/datadog/core/transport/http.rb +0 -169
  235. data/lib/datadog/core/utils/object_set.rb +0 -43
  236. data/lib/datadog/core/utils/string_table.rb +0 -47
  237. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  238. data/lib/datadog/profiling/buffer.rb +0 -43
  239. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  240. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  241. data/lib/datadog/profiling/event.rb +0 -15
  242. data/lib/datadog/profiling/events/stack.rb +0 -82
  243. data/lib/datadog/profiling/old_recorder.rb +0 -107
  244. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  245. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  246. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  247. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  248. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  249. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  250. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  251. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  252. data/lib/datadog/profiling/pprof/template.rb +0 -118
  253. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  254. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  255. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  256. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  257. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  258. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  259. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  260. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  261. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  262. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  263. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  264. data/lib/ddtrace/transport/http/api.rb +0 -39
  265. data/lib/ddtrace/transport/http/builder.rb +0 -176
  266. data/lib/ddtrace/transport/http/client.rb +0 -52
  267. data/lib/ddtrace/transport/http/env.rb +0 -58
  268. data/lib/ddtrace/transport/http/response.rb +0 -58
  269. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  270. data/lib/ddtrace/transport/http/traces.rb +0 -144
  271. data/lib/ddtrace/transport/http.rb +0 -117
  272. data/lib/ddtrace/transport/io/client.rb +0 -85
  273. data/lib/ddtrace/transport/io/response.rb +0 -25
  274. data/lib/ddtrace/transport/io/traces.rb +0 -99
  275. data/lib/ddtrace/transport/io.rb +0 -28
  276. data/lib/ddtrace/transport/parcel.rb +0 -20
  277. data/lib/ddtrace/transport/request.rb +0 -15
  278. data/lib/ddtrace/transport/response.rb +0 -60
  279. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  280. data/lib/ddtrace/transport/statistics.rb +0 -75
  281. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  282. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -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
@@ -1,4 +1,5 @@
1
1
  require_relative '../../tracing/configuration/ext'
2
+ require_relative '../../core/environment/variable_helpers'
2
3
  require_relative 'http'
3
4
 
4
5
  module Datadog
@@ -64,7 +65,7 @@ module Datadog
64
65
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER,
65
66
  ]
66
67
  )
67
- o.on_set do |styles|
68
+ o.after_set do |styles|
68
69
  # Modernize B3 options
69
70
  # DEV-2.0: Can be removed with the removal of deprecated B3 constants.
70
71
  styles.map! do |style|
@@ -93,7 +94,7 @@ module Datadog
93
94
  o.env Tracing::Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE_INJECT
94
95
  # DEV-2.0: Change default value to `tracecontext, Datadog`.
95
96
  o.default [Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG]
96
- o.on_set do |styles|
97
+ o.after_set do |styles|
97
98
  # Modernize B3 options
98
99
  # DEV-2.0: Can be removed with the removal of deprecated B3 constants.
99
100
  styles.map! do |style|
@@ -121,7 +122,7 @@ module Datadog
121
122
  o.type :array
122
123
  o.env Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE
123
124
  o.default []
124
- o.on_set do |styles|
125
+ o.after_set do |styles|
125
126
  next if styles.empty?
126
127
 
127
128
  # Modernize B3 options
@@ -371,6 +372,12 @@ module Datadog
371
372
  o.env Tracing::Configuration::Ext::Test::ENV_MODE_ENABLED
372
373
  end
373
374
 
375
+ # Use async writer in test mode
376
+ option :async do |o|
377
+ o.type :bool
378
+ o.default false
379
+ end
380
+
374
381
  option :trace_flush
375
382
 
376
383
  option :writer_options do |o|
@@ -382,8 +389,8 @@ module Datadog
382
389
  # @see file:docs/GettingStarted.md#configuring-the-transport-layer Configuring the transport layer
383
390
  #
384
391
  # A {Proc} that configures a custom tracer transport.
385
- # @yield Receives a {Datadog::Transport::HTTP} that can be modified with custom adapters and settings.
386
- # @yieldparam [Datadog::Transport::HTTP] t transport to be configured.
392
+ # @yield Receives a {Datadog::Tracing::Transport::HTTP} that can be modified with custom adapters and settings.
393
+ # @yieldparam [Datadog::Tracing::Transport::HTTP] t transport to be configured.
387
394
  # @default `nil`
388
395
  # @return [Proc,nil]
389
396
  option :transport_options do |o|
@@ -425,7 +432,7 @@ module Datadog
425
432
  option :enabled do |o|
426
433
  o.type :bool
427
434
  o.default do
428
- disabled = env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
435
+ disabled = Core::Environment::VariableHelpers.env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_DISABLED)
429
436
 
430
437
  enabled = if disabled.nil?
431
438
  false
@@ -438,7 +445,7 @@ module Datadog
438
445
  end
439
446
 
440
447
  # ENABLED env var takes precedence over deprecated DISABLED
441
- env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
448
+ Core::Environment::VariableHelpers.env_to_bool(Tracing::Configuration::Ext::ClientIp::ENV_ENABLED, enabled)
442
449
  end
443
450
  end
444
451
 
@@ -30,7 +30,7 @@ module Datadog
30
30
 
31
31
  # DEV-2.0: Breaking changes for removal.
32
32
  option :exception_controller do |o|
33
- o.on_set do |value|
33
+ o.after_set do |value|
34
34
  if value
35
35
  Datadog::Core.log_deprecation do
36
36
  'The error controller is now automatically detected. '\
@@ -33,7 +33,7 @@ module Datadog
33
33
  option :service_name
34
34
  option :error_handler do |o|
35
35
  o.type :proc
36
- o.experimental_default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
36
+ o.default_proc(&Tracing::SpanOperation::Events::DEFAULT_ON_ERROR)
37
37
  end
38
38
  end
39
39
  end
@@ -45,6 +45,10 @@ module Datadog
45
45
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
46
46
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_SQL)
47
47
 
48
+ if service_name != Datadog.configuration.service
49
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
50
+ end
51
+
48
52
  # Set analytics sample rate
49
53
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
50
54
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -10,266 +10,175 @@ module Datadog
10
10
  module ActiveSupport
11
11
  module Cache
12
12
  # Defines instrumentation for ActiveSupport caching
13
- # rubocop:disable Lint/RescueException
14
13
  module Instrumentation
15
14
  module_function
16
15
 
17
- def start_trace_cache(payload)
18
- return unless enabled?
19
-
20
- # In most of the cases Rails ``fetch()`` and ``read()`` calls are nested.
21
- # This check ensures that two reads are not nested since they don't provide
22
- # interesting details.
23
- # NOTE: the ``finish_trace_cache()`` is fired but it already has a safe-guard
24
- # to avoid any kind of issue.
25
- current_span = Tracing.active_span
26
- return if current_span.try(:name) == Ext::SPAN_CACHE &&
27
- (
28
- payload[:action] == Ext::RESOURCE_CACHE_GET &&
29
- current_span.try(:resource) == Ext::RESOURCE_CACHE_GET ||
30
- payload[:action] == Ext::RESOURCE_CACHE_MGET &&
31
- current_span.try(:resource) == Ext::RESOURCE_CACHE_MGET
32
- )
33
-
34
- tracing_context = payload.fetch(:tracing_context)
16
+ # @param action [String] type of cache operation. Will be set as the span resource.
17
+ # @param key [Object] redis cache key. Used for actions with a single key locator.
18
+ # @param multi_key [Array<Object>] list of redis cache keys. Used for actions with a multiple key locators.
19
+ def trace(action, store, key: nil, multi_key: nil)
20
+ return yield unless enabled?
35
21
 
36
22
  # create a new ``Span`` and add it to the tracing context
37
- service = Datadog.configuration.tracing[:active_support][:cache_service]
38
- type = Ext::SPAN_TYPE_CACHE
39
- span = Tracing.trace(Ext::SPAN_CACHE, service: service, span_type: type)
40
- span.resource = payload.fetch(:action)
41
-
42
- span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
43
- span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CACHE)
44
-
45
- tracing_context[:dd_cache_span] = span
46
- rescue StandardError => e
47
- Datadog.logger.debug(e.message)
48
- end
49
-
50
- def finish_trace_cache(payload)
51
- return unless enabled?
52
-
53
- # retrieve the tracing context and continue the trace
54
- tracing_context = payload.fetch(:tracing_context)
55
- span = tracing_context[:dd_cache_span]
56
- return unless span && !span.finished?
57
-
58
- begin
59
- # discard parameters from the cache_store configuration
60
- if defined?(::Rails)
61
- store, = *Array.wrap(::Rails.configuration.cache_store).flatten
62
- span.set_tag(Ext::TAG_CACHE_BACKEND, store)
23
+ Tracing.trace(
24
+ Ext::SPAN_CACHE,
25
+ span_type: Ext::SPAN_TYPE_CACHE,
26
+ service: Datadog.configuration.tracing[:active_support][:cache_service],
27
+ resource: action
28
+ ) do |span|
29
+ span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
30
+ span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CACHE)
31
+
32
+ if span.service != Datadog.configuration.service
33
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
63
34
  end
64
35
 
65
- normalized_key = ::ActiveSupport::Cache.expand_cache_key(payload.fetch(:key))
66
- cache_key = Core::Utils.truncate(normalized_key, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
67
- span.set_tag(Ext::TAG_CACHE_KEY, cache_key)
36
+ span.set_tag(Ext::TAG_CACHE_BACKEND, store) if store
37
+ set_cache_key(span, key, multi_key)
68
38
 
69
- span.set_error(payload[:exception]) if payload[:exception]
70
- ensure
71
- span.finish
39
+ yield
72
40
  end
73
- rescue StandardError => e
74
- Datadog.logger.debug(e.message)
75
41
  end
76
42
 
77
- def finish_trace_cache_multi(payload)
78
- return unless enabled?
79
-
80
- # retrieve the tracing context and continue the trace
81
- tracing_context = payload.fetch(:tracing_context)
82
- span = tracing_context[:dd_cache_span]
83
- return unless span && !span.finished?
43
+ # In most of the cases, `#fetch()` and `#read()` calls are nested.
44
+ # Instrument both does not add any value.
45
+ # This method checks if these two operations are nested.
46
+ def nested_read?
47
+ current_span = Tracing.active_span
48
+ current_span && current_span.name == Ext::SPAN_CACHE && current_span.resource == Ext::RESOURCE_CACHE_GET
49
+ end
84
50
 
85
- begin
86
- # discard parameters from the cache_store configuration
87
- if defined?(::Rails)
88
- store, = *Array.wrap(::Rails.configuration.cache_store).flatten
89
- span.set_tag(Ext::TAG_CACHE_BACKEND, store)
90
- end
91
- normalized_keys = payload.fetch(:keys, []).map do |key|
92
- ::ActiveSupport::Cache.expand_cache_key(key)
93
- end
94
- cache_keys = Core::Utils.truncate(normalized_keys, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
95
- span.set_tag(Ext::TAG_CACHE_KEY_MULTI, cache_keys)
51
+ # (see #nested_read?)
52
+ def nested_multiread?
53
+ current_span = Tracing.active_span
54
+ current_span && current_span.name == Ext::SPAN_CACHE && current_span.resource == Ext::RESOURCE_CACHE_MGET
55
+ end
96
56
 
97
- span.set_error(payload[:exception]) if payload[:exception]
98
- ensure
99
- span.finish
57
+ def set_cache_key(span, single_key, multi_key)
58
+ if multi_key
59
+ resolved_key = multi_key.map { |key| ::ActiveSupport::Cache.expand_cache_key(key) }
60
+ cache_key = Core::Utils.truncate(resolved_key, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
61
+ span.set_tag(Ext::TAG_CACHE_KEY_MULTI, cache_key)
62
+ else
63
+ resolved_key = ::ActiveSupport::Cache.expand_cache_key(single_key)
64
+ cache_key = Core::Utils.truncate(resolved_key, Ext::QUANTIZE_CACHE_MAX_KEY_SIZE)
65
+ span.set_tag(Ext::TAG_CACHE_KEY, cache_key)
100
66
  end
101
- rescue StandardError => e
102
- Datadog.logger.debug(e.message)
103
67
  end
104
68
 
105
69
  def enabled?
106
70
  Tracing.enabled? && Datadog.configuration.tracing[:active_support][:enabled]
107
71
  end
108
72
 
73
+ # Instance methods injected into the cache client
74
+ module InstanceMethods
75
+ private
76
+
77
+ # The name of the store is never saved.
78
+ # ActiveSupport looks up stores by converting a symbol into a 'require' path,
79
+ # then "camelizing" it for a `const_get` call:
80
+ # ```
81
+ # require "active_support/cache/#{store}"
82
+ # ActiveSupport::Cache.const_get(store.to_s.camelize)
83
+ # ```
84
+ # @see https://github.com/rails/rails/blob/261975dbef77731d2c76f907f1076c5132ebc0e4/activesupport/lib/active_support/cache.rb#L139-L149
85
+ #
86
+ # As `self` is the store object, we can reverse engineer
87
+ # the original symbol by converting the class name to snake case:
88
+ # e.g. ActiveSupport::Cache::RedisStore -> active_support/cache/redis_store
89
+ # In this case, `redis_store` is the store name.
90
+ #
91
+ # Because there's no API retrieve only the class name
92
+ # (only `RedisStore`, and not `ActiveSupport::Cache::RedisStore`)
93
+ # the easiest way to retrieve the store symbol is to convert the fully qualified
94
+ # name using the Rails-provided method `#underscore`, which is the reverse of `#camelize`,
95
+ # then extracting the last part of it.
96
+ #
97
+ # Also, this method caches the store name, given this value will be retrieve
98
+ # multiple times and involves string manipulation.
99
+ def dd_store_name
100
+ return @store_name if defined?(@store_name)
101
+
102
+ # DEV: String#underscore is available through ActiveSupport, and is
103
+ # DEV: the exact reverse operation to `#camelize`.
104
+ # DEV: String#demodulize is available through ActiveSupport, and is
105
+ # DEV: used to remove the module ('*::') part of a constant name.
106
+ @store_name = self.class.name.demodulize.underscore
107
+ end
108
+ end
109
+
109
110
  # Defines instrumentation for ActiveSupport cache reading
110
111
  module Read
112
+ include InstanceMethods
113
+
111
114
  def read(*args, &block)
112
- payload = {
113
- action: Ext::RESOURCE_CACHE_GET,
114
- key: args[0],
115
- tracing_context: {}
116
- }
117
-
118
- begin
119
- # process and catch cache exceptions
120
- Instrumentation.start_trace_cache(payload)
121
- super
122
- rescue Exception => e
123
- payload[:exception] = [e.class.name, e.message]
124
- payload[:exception_object] = e
125
- raise e
126
- end
127
- ensure
128
- Instrumentation.finish_trace_cache(payload)
115
+ return super if Instrumentation.nested_read?
116
+
117
+ Instrumentation.trace(Ext::RESOURCE_CACHE_GET, dd_store_name, key: args[0]) { super }
129
118
  end
130
119
  end
131
120
 
132
121
  # Defines instrumentation for ActiveSupport cache reading of multiple keys
133
122
  module ReadMulti
123
+ include InstanceMethods
124
+
134
125
  def read_multi(*keys, &block)
135
- payload = {
136
- action: Ext::RESOURCE_CACHE_MGET,
137
- keys: keys,
138
- tracing_context: {}
139
- }
140
-
141
- begin
142
- # process and catch cache exceptions
143
- Instrumentation.start_trace_cache(payload)
144
- super
145
- rescue Exception => e
146
- payload[:exception] = [e.class.name, e.message]
147
- payload[:exception_object] = e
148
- raise e
149
- end
150
- ensure
151
- Instrumentation.finish_trace_cache_multi(payload)
126
+ return super if Instrumentation.nested_multiread?
127
+
128
+ Instrumentation.trace(Ext::RESOURCE_CACHE_MGET, dd_store_name, multi_key: keys) { super }
152
129
  end
153
130
  end
154
131
 
155
132
  # Defines instrumentation for ActiveSupport cache fetching
156
133
  module Fetch
134
+ include InstanceMethods
135
+
157
136
  def fetch(*args, &block)
158
- payload = {
159
- action: Ext::RESOURCE_CACHE_GET,
160
- key: args[0],
161
- tracing_context: {}
162
- }
163
-
164
- begin
165
- # process and catch cache exceptions
166
- Instrumentation.start_trace_cache(payload)
167
- super
168
- rescue Exception => e
169
- payload[:exception] = [e.class.name, e.message]
170
- payload[:exception_object] = e
171
- raise e
172
- end
173
- ensure
174
- Instrumentation.finish_trace_cache(payload)
137
+ return super if Instrumentation.nested_read?
138
+
139
+ Instrumentation.trace(Ext::RESOURCE_CACHE_GET, dd_store_name, key: args[0]) { super }
175
140
  end
176
141
  end
177
142
 
178
143
  # Defines instrumentation for ActiveSupport cache fetching of multiple keys
179
144
  module FetchMulti
145
+ include InstanceMethods
146
+
180
147
  def fetch_multi(*args, &block)
181
- # extract options hash
148
+ return super if Instrumentation.nested_multiread?
149
+
182
150
  keys = args[-1].instance_of?(Hash) ? args[0..-2] : args
183
- payload = {
184
- action: Ext::RESOURCE_CACHE_MGET,
185
- keys: keys,
186
- tracing_context: {}
187
- }
188
-
189
- begin
190
- # process and catch cache exceptions
191
- Instrumentation.start_trace_cache(payload)
192
- super
193
- rescue Exception => e
194
- payload[:exception] = [e.class.name, e.message]
195
- payload[:exception_object] = e
196
- raise e
197
- end
198
- ensure
199
- Instrumentation.finish_trace_cache_multi(payload)
151
+ Instrumentation.trace(Ext::RESOURCE_CACHE_MGET, dd_store_name, multi_key: keys) { super }
200
152
  end
201
153
  end
202
154
 
203
155
  # Defines instrumentation for ActiveSupport cache writing
204
156
  module Write
157
+ include InstanceMethods
158
+
205
159
  def write(*args, &block)
206
- payload = {
207
- action: Ext::RESOURCE_CACHE_SET,
208
- key: args[0],
209
- tracing_context: {}
210
- }
211
-
212
- begin
213
- # process and catch cache exceptions
214
- Instrumentation.start_trace_cache(payload)
215
- super
216
- rescue Exception => e
217
- payload[:exception] = [e.class.name, e.message]
218
- payload[:exception_object] = e
219
- raise e
220
- end
221
- ensure
222
- Instrumentation.finish_trace_cache(payload)
160
+ Instrumentation.trace(Ext::RESOURCE_CACHE_SET, dd_store_name, key: args[0]) { super }
223
161
  end
224
162
  end
225
163
 
226
164
  # Defines instrumentation for ActiveSupport cache writing of multiple keys
227
165
  module WriteMulti
166
+ include InstanceMethods
167
+
228
168
  def write_multi(hash, options = nil)
229
- payload = {
230
- action: Ext::RESOURCE_CACHE_MSET,
231
- keys: hash.keys,
232
- tracing_context: {}
233
- }
234
-
235
- begin
236
- # process and catch cache exceptions
237
- Instrumentation.start_trace_cache(payload)
238
- super
239
- rescue Exception => e
240
- payload[:exception] = [e.class.name, e.message]
241
- payload[:exception_object] = e
242
- raise e
243
- end
244
- ensure
245
- Instrumentation.finish_trace_cache_multi(payload)
169
+ Instrumentation.trace(Ext::RESOURCE_CACHE_MSET, dd_store_name, multi_key: hash.keys) { super }
246
170
  end
247
171
  end
248
172
 
249
173
  # Defines instrumentation for ActiveSupport cache deleting
250
174
  module Delete
175
+ include InstanceMethods
176
+
251
177
  def delete(*args, &block)
252
- payload = {
253
- action: Ext::RESOURCE_CACHE_DELETE,
254
- key: args[0],
255
- tracing_context: {}
256
- }
257
-
258
- begin
259
- # process and catch cache exceptions
260
- Instrumentation.start_trace_cache(payload)
261
- super
262
- rescue Exception => e
263
- payload[:exception] = [e.class.name, e.message]
264
- payload[:exception_object] = e
265
- raise e
266
- end
267
- ensure
268
- Instrumentation.finish_trace_cache(payload)
178
+ Instrumentation.trace(Ext::RESOURCE_CACHE_DELETE, dd_store_name, key: args[0]) { super }
269
179
  end
270
180
  end
271
181
  end
272
- # rubocop:enable Lint/RescueException
273
182
  end
274
183
  end
275
184
  end
@@ -28,6 +28,9 @@ module Datadog
28
28
  patch_cache_store_delete
29
29
  end
30
30
 
31
+ # This method is overwritten by
32
+ # `datadog/tracing/contrib/active_support/cache/redis.rb`
33
+ # with more complex behavior.
31
34
  def cache_store_class(meth)
32
35
  ::ActiveSupport::Cache::Store
33
36
  end
@@ -28,6 +28,7 @@ module Datadog
28
28
 
29
29
  private
30
30
 
31
+ # rubocop:disable Metrics/AbcSize
31
32
  def annotate!(span, context)
32
33
  span.service = configuration[:service_name]
33
34
  span.span_type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
@@ -47,6 +48,11 @@ module Datadog
47
48
  )
48
49
  end
49
50
 
51
+ # Tag original global service name if not used
52
+ if span.service != Datadog.configuration.service
53
+ span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
54
+ end
55
+
50
56
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
51
57
 
52
58
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -71,6 +77,7 @@ module Datadog
71
77
 
72
78
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
73
79
  end
80
+ # rubocop:enable Metrics/AbcSize
74
81
 
75
82
  def configuration
76
83
  Datadog.configuration.tracing[:aws]
@@ -6,7 +6,7 @@ module Datadog
6
6
  module Tracing
7
7
  module Contrib
8
8
  module ConcurrentRuby
9
- # wraps existing executor to carry over trace context
9
+ # Wraps existing executor to carry over trace context
10
10
  class ContextCompositeExecutorService
11
11
  include Concurrent::ExecutorService
12
12
 
@@ -16,20 +16,20 @@ module Datadog
16
16
  @composited_executor = composited_executor
17
17
  end
18
18
 
19
- # post method runs the task within composited executor - in a different thread
19
+ # post method runs the task within composited executor - in a different thread. The original arguments are
20
+ # captured to be propagated to the composited executor post method
20
21
  def post(*args, &task)
21
- tracer = Tracing.send(:tracer)
22
- parent_context = tracer.provider.context
23
-
24
- @composited_executor.post(*args) do
25
- begin
26
- original_context = tracer.provider.context
27
- tracer.provider.context = parent_context
28
- yield
29
- ensure
30
- # Restore context in case the current thread gets reused
31
- tracer.provider.context = original_context
32
- end
22
+ digest = Tracing.active_trace && Tracing.active_trace.to_digest
23
+ executor = @composited_executor.is_a?(Symbol) ? Concurrent.executor(@composited_executor) : @composited_executor
24
+
25
+ # Pass the original arguments to the composited executor, which
26
+ # pushes them (possibly transformed) as block args
27
+ executor.post(*args) do |*block_args|
28
+ Tracing.continue_trace!(digest)
29
+
30
+ # Pass the executor-provided block args as they should have been
31
+ # originally passed without composition, see ChainPromise#on_resolvable
32
+ yield(*block_args)
33
33
  end
34
34
  end
35
35
 
@@ -8,17 +8,10 @@ module Datadog
8
8
  module ConcurrentRuby
9
9
  # This patches the Future - to wrap executor service using ContextCompositeExecutorService
10
10
  module FuturePatch
11
- def self.included(base)
12
- base.class_eval do
13
- alias_method :ns_initialize_without_datadog, :ns_initialize
14
- remove_method(:ns_initialize)
11
+ def ns_initialize(value, opts)
12
+ super(value, opts)
15
13
 
16
- def ns_initialize(value, opts)
17
- ns_initialize_without_datadog(value, opts)
18
-
19
- @executor = ContextCompositeExecutorService.new(@executor)
20
- end
21
- end
14
+ @executor = ContextCompositeExecutorService.new(@executor)
22
15
  end
23
16
  end
24
17
  end