ddtrace 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +63 -2
  3. data/ext/ddtrace_profiling_loader/extconf.rb +0 -2
  4. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +81 -36
  5. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -3
  6. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +37 -48
  7. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +3 -1
  8. data/ext/ddtrace_profiling_native_extension/{collectors_cpu_and_wall_time.c → collectors_thread_context.c} +222 -143
  9. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +14 -0
  10. data/ext/ddtrace_profiling_native_extension/extconf.rb +7 -18
  11. data/ext/ddtrace_profiling_native_extension/http_transport.c +25 -32
  12. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +9 -2
  13. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +9 -9
  14. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +7 -121
  15. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +1 -1
  16. data/ext/ddtrace_profiling_native_extension/profiling.c +2 -2
  17. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +2 -2
  18. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +1 -1
  19. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +125 -21
  20. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +9 -34
  21. data/lib/datadog/appsec/assets/waf_rules/recommended.json +321 -185
  22. data/lib/datadog/appsec/assets/waf_rules/strict.json +59 -2
  23. data/lib/datadog/appsec/assets.rb +0 -2
  24. data/lib/datadog/appsec/autoload.rb +4 -11
  25. data/lib/datadog/appsec/component.rb +41 -0
  26. data/lib/datadog/appsec/configuration/settings.rb +8 -3
  27. data/lib/datadog/appsec/configuration.rb +4 -2
  28. data/lib/datadog/appsec/contrib/auto_instrument.rb +0 -2
  29. data/lib/datadog/appsec/contrib/configuration/settings.rb +0 -2
  30. data/lib/datadog/appsec/contrib/integration.rb +0 -2
  31. data/lib/datadog/appsec/contrib/patcher.rb +0 -2
  32. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +0 -2
  33. data/lib/datadog/appsec/contrib/rack/ext.rb +0 -2
  34. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +104 -0
  35. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +30 -0
  36. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +111 -109
  37. data/lib/datadog/appsec/contrib/rack/integration.rb +0 -2
  38. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  39. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +18 -21
  40. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +10 -11
  41. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +10 -11
  42. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +6 -4
  43. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +40 -26
  44. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +0 -2
  45. data/lib/datadog/appsec/contrib/rails/ext.rb +0 -2
  46. data/lib/datadog/appsec/contrib/rails/framework.rb +0 -2
  47. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +67 -0
  48. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +41 -37
  49. data/lib/datadog/appsec/contrib/rails/integration.rb +0 -2
  50. data/lib/datadog/appsec/contrib/rails/patcher.rb +3 -3
  51. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +12 -11
  52. data/lib/datadog/appsec/contrib/rails/request.rb +0 -2
  53. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +0 -2
  54. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +0 -2
  55. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -2
  56. data/lib/datadog/appsec/contrib/sinatra/framework.rb +0 -2
  57. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +17 -0
  58. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +23 -0
  59. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +76 -71
  60. data/lib/datadog/appsec/contrib/sinatra/integration.rb +0 -2
  61. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +12 -4
  62. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +10 -9
  63. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +0 -2
  64. data/lib/datadog/appsec/event.rb +4 -8
  65. data/lib/datadog/appsec/ext.rb +9 -0
  66. data/lib/datadog/appsec/extensions.rb +10 -2
  67. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +24 -0
  68. data/lib/datadog/appsec/instrumentation/gateway.rb +11 -5
  69. data/lib/datadog/appsec/instrumentation.rb +9 -0
  70. data/lib/datadog/appsec/monitor/gateway/watcher.rb +86 -0
  71. data/lib/datadog/appsec/monitor/reactive/set_user.rb +61 -0
  72. data/lib/datadog/appsec/monitor.rb +11 -0
  73. data/lib/datadog/appsec/processor.rb +74 -25
  74. data/lib/datadog/appsec/rate_limiter.rb +0 -2
  75. data/lib/datadog/appsec/reactive/address_hash.rb +6 -2
  76. data/lib/datadog/appsec/reactive/engine.rb +10 -7
  77. data/lib/datadog/appsec/reactive/operation.rb +19 -2
  78. data/lib/datadog/appsec/reactive/subscriber.rb +2 -1
  79. data/lib/datadog/appsec/response.rb +0 -2
  80. data/lib/datadog/appsec/utils/http/media_range.rb +0 -2
  81. data/lib/datadog/appsec/utils/http/media_type.rb +0 -2
  82. data/lib/datadog/appsec.rb +20 -2
  83. data/lib/datadog/ci/configuration/components.rb +0 -2
  84. data/lib/datadog/ci/configuration/settings.rb +0 -2
  85. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -2
  86. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -2
  87. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -2
  88. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -2
  89. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -2
  90. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -2
  91. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -2
  92. data/lib/datadog/ci/contrib/rspec/example.rb +0 -2
  93. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -2
  94. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -2
  95. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -2
  96. data/lib/datadog/ci/ext/app_types.rb +0 -2
  97. data/lib/datadog/ci/ext/environment.rb +0 -4
  98. data/lib/datadog/ci/ext/settings.rb +0 -2
  99. data/lib/datadog/ci/ext/test.rb +0 -2
  100. data/lib/datadog/ci/extensions.rb +0 -2
  101. data/lib/datadog/ci/flush.rb +0 -2
  102. data/lib/datadog/ci/test.rb +0 -2
  103. data/lib/datadog/ci.rb +0 -2
  104. data/lib/datadog/core/buffer/cruby.rb +0 -2
  105. data/lib/datadog/core/buffer/random.rb +0 -2
  106. data/lib/datadog/core/buffer/thread_safe.rb +0 -2
  107. data/lib/datadog/core/chunker.rb +0 -2
  108. data/lib/datadog/core/configuration/agent_settings_resolver.rb +0 -17
  109. data/lib/datadog/core/configuration/base.rb +0 -2
  110. data/lib/datadog/core/configuration/components.rb +14 -318
  111. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -2
  112. data/lib/datadog/core/configuration/ext.rb +0 -2
  113. data/lib/datadog/core/configuration/option.rb +0 -2
  114. data/lib/datadog/core/configuration/option_definition.rb +0 -2
  115. data/lib/datadog/core/configuration/option_definition_set.rb +0 -2
  116. data/lib/datadog/core/configuration/option_set.rb +0 -2
  117. data/lib/datadog/core/configuration/options.rb +0 -2
  118. data/lib/datadog/core/configuration/settings.rb +14 -5
  119. data/lib/datadog/core/configuration.rb +0 -4
  120. data/lib/datadog/core/diagnostics/environment_logger.rb +0 -2
  121. data/lib/datadog/core/diagnostics/health.rb +0 -2
  122. data/lib/datadog/core/encoding.rb +0 -4
  123. data/lib/datadog/core/environment/cgroup.rb +0 -4
  124. data/lib/datadog/core/environment/class_count.rb +0 -2
  125. data/lib/datadog/core/environment/container.rb +0 -4
  126. data/lib/datadog/core/environment/ext.rb +0 -2
  127. data/lib/datadog/core/environment/gc.rb +0 -2
  128. data/lib/datadog/core/environment/identity.rb +0 -2
  129. data/lib/datadog/core/environment/platform.rb +0 -2
  130. data/lib/datadog/core/environment/socket.rb +0 -2
  131. data/lib/datadog/core/environment/thread_count.rb +0 -2
  132. data/lib/datadog/core/environment/variable_helpers.rb +0 -2
  133. data/lib/datadog/core/environment/vm_cache.rb +17 -2
  134. data/lib/datadog/core/error.rb +0 -2
  135. data/lib/datadog/core/extensions.rb +0 -2
  136. data/lib/datadog/core/git/ext.rb +0 -2
  137. data/lib/datadog/core/logger.rb +0 -2
  138. data/lib/datadog/core/metrics/client.rb +0 -2
  139. data/lib/datadog/core/metrics/ext.rb +0 -2
  140. data/lib/datadog/core/metrics/helpers.rb +0 -2
  141. data/lib/datadog/core/metrics/logging.rb +0 -2
  142. data/lib/datadog/core/metrics/metric.rb +0 -2
  143. data/lib/datadog/core/metrics/options.rb +0 -2
  144. data/lib/datadog/core/pin.rb +0 -2
  145. data/lib/datadog/core/runtime/ext.rb +2 -2
  146. data/lib/datadog/core/runtime/metrics.rb +21 -7
  147. data/lib/datadog/core/telemetry/client.rb +0 -2
  148. data/lib/datadog/core/telemetry/collector.rb +0 -2
  149. data/lib/datadog/core/telemetry/emitter.rb +0 -2
  150. data/lib/datadog/core/telemetry/event.rb +0 -4
  151. data/lib/datadog/core/telemetry/ext.rb +0 -2
  152. data/lib/datadog/core/telemetry/heartbeat.rb +0 -2
  153. data/lib/datadog/core/telemetry/http/adapters/net.rb +0 -2
  154. data/lib/datadog/core/telemetry/http/env.rb +0 -2
  155. data/lib/datadog/core/telemetry/http/response.rb +0 -4
  156. data/lib/datadog/core/telemetry/http/transport.rb +0 -2
  157. data/lib/datadog/core/telemetry/v1/app_event.rb +0 -2
  158. data/lib/datadog/core/utils/compression.rb +0 -2
  159. data/lib/datadog/core/utils/forking.rb +0 -2
  160. data/lib/datadog/core/utils/object_set.rb +0 -2
  161. data/lib/datadog/core/utils/only_once.rb +0 -2
  162. data/lib/datadog/core/utils/safe_dup.rb +0 -2
  163. data/lib/datadog/core/utils/sequence.rb +0 -2
  164. data/lib/datadog/core/utils/string_table.rb +0 -2
  165. data/lib/datadog/core/utils/time.rb +0 -4
  166. data/lib/datadog/core/utils.rb +0 -2
  167. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -2
  168. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +0 -2
  169. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +0 -2
  170. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +0 -2
  171. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +0 -2
  172. data/lib/datadog/core/vendor/multipart-post/multipart.rb +0 -2
  173. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +0 -2
  174. data/lib/datadog/core/worker.rb +0 -2
  175. data/lib/datadog/core/workers/async.rb +0 -2
  176. data/lib/datadog/core/workers/interval_loop.rb +0 -2
  177. data/lib/datadog/core/workers/polling.rb +0 -2
  178. data/lib/datadog/core/workers/queue.rb +0 -2
  179. data/lib/datadog/core/workers/runtime_metrics.rb +0 -2
  180. data/lib/datadog/core.rb +0 -1
  181. data/lib/datadog/kit/appsec/events.rb +0 -1
  182. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  183. data/lib/datadog/kit/identity.rb +7 -1
  184. data/lib/datadog/kit.rb +0 -2
  185. data/lib/datadog/opentelemetry/api/context.rb +0 -1
  186. data/lib/datadog/opentelemetry/api/trace/span.rb +0 -1
  187. data/lib/datadog/opentelemetry/sdk/configurator.rb +0 -1
  188. data/lib/datadog/opentelemetry/sdk/id_generator.rb +0 -1
  189. data/lib/datadog/opentelemetry/sdk/propagator.rb +0 -1
  190. data/lib/datadog/opentelemetry/sdk/span_processor.rb +0 -1
  191. data/lib/datadog/opentelemetry.rb +0 -1
  192. data/lib/datadog/opentracer/binary_propagator.rb +0 -2
  193. data/lib/datadog/opentracer/carrier.rb +0 -2
  194. data/lib/datadog/opentracer/distributed_headers.rb +0 -2
  195. data/lib/datadog/opentracer/global_tracer.rb +0 -2
  196. data/lib/datadog/opentracer/propagator.rb +0 -2
  197. data/lib/datadog/opentracer/rack_propagator.rb +0 -2
  198. data/lib/datadog/opentracer/scope.rb +0 -2
  199. data/lib/datadog/opentracer/scope_manager.rb +0 -2
  200. data/lib/datadog/opentracer/span.rb +0 -2
  201. data/lib/datadog/opentracer/span_context.rb +0 -2
  202. data/lib/datadog/opentracer/span_context_factory.rb +0 -2
  203. data/lib/datadog/opentracer/text_map_propagator.rb +0 -2
  204. data/lib/datadog/opentracer/thread_local_scope.rb +0 -2
  205. data/lib/datadog/opentracer/thread_local_scope_manager.rb +0 -2
  206. data/lib/datadog/opentracer/tracer.rb +0 -2
  207. data/lib/datadog/opentracer.rb +0 -2
  208. data/lib/datadog/profiling/backtrace_location.rb +0 -2
  209. data/lib/datadog/profiling/buffer.rb +0 -2
  210. data/lib/datadog/profiling/collectors/code_provenance.rb +0 -2
  211. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -7
  212. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +0 -2
  213. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -3
  214. data/lib/datadog/profiling/collectors/old_stack.rb +1 -5
  215. data/lib/datadog/profiling/collectors/stack.rb +0 -2
  216. data/lib/datadog/profiling/collectors/{cpu_and_wall_time.rb → thread_context.rb} +8 -5
  217. data/lib/datadog/profiling/component.rb +161 -0
  218. data/lib/datadog/profiling/encoding/profile.rb +0 -2
  219. data/lib/datadog/profiling/event.rb +0 -2
  220. data/lib/datadog/profiling/events/stack.rb +0 -2
  221. data/lib/datadog/profiling/exporter.rb +0 -2
  222. data/lib/datadog/profiling/ext/forking.rb +0 -2
  223. data/lib/datadog/profiling/ext.rb +0 -2
  224. data/lib/datadog/profiling/flush.rb +0 -2
  225. data/lib/datadog/profiling/http_transport.rb +0 -2
  226. data/lib/datadog/profiling/load_native_extension.rb +0 -2
  227. data/lib/datadog/profiling/native_extension.rb +0 -2
  228. data/lib/datadog/profiling/old_recorder.rb +0 -2
  229. data/lib/datadog/profiling/pprof/builder.rb +0 -2
  230. data/lib/datadog/profiling/pprof/converter.rb +0 -2
  231. data/lib/datadog/profiling/pprof/message_set.rb +0 -2
  232. data/lib/datadog/profiling/pprof/payload.rb +0 -2
  233. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -2
  234. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -2
  235. data/lib/datadog/profiling/pprof/string_table.rb +0 -2
  236. data/lib/datadog/profiling/pprof/template.rb +0 -2
  237. data/lib/datadog/profiling/preload.rb +0 -2
  238. data/lib/datadog/profiling/profiler.rb +0 -2
  239. data/lib/datadog/profiling/scheduler.rb +0 -2
  240. data/lib/datadog/profiling/stack_recorder.rb +3 -8
  241. data/lib/datadog/profiling/tag_builder.rb +0 -2
  242. data/lib/datadog/profiling/tasks/exec.rb +0 -2
  243. data/lib/datadog/profiling/tasks/help.rb +0 -2
  244. data/lib/datadog/profiling/tasks/setup.rb +0 -2
  245. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -2
  246. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -2
  247. data/lib/datadog/profiling.rb +44 -7
  248. data/lib/datadog/tracing/analytics.rb +0 -2
  249. data/lib/datadog/tracing/buffer.rb +0 -4
  250. data/lib/datadog/tracing/client_ip.rb +0 -2
  251. data/lib/datadog/tracing/component.rb +176 -0
  252. data/lib/datadog/tracing/configuration/ext.rb +2 -2
  253. data/lib/datadog/tracing/configuration/settings.rb +20 -2
  254. data/lib/datadog/tracing/context.rb +0 -2
  255. data/lib/datadog/tracing/context_provider.rb +0 -2
  256. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +0 -2
  257. data/lib/datadog/tracing/contrib/action_cable/event.rb +0 -2
  258. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +0 -2
  259. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +0 -2
  260. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +0 -2
  261. data/lib/datadog/tracing/contrib/action_cable/events.rb +0 -2
  262. data/lib/datadog/tracing/contrib/action_cable/ext.rb +0 -2
  263. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +0 -2
  264. data/lib/datadog/tracing/contrib/action_cable/integration.rb +0 -2
  265. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +0 -2
  266. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +0 -2
  267. data/lib/datadog/tracing/contrib/action_mailer/event.rb +0 -2
  268. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +0 -2
  269. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +0 -2
  270. data/lib/datadog/tracing/contrib/action_mailer/events.rb +0 -2
  271. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +0 -2
  272. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +0 -2
  273. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +0 -2
  274. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +0 -2
  275. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +0 -2
  276. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +0 -2
  277. data/lib/datadog/tracing/contrib/action_pack/ext.rb +0 -2
  278. data/lib/datadog/tracing/contrib/action_pack/integration.rb +0 -2
  279. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +0 -2
  280. data/lib/datadog/tracing/contrib/action_pack/utils.rb +0 -2
  281. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +0 -2
  282. data/lib/datadog/tracing/contrib/action_view/event.rb +0 -2
  283. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +0 -2
  284. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +0 -2
  285. data/lib/datadog/tracing/contrib/action_view/events.rb +0 -2
  286. data/lib/datadog/tracing/contrib/action_view/ext.rb +0 -2
  287. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +0 -2
  288. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +0 -2
  289. data/lib/datadog/tracing/contrib/action_view/integration.rb +0 -2
  290. data/lib/datadog/tracing/contrib/action_view/patcher.rb +0 -2
  291. data/lib/datadog/tracing/contrib/action_view/utils.rb +0 -2
  292. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +0 -2
  293. data/lib/datadog/tracing/contrib/active_job/event.rb +0 -2
  294. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +0 -2
  295. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +0 -2
  296. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +0 -2
  297. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +0 -2
  298. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +0 -2
  299. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +0 -2
  300. data/lib/datadog/tracing/contrib/active_job/events.rb +0 -2
  301. data/lib/datadog/tracing/contrib/active_job/ext.rb +0 -2
  302. data/lib/datadog/tracing/contrib/active_job/integration.rb +0 -2
  303. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  304. data/lib/datadog/tracing/contrib/active_job/patcher.rb +0 -2
  305. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +0 -2
  306. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +0 -2
  307. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +0 -2
  308. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +0 -2
  309. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +0 -2
  310. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +0 -2
  311. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +0 -2
  312. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +0 -2
  313. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
  314. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +0 -2
  315. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +0 -2
  316. data/lib/datadog/tracing/contrib/active_record/event.rb +0 -2
  317. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +0 -2
  318. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +0 -2
  319. data/lib/datadog/tracing/contrib/active_record/events.rb +0 -2
  320. data/lib/datadog/tracing/contrib/active_record/ext.rb +0 -2
  321. data/lib/datadog/tracing/contrib/active_record/integration.rb +0 -2
  322. data/lib/datadog/tracing/contrib/active_record/patcher.rb +0 -2
  323. data/lib/datadog/tracing/contrib/active_record/utils.rb +0 -2
  324. data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +0 -2
  325. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +0 -2
  326. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +0 -2
  327. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +0 -2
  328. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +0 -2
  329. data/lib/datadog/tracing/contrib/active_support/ext.rb +0 -2
  330. data/lib/datadog/tracing/contrib/active_support/integration.rb +0 -2
  331. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +0 -2
  332. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +0 -2
  333. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +0 -2
  334. data/lib/datadog/tracing/contrib/active_support/patcher.rb +0 -2
  335. data/lib/datadog/tracing/contrib/analytics.rb +0 -2
  336. data/lib/datadog/tracing/contrib/auto_instrument.rb +0 -2
  337. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +0 -2
  338. data/lib/datadog/tracing/contrib/aws/ext.rb +0 -2
  339. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +0 -2
  340. data/lib/datadog/tracing/contrib/aws/integration.rb +0 -2
  341. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +0 -2
  342. data/lib/datadog/tracing/contrib/aws/patcher.rb +0 -2
  343. data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
  344. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +0 -2
  345. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -2
  346. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +0 -2
  347. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +0 -2
  348. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +0 -2
  349. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +0 -3
  350. data/lib/datadog/tracing/contrib/configurable.rb +0 -2
  351. data/lib/datadog/tracing/contrib/configuration/resolver.rb +0 -2
  352. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +0 -2
  353. data/lib/datadog/tracing/contrib/configuration/settings.rb +0 -4
  354. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +0 -2
  355. data/lib/datadog/tracing/contrib/dalli/ext.rb +0 -2
  356. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +2 -2
  357. data/lib/datadog/tracing/contrib/dalli/integration.rb +0 -2
  358. data/lib/datadog/tracing/contrib/dalli/patcher.rb +0 -2
  359. data/lib/datadog/tracing/contrib/dalli/quantize.rb +0 -2
  360. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +0 -2
  361. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +0 -2
  362. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +0 -2
  363. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +0 -2
  364. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +4 -2
  365. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +2 -2
  366. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +0 -2
  367. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +0 -2
  368. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +0 -2
  369. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -4
  370. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +0 -4
  371. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +0 -2
  372. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +0 -2
  373. data/lib/datadog/tracing/contrib/ethon/ext.rb +0 -2
  374. data/lib/datadog/tracing/contrib/ethon/integration.rb +0 -2
  375. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +0 -2
  376. data/lib/datadog/tracing/contrib/ethon/patcher.rb +0 -3
  377. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +0 -2
  378. data/lib/datadog/tracing/contrib/excon/ext.rb +0 -2
  379. data/lib/datadog/tracing/contrib/excon/integration.rb +0 -2
  380. data/lib/datadog/tracing/contrib/excon/middleware.rb +0 -2
  381. data/lib/datadog/tracing/contrib/excon/patcher.rb +0 -2
  382. data/lib/datadog/tracing/contrib/ext.rb +5 -0
  383. data/lib/datadog/tracing/contrib/extensions.rb +0 -2
  384. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +0 -2
  385. data/lib/datadog/tracing/contrib/faraday/connection.rb +0 -2
  386. data/lib/datadog/tracing/contrib/faraday/ext.rb +0 -2
  387. data/lib/datadog/tracing/contrib/faraday/integration.rb +0 -2
  388. data/lib/datadog/tracing/contrib/faraday/middleware.rb +0 -2
  389. data/lib/datadog/tracing/contrib/faraday/patcher.rb +0 -2
  390. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +0 -2
  391. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +0 -2
  392. data/lib/datadog/tracing/contrib/grape/endpoint.rb +0 -2
  393. data/lib/datadog/tracing/contrib/grape/ext.rb +0 -2
  394. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +0 -2
  395. data/lib/datadog/tracing/contrib/grape/integration.rb +0 -2
  396. data/lib/datadog/tracing/contrib/grape/patcher.rb +0 -2
  397. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +0 -2
  398. data/lib/datadog/tracing/contrib/graphql/ext.rb +0 -2
  399. data/lib/datadog/tracing/contrib/graphql/integration.rb +0 -2
  400. data/lib/datadog/tracing/contrib/graphql/patcher.rb +0 -2
  401. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +0 -2
  402. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +0 -2
  403. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +0 -2
  404. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -2
  405. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +0 -1
  406. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +0 -1
  407. data/lib/datadog/tracing/contrib/grpc/ext.rb +0 -2
  408. data/lib/datadog/tracing/contrib/grpc/integration.rb +8 -3
  409. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +0 -2
  410. data/lib/datadog/tracing/contrib/grpc/patcher.rb +0 -3
  411. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +0 -2
  412. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +0 -2
  413. data/lib/datadog/tracing/contrib/hanami/ext.rb +0 -2
  414. data/lib/datadog/tracing/contrib/hanami/integration.rb +0 -2
  415. data/lib/datadog/tracing/contrib/hanami/patcher.rb +0 -2
  416. data/lib/datadog/tracing/contrib/hanami/plugin.rb +0 -2
  417. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +0 -2
  418. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +0 -2
  419. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -2
  420. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +0 -2
  421. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +0 -1
  422. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +0 -1
  423. data/lib/datadog/tracing/contrib/http/ext.rb +0 -2
  424. data/lib/datadog/tracing/contrib/http/instrumentation.rb +0 -2
  425. data/lib/datadog/tracing/contrib/http/integration.rb +0 -2
  426. data/lib/datadog/tracing/contrib/http/patcher.rb +0 -2
  427. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +0 -2
  428. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +0 -2
  429. data/lib/datadog/tracing/contrib/httpclient/ext.rb +0 -2
  430. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +0 -2
  431. data/lib/datadog/tracing/contrib/httpclient/integration.rb +0 -2
  432. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +0 -2
  433. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +0 -2
  434. data/lib/datadog/tracing/contrib/httprb/ext.rb +0 -2
  435. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +0 -2
  436. data/lib/datadog/tracing/contrib/httprb/integration.rb +0 -2
  437. data/lib/datadog/tracing/contrib/httprb/patcher.rb +0 -2
  438. data/lib/datadog/tracing/contrib/integration.rb +0 -2
  439. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +0 -2
  440. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +0 -2
  441. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +0 -2
  442. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -2
  443. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +0 -2
  444. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +0 -2
  445. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +0 -2
  446. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +0 -2
  447. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +0 -2
  448. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +0 -2
  449. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +0 -2
  450. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +0 -2
  451. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +0 -2
  452. data/lib/datadog/tracing/contrib/kafka/events.rb +0 -2
  453. data/lib/datadog/tracing/contrib/kafka/ext.rb +1 -2
  454. data/lib/datadog/tracing/contrib/kafka/integration.rb +0 -2
  455. data/lib/datadog/tracing/contrib/kafka/patcher.rb +0 -2
  456. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +0 -2
  457. data/lib/datadog/tracing/contrib/lograge/ext.rb +0 -2
  458. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +0 -2
  459. data/lib/datadog/tracing/contrib/lograge/integration.rb +0 -2
  460. data/lib/datadog/tracing/contrib/lograge/patcher.rb +0 -2
  461. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +0 -2
  462. data/lib/datadog/tracing/contrib/mongodb/ext.rb +0 -2
  463. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +0 -2
  464. data/lib/datadog/tracing/contrib/mongodb/integration.rb +0 -2
  465. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +0 -2
  466. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +0 -2
  467. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +0 -2
  468. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +0 -2
  469. data/lib/datadog/tracing/contrib/mysql2/ext.rb +0 -2
  470. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +0 -2
  471. data/lib/datadog/tracing/contrib/mysql2/integration.rb +0 -2
  472. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +0 -2
  473. data/lib/datadog/tracing/contrib/patchable.rb +0 -2
  474. data/lib/datadog/tracing/contrib/patcher.rb +0 -2
  475. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +0 -2
  476. data/lib/datadog/tracing/contrib/pg/ext.rb +0 -2
  477. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +0 -2
  478. data/lib/datadog/tracing/contrib/pg/integration.rb +0 -2
  479. data/lib/datadog/tracing/contrib/pg/patcher.rb +0 -2
  480. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +0 -2
  481. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -2
  482. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -2
  483. data/lib/datadog/tracing/contrib/presto/integration.rb +0 -2
  484. data/lib/datadog/tracing/contrib/presto/patcher.rb +0 -2
  485. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +0 -2
  486. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +0 -2
  487. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +0 -2
  488. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +0 -2
  489. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +0 -2
  490. data/lib/datadog/tracing/contrib/qless/ext.rb +0 -2
  491. data/lib/datadog/tracing/contrib/qless/integration.rb +0 -2
  492. data/lib/datadog/tracing/contrib/qless/patcher.rb +0 -3
  493. data/lib/datadog/tracing/contrib/qless/qless_job.rb +3 -2
  494. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  495. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +0 -2
  496. data/lib/datadog/tracing/contrib/que/ext.rb +0 -2
  497. data/lib/datadog/tracing/contrib/que/integration.rb +0 -2
  498. data/lib/datadog/tracing/contrib/que/patcher.rb +0 -2
  499. data/lib/datadog/tracing/contrib/que/tracer.rb +2 -2
  500. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +0 -2
  501. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -2
  502. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +0 -2
  503. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +0 -2
  504. data/lib/datadog/tracing/contrib/racecar/events/message.rb +0 -2
  505. data/lib/datadog/tracing/contrib/racecar/events.rb +0 -2
  506. data/lib/datadog/tracing/contrib/racecar/ext.rb +1 -2
  507. data/lib/datadog/tracing/contrib/racecar/integration.rb +0 -2
  508. data/lib/datadog/tracing/contrib/racecar/patcher.rb +0 -2
  509. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +0 -2
  510. data/lib/datadog/tracing/contrib/rack/ext.rb +5 -2
  511. data/lib/datadog/tracing/contrib/rack/integration.rb +0 -2
  512. data/lib/datadog/tracing/contrib/rack/middlewares.rb +42 -18
  513. data/lib/datadog/tracing/contrib/rack/patcher.rb +0 -2
  514. data/lib/datadog/tracing/contrib/rack/request_queue.rb +0 -2
  515. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +0 -2
  516. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +0 -2
  517. data/lib/datadog/tracing/contrib/rails/ext.rb +0 -2
  518. data/lib/datadog/tracing/contrib/rails/framework.rb +0 -2
  519. data/lib/datadog/tracing/contrib/rails/integration.rb +0 -2
  520. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  521. data/lib/datadog/tracing/contrib/rails/middlewares.rb +0 -2
  522. data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -2
  523. data/lib/datadog/tracing/contrib/rails/railtie.rb +0 -2
  524. data/lib/datadog/tracing/contrib/rails/utils.rb +0 -2
  525. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +0 -2
  526. data/lib/datadog/tracing/contrib/rake/ext.rb +0 -2
  527. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +0 -2
  528. data/lib/datadog/tracing/contrib/rake/integration.rb +0 -2
  529. data/lib/datadog/tracing/contrib/rake/patcher.rb +0 -2
  530. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +0 -2
  531. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +0 -2
  532. data/lib/datadog/tracing/contrib/redis/ext.rb +0 -2
  533. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +0 -2
  534. data/lib/datadog/tracing/contrib/redis/integration.rb +0 -2
  535. data/lib/datadog/tracing/contrib/redis/patcher.rb +0 -2
  536. data/lib/datadog/tracing/contrib/redis/quantize.rb +0 -2
  537. data/lib/datadog/tracing/contrib/redis/tags.rb +0 -2
  538. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +0 -2
  539. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
  540. data/lib/datadog/tracing/contrib/registerable.rb +0 -2
  541. data/lib/datadog/tracing/contrib/registry.rb +0 -2
  542. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +0 -2
  543. data/lib/datadog/tracing/contrib/resque/ext.rb +0 -2
  544. data/lib/datadog/tracing/contrib/resque/integration.rb +0 -2
  545. data/lib/datadog/tracing/contrib/resque/patcher.rb +0 -2
  546. data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -2
  547. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +0 -2
  548. data/lib/datadog/tracing/contrib/rest_client/ext.rb +0 -2
  549. data/lib/datadog/tracing/contrib/rest_client/integration.rb +0 -2
  550. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +0 -3
  551. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +0 -2
  552. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +0 -2
  553. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +0 -2
  554. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +0 -2
  555. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +0 -2
  556. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +0 -2
  557. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +0 -2
  558. data/lib/datadog/tracing/contrib/sequel/database.rb +0 -2
  559. data/lib/datadog/tracing/contrib/sequel/dataset.rb +0 -2
  560. data/lib/datadog/tracing/contrib/sequel/ext.rb +0 -2
  561. data/lib/datadog/tracing/contrib/sequel/integration.rb +0 -2
  562. data/lib/datadog/tracing/contrib/sequel/patcher.rb +0 -2
  563. data/lib/datadog/tracing/contrib/sequel/utils.rb +0 -2
  564. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +0 -2
  565. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +1 -2
  566. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +0 -2
  567. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +0 -2
  568. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  569. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +2 -2
  570. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +0 -2
  571. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +0 -2
  572. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +0 -2
  573. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +0 -2
  574. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +4 -2
  575. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -2
  576. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +2 -2
  577. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +4 -2
  578. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +2 -2
  579. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +0 -2
  580. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +0 -2
  581. data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -2
  582. data/lib/datadog/tracing/contrib/sinatra/ext.rb +0 -2
  583. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  584. data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -2
  585. data/lib/datadog/tracing/contrib/sinatra/integration.rb +0 -2
  586. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +0 -3
  587. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +0 -2
  588. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +0 -2
  589. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +0 -2
  590. data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -2
  591. data/lib/datadog/tracing/contrib/sneakers/integration.rb +0 -2
  592. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +0 -2
  593. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -2
  594. data/lib/datadog/tracing/contrib/status_code_matcher.rb +0 -2
  595. data/lib/datadog/tracing/contrib/stripe/patcher.rb +0 -1
  596. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +0 -2
  597. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +0 -2
  598. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +0 -2
  599. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +0 -2
  600. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +0 -2
  601. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +0 -3
  602. data/lib/datadog/tracing/contrib/utils/database.rb +0 -2
  603. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
  604. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +0 -4
  605. data/lib/datadog/tracing/contrib.rb +0 -2
  606. data/lib/datadog/tracing/correlation.rb +15 -3
  607. data/lib/datadog/tracing/diagnostics/ext.rb +0 -2
  608. data/lib/datadog/tracing/diagnostics/health.rb +0 -2
  609. data/lib/datadog/tracing/distributed/b3_multi.rb +12 -6
  610. data/lib/datadog/tracing/distributed/b3_single.rb +8 -6
  611. data/lib/datadog/tracing/distributed/datadog.rb +58 -11
  612. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -1
  613. data/lib/datadog/tracing/distributed/fetcher.rb +0 -9
  614. data/lib/datadog/tracing/distributed/headers/ext.rb +0 -1
  615. data/lib/datadog/tracing/distributed/helpers.rb +21 -36
  616. data/lib/datadog/tracing/distributed/none.rb +0 -1
  617. data/lib/datadog/tracing/distributed/propagation.rb +0 -1
  618. data/lib/datadog/tracing/distributed/trace_context.rb +8 -13
  619. data/lib/datadog/tracing/event.rb +0 -2
  620. data/lib/datadog/tracing/flush.rb +0 -2
  621. data/lib/datadog/tracing/metadata/analytics.rb +0 -2
  622. data/lib/datadog/tracing/metadata/errors.rb +0 -2
  623. data/lib/datadog/tracing/metadata/ext.rb +6 -2
  624. data/lib/datadog/tracing/metadata/tagging.rb +0 -2
  625. data/lib/datadog/tracing/metadata.rb +0 -2
  626. data/lib/datadog/tracing/pipeline/span_filter.rb +0 -2
  627. data/lib/datadog/tracing/pipeline/span_processor.rb +0 -2
  628. data/lib/datadog/tracing/pipeline.rb +0 -2
  629. data/lib/datadog/tracing/propagation/http.rb +0 -2
  630. data/lib/datadog/tracing/runtime/metrics.rb +0 -2
  631. data/lib/datadog/tracing/sampling/all_sampler.rb +0 -2
  632. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  633. data/lib/datadog/tracing/sampling/matcher.rb +0 -2
  634. data/lib/datadog/tracing/sampling/priority_sampler.rb +0 -2
  635. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +0 -2
  636. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +0 -2
  637. data/lib/datadog/tracing/sampling/rate_limiter.rb +0 -2
  638. data/lib/datadog/tracing/sampling/rate_sampler.rb +0 -2
  639. data/lib/datadog/tracing/sampling/rule.rb +0 -2
  640. data/lib/datadog/tracing/sampling/rule_sampler.rb +0 -2
  641. data/lib/datadog/tracing/sampling/sampler.rb +0 -2
  642. data/lib/datadog/tracing/span.rb +0 -2
  643. data/lib/datadog/tracing/span_operation.rb +1 -3
  644. data/lib/datadog/tracing/sync_writer.rb +0 -2
  645. data/lib/datadog/tracing/trace_digest.rb +0 -2
  646. data/lib/datadog/tracing/trace_operation.rb +1 -3
  647. data/lib/datadog/tracing/trace_segment.rb +7 -2
  648. data/lib/datadog/tracing/tracer.rb +0 -2
  649. data/lib/datadog/tracing/utils.rb +33 -2
  650. data/lib/datadog/tracing/workers/trace_writer.rb +0 -2
  651. data/lib/datadog/tracing/workers.rb +0 -2
  652. data/lib/datadog/tracing/writer.rb +0 -2
  653. data/lib/datadog/tracing.rb +0 -2
  654. data/lib/ddtrace/auto_instrument.rb +0 -2
  655. data/lib/ddtrace/auto_instrument_base.rb +0 -2
  656. data/lib/ddtrace/profiling/preload.rb +0 -2
  657. data/lib/ddtrace/transport/ext.rb +0 -2
  658. data/lib/ddtrace/transport/http/adapters/net.rb +0 -2
  659. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -2
  660. data/lib/ddtrace/transport/http/adapters/test.rb +0 -2
  661. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -2
  662. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -2
  663. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -2
  664. data/lib/ddtrace/transport/http/api/instance.rb +0 -2
  665. data/lib/ddtrace/transport/http/api/map.rb +0 -2
  666. data/lib/ddtrace/transport/http/api/spec.rb +0 -2
  667. data/lib/ddtrace/transport/http/api.rb +0 -2
  668. data/lib/ddtrace/transport/http/builder.rb +0 -2
  669. data/lib/ddtrace/transport/http/client.rb +0 -2
  670. data/lib/ddtrace/transport/http/env.rb +0 -2
  671. data/lib/ddtrace/transport/http/response.rb +0 -2
  672. data/lib/ddtrace/transport/http/statistics.rb +0 -2
  673. data/lib/ddtrace/transport/http/traces.rb +0 -2
  674. data/lib/ddtrace/transport/http.rb +0 -4
  675. data/lib/ddtrace/transport/io/client.rb +0 -2
  676. data/lib/ddtrace/transport/io/response.rb +0 -2
  677. data/lib/ddtrace/transport/io/traces.rb +0 -4
  678. data/lib/ddtrace/transport/io.rb +0 -2
  679. data/lib/ddtrace/transport/parcel.rb +0 -4
  680. data/lib/ddtrace/transport/request.rb +0 -2
  681. data/lib/ddtrace/transport/response.rb +0 -2
  682. data/lib/ddtrace/transport/serializable_trace.rb +9 -5
  683. data/lib/ddtrace/transport/statistics.rb +0 -2
  684. data/lib/ddtrace/transport/trace_formatter.rb +7 -2
  685. data/lib/ddtrace/transport/traces.rb +0 -2
  686. data/lib/ddtrace/version.rb +1 -3
  687. data/lib/ddtrace.rb +1 -5
  688. metadata +27 -16
  689. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +0 -9
  690. data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
  691. data/lib/datadog/appsec/contrib/rack/request.rb +0 -78
  692. data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
