ddtrace 1.2.0 → 1.10.1

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 (766) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +442 -2
  3. data/LICENSE-3rdparty.csv +4 -0
  4. data/README.md +2 -2
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +20 -4
  6. data/ext/ddtrace_profiling_loader/extconf.rb +21 -3
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +46 -3
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +21 -0
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +33 -2
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +10 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +821 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  15. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  16. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +186 -85
  17. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +13 -2
  18. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +978 -0
  19. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +14 -0
  20. data/ext/ddtrace_profiling_native_extension/extconf.rb +54 -34
  21. data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
  22. data/ext/ddtrace_profiling_native_extension/http_transport.c +127 -121
  23. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +25 -0
  24. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +82 -37
  25. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +189 -139
  26. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +15 -6
  27. data/ext/ddtrace_profiling_native_extension/profiling.c +221 -5
  28. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
  29. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +57 -1
  30. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  31. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  32. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +489 -45
  33. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +12 -35
  34. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  35. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  36. data/lib/datadog/appsec/assets/blocked.html +98 -3
  37. data/lib/datadog/appsec/assets/blocked.json +1 -0
  38. data/lib/datadog/appsec/assets/blocked.text +5 -0
  39. data/lib/datadog/appsec/assets/waf_rules/recommended.json +1722 -636
  40. data/lib/datadog/appsec/assets/waf_rules/strict.json +366 -74
  41. data/lib/datadog/appsec/assets.rb +2 -4
  42. data/lib/datadog/appsec/autoload.rb +5 -10
  43. data/lib/datadog/appsec/component.rb +41 -0
  44. data/lib/datadog/appsec/configuration/settings.rb +46 -24
  45. data/lib/datadog/appsec/configuration.rb +12 -4
  46. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -4
  47. data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -3
  48. data/lib/datadog/appsec/contrib/integration.rb +0 -2
  49. data/lib/datadog/appsec/contrib/patcher.rb +0 -2
  50. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -4
  51. data/lib/datadog/appsec/contrib/rack/ext.rb +0 -2
  52. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +97 -0
  53. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
  54. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +117 -110
  55. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -7
  56. data/lib/datadog/appsec/contrib/rack/patcher.rb +4 -4
  57. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +31 -38
  58. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +21 -22
  59. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +21 -22
  60. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +9 -7
  61. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +80 -39
  62. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -4
  63. data/lib/datadog/appsec/contrib/rails/ext.rb +0 -2
  64. data/lib/datadog/appsec/contrib/rails/framework.rb +0 -2
  65. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
  66. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +45 -40
  67. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -7
  68. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -16
  69. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +24 -23
  70. data/lib/datadog/appsec/contrib/rails/request.rb +3 -2
  71. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +0 -2
  72. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -4
  73. data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -2
  74. data/lib/datadog/appsec/contrib/sinatra/framework.rb +0 -2
  75. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
  76. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
  77. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +82 -75
  78. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -6
  79. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +33 -18
  80. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +21 -20
  81. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +0 -2
  82. data/lib/datadog/appsec/event.rb +8 -16
  83. data/lib/datadog/appsec/ext.rb +9 -0
  84. data/lib/datadog/appsec/extensions.rb +51 -23
  85. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +24 -0
  86. data/lib/datadog/appsec/instrumentation/gateway.rb +26 -6
  87. data/lib/datadog/appsec/instrumentation.rb +9 -0
  88. data/lib/datadog/appsec/monitor/gateway/watcher.rb +86 -0
  89. data/lib/datadog/appsec/monitor/reactive/set_user.rb +61 -0
  90. data/lib/datadog/appsec/monitor.rb +11 -0
  91. data/lib/datadog/appsec/processor.rb +110 -31
  92. data/lib/datadog/appsec/rate_limiter.rb +0 -2
  93. data/lib/datadog/appsec/reactive/address_hash.rb +6 -2
  94. data/lib/datadog/appsec/reactive/engine.rb +12 -9
  95. data/lib/datadog/appsec/reactive/operation.rb +22 -5
  96. data/lib/datadog/appsec/reactive/subscriber.rb +2 -1
  97. data/lib/datadog/appsec/response.rb +61 -0
  98. data/lib/datadog/appsec/utils/http/media_range.rb +199 -0
  99. data/lib/datadog/appsec/utils/http/media_type.rb +85 -0
  100. data/lib/datadog/appsec/utils/http.rb +9 -0
  101. data/lib/datadog/appsec/utils.rb +7 -0
  102. data/lib/datadog/appsec.rb +25 -7
  103. data/lib/datadog/ci/configuration/components.rb +1 -3
  104. data/lib/datadog/ci/configuration/settings.rb +1 -3
  105. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -4
  106. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -2
  107. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -7
  108. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -3
  109. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -6
  110. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -4
  111. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -4
  112. data/lib/datadog/ci/contrib/rspec/example.rb +5 -7
  113. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -2
  114. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -6
  115. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -4
  116. data/lib/datadog/ci/ext/app_types.rb +0 -2
  117. data/lib/datadog/ci/ext/environment.rb +77 -41
  118. data/lib/datadog/ci/ext/settings.rb +0 -2
  119. data/lib/datadog/ci/ext/test.rb +0 -2
  120. data/lib/datadog/ci/extensions.rb +4 -6
  121. data/lib/datadog/ci/flush.rb +2 -4
  122. data/lib/datadog/ci/test.rb +3 -5
  123. data/lib/datadog/ci.rb +6 -8
  124. data/lib/datadog/core/buffer/cruby.rb +1 -3
  125. data/lib/datadog/core/buffer/random.rb +0 -2
  126. data/lib/datadog/core/buffer/thread_safe.rb +1 -3
  127. data/lib/datadog/core/chunker.rb +0 -2
  128. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -28
  129. data/lib/datadog/core/configuration/base.rb +14 -4
  130. data/lib/datadog/core/configuration/components.rb +31 -299
  131. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -2
  132. data/lib/datadog/core/configuration/ext.rb +24 -0
  133. data/lib/datadog/core/configuration/option.rb +0 -2
  134. data/lib/datadog/core/configuration/option_definition.rb +12 -5
  135. data/lib/datadog/core/configuration/option_definition_set.rb +1 -3
  136. data/lib/datadog/core/configuration/option_set.rb +0 -2
  137. data/lib/datadog/core/configuration/options.rb +3 -5
  138. data/lib/datadog/core/configuration/settings.rb +87 -257
  139. data/lib/datadog/core/configuration.rb +9 -10
  140. data/lib/datadog/core/diagnostics/environment_logger.rb +10 -7
  141. data/lib/datadog/core/diagnostics/health.rb +4 -24
  142. data/lib/datadog/core/encoding.rb +0 -4
  143. data/lib/datadog/core/environment/cgroup.rb +1 -5
  144. data/lib/datadog/core/environment/class_count.rb +0 -2
  145. data/lib/datadog/core/environment/container.rb +1 -5
  146. data/lib/datadog/core/environment/ext.rb +1 -3
  147. data/lib/datadog/core/environment/gc.rb +0 -2
  148. data/lib/datadog/core/environment/identity.rb +2 -4
  149. data/lib/datadog/core/environment/platform.rb +1 -3
  150. data/lib/datadog/core/environment/socket.rb +1 -3
  151. data/lib/datadog/core/environment/thread_count.rb +0 -2
  152. data/lib/datadog/core/environment/variable_helpers.rb +58 -12
  153. data/lib/datadog/core/environment/vm_cache.rb +17 -2
  154. data/lib/datadog/core/error.rb +1 -3
  155. data/lib/datadog/core/extensions.rb +1 -3
  156. data/lib/datadog/core/git/ext.rb +0 -2
  157. data/lib/datadog/core/header_collection.rb +41 -0
  158. data/lib/datadog/core/logger.rb +0 -2
  159. data/lib/datadog/core/metrics/client.rb +10 -11
  160. data/lib/datadog/core/metrics/ext.rb +0 -4
  161. data/lib/datadog/core/metrics/helpers.rb +0 -2
  162. data/lib/datadog/core/metrics/logging.rb +0 -2
  163. data/lib/datadog/core/metrics/metric.rb +0 -2
  164. data/lib/datadog/core/metrics/options.rb +3 -5
  165. data/lib/datadog/core/pin.rb +0 -2
  166. data/lib/datadog/core/runtime/ext.rb +3 -3
  167. data/lib/datadog/core/runtime/metrics.rb +27 -13
  168. data/lib/datadog/core/telemetry/client.rb +77 -0
  169. data/lib/datadog/core/telemetry/collector.rb +231 -0
  170. data/lib/datadog/core/telemetry/emitter.rb +46 -0
  171. data/lib/datadog/core/telemetry/event.rb +67 -0
  172. data/lib/datadog/core/telemetry/ext.rb +9 -0
  173. data/lib/datadog/core/telemetry/heartbeat.rb +35 -0
  174. data/lib/datadog/core/telemetry/http/adapters/net.rb +111 -0
  175. data/lib/datadog/core/telemetry/http/env.rb +18 -0
  176. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  177. data/lib/datadog/core/telemetry/http/response.rb +64 -0
  178. data/lib/datadog/core/telemetry/http/transport.rb +51 -0
  179. data/lib/datadog/core/telemetry/v1/app_event.rb +50 -0
  180. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  181. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  182. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  183. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  184. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  185. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  186. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  187. data/lib/datadog/core/utils/compression.rb +5 -3
  188. data/lib/datadog/core/utils/forking.rb +0 -2
  189. data/lib/datadog/core/utils/network.rb +140 -0
  190. data/lib/datadog/core/utils/object_set.rb +1 -3
  191. data/lib/datadog/core/utils/only_once.rb +0 -2
  192. data/lib/datadog/core/utils/safe_dup.rb +0 -2
  193. data/lib/datadog/core/utils/sequence.rb +5 -2
  194. data/lib/datadog/core/utils/string_table.rb +1 -3
  195. data/lib/datadog/core/utils/time.rb +3 -7
  196. data/lib/datadog/core/utils.rb +1 -24
  197. data/lib/datadog/core/vendor/ipaddr.rb +78 -0
  198. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -2
  199. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -4
  200. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +0 -2
  201. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +0 -2
  202. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +0 -2
  203. data/lib/datadog/core/vendor/multipart-post/multipart.rb +0 -2
  204. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -5
  205. data/lib/datadog/core/worker.rb +0 -2
  206. data/lib/datadog/core/workers/async.rb +1 -5
  207. data/lib/datadog/core/workers/interval_loop.rb +0 -2
  208. data/lib/datadog/core/workers/polling.rb +2 -4
  209. data/lib/datadog/core/workers/queue.rb +0 -2
  210. data/lib/datadog/core/workers/runtime_metrics.rb +4 -6
  211. data/lib/datadog/core.rb +21 -56
  212. data/lib/datadog/kit/appsec/events.rb +74 -0
  213. data/lib/datadog/kit/enable_core_dumps.rb +6 -6
  214. data/lib/datadog/kit/identity.rb +15 -8
  215. data/lib/datadog/kit.rb +1 -3
  216. data/lib/datadog/opentelemetry/api/context.rb +186 -0
  217. data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
  218. data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
  219. data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
  220. data/lib/datadog/opentelemetry/sdk/propagator.rb +90 -0
  221. data/lib/datadog/opentelemetry/sdk/span_processor.rb +91 -0
  222. data/lib/datadog/opentelemetry.rb +47 -0
  223. data/lib/datadog/opentracer/binary_propagator.rb +0 -2
  224. data/lib/datadog/opentracer/carrier.rb +0 -2
  225. data/lib/datadog/opentracer/distributed_headers.rb +7 -11
  226. data/lib/datadog/opentracer/global_tracer.rb +0 -2
  227. data/lib/datadog/opentracer/propagator.rb +0 -2
  228. data/lib/datadog/opentracer/rack_propagator.rb +10 -11
  229. data/lib/datadog/opentracer/scope.rb +0 -2
  230. data/lib/datadog/opentracer/scope_manager.rb +0 -2
  231. data/lib/datadog/opentracer/span.rb +1 -3
  232. data/lib/datadog/opentracer/span_context.rb +0 -2
  233. data/lib/datadog/opentracer/span_context_factory.rb +0 -2
  234. data/lib/datadog/opentracer/text_map_propagator.rb +13 -14
  235. data/lib/datadog/opentracer/thread_local_scope.rb +0 -2
  236. data/lib/datadog/opentracer/thread_local_scope_manager.rb +1 -3
  237. data/lib/datadog/opentracer/tracer.rb +23 -23
  238. data/lib/datadog/opentracer.rb +16 -18
  239. data/lib/datadog/profiling/backtrace_location.rb +0 -2
  240. data/lib/datadog/profiling/buffer.rb +3 -5
  241. data/lib/datadog/profiling/collectors/code_provenance.rb +0 -2
  242. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +96 -0
  243. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +12 -0
  244. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +66 -0
  245. data/lib/datadog/profiling/collectors/old_stack.rb +16 -13
  246. data/lib/datadog/profiling/collectors/stack.rb +3 -10
  247. data/lib/datadog/profiling/collectors/thread_context.rb +46 -0
  248. data/lib/datadog/profiling/component.rb +161 -0
  249. data/lib/datadog/profiling/encoding/profile.rb +1 -3
  250. data/lib/datadog/profiling/event.rb +0 -2
  251. data/lib/datadog/profiling/events/stack.rb +1 -3
  252. data/lib/datadog/profiling/exporter.rb +23 -14
  253. data/lib/datadog/profiling/ext/forking.rb +36 -39
  254. data/lib/datadog/profiling/ext.rb +1 -2
  255. data/lib/datadog/profiling/flush.rb +0 -5
  256. data/lib/datadog/profiling/http_transport.rb +5 -6
  257. data/lib/datadog/profiling/load_native_extension.rb +0 -2
  258. data/lib/datadog/profiling/native_extension.rb +0 -2
  259. data/lib/datadog/profiling/old_recorder.rb +8 -7
  260. data/lib/datadog/profiling/pprof/builder.rb +4 -6
  261. data/lib/datadog/profiling/pprof/converter.rb +1 -3
  262. data/lib/datadog/profiling/pprof/message_set.rb +1 -3
  263. data/lib/datadog/profiling/pprof/payload.rb +0 -2
  264. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -2
  265. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -6
  266. data/lib/datadog/profiling/pprof/string_table.rb +1 -3
  267. data/lib/datadog/profiling/pprof/template.rb +5 -7
  268. data/lib/datadog/profiling/preload.rb +1 -3
  269. data/lib/datadog/profiling/profiler.rb +7 -2
  270. data/lib/datadog/profiling/scheduler.rb +8 -12
  271. data/lib/datadog/profiling/stack_recorder.rb +49 -8
  272. data/lib/datadog/profiling/tag_builder.rb +5 -2
  273. data/lib/datadog/profiling/tasks/exec.rb +0 -2
  274. data/lib/datadog/profiling/tasks/help.rb +0 -2
  275. data/lib/datadog/profiling/tasks/setup.rb +2 -11
  276. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -4
  277. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -3
  278. data/lib/datadog/profiling.rb +67 -27
  279. data/lib/datadog/tracing/analytics.rb +1 -3
  280. data/lib/datadog/tracing/buffer.rb +5 -9
  281. data/lib/datadog/tracing/client_ip.rb +61 -0
  282. data/lib/datadog/tracing/component.rb +176 -0
  283. data/lib/datadog/tracing/configuration/ext.rb +49 -6
  284. data/lib/datadog/tracing/configuration/settings.rb +451 -0
  285. data/lib/datadog/tracing/context.rb +1 -3
  286. data/lib/datadog/tracing/context_provider.rb +2 -4
  287. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -4
  288. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -7
  289. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -6
  290. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -5
  291. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -6
  292. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -6
  293. data/lib/datadog/tracing/contrib/action_cable/ext.rb +0 -2
  294. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -6
  295. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -6
  296. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -6
  297. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -4
  298. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -5
  299. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -5
  300. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -5
  301. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -4
  302. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +0 -2
  303. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -6
  304. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -5
  305. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +6 -8
  306. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -4
  307. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -4
  308. data/lib/datadog/tracing/contrib/action_pack/ext.rb +0 -2
  309. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -6
  310. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -4
  311. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -3
  312. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -4
  313. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -3
  314. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -7
  315. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -7
  316. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -4
  317. data/lib/datadog/tracing/contrib/action_view/ext.rb +0 -2
  318. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -4
  319. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -4
  320. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -6
  321. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -9
  322. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -3
  323. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -5
  324. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -5
  325. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -6
  326. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -6
  327. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -6
  328. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -6
  329. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -6
  330. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -6
  331. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -8
  332. data/lib/datadog/tracing/contrib/active_job/ext.rb +0 -2
  333. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -6
  334. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -4
  335. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -6
  336. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -4
  337. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -7
  338. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -5
  339. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -4
  340. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -4
  341. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +0 -2
  342. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -5
  343. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -6
  344. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
  345. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -4
  346. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -5
  347. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -3
  348. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -6
  349. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -8
  350. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -4
  351. data/lib/datadog/tracing/contrib/active_record/ext.rb +0 -2
  352. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -8
  353. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -4
  354. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -4
  355. data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +0 -2
  356. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -11
  357. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -4
  358. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -3
  359. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -4
  360. data/lib/datadog/tracing/contrib/active_support/ext.rb +0 -2
  361. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -7
  362. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -3
  363. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -3
  364. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +0 -2
  365. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -4
  366. data/lib/datadog/tracing/contrib/analytics.rb +1 -3
  367. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -6
  368. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -5
  369. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -2
  370. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -6
  371. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -5
  372. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +0 -2
  373. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -7
  374. data/lib/datadog/tracing/contrib/aws/services.rb +0 -4
  375. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -4
  376. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -2
  377. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +0 -2
  378. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -3
  379. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -5
  380. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -5
  381. data/lib/datadog/tracing/contrib/configurable.rb +2 -4
  382. data/lib/datadog/tracing/contrib/configuration/resolver.rb +0 -2
  383. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -3
  384. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -6
  385. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -5
  386. data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -2
  387. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +10 -7
  388. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -5
  389. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -5
  390. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -3
  391. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -5
  392. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -2
  393. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -5
  394. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -4
  395. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +11 -6
  396. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  397. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -5
  398. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  399. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -5
  400. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -9
  401. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -5
  402. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -5
  403. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -9
  404. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -2
  405. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -6
  406. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -6
  407. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -6
  408. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -5
  409. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -2
  410. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -6
  411. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -9
  412. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -4
  413. data/lib/datadog/tracing/contrib/ext.rb +30 -0
  414. data/lib/datadog/tracing/contrib/extensions.rb +5 -5
  415. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -5
  416. data/lib/datadog/tracing/contrib/faraday/connection.rb +0 -2
  417. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -2
  418. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -6
  419. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -10
  420. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -7
  421. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +0 -2
  422. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -5
  423. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -9
  424. data/lib/datadog/tracing/contrib/grape/ext.rb +0 -2
  425. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +0 -2
  426. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -5
  427. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -6
  428. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -5
  429. data/lib/datadog/tracing/contrib/graphql/ext.rb +0 -2
  430. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -5
  431. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -5
  432. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +9 -6
  433. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -7
  434. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -19
  435. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +3 -6
  436. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
  437. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +42 -0
  438. data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -2
  439. data/lib/datadog/tracing/contrib/grpc/integration.rb +11 -6
  440. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +0 -2
  441. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -8
  442. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +45 -0
  443. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +20 -0
  444. data/lib/datadog/tracing/contrib/hanami/ext.rb +22 -0
  445. data/lib/datadog/tracing/contrib/hanami/integration.rb +42 -0
  446. data/lib/datadog/tracing/contrib/hanami/patcher.rb +31 -0
  447. data/lib/datadog/tracing/contrib/hanami/plugin.rb +21 -0
  448. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +39 -0
  449. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +42 -0
  450. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -4
  451. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -5
  452. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
  453. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +37 -0
  454. data/lib/datadog/tracing/contrib/http/ext.rb +2 -2
  455. data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -12
  456. data/lib/datadog/tracing/contrib/http/integration.rb +6 -8
  457. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -5
  458. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +0 -2
  459. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -5
  460. data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -2
  461. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -11
  462. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -6
  463. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -5
  464. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -5
  465. data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -2
  466. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -11
  467. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -6
  468. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -5
  469. data/lib/datadog/tracing/contrib/integration.rb +3 -5
  470. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -4
  471. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -2
  472. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +0 -2
  473. data/lib/datadog/tracing/contrib/kafka/event.rb +4 -5
  474. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -4
  475. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -5
  476. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -5
  477. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -6
  478. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -6
  479. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -6
  480. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -6
  481. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -4
  482. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -4
  483. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -11
  484. data/lib/datadog/tracing/contrib/kafka/ext.rb +1 -2
  485. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -5
  486. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -5
  487. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -4
  488. data/lib/datadog/tracing/contrib/lograge/ext.rb +0 -2
  489. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -4
  490. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -5
  491. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -4
  492. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -5
  493. data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -2
  494. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -5
  495. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -6
  496. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -3
  497. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -5
  498. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -6
  499. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -4
  500. data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -2
  501. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -7
  502. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -5
  503. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -4
  504. data/lib/datadog/tracing/contrib/patchable.rb +0 -2
  505. data/lib/datadog/tracing/contrib/patcher.rb +16 -6
  506. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +17 -4
  507. data/lib/datadog/tracing/contrib/pg/ext.rb +3 -3
  508. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +78 -41
  509. data/lib/datadog/tracing/contrib/pg/integration.rb +3 -5
  510. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -4
  511. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -5
  512. data/lib/datadog/tracing/contrib/presto/ext.rb +2 -2
  513. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -5
  514. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -5
  515. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -6
  516. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +41 -0
  517. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +31 -0
  518. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +26 -0
  519. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +45 -0
  520. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -4
  521. data/lib/datadog/tracing/contrib/qless/ext.rb +0 -2
  522. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -5
  523. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -5
  524. data/lib/datadog/tracing/contrib/qless/qless_job.rb +5 -5
  525. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -4
  526. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -5
  527. data/lib/datadog/tracing/contrib/que/ext.rb +0 -2
  528. data/lib/datadog/tracing/contrib/que/integration.rb +4 -6
  529. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -3
  530. data/lib/datadog/tracing/contrib/que/tracer.rb +5 -3
  531. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -4
  532. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -7
  533. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -5
  534. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -4
  535. data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -5
  536. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -5
  537. data/lib/datadog/tracing/contrib/racecar/ext.rb +1 -2
  538. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -5
  539. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -5
  540. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -4
  541. data/lib/datadog/tracing/contrib/rack/ext.rb +5 -2
  542. data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
  543. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -6
  544. data/lib/datadog/tracing/contrib/rack/middlewares.rb +170 -78
  545. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -4
  546. data/lib/datadog/tracing/contrib/rack/request_queue.rb +0 -2
  547. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -3
  548. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -3
  549. data/lib/datadog/tracing/contrib/rails/ext.rb +0 -2
  550. data/lib/datadog/tracing/contrib/rails/framework.rb +16 -23
  551. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -6
  552. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -4
  553. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -4
  554. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -10
  555. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -5
  556. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -3
  557. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +16 -3
  558. data/lib/datadog/tracing/contrib/rake/ext.rb +0 -2
  559. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -9
  560. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -5
  561. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -6
  562. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -3
  563. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -5
  564. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  565. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -28
  566. data/lib/datadog/tracing/contrib/redis/integration.rb +37 -6
  567. data/lib/datadog/tracing/contrib/redis/patcher.rb +56 -14
  568. data/lib/datadog/tracing/contrib/redis/quantize.rb +11 -10
  569. data/lib/datadog/tracing/contrib/redis/tags.rb +12 -12
  570. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +70 -0
  571. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
  572. data/lib/datadog/tracing/contrib/registerable.rb +0 -2
  573. data/lib/datadog/tracing/contrib/registry.rb +0 -2
  574. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -5
  575. data/lib/datadog/tracing/contrib/resque/ext.rb +0 -2
  576. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -5
  577. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -4
  578. data/lib/datadog/tracing/contrib/resque/resque_job.rb +7 -6
  579. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +8 -5
  580. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -2
  581. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -5
  582. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -5
  583. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +6 -7
  584. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -4
  585. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +0 -2
  586. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -4
  587. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -5
  588. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -4
  589. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -4
  590. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -7
  591. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -7
  592. data/lib/datadog/tracing/contrib/sequel/ext.rb +0 -2
  593. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -5
  594. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -5
  595. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -4
  596. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -5
  597. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +1 -2
  598. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -6
  599. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -3
  600. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +5 -3
  601. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +11 -7
  602. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -5
  603. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -2
  604. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -5
  605. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -9
  606. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +23 -3
  607. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -2
  608. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +7 -8
  609. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +55 -0
  610. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +12 -8
  611. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -4
  612. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -4
  613. data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -27
  614. data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -5
  615. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -4
  616. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -3
  617. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -5
  618. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +6 -9
  619. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -90
  620. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -18
  621. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -4
  622. data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -2
  623. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -6
  624. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -4
  625. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +7 -5
  626. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -4
  627. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  628. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  629. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  630. data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
  631. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  632. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -4
  633. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +0 -2
  634. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +0 -2
  635. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -6
  636. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -5
  637. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -8
  638. data/lib/datadog/tracing/contrib/utils/database.rb +0 -2
  639. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
  640. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -14
  641. data/lib/datadog/tracing/contrib.rb +50 -50
  642. data/lib/datadog/tracing/correlation.rb +16 -4
  643. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -8
  644. data/lib/datadog/tracing/diagnostics/health.rb +38 -0
  645. data/lib/datadog/tracing/distributed/b3_multi.rb +72 -0
  646. data/lib/datadog/tracing/distributed/b3_single.rb +68 -0
  647. data/lib/datadog/tracing/distributed/datadog.rb +200 -0
  648. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
  649. data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
  650. data/lib/datadog/tracing/distributed/headers/ext.rb +19 -16
  651. data/lib/datadog/tracing/distributed/helpers.rb +27 -40
  652. data/lib/datadog/tracing/distributed/none.rb +18 -0
  653. data/lib/datadog/tracing/distributed/propagation.rb +126 -0
  654. data/lib/datadog/tracing/distributed/trace_context.rb +373 -0
  655. data/lib/datadog/tracing/event.rb +1 -3
  656. data/lib/datadog/tracing/flush.rb +57 -37
  657. data/lib/datadog/tracing/metadata/analytics.rb +2 -4
  658. data/lib/datadog/tracing/metadata/errors.rb +2 -4
  659. data/lib/datadog/tracing/metadata/ext.rb +18 -12
  660. data/lib/datadog/tracing/metadata/tagging.rb +17 -4
  661. data/lib/datadog/tracing/metadata.rb +3 -5
  662. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -8
  663. data/lib/datadog/tracing/pipeline/span_processor.rb +0 -2
  664. data/lib/datadog/tracing/pipeline.rb +3 -5
  665. data/lib/datadog/tracing/propagation/http.rb +3 -100
  666. data/lib/datadog/tracing/runtime/metrics.rb +1 -3
  667. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -3
  668. data/lib/datadog/tracing/sampling/ext.rb +30 -1
  669. data/lib/datadog/tracing/sampling/matcher.rb +0 -2
  670. data/lib/datadog/tracing/sampling/priority_sampler.rb +62 -11
  671. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -13
  672. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -10
  673. data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -3
  674. data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -12
  675. data/lib/datadog/tracing/sampling/rule.rb +3 -5
  676. data/lib/datadog/tracing/sampling/rule_sampler.rb +8 -9
  677. data/lib/datadog/tracing/sampling/sampler.rb +0 -2
  678. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  679. data/lib/datadog/tracing/sampling/span/matcher.rb +9 -0
  680. data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
  681. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  682. data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
  683. data/lib/datadog/tracing/span.rb +6 -24
  684. data/lib/datadog/tracing/span_operation.rb +11 -14
  685. data/lib/datadog/tracing/sync_writer.rb +5 -7
  686. data/lib/datadog/tracing/trace_digest.rb +88 -4
  687. data/lib/datadog/tracing/trace_operation.rb +60 -17
  688. data/lib/datadog/tracing/trace_segment.rb +20 -10
  689. data/lib/datadog/tracing/tracer.rb +49 -23
  690. data/lib/datadog/tracing/utils.rb +81 -0
  691. data/lib/datadog/tracing/workers/trace_writer.rb +9 -11
  692. data/lib/datadog/tracing/workers.rb +3 -5
  693. data/lib/datadog/tracing/writer.rb +12 -7
  694. data/lib/datadog/tracing.rb +8 -10
  695. data/lib/ddtrace/auto_instrument.rb +9 -4
  696. data/lib/ddtrace/auto_instrument_base.rb +0 -2
  697. data/lib/ddtrace/profiling/preload.rb +0 -2
  698. data/lib/ddtrace/transport/ext.rb +7 -3
  699. data/lib/ddtrace/transport/http/adapters/net.rb +3 -4
  700. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -2
  701. data/lib/ddtrace/transport/http/adapters/test.rb +1 -3
  702. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
  703. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -2
  704. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -2
  705. data/lib/ddtrace/transport/http/api/instance.rb +0 -2
  706. data/lib/ddtrace/transport/http/api/map.rb +1 -3
  707. data/lib/ddtrace/transport/http/api/spec.rb +0 -2
  708. data/lib/ddtrace/transport/http/api.rb +4 -6
  709. data/lib/ddtrace/transport/http/builder.rb +5 -7
  710. data/lib/ddtrace/transport/http/client.rb +2 -4
  711. data/lib/ddtrace/transport/http/env.rb +0 -2
  712. data/lib/ddtrace/transport/http/response.rb +1 -3
  713. data/lib/ddtrace/transport/http/statistics.rb +1 -3
  714. data/lib/ddtrace/transport/http/traces.rb +6 -8
  715. data/lib/ddtrace/transport/http.rb +11 -12
  716. data/lib/ddtrace/transport/io/client.rb +2 -4
  717. data/lib/ddtrace/transport/io/response.rb +1 -3
  718. data/lib/ddtrace/transport/io/traces.rb +3 -7
  719. data/lib/ddtrace/transport/io.rb +3 -5
  720. data/lib/ddtrace/transport/parcel.rb +0 -4
  721. data/lib/ddtrace/transport/request.rb +0 -2
  722. data/lib/ddtrace/transport/response.rb +0 -2
  723. data/lib/ddtrace/transport/serializable_trace.rb +9 -5
  724. data/lib/ddtrace/transport/statistics.rb +2 -4
  725. data/lib/ddtrace/transport/trace_formatter.rb +21 -12
  726. data/lib/ddtrace/transport/traces.rb +9 -9
  727. data/lib/ddtrace/version.rb +2 -4
  728. data/lib/ddtrace.rb +6 -10
  729. metadata +131 -50
  730. data/.editorconfig +0 -22
  731. data/.gitignore +0 -58
  732. data/CONTRIBUTING.md +0 -81
  733. data/ddtrace.gemspec +0 -71
  734. data/docs/0.x-trace.png +0 -0
  735. data/docs/1.0-trace.png +0 -0
  736. data/docs/AutoInstrumentation.md +0 -36
  737. data/docs/Deprecation.md +0 -8
  738. data/docs/DevelopmentGuide.md +0 -259
  739. data/docs/GettingStarted.md +0 -2712
  740. data/docs/ProfilingDevelopment.md +0 -109
  741. data/docs/PublicApi.md +0 -14
  742. data/docs/UpgradeGuide.md +0 -736
  743. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +0 -269
  744. data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +0 -13
  745. data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
  746. data/lib/datadog/appsec/contrib/rack/request.rb +0 -58
  747. data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
  748. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +0 -42
  749. data/lib/datadog/profiling/old_ext.rb +0 -42
  750. data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
  751. data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
  752. data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
  753. data/lib/datadog/profiling/transport/http/api.rb +0 -45
  754. data/lib/datadog/profiling/transport/http/builder.rb +0 -30
  755. data/lib/datadog/profiling/transport/http/client.rb +0 -37
  756. data/lib/datadog/profiling/transport/http/response.rb +0 -21
  757. data/lib/datadog/profiling/transport/http.rb +0 -112
  758. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  759. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  760. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
  761. data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
  762. data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
  763. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
  764. data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
  765. data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
  766. data/lib/datadog/tracing/propagation/grpc.rb +0 -98
