ddtrace 1.0.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 (767) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +529 -2
  3. data/LICENSE-3rdparty.csv +7 -2
  4. data/README.md +10 -5
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +134 -0
  6. data/ext/ddtrace_profiling_loader/extconf.rb +72 -0
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +79 -9
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +22 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +33 -10
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  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 +379 -0
  17. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +20 -0
  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 +147 -116
  21. data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
  22. data/ext/ddtrace_profiling_native_extension/http_transport.c +347 -0
  23. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +25 -0
  24. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +319 -0
  25. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +706 -9
  26. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +42 -0
  27. data/ext/ddtrace_profiling_native_extension/profiling.c +230 -3
  28. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
  29. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
  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 +591 -0
  33. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +14 -0
  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 +61 -20
  45. data/lib/datadog/appsec/configuration.rb +20 -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 +137 -87
  55. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -6
  56. data/lib/datadog/appsec/contrib/rack/patcher.rb +4 -5
  57. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +31 -38
  58. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +63 -0
  59. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +21 -22
  60. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +43 -0
  61. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +117 -21
  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 +86 -0
  67. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -7
  68. data/lib/datadog/appsec/contrib/rails/patcher.rb +44 -10
  69. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +69 -0
  70. data/lib/datadog/appsec/contrib/rails/request.rb +34 -0
  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 +131 -0
  78. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -6
  79. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +94 -12
  80. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +64 -0
  81. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +0 -2
  82. data/lib/datadog/appsec/event.rb +33 -26
  83. data/lib/datadog/appsec/ext.rb +9 -0
  84. data/lib/datadog/appsec/extensions.rb +51 -26
  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 +143 -21
  92. data/lib/datadog/appsec/rate_limiter.rb +5 -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 -6
  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 +98 -48
  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 +9 -29
  129. data/lib/datadog/core/configuration/base.rb +14 -4
  130. data/lib/datadog/core/configuration/components.rb +31 -266
  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 +92 -255
  139. data/lib/datadog/core/configuration.rb +16 -15
  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 +4 -6
  144. data/lib/datadog/core/environment/class_count.rb +0 -2
  145. data/lib/datadog/core/environment/container.rb +3 -6
  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 +38 -0
  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 +83 -13
  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/logging/ext.rb +11 -0
  160. data/lib/datadog/core/metrics/client.rb +25 -16
  161. data/lib/datadog/core/metrics/ext.rb +0 -4
  162. data/lib/datadog/core/metrics/helpers.rb +0 -2
  163. data/lib/datadog/core/metrics/logging.rb +0 -2
  164. data/lib/datadog/core/metrics/metric.rb +0 -2
  165. data/lib/datadog/core/metrics/options.rb +3 -5
  166. data/lib/datadog/core/pin.rb +0 -2
  167. data/lib/datadog/core/runtime/ext.rb +3 -3
  168. data/lib/datadog/core/runtime/metrics.rb +28 -14
  169. data/lib/datadog/core/telemetry/client.rb +77 -0
  170. data/lib/datadog/core/telemetry/collector.rb +231 -0
  171. data/lib/datadog/core/telemetry/emitter.rb +46 -0
  172. data/lib/datadog/core/telemetry/event.rb +67 -0
  173. data/lib/datadog/core/telemetry/ext.rb +9 -0
  174. data/lib/datadog/core/telemetry/heartbeat.rb +35 -0
  175. data/lib/datadog/core/telemetry/http/adapters/net.rb +111 -0
  176. data/lib/datadog/core/telemetry/http/env.rb +18 -0
  177. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  178. data/lib/datadog/core/telemetry/http/response.rb +64 -0
  179. data/lib/datadog/core/telemetry/http/transport.rb +51 -0
  180. data/lib/datadog/core/telemetry/v1/app_event.rb +50 -0
  181. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  182. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  183. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  184. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  185. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  186. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  187. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  188. data/lib/datadog/core/utils/compression.rb +5 -3
  189. data/lib/datadog/core/utils/forking.rb +0 -2
  190. data/lib/datadog/core/utils/network.rb +140 -0
  191. data/lib/datadog/core/utils/object_set.rb +1 -3
  192. data/lib/datadog/core/utils/only_once.rb +0 -2
  193. data/lib/datadog/core/utils/safe_dup.rb +0 -2
  194. data/lib/datadog/core/utils/sequence.rb +5 -2
  195. data/lib/datadog/core/utils/string_table.rb +1 -3
  196. data/lib/datadog/core/utils/time.rb +3 -7
  197. data/lib/datadog/core/utils.rb +1 -24
  198. data/lib/datadog/core/vendor/ipaddr.rb +78 -0
  199. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -2
  200. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -4
  201. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +0 -2
  202. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +0 -2
  203. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +0 -2
  204. data/lib/datadog/core/vendor/multipart-post/multipart.rb +0 -2
  205. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -5
  206. data/lib/datadog/core/worker.rb +0 -2
  207. data/lib/datadog/core/workers/async.rb +4 -6
  208. data/lib/datadog/core/workers/interval_loop.rb +0 -2
  209. data/lib/datadog/core/workers/polling.rb +2 -4
  210. data/lib/datadog/core/workers/queue.rb +0 -2
  211. data/lib/datadog/core/workers/runtime_metrics.rb +4 -9
  212. data/lib/datadog/core.rb +27 -56
  213. data/lib/datadog/kit/appsec/events.rb +74 -0
  214. data/lib/datadog/kit/enable_core_dumps.rb +50 -0
  215. data/lib/datadog/kit/identity.rb +70 -0
  216. data/lib/datadog/kit.rb +9 -0
  217. data/lib/datadog/opentelemetry/api/context.rb +186 -0
  218. data/lib/datadog/opentelemetry/api/trace/span.rb +14 -0
  219. data/lib/datadog/opentelemetry/sdk/configurator.rb +37 -0
  220. data/lib/datadog/opentelemetry/sdk/id_generator.rb +26 -0
  221. data/lib/datadog/opentelemetry/sdk/propagator.rb +90 -0
  222. data/lib/datadog/opentelemetry/sdk/span_processor.rb +91 -0
  223. data/lib/datadog/opentelemetry.rb +47 -0
  224. data/lib/datadog/opentracer/binary_propagator.rb +0 -2
  225. data/lib/datadog/opentracer/carrier.rb +0 -2
  226. data/lib/datadog/opentracer/distributed_headers.rb +7 -11
  227. data/lib/datadog/opentracer/global_tracer.rb +0 -2
  228. data/lib/datadog/opentracer/propagator.rb +0 -2
  229. data/lib/datadog/opentracer/rack_propagator.rb +10 -11
  230. data/lib/datadog/opentracer/scope.rb +0 -2
  231. data/lib/datadog/opentracer/scope_manager.rb +0 -2
  232. data/lib/datadog/opentracer/span.rb +1 -3
  233. data/lib/datadog/opentracer/span_context.rb +0 -2
  234. data/lib/datadog/opentracer/span_context_factory.rb +0 -2
  235. data/lib/datadog/opentracer/text_map_propagator.rb +13 -14
  236. data/lib/datadog/opentracer/thread_local_scope.rb +0 -2
  237. data/lib/datadog/opentracer/thread_local_scope_manager.rb +24 -3
  238. data/lib/datadog/opentracer/tracer.rb +23 -25
  239. data/lib/datadog/opentracer.rb +16 -18
  240. data/lib/datadog/profiling/backtrace_location.rb +0 -2
  241. data/lib/datadog/profiling/buffer.rb +3 -5
  242. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -2
  243. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +96 -0
  244. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +12 -0
  245. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +66 -0
  246. data/lib/datadog/profiling/collectors/old_stack.rb +301 -0
  247. data/lib/datadog/profiling/collectors/stack.rb +3 -289
  248. data/lib/datadog/profiling/collectors/thread_context.rb +46 -0
  249. data/lib/datadog/profiling/component.rb +161 -0
  250. data/lib/datadog/profiling/encoding/profile.rb +8 -15
  251. data/lib/datadog/profiling/event.rb +0 -2
  252. data/lib/datadog/profiling/events/stack.rb +1 -3
  253. data/lib/datadog/profiling/exporter.rb +69 -11
  254. data/lib/datadog/profiling/ext/forking.rb +41 -44
  255. data/lib/datadog/profiling/ext.rb +4 -18
  256. data/lib/datadog/profiling/flush.rb +25 -58
  257. data/lib/datadog/profiling/http_transport.rb +130 -0
  258. data/lib/datadog/profiling/load_native_extension.rb +20 -0
  259. data/lib/datadog/profiling/native_extension.rb +0 -2
  260. data/lib/datadog/profiling/old_recorder.rb +107 -0
  261. data/lib/datadog/profiling/pprof/builder.rb +4 -6
  262. data/lib/datadog/profiling/pprof/converter.rb +1 -3
  263. data/lib/datadog/profiling/pprof/message_set.rb +1 -3
  264. data/lib/datadog/profiling/pprof/payload.rb +0 -2
  265. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -2
  266. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -6
  267. data/lib/datadog/profiling/pprof/string_table.rb +1 -3
  268. data/lib/datadog/profiling/pprof/template.rb +5 -7
  269. data/lib/datadog/profiling/preload.rb +1 -3
  270. data/lib/datadog/profiling/profiler.rb +7 -2
  271. data/lib/datadog/profiling/scheduler.rb +29 -52
  272. data/lib/datadog/profiling/stack_recorder.rb +74 -0
  273. data/lib/datadog/profiling/tag_builder.rb +51 -0
  274. data/lib/datadog/profiling/tasks/exec.rb +2 -4
  275. data/lib/datadog/profiling/tasks/help.rb +0 -2
  276. data/lib/datadog/profiling/tasks/setup.rb +8 -15
  277. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -4
  278. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -3
  279. data/lib/datadog/profiling.rb +92 -50
  280. data/lib/datadog/tracing/analytics.rb +1 -3
  281. data/lib/datadog/tracing/buffer.rb +14 -12
  282. data/lib/datadog/tracing/client_ip.rb +61 -0
  283. data/lib/datadog/tracing/component.rb +176 -0
  284. data/lib/datadog/tracing/configuration/ext.rb +49 -6
  285. data/lib/datadog/tracing/configuration/settings.rb +451 -0
  286. data/lib/datadog/tracing/context.rb +1 -3
  287. data/lib/datadog/tracing/context_provider.rb +18 -4
  288. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -4
  289. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -7
  290. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -6
  291. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -5
  292. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -6
  293. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -6
  294. data/lib/datadog/tracing/contrib/action_cable/ext.rb +0 -2
  295. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -6
  296. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -6
  297. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -6
  298. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -4
  299. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -5
  300. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -5
  301. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -5
  302. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -4
  303. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +0 -2
  304. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -6
  305. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -5
  306. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -8
  307. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -4
  308. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -4
  309. data/lib/datadog/tracing/contrib/action_pack/ext.rb +0 -2
  310. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -6
  311. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -4
  312. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -3
  313. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -4
  314. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -3
  315. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -7
  316. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -7
  317. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -4
  318. data/lib/datadog/tracing/contrib/action_view/ext.rb +0 -2
  319. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -4
  320. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -4
  321. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -6
  322. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -10
  323. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -3
  324. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -5
  325. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -5
  326. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -6
  327. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -6
  328. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -6
  329. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -6
  330. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -6
  331. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -6
  332. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -8
  333. data/lib/datadog/tracing/contrib/active_job/ext.rb +0 -2
  334. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -6
  335. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -4
  336. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -6
  337. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -4
  338. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -7
  339. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -5
  340. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -4
  341. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -4
  342. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +0 -2
  343. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -5
  344. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -6
  345. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +0 -2
  346. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +4 -6
  347. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -5
  348. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -3
  349. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -6
  350. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -8
  351. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -4
  352. data/lib/datadog/tracing/contrib/active_record/ext.rb +0 -2
  353. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -8
  354. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -4
  355. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -5
  356. data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +1 -3
  357. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -11
  358. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -4
  359. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -3
  360. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -4
  361. data/lib/datadog/tracing/contrib/active_support/ext.rb +0 -2
  362. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -7
  363. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -3
  364. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -3
  365. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +4 -4
  366. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -4
  367. data/lib/datadog/tracing/contrib/analytics.rb +1 -3
  368. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -6
  369. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -5
  370. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -2
  371. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -6
  372. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -5
  373. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +0 -2
  374. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -7
  375. data/lib/datadog/tracing/contrib/aws/services.rb +0 -4
  376. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -4
  377. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +10 -5
  378. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +0 -2
  379. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -3
  380. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -5
  381. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -5
  382. data/lib/datadog/tracing/contrib/configurable.rb +2 -4
  383. data/lib/datadog/tracing/contrib/configuration/resolver.rb +0 -2
  384. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -3
  385. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -6
  386. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -5
  387. data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -2
  388. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +10 -7
  389. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -5
  390. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -6
  391. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -3
  392. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -5
  393. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -2
  394. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -5
  395. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -5
  396. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +11 -6
  397. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  398. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -5
  399. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  400. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +12 -8
  401. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +48 -11
  402. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -5
  403. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -5
  404. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -9
  405. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -2
  406. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -6
  407. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -6
  408. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -7
  409. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -5
  410. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -2
  411. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -6
  412. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -9
  413. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -4
  414. data/lib/datadog/tracing/contrib/ext.rb +30 -0
  415. data/lib/datadog/tracing/contrib/extensions.rb +5 -7
  416. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -5
  417. data/lib/datadog/tracing/contrib/faraday/connection.rb +0 -2
  418. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -2
  419. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -6
  420. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -10
  421. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -8
  422. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +0 -2
  423. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -5
  424. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -9
  425. data/lib/datadog/tracing/contrib/grape/ext.rb +0 -2
  426. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +0 -2
  427. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -5
  428. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -7
  429. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -5
  430. data/lib/datadog/tracing/contrib/graphql/ext.rb +0 -2
  431. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -5
  432. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -6
  433. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +10 -6
  434. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -7
  435. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -19
  436. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -6
  437. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +26 -0
  438. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +42 -0
  439. data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -2
  440. data/lib/datadog/tracing/contrib/grpc/integration.rb +11 -6
  441. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +0 -2
  442. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -9
  443. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +45 -0
  444. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +20 -0
  445. data/lib/datadog/tracing/contrib/hanami/ext.rb +22 -0
  446. data/lib/datadog/tracing/contrib/hanami/integration.rb +42 -0
  447. data/lib/datadog/tracing/contrib/hanami/patcher.rb +31 -0
  448. data/lib/datadog/tracing/contrib/hanami/plugin.rb +21 -0
  449. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +39 -0
  450. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +42 -0
  451. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -4
  452. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -5
  453. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +38 -0
  454. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +37 -0
  455. data/lib/datadog/tracing/contrib/http/ext.rb +2 -2
  456. data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -12
  457. data/lib/datadog/tracing/contrib/http/integration.rb +6 -8
  458. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -5
  459. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +0 -2
  460. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -5
  461. data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -2
  462. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -11
  463. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -6
  464. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -5
  465. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -5
  466. data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -2
  467. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -11
  468. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -6
  469. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -5
  470. data/lib/datadog/tracing/contrib/integration.rb +3 -5
  471. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -4
  472. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -2
  473. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +0 -2
  474. data/lib/datadog/tracing/contrib/kafka/event.rb +4 -5
  475. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -4
  476. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -5
  477. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -5
  478. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -6
  479. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -6
  480. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -6
  481. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -6
  482. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -4
  483. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -4
  484. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -11
  485. data/lib/datadog/tracing/contrib/kafka/ext.rb +1 -2
  486. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -5
  487. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -6
  488. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -4
  489. data/lib/datadog/tracing/contrib/lograge/ext.rb +0 -2
  490. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -4
  491. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -5
  492. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -4
  493. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -5
  494. data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -2
  495. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -5
  496. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -6
  497. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -3
  498. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -5
  499. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -6
  500. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -4
  501. data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -2
  502. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -7
  503. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -5
  504. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -4
  505. data/lib/datadog/tracing/contrib/patchable.rb +0 -2
  506. data/lib/datadog/tracing/contrib/patcher.rb +16 -6
  507. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +48 -0
  508. data/lib/datadog/tracing/contrib/pg/ext.rb +31 -0
  509. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +166 -0
  510. data/lib/datadog/tracing/contrib/pg/integration.rb +41 -0
  511. data/lib/datadog/tracing/contrib/pg/patcher.rb +29 -0
  512. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -5
  513. data/lib/datadog/tracing/contrib/presto/ext.rb +2 -2
  514. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -5
  515. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -5
  516. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -6
  517. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +41 -0
  518. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +31 -0
  519. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +26 -0
  520. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +45 -0
  521. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -4
  522. data/lib/datadog/tracing/contrib/qless/ext.rb +0 -2
  523. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -5
  524. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -6
  525. data/lib/datadog/tracing/contrib/qless/qless_job.rb +5 -5
  526. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -4
  527. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -5
  528. data/lib/datadog/tracing/contrib/que/ext.rb +0 -2
  529. data/lib/datadog/tracing/contrib/que/integration.rb +4 -6
  530. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -4
  531. data/lib/datadog/tracing/contrib/que/tracer.rb +5 -3
  532. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -4
  533. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -7
  534. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -5
  535. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -4
  536. data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -5
  537. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -5
  538. data/lib/datadog/tracing/contrib/racecar/ext.rb +1 -2
  539. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -5
  540. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -6
  541. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -4
  542. data/lib/datadog/tracing/contrib/rack/ext.rb +5 -2
  543. data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
  544. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -6
  545. data/lib/datadog/tracing/contrib/rack/middlewares.rb +170 -78
  546. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -4
  547. data/lib/datadog/tracing/contrib/rack/request_queue.rb +0 -2
  548. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -3
  549. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -3
  550. data/lib/datadog/tracing/contrib/rails/ext.rb +0 -2
  551. data/lib/datadog/tracing/contrib/rails/framework.rb +18 -24
  552. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -6
  553. data/lib/datadog/tracing/contrib/rails/log_injection.rb +3 -20
  554. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -4
  555. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -10
  556. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -5
  557. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -3
  558. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +16 -3
  559. data/lib/datadog/tracing/contrib/rake/ext.rb +0 -2
  560. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +14 -11
  561. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -5
  562. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -7
  563. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -3
  564. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -5
  565. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  566. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -28
  567. data/lib/datadog/tracing/contrib/redis/integration.rb +37 -6
  568. data/lib/datadog/tracing/contrib/redis/patcher.rb +56 -15
  569. data/lib/datadog/tracing/contrib/redis/quantize.rb +11 -10
  570. data/lib/datadog/tracing/contrib/redis/tags.rb +12 -12
  571. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +70 -0
  572. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +0 -2
  573. data/lib/datadog/tracing/contrib/registerable.rb +0 -2
  574. data/lib/datadog/tracing/contrib/registry.rb +0 -2
  575. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -5
  576. data/lib/datadog/tracing/contrib/resque/ext.rb +0 -2
  577. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -5
  578. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -5
  579. data/lib/datadog/tracing/contrib/resque/resque_job.rb +7 -6
  580. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +9 -5
  581. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -2
  582. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -5
  583. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -6
  584. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +7 -8
  585. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -4
  586. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +0 -2
  587. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +2 -4
  588. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -5
  589. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -4
  590. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -4
  591. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -7
  592. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -7
  593. data/lib/datadog/tracing/contrib/sequel/ext.rb +0 -2
  594. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -5
  595. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -5
  596. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -4
  597. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -5
  598. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +1 -2
  599. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -6
  600. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -3
  601. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +5 -3
  602. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +11 -7
  603. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +4 -5
  604. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -2
  605. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -5
  606. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -9
  607. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +23 -3
  608. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -2
  609. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +7 -8
  610. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +55 -0
  611. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +31 -8
  612. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -4
  613. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -4
  614. data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -27
  615. data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -5
  616. data/lib/datadog/tracing/contrib/sinatra/framework.rb +11 -4
  617. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -3
  618. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -5
  619. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +6 -10
  620. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -90
  621. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -18
  622. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -4
  623. data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -2
  624. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -6
  625. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -5
  626. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +7 -5
  627. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -4
  628. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  629. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  630. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  631. data/lib/datadog/tracing/contrib/stripe/patcher.rb +28 -0
  632. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  633. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -4
  634. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +0 -2
  635. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +0 -2
  636. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -6
  637. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -5
  638. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -9
  639. data/lib/datadog/tracing/contrib/utils/database.rb +0 -2
  640. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +0 -2
  641. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -14
  642. data/lib/datadog/tracing/contrib.rb +50 -49
  643. data/lib/datadog/tracing/correlation.rb +16 -4
  644. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -8
  645. data/lib/datadog/tracing/diagnostics/health.rb +38 -0
  646. data/lib/datadog/tracing/distributed/b3_multi.rb +72 -0
  647. data/lib/datadog/tracing/distributed/b3_single.rb +68 -0
  648. data/lib/datadog/tracing/distributed/datadog.rb +200 -0
  649. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
  650. data/lib/datadog/tracing/distributed/fetcher.rb +21 -0
  651. data/lib/datadog/tracing/distributed/headers/ext.rb +19 -16
  652. data/lib/datadog/tracing/distributed/helpers.rb +34 -13
  653. data/lib/datadog/tracing/distributed/none.rb +18 -0
  654. data/lib/datadog/tracing/distributed/propagation.rb +126 -0
  655. data/lib/datadog/tracing/distributed/trace_context.rb +373 -0
  656. data/lib/datadog/tracing/event.rb +3 -4
  657. data/lib/datadog/tracing/flush.rb +57 -37
  658. data/lib/datadog/tracing/metadata/analytics.rb +2 -4
  659. data/lib/datadog/tracing/metadata/errors.rb +2 -4
  660. data/lib/datadog/tracing/metadata/ext.rb +34 -3
  661. data/lib/datadog/tracing/metadata/tagging.rb +23 -4
  662. data/lib/datadog/tracing/metadata.rb +3 -5
  663. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -8
  664. data/lib/datadog/tracing/pipeline/span_processor.rb +0 -2
  665. data/lib/datadog/tracing/pipeline.rb +3 -5
  666. data/lib/datadog/tracing/propagation/http.rb +3 -100
  667. data/lib/datadog/tracing/runtime/metrics.rb +1 -3
  668. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -3
  669. data/lib/datadog/tracing/sampling/ext.rb +30 -1
  670. data/lib/datadog/tracing/sampling/matcher.rb +0 -2
  671. data/lib/datadog/tracing/sampling/priority_sampler.rb +64 -14
  672. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -13
  673. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -10
  674. data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -3
  675. data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -12
  676. data/lib/datadog/tracing/sampling/rule.rb +15 -11
  677. data/lib/datadog/tracing/sampling/rule_sampler.rb +11 -14
  678. data/lib/datadog/tracing/sampling/sampler.rb +0 -2
  679. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  680. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  681. data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
  682. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  683. data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
  684. data/lib/datadog/tracing/span.rb +24 -22
  685. data/lib/datadog/tracing/span_operation.rb +15 -18
  686. data/lib/datadog/tracing/sync_writer.rb +5 -7
  687. data/lib/datadog/tracing/trace_digest.rb +88 -4
  688. data/lib/datadog/tracing/trace_operation.rb +60 -18
  689. data/lib/datadog/tracing/trace_segment.rb +20 -10
  690. data/lib/datadog/tracing/tracer.rb +49 -23
  691. data/lib/datadog/tracing/utils.rb +81 -0
  692. data/lib/datadog/tracing/workers/trace_writer.rb +9 -11
  693. data/lib/datadog/tracing/workers.rb +3 -5
  694. data/lib/datadog/tracing/writer.rb +12 -7
  695. data/lib/datadog/tracing.rb +8 -10
  696. data/lib/ddtrace/auto_instrument.rb +9 -4
  697. data/lib/ddtrace/auto_instrument_base.rb +0 -2
  698. data/lib/ddtrace/profiling/preload.rb +0 -2
  699. data/lib/ddtrace/transport/ext.rb +7 -3
  700. data/lib/ddtrace/transport/http/adapters/net.rb +3 -4
  701. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -2
  702. data/lib/ddtrace/transport/http/adapters/test.rb +1 -3
  703. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
  704. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -2
  705. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -2
  706. data/lib/ddtrace/transport/http/api/instance.rb +0 -2
  707. data/lib/ddtrace/transport/http/api/map.rb +1 -3
  708. data/lib/ddtrace/transport/http/api/spec.rb +0 -2
  709. data/lib/ddtrace/transport/http/api.rb +4 -6
  710. data/lib/ddtrace/transport/http/builder.rb +5 -7
  711. data/lib/ddtrace/transport/http/client.rb +4 -5
  712. data/lib/ddtrace/transport/http/env.rb +0 -2
  713. data/lib/ddtrace/transport/http/response.rb +35 -7
  714. data/lib/ddtrace/transport/http/statistics.rb +1 -3
  715. data/lib/ddtrace/transport/http/traces.rb +6 -8
  716. data/lib/ddtrace/transport/http.rb +11 -12
  717. data/lib/ddtrace/transport/io/client.rb +5 -5
  718. data/lib/ddtrace/transport/io/response.rb +1 -3
  719. data/lib/ddtrace/transport/io/traces.rb +3 -7
  720. data/lib/ddtrace/transport/io.rb +3 -5
  721. data/lib/ddtrace/transport/parcel.rb +0 -4
  722. data/lib/ddtrace/transport/request.rb +0 -2
  723. data/lib/ddtrace/transport/response.rb +0 -2
  724. data/lib/ddtrace/transport/serializable_trace.rb +9 -5
  725. data/lib/ddtrace/transport/statistics.rb +2 -4
  726. data/lib/ddtrace/transport/trace_formatter.rb +21 -12
  727. data/lib/ddtrace/transport/traces.rb +9 -9
  728. data/lib/ddtrace/version.rb +2 -4
  729. data/lib/ddtrace.rb +6 -9
  730. metadata +176 -47
  731. data/.editorconfig +0 -22
  732. data/.gitignore +0 -70
  733. data/CONTRIBUTING.md +0 -81
  734. data/ddtrace.gemspec +0 -59
  735. data/docs/0.x-trace.png +0 -0
  736. data/docs/1.0-trace.png +0 -0
  737. data/docs/AutoInstrumentation.md +0 -36
  738. data/docs/Deprecation.md +0 -8
  739. data/docs/DevelopmentGuide.md +0 -259
  740. data/docs/GettingStarted.md +0 -2671
  741. data/docs/ProfilingDevelopment.md +0 -110
  742. data/docs/PublicApi.md +0 -14
  743. data/docs/UpgradeGuide.md +0 -736
  744. data/lib/datadog/appsec/assets/waf_rules/risky.json +0 -1499
  745. data/lib/datadog/appsec/contrib/rack/request.rb +0 -52
  746. data/lib/datadog/appsec/contrib/rack/response.rb +0 -24
  747. data/lib/datadog/profiling/recorder.rb +0 -117
  748. data/lib/datadog/profiling/transport/client.rb +0 -16
  749. data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -107
  750. data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
  751. data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
  752. data/lib/datadog/profiling/transport/http/api.rb +0 -45
  753. data/lib/datadog/profiling/transport/http/builder.rb +0 -30
  754. data/lib/datadog/profiling/transport/http/client.rb +0 -35
  755. data/lib/datadog/profiling/transport/http/response.rb +0 -23
  756. data/lib/datadog/profiling/transport/http.rb +0 -112
  757. data/lib/datadog/profiling/transport/io/client.rb +0 -29
  758. data/lib/datadog/profiling/transport/io/response.rb +0 -18
  759. data/lib/datadog/profiling/transport/io.rb +0 -32
  760. data/lib/datadog/profiling/transport/parcel.rb +0 -19
  761. data/lib/datadog/profiling/transport/request.rb +0 -17
  762. data/lib/datadog/profiling/transport/response.rb +0 -10
  763. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  764. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  765. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
  766. data/lib/datadog/tracing/distributed/parser.rb +0 -70
  767. data/lib/datadog/tracing/propagation/grpc.rb +0 -88