@@ -1,7 +1,7 @@
1
1
  #include <ruby.h>
2
2
 
3
+ #include "collectors_thread_context.h"
3
4
  #include "clock_id.h"
4
- #include "collectors_cpu_and_wall_time.h"
5
5
  #include "collectors_stack.h"
6
6
  #include "helpers.h"
7
7
  #include "libdatadog_helpers.h"
@@ -9,29 +9,32 @@
9
9
  #include "stack_recorder.h"
10
10
  #include "time_helpers.h"
11
11
 
12
- // Used to periodically sample threads, recording elapsed CPU-time and Wall-time between samples.
12
+ // Used to trigger sampling of threads, based on external "events", such as:
13
+ // * periodic timer for cpu-time and wall-time
14
+ // * VM garbage collection events
15
+ // * VM object allocation events
13
16
  //
14
- // This file implements the native bits of the Datadog::Profiling::Collectors::CpuAndWallTime class
17
+ // This file implements the native bits of the Datadog::Profiling::Collectors::ThreadContext class
15
18
  //
16
- // Triggering of this component (e.g. deciding when to take a sample) is implemented in Collectors::CpuAndWallTimeWorker.
19
+ // Triggering of this component (e.g. watching for the above "events") is implemented by Collectors::CpuAndWallTimeWorker.
17
20
 