@@ -13,7 +13,14 @@
13
13
  #include RUBY_MJIT_HEADER
14
14
  #else
15
15
  // On older Rubies, use a copy of the VM internal headers shipped in the debase-ruby_core_source gem
16
- #include <vm_core.h>
16
+
17
+ // We can't do anything about warnings in VM headers, so we just use this technique to suppress them.
18
+ // See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
19
+ #pragma GCC diagnostic push
20
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
21
+ #pragma GCC diagnostic ignored "-Wattributes"
22
+ #include <vm_core.h>
23
+ #pragma GCC diagnostic pop
17
24
  #include <iseq.h>
18
25
  #endif
19
26
 
@@ -29,7 +36,7 @@
29
36
  // if the argument passed in is not actually a `Thread` instance.
30
37
  static inline rb_thread_t *thread_struct_from_object(VALUE thread) {
31
38
  static const rb_data_type_t *thread_data_type = NULL;
32
- if (thread_data_type == NULL) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
39
+ if (UNLIKELY(thread_data_type == NULL)) thread_data_type = RTYPEDDATA_TYPE(rb_thread_current());
33
40
 
34
41
  return (rb_thread_t *) rb_check_typeddata(thread, thread_data_type);
35
42
  }
@@ -43,6 +50,134 @@ rb_nativethread_id_t pthread_id_for(VALUE thread) {
43
50
  #endif
44
51
  }