@@ -0,0 +1,379 @@
1
+ #include <ruby.h>
2
+ #include <ruby/debug.h>
3
+ #include "extconf.h"
4
+ #include "helpers.h"
5
+ #include "libdatadog_helpers.h"
6
+ #include "ruby_helpers.h"
7
+ #include "private_vm_api_access.h"
8
+ #include "stack_recorder.h"
9
+ #include "collectors_stack.h"
10
+
11
+ // Gathers stack traces from running threads, storing them in a StackRecorder instance
12
+ // This file implements the native bits of the Datadog::Profiling::Collectors::Stack class
13
+
14
+ #define MAX_FRAMES_LIMIT 10000
15
+ #define MAX_FRAMES_LIMIT_AS_STRING "10000"
16
+
17
+ static VALUE missing_string = Qnil;
18
+
19
+ // Used as scratch space during sampling
20
+ struct sampling_buffer {
21
+ unsigned int max_frames;
22
+ VALUE *stack_buffer;
23
+ int *lines_buffer;
24
+ bool *is_ruby_frame;
25
+ ddog_prof_Location *locations;
26
+ ddog_prof_Line *lines;
27
+ }; // Note: typedef'd in the header to sampling_buffer
28
+
29
+ static VALUE _native_sample(
30
+ VALUE self,
31
+ VALUE thread,
32
+ VALUE recorder_instance,
33
+ VALUE metric_values_hash,
34
+ VALUE labels_array,
35
+ VALUE numeric_labels_array,
36
+ VALUE max_frames,
37
+ VALUE in_gc
38
+ );
39
+ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size);
40
+ static void record_placeholder_stack_in_native_code(
41
+ sampling_buffer* buffer,
42
+ VALUE recorder_instance,
43
+ sample_values values,
44
+ ddog_prof_Slice_Label labels,
45
+ sampling_buffer *record_buffer,
46
+ int extra_frames_in_record_buffer
47
+ );
48
+ static void sample_thread_internal(
49
+ VALUE thread,
50
+ sampling_buffer* buffer,
51
+ VALUE recorder_instance,
52
+ sample_values values,
53
+ ddog_prof_Slice_Label labels,
54
+ sampling_buffer *record_buffer,
55
+ int extra_frames_in_record_buffer
56
+ );
57
+
58
+ void collectors_stack_init(VALUE profiling_module) {
59
+ VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
60
+ VALUE collectors_stack_class = rb_define_class_under(collectors_module, "Stack", rb_cObject);
61
+ // Hosts methods used for testing the native code using RSpec
62
+ VALUE testing_module = rb_define_module_under(collectors_stack_class, "Testing");
63
+
64
+ rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 7);
65
+
66
+ missing_string = rb_str_new2("");
67
+ rb_global_variable(&missing_string);
68
+ }
69
+
70
+ // This method exists only to enable testing Datadog::Profiling::Collectors::Stack behavior using RSpec.
71
+ // It SHOULD NOT be used for other purposes.
72
+ static VALUE _native_sample(
73
+ DDTRACE_UNUSED VALUE _self,
74
+ VALUE thread,
75
+ VALUE recorder_instance,
76
+ VALUE metric_values_hash,
77
+ VALUE labels_array,
78
+ VALUE numeric_labels_array,
79
+ VALUE max_frames,
80
+ VALUE in_gc
81
+ ) {
82
+ ENFORCE_TYPE(metric_values_hash, T_HASH);
83
+ ENFORCE_TYPE(labels_array, T_ARRAY);
84
+ ENFORCE_TYPE(numeric_labels_array, T_ARRAY);
85
+
86
+ VALUE zero = INT2NUM(0);
87
+ sample_values values = {
88
+ .cpu_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("cpu-time"), zero)),
89
+ .cpu_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("cpu-samples"), zero)),
90
+ .wall_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("wall-time"), zero)),
91
+ .alloc_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("alloc-samples"), zero)),
92
+ };
93
+
94
+ long labels_count = RARRAY_LEN(labels_array) + RARRAY_LEN(numeric_labels_array);
95
+ ddog_prof_Label labels[labels_count];
96
+
97
+ for (int i = 0; i < RARRAY_LEN(labels_array); i++) {
98
+ VALUE key_str_pair = rb_ary_entry(labels_array, i);
99
+
100
+ labels[i] = (ddog_prof_Label) {
101
+ .key = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 0)),
102
+ .str = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 1))
103
+ };
104
+ }
105
+ for (int i = 0; i < RARRAY_LEN(numeric_labels_array); i++) {
106
+ VALUE key_str_pair = rb_ary_entry(numeric_labels_array, i);
107
+
108
+ labels[i + RARRAY_LEN(labels_array)] = (ddog_prof_Label) {
109
+ .key = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 0)),
110
+ .num = NUM2ULL(rb_ary_entry(key_str_pair, 1))
111
+ };
112
+ }
113
+
114
+ int max_frames_requested = NUM2INT(max_frames);
115
+ if (max_frames_requested < 0) rb_raise(rb_eArgError, "Invalid max_frames: value must not be negative");
116
+
117
+ sampling_buffer *buffer = sampling_buffer_new(max_frames_requested);
118
+
119
+ sample_thread(
120
+ thread,
121
+ buffer,
122
+ recorder_instance,
123
+ values,
124
+ (ddog_prof_Slice_Label) {.ptr = labels, .len = labels_count},
125
+ RTEST(in_gc) ? SAMPLE_IN_GC : SAMPLE_REGULAR
126
+ );
127
+
128
+ sampling_buffer_free(buffer);
129
+
130
+ return Qtrue;
131
+ }
132
+
133
+ void sample_thread(
134
+ VALUE thread,
135
+ sampling_buffer* buffer,
136
+ VALUE recorder_instance,
137
+ sample_values values,
138
+ ddog_prof_Slice_Label labels,
139
+ sample_type type
140
+ ) {
141
+ // Samples thread into recorder
142
+ if (type == SAMPLE_REGULAR) {
143
+ sampling_buffer *record_buffer = buffer;
144
+ int extra_frames_in_record_buffer = 0;
145
+ sample_thread_internal(thread, buffer, recorder_instance, values, labels, record_buffer, extra_frames_in_record_buffer);
146
+ return;
147
+ }
148
+
149
+ // Samples thread into recorder, including as a top frame in the stack a frame named "Garbage Collection"
150
+ if (type == SAMPLE_IN_GC) {
151
+ ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
152
+ ddog_CharSlice function_filename = DDOG_CHARSLICE_C("Garbage Collection");
153
+ buffer->lines[0] = (ddog_prof_Line) {
154
+ .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
155
+ .line = 0
156
+ };
157
+ // To avoid changing sample_thread_internal, we just prepare a new buffer struct that uses the same underlying storage as the
158
+ // original buffer, but has capacity one less, so that we can keep the above Garbage Collection frame untouched.
159
+ sampling_buffer thread_in_gc_buffer = (struct sampling_buffer) {
160
+ .max_frames = buffer->max_frames - 1,
161
+ .stack_buffer = buffer->stack_buffer + 1,
162
+ .lines_buffer = buffer->lines_buffer + 1,
163
+ .is_ruby_frame = buffer->is_ruby_frame + 1,
164
+ .locations = buffer->locations + 1,
165
+ .lines = buffer->lines + 1
166
+ };
167
+ sampling_buffer *record_buffer = buffer; // We pass in the original buffer as the record_buffer, but not as the regular buffer
168
+ int extra_frames_in_record_buffer = 1;
169
+ sample_thread_internal(thread, &thread_in_gc_buffer, recorder_instance, values, labels, record_buffer, extra_frames_in_record_buffer);
170
+ return;
171
+ }
172
+
173
+ rb_raise(rb_eArgError, "Unexpected value for sample_type: %d", type);
174
+ }
175
+
176
+ // Idea: Should we release the global vm lock (GVL) after we get the data from `rb_profile_frames`? That way other Ruby threads
177
+ // could continue making progress while the sample was ingested into the profile.
178
+ //
179
+ // Other things to take into consideration if we go in that direction:
180
+ // * Is it safe to call `rb_profile_frame_...` methods on things from the `stack_buffer` without the GVL acquired?
181
+ // * We need to make `VALUE` references in the `stack_buffer` visible to the Ruby GC
182
+ // * Should we move this into a different thread entirely?
183
+ // * If we don't move it into a different thread, does releasing the GVL on a Ruby thread mean that we're introducing
184
+ // a new thread switch point where there previously was none?
185
+ //
186
+ // ---
187
+ //
188
+ // Why the weird extra record_buffer and extra_frames_in_record_buffer?
189
+ // The answer is: to support both sample_thread() and sample_thread_in_gc().
190
+ //
191
+ // For sample_thread(), buffer == record_buffer and extra_frames_in_record_buffer == 0, so it's a no-op.
192
+ // For sample_thread_in_gc(), the buffer is a special buffer that is the same as the record_buffer, but with every
193
+ // pointer shifted forward extra_frames_in_record_buffer elements, so that the caller can actually inject those extra
194
+ // frames, and this function doesn't have to care about it.
195
+ static void sample_thread_internal(
196
+ VALUE thread,
197
+ sampling_buffer* buffer,
198
+ VALUE recorder_instance,
199
+ sample_values values,
200
+ ddog_prof_Slice_Label labels,
201
+ sampling_buffer *record_buffer,
202
+ int extra_frames_in_record_buffer
203
+ ) {
204
+ int captured_frames = ddtrace_rb_profile_frames(
205
+ thread,
206
+ 0 /* stack starting depth */,
207
+ buffer->max_frames,
208
+ buffer->stack_buffer,
209
+ buffer->lines_buffer,
210
+ buffer->is_ruby_frame
211
+ );
212
+
213
+ if (captured_frames == PLACEHOLDER_STACK_IN_NATIVE_CODE) {
214
+ record_placeholder_stack_in_native_code(
215
+ buffer,
216
+ recorder_instance,
217
+ values,
218
+ labels,
219
+ record_buffer,
220
+ extra_frames_in_record_buffer
221
+ );
222
+ return;
223
+ }
224
+
225
+ // Ruby does not give us path and line number for methods implemented using native code.
226
+ // The convention in Kernel#caller_locations is to instead use the path and line number of the first Ruby frame
227
+ // on the stack that is below (e.g. directly or indirectly has called) the native method.
228
+ // Thus, we keep that frame here to able to replicate that behavior.
229
+ // (This is why we also iterate the sampling buffers backwards below -- so that it's easier to keep the last_ruby_frame)
230
+ VALUE last_ruby_frame = Qnil;
231
+ int last_ruby_line = 0;
232
+
233
+ for (int i = captured_frames - 1; i >= 0; i--) {
234
+ VALUE name, filename;
235
+ int line;
236
+
237
+ if (buffer->is_ruby_frame[i]) {
238
+ last_ruby_frame = buffer->stack_buffer[i];
239
+ last_ruby_line = buffer->lines_buffer[i];
240
+
241
+ name = rb_profile_frame_base_label(buffer->stack_buffer[i]);
242
+ filename = rb_profile_frame_path(buffer->stack_buffer[i]);
243
+ line = buffer->lines_buffer[i];
244
+ } else {
245
+ name = ddtrace_rb_profile_frame_method_name(buffer->stack_buffer[i]);
246
+ filename = NIL_P(last_ruby_frame) ? Qnil : rb_profile_frame_path(last_ruby_frame);
247
+ line = last_ruby_line;
248
+ }
249
+
250
+ name = NIL_P(name) ? missing_string : name;
251
+ filename = NIL_P(filename) ? missing_string : filename;
252
+
253
+ buffer->lines[i] = (ddog_prof_Line) {
254
+ .function = (ddog_prof_Function) {
255
+ .name = char_slice_from_ruby_string(name),
256
+ .filename = char_slice_from_ruby_string(filename)
257
+ },
258
+ .line = line,
259
+ };
260
+ }
261
+
262
+ // Used below; since we want to stack-allocate this, we must do it here rather than in maybe_add_placeholder_frames_omitted
263
+ const int frames_omitted_message_size = sizeof(MAX_FRAMES_LIMIT_AS_STRING " frames omitted");
264
+ char frames_omitted_message[frames_omitted_message_size];
265
+
266
+ // If we filled up the buffer, some frames may have been omitted. In that case, we'll add a placeholder frame
267
+ // with that info.
268
+ if (captured_frames == (long) buffer->max_frames) {
269
+ maybe_add_placeholder_frames_omitted(thread, buffer, frames_omitted_message, frames_omitted_message_size);
270
+ }
271
+
272
+ record_sample(
273
+ recorder_instance,
274
+ (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = captured_frames + extra_frames_in_record_buffer},
275
+ values,
276
+ labels
277
+ );
278
+ }
279
+
280
+ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size) {
281
+ ptrdiff_t frames_omitted = stack_depth_for(thread) - buffer->max_frames;
282
+
283
+ if (frames_omitted == 0) return; // Perfect fit!
284
+
285
+ // The placeholder frame takes over a space, so if 10 frames were left out and we consume one other space for the
286
+ // placeholder, then 11 frames are omitted in total
287
+ frames_omitted++;
288
+
289
+ snprintf(frames_omitted_message, frames_omitted_message_size, "%td frames omitted", frames_omitted);
290
+
291
+ // Important note: `frames_omitted_message` MUST have a lifetime that is at least as long as the call to
292
+ // `record_sample`. So be careful where it gets allocated. (We do have tests for this, at least!)
293
+ ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
294
+ ddog_CharSlice function_filename = {.ptr = frames_omitted_message, .len = strlen(frames_omitted_message)};
295
+ buffer->lines[buffer->max_frames - 1] = (ddog_prof_Line) {
296
+ .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
297
+ .line = 0,
298
+ };
299
+ }
300
+
301
+ // Our custom rb_profile_frames returning PLACEHOLDER_STACK_IN_NATIVE_CODE is equivalent to when the
302
+ // Ruby `Thread#backtrace` API returns an empty array: we know that a thread is alive but we don't know what it's doing:
303
+ //
304
+ // 1. It can be starting up
305
+ // ```
306
+ // > Thread.new { sleep }.backtrace
307
+ // => [] # <-- note the thread hasn't actually started running sleep yet, we got there first
308
+ // ```
309
+ // 2. It can be running native code
310
+ // ```
311
+ // > t = Process.detach(fork { sleep })
312
+ // => #<Process::Waiter:0x00007ffe7285f7a0 run>
313
+ // > t.backtrace
314
+ // => [] # <-- this can happen even minutes later, e.g. it's not a race as in 1.
315
+ // ```
316
+ // This effect has been observed in threads created by the Iodine web server and the ffi gem,
317
+ // see for instance https://github.com/ffi/ffi/pull/883 and https://github.com/DataDog/dd-trace-rb/pull/1719 .
318
+ //
319
+ // To give customers visibility into these threads, rather than reporting an empty stack, we replace the empty stack
320
+ // with one containing a placeholder frame, so that these threads are properly represented in the UX.
321
+ static void record_placeholder_stack_in_native_code(
322
+ sampling_buffer* buffer,
323
+ VALUE recorder_instance,
324
+ sample_values values,
325
+ ddog_prof_Slice_Label labels,
326
+ sampling_buffer *record_buffer,
327
+ int extra_frames_in_record_buffer
328
+ ) {
329
+ ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
330
+ ddog_CharSlice function_filename = DDOG_CHARSLICE_C("In native code");
331
+ buffer->lines[0] = (ddog_prof_Line) {
332
+ .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
333
+ .line = 0
334
+ };
335
+
336
+ record_sample(
337
+ recorder_instance,
338
+ (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = 1 + extra_frames_in_record_buffer},
339
+ values,
340
+ labels
341
+ );
342
+ }
343
+
344
+ sampling_buffer *sampling_buffer_new(unsigned int max_frames) {
345
+ if (max_frames < 5) rb_raise(rb_eArgError, "Invalid max_frames: value must be >= 5");
346
+ if (max_frames > MAX_FRAMES_LIMIT) rb_raise(rb_eArgError, "Invalid max_frames: value must be <= " MAX_FRAMES_LIMIT_AS_STRING);
347
+
348
+ // Note: never returns NULL; if out of memory, it calls the Ruby out-of-memory handlers
349
+ sampling_buffer* buffer = ruby_xcalloc(1, sizeof(sampling_buffer));
350
+
351
+ buffer->max_frames = max_frames;
352
+
353
+ buffer->stack_buffer = ruby_xcalloc(max_frames, sizeof(VALUE));
354
+ buffer->lines_buffer = ruby_xcalloc(max_frames, sizeof(int));
355
+ buffer->is_ruby_frame = ruby_xcalloc(max_frames, sizeof(bool));
356
+ buffer->locations = ruby_xcalloc(max_frames, sizeof(ddog_prof_Location));
357
+ buffer->lines = ruby_xcalloc(max_frames, sizeof(ddog_prof_Line));
358
+
359
+ // Currently we have a 1-to-1 correspondence between lines and locations, so we just initialize the locations once
360
+ // here and then only mutate the contents of the lines.
361
+ for (unsigned int i = 0; i < max_frames; i++) {
362
+ ddog_prof_Slice_Line lines = (ddog_prof_Slice_Line) {.ptr = &buffer->lines[i], .len = 1};
363
+ buffer->locations[i] = (ddog_prof_Location) {.lines = lines};
364
+ }
365
+
366
+ return buffer;
367
+ }
368
+
369
+ void sampling_buffer_free(sampling_buffer *buffer) {
370
+ if (buffer == NULL) rb_raise(rb_eArgError, "sampling_buffer_free called with NULL buffer");
371
+
372
+ ruby_xfree(buffer->stack_buffer);
373
+ ruby_xfree(buffer->lines_buffer);
374
+ ruby_xfree(buffer->is_ruby_frame);
375
+ ruby_xfree(buffer->locations);
376
+ ruby_xfree(buffer->lines);
377
+
378
+ ruby_xfree(buffer);
379
+ }
@@ -0,0 +1,20 @@
1
+ #pragma once
2
+
3
+ #include <datadog/profiling.h>
4
+
5
+ #include "stack_recorder.h"
6
+
7
+ typedef struct sampling_buffer sampling_buffer;
8
+
9
+ typedef enum { SAMPLE_REGULAR, SAMPLE_IN_GC } sample_type;
10
+
11
+ void sample_thread(
12
+ VALUE thread,
13
+ sampling_buffer* buffer,
14
+ VALUE recorder_instance,
15
+ sample_values values,
16
+ ddog_prof_Slice_Label labels,
17
+ sample_type type
18
+ );
19
+ sampling_buffer *sampling_buffer_new(unsigned int max_frames);
20
+ void sampling_buffer_free(sampling_buffer *buffer);