18
21
  // ---
19
22
  // ## Tracking of cpu-time and wall-time spent during garbage collection
20
23
  //
21
- // This feature works by having an implicit state that a thread can be in: doing garbage collection. This state is
24
+ // This feature works by having a special state that a thread can be in: doing garbage collection. This state is
22
25
  // tracked inside the thread's `per_thread_context.gc_tracking` data, and three functions, listed below. The functions
23
26
  // will get called by the `Collectors::CpuAndWallTimeWorker` at very specific times in the VM lifetime.
24
27
  //
25
- // * `cpu_and_wall_time_collector_on_gc_start`: Called at the very beginning of the garbage collection process.
28
+ // * `thread_context_collector_on_gc_start`: Called at the very beginning of the garbage collection process.
26
29
  // The internal VM `during_gc` flag is set to `true`, but Ruby has not done any work yet.
27
- // * `cpu_and_wall_time_collector_on_gc_finish`: Called at the very end of the garbage collection process.
30
+ // * `thread_context_collector_on_gc_finish`: Called at the very end of the garbage collection process.
28
31
  // The internal VM `during_gc` flag is still set to `true`, but all the work has been done.
29
- // * `cpu_and_wall_time_collector_sample_after_gc`: Called shortly after the garbage collection process.
32
+ // * `thread_context_collector_sample_after_gc`: Called shortly after the garbage collection process.
30
33
  // The internal VM `during_gc` flag is set to `false`.