45
52
 
53
+ // Queries if the current thread is the owner of the global VM lock.
54
+ //
55
+ // @ivoanjo: Ruby has a similarly-named `ruby_thread_has_gvl_p` but that API is insufficient for our needs because it can
56
+ // still return `true` even when a thread DOES NOT HAVE the global VM lock.
57
+ // In particular, looking at the implementation, that API assumes that if a thread is not in a "blocking region" then it
58
+ // will have the GVL which is probably true for the situations that API was designed to be called from BUT this assumption
59
+ // does not hold true when calling `ruby_thread_has_gvl_p` from a signal handler. (Because the thread may have lost the
60
+ // GVL due to a scheduler decision, not because it decided to block.)
61
+ // I have also submitted https://bugs.ruby-lang.org/issues/19172 to discuss this with upstream Ruby developers.
62
+ //
63
+ // Thus we need our own gvl-checking method which actually looks at the gvl structure to determine if it is the owner.
64
+ bool is_current_thread_holding_the_gvl(void) {
65
+ current_gvl_owner owner = gvl_owner();
66
+ return owner.valid && pthread_equal(pthread_self(), owner.owner);
67
+ }
68
+
69
+ #ifndef NO_GVL_OWNER // Ruby < 2.6 doesn't have the owner/running field
70
+ // NOTE: Reading the owner in this is a racy read, because we're not grabbing the lock that Ruby uses to protect it.
71
+ //
72
+ // While we could potentially grab this lock, I (@ivoanjo) think we actually don't need it because:
73
+ // * In the case where a thread owns the GVL and calls `gvl_owner`, it will always see the correct value. That's
74
+ // because every thread sets itself as the owner when it grabs the GVL and unsets itself at the end.
75
+ // That means that `is_current_thread_holding_the_gvl` is always accurate.
76
+ // * In a case where we observe a different thread, then this may change by the time we do something with this value
77
+ // anyway. So unless we want to prevent the Ruby scheduler from switching threads, we need to deal with races here.
78
+ current_gvl_owner gvl_owner(void) {
79
+ const rb_thread_t *current_owner =
80
+ #ifndef NO_RB_THREAD_SCHED // Introduced in Ruby 3.2 as a replacement for struct rb_global_vm_lock_struct
81
+ GET_RACTOR()->threads.sched.running;
82
+ #elif HAVE_RUBY_RACTOR_H
83
+ GET_RACTOR()->threads.gvl.owner;
84
+ #else
85
+ GET_VM()->gvl.owner;
86
+ #endif
87
+
88
+ if (current_owner == NULL) return (current_gvl_owner) {.valid = false};
89
+
90
+ return (current_gvl_owner) {
91
+ .valid = true,
92
+ .owner =
93
+ #ifndef NO_RB_NATIVE_THREAD
94
+ current_owner->nt->thread_id
95
+ #else
96
+ current_owner->thread_id
97
+ #endif
98
+ };
99
+ }
100
+ #else
101
+ current_gvl_owner gvl_owner(void) {
102
+ rb_vm_t *vm =
103
+ #ifndef NO_GET_VM
104
+ GET_VM();
105
+ #else
106
+ thread_struct_from_object(rb_thread_current())->vm;
107
+ #endif
108
+
109
+ // BIG Issue: Ruby < 2.6 did not have the owner field. The really nice thing about the owner field is that it's
110
+ // "atomic" -- when a thread sets it, it "declares" two things in a single step
111
+ // * Declaration 1: Someone has the GVL
112
+ // * Declaration 2: That someone is the specific thread
113
+ //
114
+ // Observation 1: On older versions of Ruby, this ownership concept is actually split. Specifically, `gvl.acquired`
115
+ // is a boolean that represents declaration 1 above, and `vm->running_thread` (or `ruby_current_thread`/
116
+ // `ruby_current_execution_context_ptr`) represents declaration 2.
117
+ //
118
+ // Observation 2: In addition, when a thread releases the GVL, it only sets `gvl.acquired` back to 0 **BUT CRUCIALLY
119
+ // DOES NOT CHANGE THE OTHER global variables**.
120
+ //
121
+ // Observation 1+2 above lead to the following possible race:
122
+ // * Thread A grabs the GVL (`gvl.acquired == 1`)
123
+ // * Thread A sets `running_thread` (`gvl.acquired == 1` + `running_thread == Thread A`)
124
+ // * Thread A releases the GVL (`gvl.acquired == 0` + `running_thread == Thread A`)
125
+ // * Thread B grabs the GVL (`gvl.acquired == 1` + `running_thread == Thread A`)
126
+ // * Thread A calls gvl_owner. Due to the current state (`gvl.acquired == 1` + `running_thread == Thread A`), this
127
+ // function returns an incorrect result.
128
+ // * Thread B finally sets `running_thread` (`gvl.acquired == 1` + `running_thread == Thread B`)
129
+ //
130
+ // This is especially problematic because we use `gvl_owner` to implement `is_current_thread_holding_the_gvl` which
131
+ // is called in a signal handler to decide "is it safe for me to call `rb_postponed_job_register_one` or not".
132
+ // (See constraints in `collectors_cpu_and_wall_time_worker.c` comments for why).
133
+ //
134
+ // Thus an incorrect `is_current_thread_holding_the_gvl` result may lead to issues inside `rb_postponed_job_register_one`.
135
+ //
136
+ // For this reason we currently do not enable the new Ruby profiler on Ruby 2.5 and below by default, and we print a
137
+ // warning when customers force-enable it.
138
+ bool gvl_acquired = vm->gvl.acquired != 0;
139
+ rb_thread_t *current_owner = vm->running_thread;
140
+
141
+ if (!gvl_acquired || current_owner == NULL) return (current_gvl_owner) {.valid = false};
142
+
143
+ return (current_gvl_owner) {.valid = true, .owner = current_owner->thread_id};
144
+ }
145
+ #endif // NO_GVL_OWNER
146
+
147
+ // Taken from upstream vm_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
148
+ // Copyright (C) 2004-2007 Koichi Sasada
149
+ // to support tid_for (see below)
150
+ // Modifications: None
151
+ #if defined(__linux__) || defined(__FreeBSD__)
152
+ # define RB_THREAD_T_HAS_NATIVE_ID
153
+ #endif
154
+
155
+ uint64_t native_thread_id_for(VALUE thread) {
156
+ // The tid is only available on Ruby >= 3.1 + Linux (and FreeBSD). It's the same as `gettid()` aka the task id as seen in /proc
157
+ #if !defined(NO_THREAD_TID) && defined(RB_THREAD_T_HAS_NATIVE_ID)
158
+ #ifndef NO_RB_NATIVE_THREAD
159
+ return thread_struct_from_object(thread)->nt->tid;
160
+ #else
161
+ return thread_struct_from_object(thread)->tid;
162
+ #endif
163
+ #else
164
+ rb_nativethread_id_t pthread_id = pthread_id_for(thread);
165
+
166
+ #ifdef __APPLE__
167
+ uint64_t result;
168
+ // On macOS, this gives us the same identifier that shows up in activity monitor
169
+ int error = pthread_threadid_np(pthread_id, &result);
170
+ if (error) rb_syserr_fail(error, "Unexpected failure in pthread_threadid_np");
171
+ return result;
172
+ #else
173
+ // Fallback, when we have nothing better (e.g. on Ruby < 3.1 on Linux)
174
+ // @ivoanjo: In the future we may want to explore some potential hacks to get the actual tid on linux
175
+ // (e.g. https://stackoverflow.com/questions/558469/how-do-i-get-a-thread-id-from-an-arbitrary-pthread-t )
176
+ return (uint64_t) pthread_id;
177
+ #endif
178
+ #endif
179
+ }
180
+
46
181
  // Returns the stack depth by using the same approach as rb_profile_frames and backtrace_each: get the positions