31
34
  //
32
35
  // Inside this component, here's what happens inside those three functions:
33
36
  //
34
- // When `cpu_and_wall_time_collector_on_gc_start` gets called, the current cpu and wall-time get recorded to the thread
37
+ // When `thread_context_collector_on_gc_start` gets called, the current cpu and wall-time get recorded to the thread
35
38
  // context: `cpu_time_at_gc_start_ns` and `wall_time_at_gc_start_ns`.
36
39
  //
37
40
  // While these fields are set, regular samples (if any) do not account for any time that passes after these two
@@ -39,10 +42,10 @@
39
42
  //
40
43
  // (Regular samples can still account for the time between the previous sample and the start of GC.)
41
44
  //
42
- // When `cpu_and_wall_time_collector_on_gc_finish` gets called, the current cpu and wall-time again get recorded to the
45
+ // When `thread_context_collector_on_gc_finish` gets called, the current cpu and wall-time again get recorded to the
43
46
  // thread context: `cpu_time_at_gc_finish_ns` and `wall_time_at_gc_finish_ns`.
44
47
  //
45
- // Finally, when `cpu_and_wall_time_collector_sample_after_gc` gets called, the following happens:
48
+ // Finally, when `thread_context_collector_sample_after_gc` gets called, the following happens:
46
49
  //
47
50
  // 1. A sample gets taken, using the special `SAMPLE_IN_GC` sample type, which produces a stack with a placeholder
48
51
  // `Garbage Collection` frame as the latest frame. This sample gets assigned the cpu-time and wall-time period that was
@@ -54,8 +57,8 @@
54
57
  // GC, so that all time is accounted for -- e.g. the next sample will not get "blamed" by time spent in GC.
55
58
  //
56
59
  // In an earlier attempt at implementing this functionality (https://github.com/DataDog/dd-trace-rb/pull/2308), we
57
- // discovered that we needed to factor the sampling work away from `cpu_and_wall_time_collector_on_gc_finish` and into a
58
- // separate `cpu_and_wall_time_collector_sample_after_gc` because (as documented in more detail below),
60
+ // discovered that we needed to factor the sampling work away from `thread_context_collector_on_gc_finish` and into a
61
+ // separate `thread_context_collector_sample_after_gc` because (as documented in more detail below),
59
62
  // `sample_after_gc` could trigger memory allocation in rare occasions (usually exceptions), which is actually not
60
63
  // allowed to happen during Ruby's garbage collection start/finish hooks.
61
64
  // ---
@@ -73,8 +76,8 @@ static ID at_resource_id; // id of :@resource in Ruby
73
76
  static ID at_root_span_id; // id of :@root_span in Ruby
74
77
  static ID at_type_id; // id of :@type in Ruby
75
78
 
76
- // Contains state for a single CpuAndWallTime instance
77
- struct cpu_and_wall_time_collector_state {
79
+ // Contains state for a single ThreadContext instance
80
+ struct thread_context_collector_state {
78
81
  // Note: Places in this file that usually need to be changed when this struct is changed are tagged with
79
82
  // "Update this when modifying state struct"
80
83
 
@@ -92,11 +95,13 @@ struct cpu_and_wall_time_collector_state {
92
95
  // Currently **outside** of stats struct because we also use it to decide when to clean the contexts, and thus this
93
96
  // is not (just) a stat.
94
97
  unsigned int sample_count;
98
+ // Reusable array to get list of threads
99
+ VALUE thread_list_buffer;
95
100
 
96
101
  struct stats {
97
102
  // Track how many garbage collection samples we've taken.
98
103
  unsigned int gc_samples;
99
- // See cpu_and_wall_time_collector_on_gc_start for details
104
+ // See thread_context_collector_on_gc_start for details
100
105
  unsigned int gc_samples_missed_due_to_missing_context;
101
106
  } stats;
102
107
  };
@@ -124,71 +129,80 @@ struct per_thread_context {
124
129
 
125
130
  // Used to correlate profiles with traces
126
131
  struct trace_identifiers {
127
- #define MAXIMUM_LENGTH_64_BIT_IDENTIFIER 21 // Why 21? 2^64 => 20 digits + 1 for \0
128
-
129
132
  bool valid;
130
- ddog_CharSlice local_root_span_id;
133
+ uint64_t local_root_span_id;
131
134
  uint64_t span_id;
132
- char local_root_span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
133
135
  VALUE trace_endpoint;
134
136
  };
135
137
 
136
- static void cpu_and_wall_time_collector_typed_data_mark(void *state_ptr);
137
- static void cpu_and_wall_time_collector_typed_data_free(void *state_ptr);
138
+ static void thread_context_collector_typed_data_mark(void *state_ptr);
139
+ static void thread_context_collector_typed_data_free(void *state_ptr);
138
140
  static int hash_map_per_thread_context_mark(st_data_t key_thread, st_data_t _value, st_data_t _argument);
139
141
  static int hash_map_per_thread_context_free_values(st_data_t _thread, st_data_t value_per_thread_context, st_data_t _argument);
140
142
  static VALUE _native_new(VALUE klass);
141
143
  static VALUE _native_initialize(VALUE self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames, VALUE tracer_context_key);
142
- static VALUE _native_sample(VALUE self, VALUE collector_instance);
144
+ static VALUE _native_sample(VALUE self, VALUE collector_instance, VALUE profiler_overhead_stack_thread);
143
145
  static VALUE _native_on_gc_start(VALUE self, VALUE collector_instance);
144
146
  static VALUE _native_on_gc_finish(VALUE self, VALUE collector_instance);
145
147
  static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
148
+ void update_metrics_and_sample(
149
+ struct thread_context_collector_state *state,
150
+ VALUE thread_being_sampled,
151
+ VALUE profiler_overhead_stack_thread,
152
+ struct per_thread_context *thread_context,
153
+ long current_cpu_time_ns,
154
+ long current_monotonic_wall_time_ns
155
+ );
146
156
  static void trigger_sample_for_thread(
147
- struct cpu_and_wall_time_collector_state *state,
157
+ struct thread_context_collector_state *state,
148
158
  VALUE thread,
159
+ VALUE stack_from_thread,
149
160
  struct per_thread_context *thread_context,
150
- ddog_Slice_I64 metric_values_slice,
161
+ sample_values values,
151
162
  sample_type type
152
163
  );
153
164
  static VALUE _native_thread_list(VALUE self);
154
- static struct per_thread_context *get_or_create_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state);
155
- static struct per_thread_context *get_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state);
165
+ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct thread_context_collector_state *state);
166
+ static struct per_thread_context *get_context_for(VALUE thread, struct thread_context_collector_state *state);
156
167
  static void initialize_context(VALUE thread, struct per_thread_context *thread_context);