47
182
  // of the end and current frame pointers and subtracting them.
48
183
  ptrdiff_t stack_depth_for(VALUE thread) {
@@ -68,10 +203,8 @@ ptrdiff_t stack_depth_for(VALUE thread) {
68
203
  #define ccan_list_for_each list_for_each
69
204
  #endif
70
205
 
71
- #ifndef USE_LEGACY_LIVING_THREADS_ST // Ruby > 2.1
72
206
  // Tries to match rb_thread_list() but that method isn't accessible to extensions
73
- VALUE ddtrace_thread_list(void) {
74
- VALUE result = rb_ary_new();
207
+ void ddtrace_thread_list(VALUE result_array) {
75
208
  rb_thread_t *thread = NULL;
76
209
 
77
210
  // Ruby 3 Safety: Our implementation is inspired by `rb_ractor_thread_list` BUT that method wraps the operations below
@@ -88,51 +221,33 @@ VALUE ddtrace_thread_list(void) {
88
221
  rb_ractor_t *current_ractor = GET_RACTOR();
89
222
  ccan_list_for_each(&current_ractor->threads.set, thread, lt_node) {
90
223
  #else
91
- rb_vm_t *vm = thread_struct_from_object(rb_thread_current())->vm;
224
+ rb_vm_t *vm =
225
+ #ifndef NO_GET_VM
226
+ GET_VM();
227
+ #else
228
+ thread_struct_from_object(rb_thread_current())->vm;
229
+ #endif
92
230
  list_for_each(&vm->living_threads, thread, vmlt_node) {
93
231
  #endif
94
232
  switch (thread->status) {
95
233
  case THREAD_RUNNABLE:
96
234
  case THREAD_STOPPED:
97
235
  case THREAD_STOPPED_FOREVER:
98
- rb_ary_push(result, thread->self);
236
+ rb_ary_push(result_array, thread->self);
99
237
  default:
100
238
  break;
101
239
  }
102
240
  }
103
-
104
- return result;
105
- }
106
- #else // USE_LEGACY_LIVING_THREADS_ST
107
- static int ddtrace_thread_list_each(st_data_t thread_object, st_data_t _value, void *result_object);
108
-
109
- // Alternative ddtrace_thread_list implementation for Ruby 2.1. In this Ruby version, living threads were stored in a
110
- // hashmap (st) instead of a list.
111
- VALUE ddtrace_thread_list() {
112
- VALUE result = rb_ary_new();
113
- st_foreach(thread_struct_from_object(rb_thread_current())->vm->living_threads, ddtrace_thread_list_each, result);
114
- return result;
115
241
  }
116
242
 
117
- static int ddtrace_thread_list_each(st_data_t thread_object, st_data_t _value, void *result_object) {
118
- VALUE result = (VALUE) result_object;
119
- rb_thread_t *thread = thread_struct_from_object((VALUE) thread_object);
120
- switch (thread->status) {
121
- case THREAD_RUNNABLE:
122
- case THREAD_STOPPED:
123
- case THREAD_STOPPED_FOREVER:
124
- rb_ary_push(result, thread->self);
125
- default:
126
- break;
127
- }
128
- return ST_CONTINUE;
129
- }
130
- #endif // USE_LEGACY_LIVING_THREADS_ST
131
-
132
243
  bool is_thread_alive(VALUE thread) {
133
244
  return thread_struct_from_object(thread)->status != THREAD_KILLED;
134
245
  }
135
246
 
247
+ VALUE thread_name_for(VALUE thread) {
248
+ return thread_struct_from_object(thread)->name;
249
+ }
250
+
136
251
  // -----------------------------------------------------------------------------
137
252
  // The sources below are modified versions of code extracted from the Ruby project.
138
253
  // Each function is annotated with its origin, why we imported it, and the changes made.
@@ -162,8 +277,6 @@ bool is_thread_alive(VALUE thread) {
162
277
  // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
163
278
  // SUCH DAMAGE.
164
279
 
165
- #ifndef USE_LEGACY_RB_PROFILE_FRAMES // Modern Rubies
166
-
167
280
  // Taken from upstream vm_core.h at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
168
281
  // Copyright (C) 2004-2007 Koichi Sasada
169
282
  // to support our custom rb_profile_frames (see below)
@@ -174,6 +287,12 @@ bool is_thread_alive(VALUE thread) {
174
287
  // Copyright (C) 1993-2012 Yukihiro Matsumoto
175
288
  // to support our custom rb_profile_frames (see below)
176
289
  // Modifications: None
290
+ //
291
+ // `node_id` gets used depending on Ruby VM compilation settings (USE_ISEQ_NODE_ID being defined).
292
+ // To avoid getting false "unused argument" warnings in setups where it's not used, we need to do this weird dance
293
+ // with diagnostic stuff. See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
294
+ #pragma GCC diagnostic push
295
+ #pragma GCC diagnostic ignored "-Wunused-parameter"
177
296
  inline static int
178
297
  calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
179
298
  {
@@ -217,6 +336,7 @@ calc_pos(const rb_iseq_t *iseq, const VALUE *pc, int *lineno, int *node_id)
217
336
  return 1;
218
337
  }
219
338
  }
339
+ #pragma GCC diagnostic pop
220
340
 
221
341
  // Taken from upstream vm_backtrace.c at commit 5f10bd634fb6ae8f74a4ea730176233b0ca96954 (March 2022, Ruby 3.2 trunk)
222
342
  // Copyright (C) 1993-2012 Yukihiro Matsumoto
@@ -248,9 +368,6 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
248
368
  // * Add `end_cfp == NULL` and `end_cfp <= cfp` safety checks. These are used in a bunch of places in
249
369
  // `vm_backtrace.c` (`backtrace_each`, `backtrace_size`, `rb_ec_partial_backtrace_object`) but are conspicuously
250
370
  // absent from `rb_profile_frames`. Oversight?
251
- // * Distinguish between `end_cfp == NULL` (dead thread or some other error, returns 0) and `end_cfp <= cfp`
252
- // (alive thread which may just be executing native code and has not pushed anything on the Ruby stack, returns
253
- // PLACEHOLDER_STACK_IN_NATIVE_CODE). See comments on `record_placeholder_stack_in_native_code` for more details.
254
371
  // * Skip frames where `cfp->iseq && !cfp->pc`. These seem to be internal and are skipped by `backtrace_each` in
255
372
  // `vm_backtrace.c`.
256
373
  // * Check thread status and do not sample if thread has been killed.
@@ -258,9 +375,7 @@ calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
258
375
  // for iseqs created from calls to `eval` and `instance_eval`. This makes it so that `rb_profile_frame_path` on
259
376
  // the `VALUE` returned by rb_profile_frames returns `(eval)` instead of the path of the file where the `eval`
260
377
  // was called from.
261
- //
262
- // **IMPORTANT: WHEN CHANGING THIS FUNCTION, CONSIDER IF THE SAME CHANGE ALSO NEEDS TO BE MADE TO THE VARIANT FOR
263
- // RUBY 2.2 AND BELOW WHICH IS ALSO PRESENT ON THIS FILE**
378
+ // * Imported fix from https://github.com/ruby/ruby/pull/7116 to avoid sampling threads that are still being created
264
379
  //
265
380
  // What is rb_profile_frames?
266
381
  // `rb_profile_frames` is a Ruby VM debug API added for use by profilers for sampling the stack trace of a Ruby thread.
@@ -304,13 +419,17 @@ int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, i
304
419
  const rb_control_frame_t *cfp = ec->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(ec);
305
420
  const rb_callable_method_entry_t *cme;
306
421
 
307
- // `vm_backtrace.c` includes this check in several methods, and I think this happens on either dead or newly-created
308
- // threads, but I'm not entirely sure
309
- if (end_cfp == NULL) return 0;
310
-
311
422
  // Avoid sampling dead threads
312
423
  if (th->status == THREAD_KILLED) return 0;
313
424
 
425
+ // `vm_backtrace.c` includes this check in several methods. This happens on newly-created threads, and may
426
+ // also (not entirely sure) happen on dead threads
427
+ if (end_cfp == NULL) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
428
+
429
+ // This should not happen for ddtrace (it can only happen when a thread is still being created), but I've imported
430
+ // it from https://github.com/ruby/ruby/pull/7116 in a "just in case" kind of mindset.
431
+ if (cfp == NULL) return 0;
432
+
314
433
  // Fix: Skip dummy frame that shows up in main thread.
315
434
  //
316
435
  // According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
@@ -585,98 +704,29 @@ check_method_entry(VALUE obj, int can_be_svar)
585
704
  return check_method_entry(ep[-1], TRUE);
586
705
  }
587
706
  #endif // USE_LEGACY_RB_VM_FRAME_METHOD_ENTRY
588
-
589
707
  #endif // RUBY_MJIT_HEADER
590
708
 
591
- #else // USE_LEGACY_RB_PROFILE_FRAMES, Ruby < 2.3
592
-
593
- // Taken from upstream vm_backtrace.c at commit bbda1a027475bf7ce5e1a9583a7b55d0be71c8fe (March 2018, ruby_2_2 branch)
594
- // Copyright (C) 1993-2012 Yukihiro Matsumoto
595
- // to support our custom rb_profile_frames (see below)
596
- // Modifications: None
597
- inline static int
598
- calc_lineno(const rb_iseq_t *iseq, const VALUE *pc)
599
- {
600
- return rb_iseq_line_no(iseq, pc - iseq->iseq_encoded);
601
- }
602
-
603
- // Taken from upstream vm_backtrace.c at commit bbda1a027475bf7ce5e1a9583a7b55d0be71c8fe (March 2018, ruby_2_2 branch)
604
- // Copyright (C) 1993-2012 Yukihiro Matsumoto
605
- // Modifications:
606
- // * Renamed rb_profile_frames => ddtrace_rb_profile_frames
607
- // * Add thread argument
608
- // * Add is_ruby_frame argument
609
- // * Removed `if (lines)` tests -- require/assume that like `buff`, `lines` is always specified
610
- // * Added support for getting the name from native methods by getting inspiration from `backtrace_each` in
611
- // `vm_backtrace.c`. Note that unlike the `rb_profile_frames` for modern Rubies, this version actually returns the
612
- // method name as as `VALUE` containing a Ruby string in the `buff`.
613
- // * Skip dummy frame that shows up in main thread
614
- // * Add `end_cfp == NULL` and `end_cfp <= cfp` safety checks. These are used in a bunch of places in
615
- // `vm_backtrace.c` (`backtrace_each`, `backtrace_size`, `rb_ec_partial_backtrace_object`) but are conspicuously
616
- // absent from `rb_profile_frames`. Oversight?
617
- // * Distinguish between `end_cfp == NULL` (dead thread or some other error, returns 0) and `end_cfp <= cfp`
618
- // (alive thread which may just be executing native code and has not pushed anything on the Ruby stack, returns
619
- // PLACEHOLDER_STACK_IN_NATIVE_CODE). See comments on `record_placeholder_stack_in_native_code` for more details.
620
- // * Check thread status and do not sample if thread has been killed.
621
- //
622
- // The `rb_profile_frames` function changed quite a bit between Ruby 2.2 and 2.3. Since the change was quite complex
623
- // I opted not to try to extend support to Ruby 2.2 and below using the same custom function, and instead I started
624
- // anew from the Ruby 2.2 version of the function, applying some of the same fixes that we have for the modern version.
625
- int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame)
626
- {
627
- // **IMPORTANT: THIS IS A CUSTOM RB_PROFILE_FRAMES JUST FOR RUBY 2.2 AND BELOW;
628
- // SEE ABOVE FOR THE FUNCTION THAT GETS USED FOR MODERN RUBIES**
629
-
630
- int i;
631
- rb_thread_t *th = thread_struct_from_object(thread);
632
- rb_control_frame_t *cfp = th->cfp, *end_cfp = RUBY_VM_END_CONTROL_FRAME(th);
633
-
634
- // `vm_backtrace.c` includes this check in several methods, and I think this happens on either dead or newly-created
635
- // threads, but I'm not entirely sure
636
- if (end_cfp == NULL) return 0;
637
-
638
- // Avoid sampling dead threads
639
- if (th->status == THREAD_KILLED) return 0;
640
-
641
- // Fix: Skip dummy frame that shows up in main thread.
642
- //
643
- // According to a comment in `backtrace_each` (`vm_backtrace.c`), there's two dummy frames that we should ignore
644
- // at the base of every thread's stack.
645
- // (see https://github.com/ruby/ruby/blob/4bd38e8120f2fdfdd47a34211720e048502377f1/vm_backtrace.c#L890-L914 )
646
- //
647
- // One is being pointed to by `RUBY_VM_END_CONTROL_FRAME(ec)`, and so we need to advance to the next one, and
648
- // reaching it will be used as a condition to break out of the loop below.
649
- //
650
- // Note that in `backtrace_each` there's two calls to `RUBY_VM_NEXT_CONTROL_FRAME`, but the loop bounds there
651
- // are computed in a different way, so the two calls really are equivalent to one here.
652
- end_cfp = RUBY_VM_NEXT_CONTROL_FRAME(end_cfp);
653
-
654
- // See comment on `record_placeholder_stack_in_native_code` for a full explanation of what this means (and why we don't just return 0)
655
- if (end_cfp <= cfp) return PLACEHOLDER_STACK_IN_NATIVE_CODE;
656
-
657
- for (i=0; i<limit && cfp != end_cfp;) {
658
- if (cfp->iseq && cfp->pc) { /* should be NORMAL_ISEQ */
659
- if (start > 0) {
660
- start--;
661
- continue;
662
- }
663
-
664
- /* record frame info */
665
- buff[i] = cfp->iseq->self;
666
- lines[i] = calc_lineno(cfp->iseq, cfp->pc);
667
- is_ruby_frame[i] = true;
668
- i++;
669
- } else if (RUBYVM_CFUNC_FRAME_P(cfp)) {
670
- ID mid = cfp->me->def ? cfp->me->def->original_id : cfp->me->called_id;
671
- buff[i] = rb_id2str(mid);
672
- lines[i] = 0;
673
- is_ruby_frame[i] = false;
674
- i++;
675
- }
676
- cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
677
- }
678
-
679
- return i;
680
- }
681
-
682
- #endif // USE_LEGACY_RB_PROFILE_FRAMES
709
+ #ifndef NO_RACTORS
710
+ // This API and definition are exported as a public symbol by the VM BUT the function header is not defined in any public header, so we
711
+ // repeat it here to be able to use in our code.
712
+ bool rb_ractor_main_p_(void);
713
+ extern struct rb_ractor_struct *ruby_single_main_ractor;
714
+
715
+ // Taken from upstream ractor_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
716
+ // to allow us to ensure that we're always operating on the main ractor (if Ruby has ractors)
717
+ // Modifications:
718
+ // * None
719
+ bool ddtrace_rb_ractor_main_p(void)
720
+ {
721
+ if (ruby_single_main_ractor) {
722
+ return true;
723
+ }
724
+ else {
725
+ return rb_ractor_main_p_();
726
+ }
727
+ }
728
+ #else
729
+ // Simplify callers on older Rubies, instead of having them probe if the VM supports Ractors we just tell them that yes
730
+ // they're always on the main Ractor
731
+ bool ddtrace_rb_ractor_main_p(void) { return true; }
732
+ #endif // NO_RACTORS
@@ -6,21 +6,30 @@
6
6
  // so we use PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES to be able to include private_vm_api_access.h on that file
7
7
  // without also dragging the incompatible includes
8
8
  #ifndef PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
9
- #ifdef RUBY_2_1_WORKAROUND
10
- #include <thread_native.h>
11
- #else
12
- #include <ruby/thread_native.h>
13
- #endif
9
+ #include <ruby/thread_native.h>
10
+ #include <ruby/vm.h>
14
11
  #endif
15
12
 
16
13
  #include "extconf.h"
17
14
 
15
+ // Contains the current gvl owner, and a flag to indicate if it is valid
16
+ typedef struct {
17
+ bool valid;
18
+ rb_nativethread_id_t owner;
19
+ } current_gvl_owner;
20
+
18
21
  rb_nativethread_id_t pthread_id_for(VALUE thread);
22
+ bool is_current_thread_holding_the_gvl(void);
23
+ current_gvl_owner gvl_owner(void);
24
+ uint64_t native_thread_id_for(VALUE thread);
19
25
  ptrdiff_t stack_depth_for(VALUE thread);
20
- VALUE ddtrace_thread_list(void);
26
+ void ddtrace_thread_list(VALUE result_array);
21
27
  bool is_thread_alive(VALUE thread);
28
+ VALUE thread_name_for(VALUE thread);
22
29
 
23
30
  int ddtrace_rb_profile_frames(VALUE thread, int start, int limit, VALUE *buff, int *lines, bool* is_ruby_frame);
31
+ // Returns true if the current thread belongs to the main Ractor or if Ruby has no Ractor support
32
+ bool ddtrace_rb_ractor_main_p(void);
24
33
 
25
34
  // Ruby 3.0 finally added support for showing CFUNC frames (frames for methods written using native code)
26
35
  // in stack traces gathered via `rb_profile_frames` (https://github.com/ruby/ruby/pull/3299).