157
168
  static VALUE _native_inspect(VALUE self, VALUE collector_instance);
158
- static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_collector_state *state);
169
+ static VALUE per_thread_context_st_table_as_ruby_hash(struct thread_context_collector_state *state);
159
170
  static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash);
160
- static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state);
161
- static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_state *state);
171
+ static VALUE stats_as_ruby_hash(struct thread_context_collector_state *state);
172
+ static void remove_context_for_dead_threads(struct thread_context_collector_state *state);
162
173
  static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument);
163
174
  static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
164
175
  static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns, long gc_start_time_ns, bool is_wall_time);
165
176
  static long cpu_time_now_ns(struct per_thread_context *thread_context);
166
177
  static long thread_id_for(VALUE thread);
167
178
  static VALUE _native_stats(VALUE self, VALUE collector_instance);
168
- static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result);
179
+ static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result);
169
180
  static bool is_type_web(VALUE root_span_type);
170
181
  static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
182
+ static VALUE thread_list(struct thread_context_collector_state *state);
183
+ static VALUE _native_sample_allocation(VALUE self, VALUE collector_instance, VALUE sample_weight);
171
184
 
172
- void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
185
+ void collectors_thread_context_init(VALUE profiling_module) {
173
186
  VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
174
- VALUE collectors_cpu_and_wall_time_class = rb_define_class_under(collectors_module, "CpuAndWallTime", rb_cObject);
187
+ VALUE collectors_thread_context_class = rb_define_class_under(collectors_module, "ThreadContext", rb_cObject);
175
188
  // Hosts methods used for testing the native code using RSpec
176
- VALUE testing_module = rb_define_module_under(collectors_cpu_and_wall_time_class, "Testing");
189
+ VALUE testing_module = rb_define_module_under(collectors_thread_context_class, "Testing");
177
190
 
178
- // Instances of the CpuAndWallTime class are "TypedData" objects.
191
+ // Instances of the ThreadContext class are "TypedData" objects.
179
192
  // "TypedData" objects are special objects in the Ruby VM that can wrap C structs.
180
- // In this case, it wraps the cpu_and_wall_time_collector_state.
193
+ // In this case, it wraps the thread_context_collector_state.
181
194
  //
182
195
  // Because Ruby doesn't know how to initialize native-level structs, we MUST override the allocation function for objects
183
196
  // of this class so that we can manage this part. Not overriding or disabling the allocation function is a common
184
197
  // gotcha for "TypedData" objects that can very easily lead to VM crashes, see for instance
185
198
  // https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
186
- rb_define_alloc_func(collectors_cpu_and_wall_time_class, _native_new);
199
+ rb_define_alloc_func(collectors_thread_context_class, _native_new);
187
200
 
188
- rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_initialize", _native_initialize, 4);
189
- rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_inspect", _native_inspect, 1);
190
- rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
191
- rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 1);
201
+ rb_define_singleton_method(collectors_thread_context_class, "_native_initialize", _native_initialize, 4);
202
+ rb_define_singleton_method(collectors_thread_context_class, "_native_inspect", _native_inspect, 1);
203
+ rb_define_singleton_method(collectors_thread_context_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
204
+ rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 2);
205
+ rb_define_singleton_method(testing_module, "_native_sample_allocation", _native_sample_allocation, 2);
192
206
  rb_define_singleton_method(testing_module, "_native_on_gc_start", _native_on_gc_start, 1);
193
207
  rb_define_singleton_method(testing_module, "_native_on_gc_finish", _native_on_gc_finish, 1);
194
208
  rb_define_singleton_method(testing_module, "_native_sample_after_gc", _native_sample_after_gc, 1);
@@ -204,13 +218,13 @@ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
204
218
  at_type_id = rb_intern_const("@type");
205
219
  }
206
220
 
207
- // This structure is used to define a Ruby object that stores a pointer to a struct cpu_and_wall_time_collector_state
221
+ // This structure is used to define a Ruby object that stores a pointer to a struct thread_context_collector_state
208
222
  // See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
209
- static const rb_data_type_t cpu_and_wall_time_collector_typed_data = {
210
- .wrap_struct_name = "Datadog::Profiling::Collectors::CpuAndWallTime",
223
+ static const rb_data_type_t thread_context_collector_typed_data = {
224
+ .wrap_struct_name = "Datadog::Profiling::Collectors::ThreadContext",
211
225
  .function = {
212
- .dmark = cpu_and_wall_time_collector_typed_data_mark,
213
- .dfree = cpu_and_wall_time_collector_typed_data_free,
226
+ .dmark = thread_context_collector_typed_data_mark,
227
+ .dfree = thread_context_collector_typed_data_free,
214
228
  .dsize = NULL, // We don't track profile memory usage (although it'd be cool if we did!)
215
229
  //.dcompact = NULL, // FIXME: Add support for compaction
216
230
  },
@@ -219,16 +233,17 @@ static const rb_data_type_t cpu_and_wall_time_collector_typed_data = {
219
233
 
220
234
  // This function is called by the Ruby GC to give us a chance to mark any Ruby objects that we're holding on to,
221
235
  // so that they don't get garbage collected
222
- static void cpu_and_wall_time_collector_typed_data_mark(void *state_ptr) {
223
- struct cpu_and_wall_time_collector_state *state = (struct cpu_and_wall_time_collector_state *) state_ptr;
236
+ static void thread_context_collector_typed_data_mark(void *state_ptr) {
237
+ struct thread_context_collector_state *state = (struct thread_context_collector_state *) state_ptr;
224
238
 
225
239
  // Update this when modifying state struct
226
240
  rb_gc_mark(state->recorder_instance);
227
241
  st_foreach(state->hash_map_per_thread_context, hash_map_per_thread_context_mark, 0 /* unused */);
242
+ rb_gc_mark(state->thread_list_buffer);
228
243
  }
229
244
 
230
- static void cpu_and_wall_time_collector_typed_data_free(void *state_ptr) {
231
- struct cpu_and_wall_time_collector_state *state = (struct cpu_and_wall_time_collector_state *) state_ptr;
245
+ static void thread_context_collector_typed_data_free(void *state_ptr) {
246
+ struct thread_context_collector_state *state = (struct thread_context_collector_state *) state_ptr;
232
247
 
233
248
  // Update this when modifying state struct
234
249
 
@@ -259,7 +274,7 @@ static int hash_map_per_thread_context_free_values(DDTRACE_UNUSED st_data_t _thr
259
274
  }
260
275
 
261
276
  static VALUE _native_new(VALUE klass) {
262
- struct cpu_and_wall_time_collector_state *state = ruby_xcalloc(1, sizeof(struct cpu_and_wall_time_collector_state));
277
+ struct thread_context_collector_state *state = ruby_xcalloc(1, sizeof(struct thread_context_collector_state));
263
278
 
264
279
  // Update this when modifying state struct
265
280
  state->sampling_buffer = NULL;
@@ -268,13 +283,14 @@ static VALUE _native_new(VALUE klass) {
268
283
  st_init_numtable();
269
284
  state->recorder_instance = Qnil;
270
285
  state->tracer_context_key = MISSING_TRACER_CONTEXT_KEY;
286
+ state->thread_list_buffer = rb_ary_new();
271
287
 
272
- return TypedData_Wrap_Struct(klass, &cpu_and_wall_time_collector_typed_data, state);
288
+ return TypedData_Wrap_Struct(klass, &thread_context_collector_typed_data, state);
273
289
  }
274
290
 
275
291
  static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames, VALUE tracer_context_key) {
276
- struct cpu_and_wall_time_collector_state *state;
277
- TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
292
+ struct thread_context_collector_state *state;
293
+ TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
278
294
 
279
295
  int max_frames_requested = NUM2INT(max_frames);
280
296
  if (max_frames_requested < 0) rb_raise(rb_eArgError, "Invalid max_frames: value must not be negative");
@@ -295,31 +311,33 @@ static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_inst
295
311
  return Qtrue;
296
312
  }
297
313
 
298
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
314
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
299
315
  // It SHOULD NOT be used for other purposes.
300
- static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
301
- cpu_and_wall_time_collector_sample(collector_instance, monotonic_wall_time_now_ns(RAISE_ON_FAILURE));
316
+ static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance, VALUE profiler_overhead_stack_thread) {
317
+ if (!is_thread_alive(profiler_overhead_stack_thread)) rb_raise(rb_eArgError, "Unexpected: profiler_overhead_stack_thread is not alive");
318
+
319
+ thread_context_collector_sample(collector_instance, monotonic_wall_time_now_ns(RAISE_ON_FAILURE), profiler_overhead_stack_thread);
302
320
  return Qtrue;
303
321
  }
304
322
 
305
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
323
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
306
324
  // It SHOULD NOT be used for other purposes.
307
325
  static VALUE _native_on_gc_start(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
308
- cpu_and_wall_time_collector_on_gc_start(collector_instance);
326
+ thread_context_collector_on_gc_start(collector_instance);
309
327
  return Qtrue;
310
328
  }
311
329
 
312
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
330
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
313
331
  // It SHOULD NOT be used for other purposes.
314
332
  static VALUE _native_on_gc_finish(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
315
- cpu_and_wall_time_collector_on_gc_finish(collector_instance);
333
+ thread_context_collector_on_gc_finish(collector_instance);
316
334
  return Qtrue;
317
335
  }
318
336
 
319
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
337
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
320
338
  // It SHOULD NOT be used for other purposes.
321
339
  static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
322
- cpu_and_wall_time_collector_sample_after_gc(collector_instance);
340
+ thread_context_collector_sample_after_gc(collector_instance);
323
341
  return Qtrue;
324
342
  }
325
343
 
@@ -330,44 +348,35 @@ static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_
330
348
  // Assumption 3: This function IS NOT called from a signal handler. This function is not async-signal-safe.
331
349
  // Assumption 4: This function IS NOT called in a reentrant way.
332
350
  // Assumption 5: This function is called from the main Ractor (if Ruby has support for Ractors).
333
- void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns) {
334
- struct cpu_and_wall_time_collector_state *state;
335
- TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
351
+ //
352
+ // The `profiler_overhead_stack_thread` is used to attribute the profiler overhead to a stack borrowed from a different thread
353
+ // (belonging to ddtrace), so that the overhead is visible in the profile rather than blamed on user code.
354
+ void thread_context_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns, VALUE profiler_overhead_stack_thread) {
355
+ struct thread_context_collector_state *state;
356
+ TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
357
+
358
+ VALUE current_thread = rb_thread_current();
359
+ struct per_thread_context *current_thread_context = get_or_create_context_for(current_thread, state);
360
+ long cpu_time_at_sample_start_for_current_thread = cpu_time_now_ns(current_thread_context);
336
361
 
337
- VALUE threads = ddtrace_thread_list();
362
+ VALUE threads = thread_list(state);
338
363
 
339
364
  const long thread_count = RARRAY_LEN(threads);
340
365
  for (long i = 0; i < thread_count; i++) {
341
366
  VALUE thread = RARRAY_AREF(threads, i);
342
367
  struct per_thread_context *thread_context = get_or_create_context_for(thread, state);
343
368
 
344
- long current_cpu_time_ns = cpu_time_now_ns(thread_context);
345
-
346
- long cpu_time_elapsed_ns = update_time_since_previous_sample(
347
- &thread_context->cpu_time_at_previous_sample_ns,
348
- current_cpu_time_ns,
349
- thread_context->gc_tracking.cpu_time_at_start_ns,
350
- IS_NOT_WALL_TIME
351
- );
352
- long wall_time_elapsed_ns = update_time_since_previous_sample(
353
- &thread_context->wall_time_at_previous_sample_ns,
354
- current_monotonic_wall_time_ns,
355
- thread_context->gc_tracking.wall_time_at_start_ns,
356
- IS_WALL_TIME
357
- );
358
-
359
- int64_t metric_values[ENABLED_VALUE_TYPES_COUNT] = {0};
360
-
361
- metric_values[CPU_TIME_VALUE_POS] = cpu_time_elapsed_ns;
362
- metric_values[CPU_SAMPLES_VALUE_POS] = 1;
363
- metric_values[WALL_TIME_VALUE_POS] = wall_time_elapsed_ns;
369
+ // We account for cpu-time for the current thread in a different way -- we use the cpu-time at sampling start, to avoid
370
+ // blaming the time the profiler took on whatever's running on the thread right now
371
+ long current_cpu_time_ns = thread != current_thread ? cpu_time_now_ns(thread_context) : cpu_time_at_sample_start_for_current_thread;
364
372
 
365
- trigger_sample_for_thread(
373
+ update_metrics_and_sample(
366
374
  state,
367
- thread,
375
+ /* thread_being_sampled: */ thread,
376
+ /* stack_from_thread: */ thread,
368
377
  thread_context,
369
- (ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
370
- SAMPLE_REGULAR
378
+ current_cpu_time_ns,
379
+ current_monotonic_wall_time_ns
371
380
  );
372
381
  }
373
382
 
@@ -376,6 +385,46 @@ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monoto
376
385
  // TODO: This seems somewhat overkill and inefficient to do often; right now we just do it every few samples
377
386
  // but there's probably a better way to do this if we actually track when threads finish
378
387
  if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
388
+
389
+ update_metrics_and_sample(
390
+ state,
391
+ /* thread_being_sampled: */ current_thread,
392
+ /* stack_from_thread: */ profiler_overhead_stack_thread,
393
+ current_thread_context,
394
+ cpu_time_now_ns(current_thread_context),
395
+ monotonic_wall_time_now_ns(RAISE_ON_FAILURE)
396
+ );
397
+ }
398
+
399
+ void update_metrics_and_sample(
400
+ struct thread_context_collector_state *state,
401
+ VALUE thread_being_sampled,
402
+ VALUE stack_from_thread, // This can be different when attributing profiler overhead using a different stack
403
+ struct per_thread_context *thread_context,
404
+ long current_cpu_time_ns,
405
+ long current_monotonic_wall_time_ns
406
+ ) {
407
+ long cpu_time_elapsed_ns = update_time_since_previous_sample(
408
+ &thread_context->cpu_time_at_previous_sample_ns,
409
+ current_cpu_time_ns,
410
+ thread_context->gc_tracking.cpu_time_at_start_ns,
411
+ IS_NOT_WALL_TIME
412
+ );
413
+ long wall_time_elapsed_ns = update_time_since_previous_sample(
414
+ &thread_context->wall_time_at_previous_sample_ns,
415
+ current_monotonic_wall_time_ns,
416
+ thread_context->gc_tracking.wall_time_at_start_ns,
417
+ IS_WALL_TIME
418
+ );
419
+
420
+ trigger_sample_for_thread(
421
+ state,
422
+ thread_being_sampled,
423
+ stack_from_thread,
424
+ thread_context,
425
+ (sample_values) {.cpu_time_ns = cpu_time_elapsed_ns, .cpu_samples = 1, .wall_time_ns = wall_time_elapsed_ns},
426
+ SAMPLE_REGULAR
427
+ );
379
428
  }
380
429
 
381
430
  // This function gets called when Ruby is about to start running the Garbage Collector on the current thread.
@@ -388,11 +437,11 @@ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monoto
388
437
  //
389
438
  // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
390
439
  // Assumption 2: This function is called from the main Ractor (if Ruby has support for Ractors).
391
- void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance) {
392
- struct cpu_and_wall_time_collector_state *state;
393
- if (!rb_typeddata_is_kind_of(self_instance, &cpu_and_wall_time_collector_typed_data)) return;
440
+ void thread_context_collector_on_gc_start(VALUE self_instance) {
441
+ struct thread_context_collector_state *state;
442
+ if (!rb_typeddata_is_kind_of(self_instance, &thread_context_collector_typed_data)) return;
394
443
  // This should never fail the the above check passes
395
- TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
444
+ TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
396
445
 
397
446
  struct per_thread_context *thread_context = get_context_for(rb_thread_current(), state);
398
447
 
@@ -433,11 +482,11 @@ void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance) {
433
482
  //
434
483
  // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
435
484
  // Assumption 2: This function is called from the main Ractor (if Ruby has support for Ractors).
436
- void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance) {
437
- struct cpu_and_wall_time_collector_state *state;
438
- if (!rb_typeddata_is_kind_of(self_instance, &cpu_and_wall_time_collector_typed_data)) return;
485
+ void thread_context_collector_on_gc_finish(VALUE self_instance) {
486
+ struct thread_context_collector_state *state;
487
+ if (!rb_typeddata_is_kind_of(self_instance, &thread_context_collector_typed_data)) return;
439
488
  // This should never fail the the above check passes
440
- TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
489
+ TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
441
490
 
442
491
  struct per_thread_context *thread_context = get_context_for(rb_thread_current(), state);
443
492
 
@@ -470,11 +519,11 @@ void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance) {
470
519
  // Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed.
471
520
  // Assumption 3: Unlike `on_gc_start` and `on_gc_finish`, this method is allowed to allocate memory as needed.
472
521
  // Assumption 4: This function is called from the main Ractor (if Ruby has support for Ractors).
473
- VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance) {
474
- struct cpu_and_wall_time_collector_state *state;
475
- TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
522
+ VALUE thread_context_collector_sample_after_gc(VALUE self_instance) {
523
+ struct thread_context_collector_state *state;
524
+ TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
476
525
 
477
- VALUE threads = ddtrace_thread_list();
526
+ VALUE threads = thread_list(state);
478
527
  bool sampled_any_thread = false;
479
528
 
480
529
  const long thread_count = RARRAY_LEN(threads);
@@ -510,17 +559,12 @@ VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance) {
510
559
  rb_raise(rb_eRuntimeError, "BUG: Unexpected zero value for gc_tracking.wall_time_at_start_ns");
511
560
  }
512
561
 
513
- int64_t metric_values[ENABLED_VALUE_TYPES_COUNT] = {0};
514
-
515
- metric_values[CPU_TIME_VALUE_POS] = gc_cpu_time_elapsed_ns;
516
- metric_values[CPU_SAMPLES_VALUE_POS] = 1;
517
- metric_values[WALL_TIME_VALUE_POS] = gc_wall_time_elapsed_ns;
518
-
519
562
  trigger_sample_for_thread(
520
563
  state,
521
- thread,
564
+ /* thread: */ thread,
565
+ /* stack_from_thread: */ thread,
522
566
  thread_context,
523
- (ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
567
+ (sample_values) {.cpu_time_ns = gc_cpu_time_elapsed_ns, .cpu_samples = 1, .wall_time_ns = gc_wall_time_elapsed_ns},
524
568
  SAMPLE_IN_GC
525
569
  );
526
570
 
@@ -546,15 +590,17 @@ VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance) {
546
590
  }
547
591
 
548
592
  static void trigger_sample_for_thread(
549
- struct cpu_and_wall_time_collector_state *state,
593
+ struct thread_context_collector_state *state,
550
594
  VALUE thread,
595
+ VALUE stack_from_thread, // This can be different when attributing profiler overhead using a different stack
551
596
  struct per_thread_context *thread_context,
552
- ddog_Slice_I64 metric_values_slice,
597
+ sample_values values,
553
598
  sample_type type
554
599
  ) {
555
600
  int max_label_count =
556
601
  1 + // thread id
557
602
  1 + // thread name
603
+ 1 + // profiler overhead
558
604
  2; // local root span id and span id
559
605
  ddog_prof_Label labels[max_label_count];
560
606
  int label_pos = 0;
@@ -576,7 +622,7 @@ static void trigger_sample_for_thread(
576
622
  trace_identifiers_for(state, thread, &trace_identifiers_result);
577
623
 
578
624
  if (trace_identifiers_result.valid) {
579
- labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .str = trace_identifiers_result.local_root_span_id};
625
+ labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .num = trace_identifiers_result.local_root_span_id};
580
626
  labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("span id"), .num = trace_identifiers_result.span_id};
581
627
 
582
628
  if (trace_identifiers_result.trace_endpoint != Qnil) {
@@ -597,6 +643,13 @@ static void trigger_sample_for_thread(
597
643
  }
598
644
  }
599
645
 
646
+ if (thread != stack_from_thread) {
647
+ labels[label_pos++] = (ddog_prof_Label) {
648
+ .key = DDOG_CHARSLICE_C("profiler overhead"),
649
+ .num = 1
650
+ };
651
+ }
652
+
600
653
  // The number of times `label_pos++` shows up in this function needs to match `max_label_count`. To avoid "oops I
601
654
  // forgot to update max_label_count" in the future, we've also added this validation.
602
655
  // @ivoanjo: I wonder if C compilers are smart enough to statically prove when this check never triggers happens and
@@ -606,22 +659,24 @@ static void trigger_sample_for_thread(
606
659
  }
607
660
 
608
661
  sample_thread(
609
- thread,
662
+ stack_from_thread,
610
663
  state->sampling_buffer,
611
664
  state->recorder_instance,
612
- metric_values_slice,
665
+ values,
613
666
  (ddog_prof_Slice_Label) {.ptr = labels, .len = label_pos},
614
667
  type
615
668
  );
616
669
  }
617
670
 
618
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
671
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
619
672
  // It SHOULD NOT be used for other purposes.
620
673
  static VALUE _native_thread_list(DDTRACE_UNUSED VALUE _self) {
621
- return ddtrace_thread_list();
674
+ VALUE result = rb_ary_new();
675
+ ddtrace_thread_list(result);
676
+ return result;
622
677
  }
623
678
 
624
- static struct per_thread_context *get_or_create_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state) {
679
+ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct thread_context_collector_state *state) {
625
680
  struct per_thread_context* thread_context = NULL;
626
681
  st_data_t value_context = 0;
627
682
 
@@ -636,7 +691,7 @@ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct
636
691
  return thread_context;
637
692
  }
638
693
 
639
- static struct per_thread_context *get_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state) {
694
+ static struct per_thread_context *get_context_for(VALUE thread, struct thread_context_collector_state *state) {
640
695
  struct per_thread_context* thread_context = NULL;
641
696
  st_data_t value_context = 0;
642
697
 
@@ -665,8 +720,8 @@ static void initialize_context(VALUE thread, struct per_thread_context *thread_c
665
720
  }
666
721
 
667
722
  static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
668
- struct cpu_and_wall_time_collector_state *state;
669
- TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
723
+ struct thread_context_collector_state *state;
724
+ TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
670
725
 
671
726
  VALUE result = rb_str_new2(" (native state)");
672
727
 
@@ -681,7 +736,7 @@ static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instanc
681
736
  return result;
682
737
  }
683
738
 
684
- static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_collector_state *state) {
739
+ static VALUE per_thread_context_st_table_as_ruby_hash(struct thread_context_collector_state *state) {
685
740
  VALUE result = rb_hash_new();
686
741
  st_foreach(state->hash_map_per_thread_context, per_thread_context_as_ruby_hash, result);
687
742
  return result;
@@ -711,7 +766,7 @@ static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value
711
766
  return ST_CONTINUE;
712
767
  }
713
768
 
714
- static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state) {
769
+ static VALUE stats_as_ruby_hash(struct thread_context_collector_state *state) {
715
770
  // Update this when modifying state struct (stats inner struct)
716
771
  VALUE stats_as_hash = rb_hash_new();
717
772
  VALUE arguments[] = {
@@ -722,7 +777,7 @@ static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state)
722
777
  return stats_as_hash;
723
778
  }
724
779
 
725
- static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_state *state) {
780
+ static void remove_context_for_dead_threads(struct thread_context_collector_state *state) {
726
781
  st_foreach(state->hash_map_per_thread_context, remove_if_dead_thread, 0 /* unused */);
727
782
  }
728
783
 
@@ -736,13 +791,13 @@ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context,
736
791
  return ST_DELETE;
737
792
  }
738
793
 
739
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
794
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
740
795
  // It SHOULD NOT be used for other purposes.
741
796
  //
742
797
  // Returns the whole contents of the per_thread_context structs being tracked.
743
798
  static VALUE _native_per_thread_context(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
744
- struct cpu_and_wall_time_collector_state *state;
745
- TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
799
+ struct thread_context_collector_state *state;
800
+ TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
746
801
 
747
802
  return per_thread_context_st_table_as_ruby_hash(state);
748
803
  }
@@ -817,24 +872,24 @@ static long thread_id_for(VALUE thread) {
817
872
  return FIXNUM_P(object_id) ? FIX2LONG(object_id) : -1;
818
873
  }
819
874
 
820
- VALUE enforce_cpu_and_wall_time_collector_instance(VALUE object) {
821
- Check_TypedStruct(object, &cpu_and_wall_time_collector_typed_data);
875
+ VALUE enforce_thread_context_collector_instance(VALUE object) {
876
+ Check_TypedStruct(object, &thread_context_collector_typed_data);
822
877
  return object;
823
878
  }
824
879
 
825
- // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
880
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
826
881
  // It SHOULD NOT be used for other purposes.
827
882
  //
828
883
  // Returns the whole contents of the per_thread_context structs being tracked.
829
884
  static VALUE _native_stats(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
830
- struct cpu_and_wall_time_collector_state *state;
831
- TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
885
+ struct thread_context_collector_state *state;
886
+ TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
832
887
 
833
888
  return stats_as_ruby_hash(state);
834
889
  }
835
890
 
836
891
  // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
837
- static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result) {
892
+ static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result) {
838
893
  if (state->tracer_context_key == MISSING_TRACER_CONTEXT_KEY) return;
839
894
 
840
895
  VALUE current_context = rb_thread_local_aref(thread, state->tracer_context_key);
@@ -851,13 +906,7 @@ static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *stat
851
906
  VALUE numeric_span_id = rb_ivar_get(active_span, at_id_id /* @id */);
852
907
  if (numeric_local_root_span_id == Qnil || numeric_span_id == Qnil) return;
853
908
 
854
- unsigned long long local_root_span_id = NUM2ULL(numeric_local_root_span_id);
855
- snprintf(trace_identifiers_result->local_root_span_id_buffer, MAXIMUM_LENGTH_64_BIT_IDENTIFIER, "%llu", local_root_span_id);
856
-
857
- trace_identifiers_result->local_root_span_id = (ddog_CharSlice) {
858
- .ptr = trace_identifiers_result->local_root_span_id_buffer,
859
- .len = strlen(trace_identifiers_result->local_root_span_id_buffer)
860
- };
909
+ trace_identifiers_result->local_root_span_id = NUM2ULL(numeric_local_root_span_id);
861
910
  trace_identifiers_result->span_id = NUM2ULL(numeric_span_id);
862
911
 
863
912
  trace_identifiers_result->valid = true;
@@ -886,8 +935,8 @@ static bool is_type_web(VALUE root_span_type) {
886
935
  // Assumption: This method gets called BEFORE restarting profiling -- e.g. there are no components attempting to
887
936
  // trigger samples at the same time.
888
937
  static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
889
- struct cpu_and_wall_time_collector_state *state;
890
- TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
938
+ struct thread_context_collector_state *state;
939
+ TypedData_Get_Struct(collector_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
891
940
 
892
941
  st_clear(state->hash_map_per_thread_context);
893
942
 
@@ -897,3 +946,33 @@ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector
897
946
 
898
947
  return Qtrue;
899
948
  }
949
+
950
+ static VALUE thread_list(struct thread_context_collector_state *state) {
951
+ VALUE result = state->thread_list_buffer;
952
+ rb_ary_clear(result);
953
+ ddtrace_thread_list(result);
954
+ return result;
955
+ }
956
+
957
+ void thread_context_collector_sample_allocation(VALUE self_instance, unsigned int sample_weight) {
958
+ struct thread_context_collector_state *state;
959
+ TypedData_Get_Struct(self_instance, struct thread_context_collector_state, &thread_context_collector_typed_data, state);
960
+
961
+ VALUE current_thread = rb_thread_current();
962
+
963
+ trigger_sample_for_thread(
964
+ state,
965
+ /* thread: */ current_thread,
966
+ /* stack_from_thread: */ current_thread,
967
+ get_or_create_context_for(current_thread, state),
968
+ (sample_values) {.alloc_samples = sample_weight},
969
+ SAMPLE_REGULAR
970
+ );
971
+ }
972
+
973
+ // This method exists only to enable testing Datadog::Profiling::Collectors::ThreadContext behavior using RSpec.
974
+ // It SHOULD NOT be used for other purposes.
975
+ static VALUE _native_sample_allocation(DDTRACE_UNUSED VALUE self, VALUE collector_instance, VALUE sample_weight) {
976
+ thread_context_collector_sample_allocation(collector_instance, NUM2UINT(sample_weight));
977
+ return Qtrue;
978
+ }