ddtrace 0.53.0 → 1.9.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 (1210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +687 -12
  3. data/LICENSE-3rdparty.csv +6 -1
  4. data/README.md +10 -1
  5. data/bin/ddtracerb +5 -5
  6. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +134 -0
  7. data/ext/ddtrace_profiling_loader/extconf.rb +74 -0
  8. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +156 -0
  9. data/ext/ddtrace_profiling_native_extension/clock_id.h +25 -0
  10. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +75 -0
  11. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +23 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +899 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +9 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +776 -0
  15. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  16. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  17. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  18. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  19. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +390 -0
  20. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +18 -0
  21. data/ext/ddtrace_profiling_native_extension/extconf.rb +234 -14
  22. data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
  23. data/ext/ddtrace_profiling_native_extension/http_transport.c +354 -0
  24. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +18 -0
  25. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +319 -0
  26. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +846 -0
  27. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +45 -0
  28. data/ext/ddtrace_profiling_native_extension/profiling.c +237 -3
  29. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
  30. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
  31. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  32. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  33. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +487 -0
  34. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +39 -0
  35. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  36. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  37. data/lib/datadog/appsec/assets/blocked.html +99 -0
  38. data/lib/datadog/appsec/assets/blocked.json +1 -0
  39. data/lib/datadog/appsec/assets/blocked.text +5 -0
  40. data/lib/datadog/appsec/assets/waf_rules/README.md +7 -0
  41. data/lib/datadog/appsec/assets/waf_rules/recommended.json +6588 -0
  42. data/lib/datadog/appsec/assets/waf_rules/risky.json +1499 -0
  43. data/lib/datadog/appsec/assets/waf_rules/strict.json +1533 -0
  44. data/lib/datadog/appsec/assets.rb +38 -0
  45. data/lib/datadog/appsec/autoload.rb +18 -0
  46. data/lib/datadog/appsec/configuration/settings.rb +211 -0
  47. data/lib/datadog/appsec/configuration.rb +86 -0
  48. data/lib/datadog/appsec/contrib/auto_instrument.rb +27 -0
  49. data/lib/datadog/appsec/contrib/configuration/settings.rb +20 -0
  50. data/lib/datadog/appsec/contrib/integration.rb +37 -0
  51. data/lib/datadog/appsec/contrib/patcher.rb +12 -0
  52. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +22 -0
  53. data/lib/datadog/appsec/contrib/rack/ext.rb +15 -0
  54. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +174 -0
  55. data/lib/datadog/appsec/contrib/rack/integration.rb +49 -0
  56. data/lib/datadog/appsec/contrib/rack/patcher.rb +32 -0
  57. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +83 -0
  58. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +64 -0
  59. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +64 -0
  60. data/lib/datadog/appsec/contrib/rack/request.rb +78 -0
  61. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +41 -0
  62. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +139 -0
  63. data/lib/datadog/appsec/contrib/rack/response.rb +24 -0
  64. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +22 -0
  65. data/lib/datadog/appsec/contrib/rails/ext.rb +15 -0
  66. data/lib/datadog/appsec/contrib/rails/framework.rb +30 -0
  67. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +82 -0
  68. data/lib/datadog/appsec/contrib/rails/integration.rb +48 -0
  69. data/lib/datadog/appsec/contrib/rails/patcher.rb +159 -0
  70. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +68 -0
  71. data/lib/datadog/appsec/contrib/rails/request.rb +36 -0
  72. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +20 -0
  73. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +22 -0
  74. data/lib/datadog/appsec/contrib/sinatra/ext.rb +16 -0
  75. data/lib/datadog/appsec/contrib/sinatra/framework.rb +34 -0
  76. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +126 -0
  77. data/lib/datadog/appsec/contrib/sinatra/integration.rb +48 -0
  78. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +151 -0
  79. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +63 -0
  80. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +20 -0
  81. data/lib/datadog/appsec/event.rb +117 -0
  82. data/lib/datadog/appsec/extensions.rb +138 -0
  83. data/lib/datadog/appsec/instrumentation/gateway.rb +58 -0
  84. data/lib/datadog/appsec/processor.rb +194 -0
  85. data/lib/datadog/appsec/rate_limiter.rb +60 -0
  86. data/lib/datadog/appsec/reactive/address_hash.rb +18 -0
  87. data/lib/datadog/appsec/reactive/engine.rb +44 -0
  88. data/lib/datadog/appsec/reactive/operation.rb +51 -0
  89. data/lib/datadog/appsec/reactive/subscriber.rb +18 -0
  90. data/lib/datadog/appsec/response.rb +63 -0
  91. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  92. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  93. data/lib/datadog/appsec/utils/http.rb +9 -0
  94. data/lib/datadog/appsec/utils.rb +7 -0
  95. data/lib/datadog/appsec.rb +23 -0
  96. data/lib/datadog/ci/configuration/components.rb +9 -8
  97. data/lib/datadog/ci/configuration/settings.rb +20 -4
  98. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +5 -3
  99. data/lib/datadog/ci/contrib/cucumber/ext.rb +2 -0
  100. data/lib/datadog/ci/contrib/cucumber/formatter.rb +9 -13
  101. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +3 -2
  102. data/lib/datadog/ci/contrib/cucumber/integration.rb +6 -5
  103. data/lib/datadog/ci/contrib/cucumber/patcher.rb +4 -3
  104. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +5 -3
  105. data/lib/datadog/ci/contrib/rspec/example.rb +9 -13
  106. data/lib/datadog/ci/contrib/rspec/ext.rb +2 -0
  107. data/lib/datadog/ci/contrib/rspec/integration.rb +6 -5
  108. data/lib/datadog/ci/contrib/rspec/patcher.rb +4 -3
  109. data/lib/datadog/ci/ext/app_types.rb +2 -1
  110. data/lib/datadog/ci/ext/environment.rb +214 -133
  111. data/lib/datadog/ci/ext/settings.rb +2 -1
  112. data/lib/datadog/ci/ext/test.rb +2 -0
  113. data/lib/datadog/ci/extensions.rb +7 -6
  114. data/lib/datadog/ci/flush.rb +38 -0
  115. data/lib/datadog/ci/test.rb +22 -16
  116. data/lib/datadog/ci.rb +7 -4
  117. data/lib/datadog/core/buffer/cruby.rb +55 -0
  118. data/lib/datadog/core/buffer/random.rb +134 -0
  119. data/lib/datadog/core/buffer/thread_safe.rb +58 -0
  120. data/lib/datadog/core/chunker.rb +35 -0
  121. data/lib/datadog/core/configuration/agent_settings_resolver.rb +362 -0
  122. data/lib/datadog/core/configuration/base.rb +101 -0
  123. data/lib/datadog/core/configuration/components.rb +462 -0
  124. data/lib/datadog/core/configuration/dependency_resolver.rb +28 -0
  125. data/lib/datadog/core/configuration/ext.rb +26 -0
  126. data/lib/datadog/core/configuration/option.rb +69 -0
  127. data/lib/datadog/core/configuration/option_definition.rb +135 -0
  128. data/lib/datadog/core/configuration/option_definition_set.rb +22 -0
  129. data/lib/datadog/core/configuration/option_set.rb +10 -0
  130. data/lib/datadog/core/configuration/options.rb +118 -0
  131. data/lib/datadog/core/configuration/settings.rb +446 -0
  132. data/lib/datadog/core/configuration.rb +289 -0
  133. data/lib/datadog/core/diagnostics/environment_logger.rb +288 -0
  134. data/lib/datadog/core/diagnostics/health.rb +19 -0
  135. data/lib/datadog/core/encoding.rb +76 -0
  136. data/lib/datadog/core/environment/cgroup.rb +5 -2
  137. data/lib/datadog/core/environment/class_count.rb +1 -0
  138. data/lib/datadog/core/environment/container.rb +4 -2
  139. data/lib/datadog/core/environment/ext.rb +29 -10
  140. data/lib/datadog/core/environment/gc.rb +1 -0
  141. data/lib/datadog/core/environment/identity.rb +12 -5
  142. data/lib/datadog/core/environment/platform.rb +40 -0
  143. data/lib/datadog/core/environment/socket.rb +9 -2
  144. data/lib/datadog/core/environment/thread_count.rb +1 -0
  145. data/lib/datadog/core/environment/variable_helpers.rb +85 -11
  146. data/lib/datadog/core/environment/vm_cache.rb +1 -0
  147. data/lib/datadog/core/error.rb +101 -0
  148. data/lib/datadog/core/extensions.rb +16 -0
  149. data/lib/datadog/core/git/ext.rb +35 -0
  150. data/lib/datadog/core/header_collection.rb +41 -0
  151. data/lib/datadog/core/logger.rb +46 -0
  152. data/lib/datadog/core/logging/ext.rb +11 -0
  153. data/lib/datadog/core/metrics/client.rb +199 -0
  154. data/lib/datadog/core/metrics/ext.rb +18 -0
  155. data/lib/datadog/core/metrics/helpers.rb +25 -0
  156. data/lib/datadog/core/metrics/logging.rb +44 -0
  157. data/lib/datadog/core/metrics/metric.rb +14 -0
  158. data/lib/datadog/core/metrics/options.rb +50 -0
  159. data/lib/datadog/core/pin.rb +75 -0
  160. data/lib/datadog/core/runtime/ext.rb +28 -0
  161. data/lib/datadog/core/runtime/metrics.rb +126 -0
  162. data/lib/datadog/core/telemetry/client.rb +79 -0
  163. data/lib/datadog/core/telemetry/collector.rb +233 -0
  164. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  165. data/lib/datadog/core/telemetry/event.rb +71 -0
  166. data/lib/datadog/core/telemetry/ext.rb +11 -0
  167. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  168. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  169. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  170. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  171. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  172. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  173. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  174. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  175. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  176. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  177. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  178. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  179. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  180. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  181. data/lib/datadog/core/utils/compression.rb +36 -0
  182. data/lib/datadog/core/utils/forking.rb +63 -0
  183. data/lib/datadog/core/utils/object_set.rb +43 -0
  184. data/lib/datadog/core/utils/only_once.rb +44 -0
  185. data/lib/datadog/core/utils/safe_dup.rb +27 -0
  186. data/lib/datadog/core/utils/sequence.rb +26 -0
  187. data/lib/datadog/core/utils/string_table.rb +49 -0
  188. data/lib/datadog/core/utils/time.rb +54 -0
  189. data/lib/datadog/core/utils.rb +94 -0
  190. data/lib/{ddtrace → datadog/core}/vendor/multipart-post/LICENSE +0 -0
  191. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +120 -0
  192. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +61 -0
  193. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +139 -0
  194. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +13 -0
  195. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +12 -0
  196. data/lib/datadog/core/vendor/multipart-post/multipart.rb +16 -0
  197. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +36 -0
  198. data/lib/datadog/core/worker.rb +24 -0
  199. data/lib/datadog/core/workers/async.rb +180 -0
  200. data/lib/datadog/core/workers/interval_loop.rb +119 -0
  201. data/lib/datadog/core/workers/polling.rb +59 -0
  202. data/lib/datadog/core/workers/queue.rb +44 -0
  203. data/lib/datadog/core/workers/runtime_metrics.rb +62 -0
  204. data/lib/datadog/core.rb +46 -0
  205. data/lib/datadog/kit/appsec/events.rb +75 -0
  206. data/lib/datadog/kit/enable_core_dumps.rb +51 -0
  207. data/lib/datadog/kit/identity.rb +64 -0
  208. data/lib/datadog/kit.rb +11 -0
  209. data/lib/datadog/opentelemetry/api/context.rb +187 -0
  210. data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
  211. data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
  212. data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
  213. data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
  214. data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
  215. data/lib/datadog/opentelemetry.rb +48 -0
  216. data/lib/datadog/opentracer/binary_propagator.rb +26 -0
  217. data/lib/datadog/opentracer/carrier.rb +9 -0
  218. data/lib/datadog/opentracer/distributed_headers.rb +56 -0
  219. data/lib/datadog/opentracer/global_tracer.rb +17 -0
  220. data/lib/datadog/opentracer/propagator.rb +26 -0
  221. data/lib/datadog/opentracer/rack_propagator.rb +73 -0
  222. data/lib/datadog/opentracer/scope.rb +18 -0
  223. data/lib/datadog/opentracer/scope_manager.rb +9 -0
  224. data/lib/datadog/opentracer/span.rb +101 -0
  225. data/lib/datadog/opentracer/span_context.rb +19 -0
  226. data/lib/datadog/opentracer/span_context_factory.rb +27 -0
  227. data/lib/datadog/opentracer/text_map_propagator.rb +88 -0
  228. data/lib/datadog/opentracer/thread_local_scope.rb +34 -0
  229. data/lib/datadog/opentracer/thread_local_scope_manager.rb +66 -0
  230. data/lib/datadog/opentracer/tracer.rb +214 -0
  231. data/lib/datadog/opentracer.rb +24 -0
  232. data/lib/datadog/profiling/backtrace_location.rb +34 -0
  233. data/lib/datadog/profiling/buffer.rb +43 -0
  234. data/lib/datadog/profiling/collectors/code_provenance.rb +115 -0
  235. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +43 -0
  236. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +91 -0
  237. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  238. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  239. data/lib/datadog/profiling/collectors/old_stack.rb +305 -0
  240. data/lib/datadog/profiling/collectors/stack.rb +13 -0
  241. data/lib/datadog/profiling/encoding/profile.rb +43 -0
  242. data/lib/datadog/profiling/event.rb +15 -0
  243. data/lib/datadog/profiling/events/stack.rb +82 -0
  244. data/lib/datadog/profiling/exporter.rb +85 -0
  245. data/lib/datadog/profiling/ext/forking.rb +98 -0
  246. data/lib/datadog/profiling/ext.rb +45 -0
  247. data/lib/datadog/profiling/flush.rb +38 -0
  248. data/lib/datadog/profiling/http_transport.rb +132 -0
  249. data/lib/datadog/profiling/load_native_extension.rb +22 -0
  250. data/lib/datadog/profiling/native_extension.rb +41 -0
  251. data/lib/datadog/profiling/old_recorder.rb +109 -0
  252. data/lib/datadog/profiling/pprof/builder.rb +127 -0
  253. data/lib/datadog/profiling/pprof/converter.rb +104 -0
  254. data/lib/datadog/profiling/pprof/message_set.rb +16 -0
  255. data/lib/datadog/profiling/pprof/payload.rb +20 -0
  256. data/lib/{ddtrace → datadog}/profiling/pprof/pprof.proto +0 -0
  257. data/lib/datadog/profiling/pprof/pprof_pb.rb +83 -0
  258. data/lib/datadog/profiling/pprof/stack_sample.rb +141 -0
  259. data/lib/datadog/profiling/pprof/string_table.rb +12 -0
  260. data/lib/datadog/profiling/pprof/template.rb +120 -0
  261. data/lib/datadog/profiling/preload.rb +5 -0
  262. data/lib/datadog/profiling/profiler.rb +41 -0
  263. data/lib/datadog/profiling/scheduler.rb +130 -0
  264. data/lib/datadog/profiling/stack_recorder.rb +79 -0
  265. data/lib/datadog/profiling/tag_builder.rb +53 -0
  266. data/lib/datadog/profiling/tasks/exec.rb +50 -0
  267. data/lib/datadog/profiling/tasks/help.rb +18 -0
  268. data/lib/datadog/profiling/tasks/setup.rb +86 -0
  269. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +45 -0
  270. data/lib/datadog/profiling/trace_identifiers/helper.rb +47 -0
  271. data/lib/datadog/profiling.rb +173 -0
  272. data/lib/datadog/tracing/analytics.rb +25 -0
  273. data/lib/datadog/tracing/buffer.rb +132 -0
  274. data/lib/datadog/tracing/client_ip.rb +164 -0
  275. data/lib/datadog/tracing/configuration/ext.rb +94 -0
  276. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  277. data/lib/datadog/tracing/context.rb +68 -0
  278. data/lib/datadog/tracing/context_provider.rb +82 -0
  279. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +35 -0
  280. data/lib/datadog/tracing/contrib/action_cable/event.rb +71 -0
  281. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +58 -0
  282. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +63 -0
  283. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +59 -0
  284. data/lib/datadog/tracing/contrib/action_cable/events.rb +37 -0
  285. data/lib/datadog/tracing/contrib/action_cable/ext.rb +32 -0
  286. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +90 -0
  287. data/lib/datadog/tracing/contrib/action_cable/integration.rb +50 -0
  288. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +31 -0
  289. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +36 -0
  290. data/lib/datadog/tracing/contrib/action_mailer/event.rb +52 -0
  291. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +60 -0
  292. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +47 -0
  293. data/lib/datadog/tracing/contrib/action_mailer/events.rb +34 -0
  294. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +33 -0
  295. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +50 -0
  296. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +29 -0
  297. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +160 -0
  298. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +29 -0
  299. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +36 -0
  300. data/lib/datadog/tracing/contrib/action_pack/ext.rb +22 -0
  301. data/lib/datadog/tracing/contrib/action_pack/integration.rb +50 -0
  302. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +27 -0
  303. data/lib/datadog/tracing/contrib/action_pack/utils.rb +40 -0
  304. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +36 -0
  305. data/lib/datadog/tracing/contrib/action_view/event.rb +35 -0
  306. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +54 -0
  307. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +57 -0
  308. data/lib/datadog/tracing/contrib/action_view/events.rb +34 -0
  309. data/lib/datadog/tracing/contrib/action_view/ext.rb +24 -0
  310. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +78 -0
  311. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +91 -0
  312. data/lib/datadog/tracing/contrib/action_view/integration.rb +57 -0
  313. data/lib/datadog/tracing/contrib/action_view/patcher.rb +47 -0
  314. data/lib/datadog/tracing/contrib/action_view/utils.rb +36 -0
  315. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +37 -0
  316. data/lib/datadog/tracing/contrib/active_job/event.rb +58 -0
  317. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +50 -0
  318. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +49 -0
  319. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +49 -0
  320. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +51 -0
  321. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +49 -0
  322. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +50 -0
  323. data/lib/datadog/tracing/contrib/active_job/events.rb +42 -0
  324. data/lib/datadog/tracing/contrib/active_job/ext.rb +39 -0
  325. data/lib/datadog/tracing/contrib/active_job/integration.rb +50 -0
  326. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +24 -0
  327. data/lib/datadog/tracing/contrib/active_job/patcher.rb +36 -0
  328. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +33 -0
  329. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +68 -0
  330. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +45 -0
  331. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +47 -0
  332. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +34 -0
  333. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +24 -0
  334. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +45 -0
  335. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +32 -0
  336. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +36 -0
  337. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +138 -0
  338. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +39 -0
  339. data/lib/datadog/tracing/contrib/active_record/event.rb +30 -0
  340. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +58 -0
  341. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +78 -0
  342. data/lib/datadog/tracing/contrib/active_record/events.rb +34 -0
  343. data/lib/datadog/tracing/contrib/active_record/ext.rb +29 -0
  344. data/lib/datadog/tracing/contrib/active_record/integration.rb +56 -0
  345. data/lib/datadog/tracing/contrib/active_record/patcher.rb +27 -0
  346. data/lib/datadog/tracing/contrib/active_record/utils.rb +128 -0
  347. data/lib/{ddtrace/vendor/active_record → datadog/tracing/contrib/active_record/vendor}/MIT-LICENSE +0 -0
  348. data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +307 -0
  349. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +280 -0
  350. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +73 -0
  351. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +47 -0
  352. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +35 -0
  353. data/lib/datadog/tracing/contrib/active_support/ext.rb +31 -0
  354. data/lib/datadog/tracing/contrib/active_support/integration.rb +51 -0
  355. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +71 -0
  356. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +71 -0
  357. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +164 -0
  358. data/lib/datadog/tracing/contrib/active_support/patcher.rb +27 -0
  359. data/lib/datadog/tracing/contrib/analytics.rb +29 -0
  360. data/lib/datadog/tracing/contrib/auto_instrument.rb +53 -0
  361. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +38 -0
  362. data/lib/datadog/tracing/contrib/aws/ext.rb +28 -0
  363. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +96 -0
  364. data/lib/datadog/tracing/contrib/aws/integration.rb +47 -0
  365. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +60 -0
  366. data/lib/datadog/tracing/contrib/aws/patcher.rb +57 -0
  367. data/lib/datadog/tracing/contrib/aws/services.rb +121 -0
  368. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +23 -0
  369. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +53 -0
  370. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +16 -0
  371. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +27 -0
  372. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +43 -0
  373. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +33 -0
  374. data/lib/datadog/tracing/contrib/configurable.rb +102 -0
  375. data/lib/datadog/tracing/contrib/configuration/resolver.rb +85 -0
  376. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +43 -0
  377. data/lib/datadog/tracing/contrib/configuration/settings.rb +43 -0
  378. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +38 -0
  379. data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -0
  380. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +61 -0
  381. data/lib/datadog/tracing/contrib/dalli/integration.rb +52 -0
  382. data/lib/datadog/tracing/contrib/dalli/patcher.rb +28 -0
  383. data/lib/datadog/tracing/contrib/dalli/quantize.rb +26 -0
  384. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +38 -0
  385. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +28 -0
  386. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +43 -0
  387. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +37 -0
  388. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +104 -0
  389. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  390. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +40 -0
  391. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +29 -0
  392. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +50 -0
  393. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +153 -0
  394. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +89 -0
  395. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +42 -0
  396. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +176 -0
  397. data/lib/datadog/tracing/contrib/ethon/ext.rb +25 -0
  398. data/lib/datadog/tracing/contrib/ethon/integration.rb +48 -0
  399. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +97 -0
  400. data/lib/datadog/tracing/contrib/ethon/patcher.rb +31 -0
  401. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +42 -0
  402. data/lib/datadog/tracing/contrib/excon/ext.rb +22 -0
  403. data/lib/datadog/tracing/contrib/excon/integration.rb +48 -0
  404. data/lib/datadog/tracing/contrib/excon/middleware.rb +171 -0
  405. data/lib/datadog/tracing/contrib/excon/patcher.rb +31 -0
  406. data/lib/datadog/tracing/contrib/ext.rb +25 -0
  407. data/lib/datadog/tracing/contrib/extensions.rb +199 -0
  408. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +46 -0
  409. data/lib/datadog/tracing/contrib/faraday/connection.rb +22 -0
  410. data/lib/datadog/tracing/contrib/faraday/ext.rb +22 -0
  411. data/lib/datadog/tracing/contrib/faraday/integration.rb +48 -0
  412. data/lib/datadog/tracing/contrib/faraday/middleware.rb +93 -0
  413. data/lib/datadog/tracing/contrib/faraday/patcher.rb +56 -0
  414. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +22 -0
  415. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +42 -0
  416. data/lib/datadog/tracing/contrib/grape/endpoint.rb +250 -0
  417. data/lib/datadog/tracing/contrib/grape/ext.rb +28 -0
  418. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +37 -0
  419. data/lib/datadog/tracing/contrib/grape/integration.rb +44 -0
  420. data/lib/datadog/tracing/contrib/grape/patcher.rb +33 -0
  421. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +36 -0
  422. data/lib/datadog/tracing/contrib/graphql/ext.rb +19 -0
  423. data/lib/datadog/tracing/contrib/graphql/integration.rb +44 -0
  424. data/lib/datadog/tracing/contrib/graphql/patcher.rb +90 -0
  425. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +43 -0
  426. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +99 -0
  427. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +90 -0
  428. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +107 -0
  429. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  430. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
  431. data/lib/datadog/tracing/contrib/grpc/ext.rb +27 -0
  432. data/lib/datadog/tracing/contrib/grpc/integration.rb +43 -0
  433. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +53 -0
  434. data/lib/datadog/tracing/contrib/grpc/patcher.rb +35 -0
  435. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
  436. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
  437. data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
  438. data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
  439. data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
  440. data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
  441. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
  442. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
  443. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +43 -0
  444. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +47 -0
  445. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +39 -0
  446. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
  447. data/lib/datadog/tracing/contrib/http/ext.rb +23 -0
  448. data/lib/datadog/tracing/contrib/http/instrumentation.rb +137 -0
  449. data/lib/datadog/tracing/contrib/http/integration.rb +49 -0
  450. data/lib/datadog/tracing/contrib/http/patcher.rb +30 -0
  451. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +17 -0
  452. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +47 -0
  453. data/lib/datadog/tracing/contrib/httpclient/ext.rb +23 -0
  454. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +117 -0
  455. data/lib/datadog/tracing/contrib/httpclient/integration.rb +48 -0
  456. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +42 -0
  457. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +47 -0
  458. data/lib/datadog/tracing/contrib/httprb/ext.rb +23 -0
  459. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +128 -0
  460. data/lib/datadog/tracing/contrib/httprb/integration.rb +48 -0
  461. data/lib/datadog/tracing/contrib/httprb/patcher.rb +42 -0
  462. data/lib/datadog/tracing/contrib/integration.rb +78 -0
  463. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +35 -0
  464. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +19 -0
  465. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +18 -0
  466. data/lib/datadog/tracing/contrib/kafka/event.rb +52 -0
  467. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +42 -0
  468. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +49 -0
  469. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +47 -0
  470. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +47 -0
  471. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +37 -0
  472. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +37 -0
  473. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +37 -0
  474. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +41 -0
  475. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +44 -0
  476. data/lib/datadog/tracing/contrib/kafka/events.rb +48 -0
  477. data/lib/datadog/tracing/contrib/kafka/ext.rb +52 -0
  478. data/lib/datadog/tracing/contrib/kafka/integration.rb +44 -0
  479. data/lib/datadog/tracing/contrib/kafka/patcher.rb +29 -0
  480. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +23 -0
  481. data/lib/datadog/tracing/contrib/lograge/ext.rb +15 -0
  482. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +46 -0
  483. data/lib/datadog/tracing/contrib/lograge/integration.rb +50 -0
  484. data/lib/datadog/tracing/contrib/lograge/patcher.rb +29 -0
  485. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +42 -0
  486. data/lib/datadog/tracing/contrib/mongodb/ext.rb +35 -0
  487. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +47 -0
  488. data/lib/datadog/tracing/contrib/mongodb/integration.rb +48 -0
  489. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +49 -0
  490. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +34 -0
  491. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +127 -0
  492. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +50 -0
  493. data/lib/datadog/tracing/contrib/mysql2/ext.rb +24 -0
  494. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +77 -0
  495. data/lib/datadog/tracing/contrib/mysql2/integration.rb +43 -0
  496. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +31 -0
  497. data/lib/datadog/tracing/contrib/patchable.rb +109 -0
  498. data/lib/datadog/tracing/contrib/patcher.rb +86 -0
  499. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +50 -0
  500. data/lib/datadog/tracing/contrib/pg/ext.rb +33 -0
  501. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +168 -0
  502. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  503. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  504. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +38 -0
  505. data/lib/datadog/tracing/contrib/presto/ext.rb +33 -0
  506. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +124 -0
  507. data/lib/datadog/tracing/contrib/presto/integration.rb +43 -0
  508. data/lib/datadog/tracing/contrib/presto/patcher.rb +37 -0
  509. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
  510. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
  511. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
  512. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +47 -0
  513. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +40 -0
  514. data/lib/datadog/tracing/contrib/qless/ext.rb +26 -0
  515. data/lib/datadog/tracing/contrib/qless/integration.rb +43 -0
  516. data/lib/datadog/tracing/contrib/qless/patcher.rb +37 -0
  517. data/lib/datadog/tracing/contrib/qless/qless_job.rb +74 -0
  518. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +30 -0
  519. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +49 -0
  520. data/lib/datadog/tracing/contrib/que/ext.rb +34 -0
  521. data/lib/datadog/tracing/contrib/que/integration.rb +46 -0
  522. data/lib/datadog/tracing/contrib/que/patcher.rb +28 -0
  523. data/lib/datadog/tracing/contrib/que/tracer.rb +63 -0
  524. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +35 -0
  525. data/lib/datadog/tracing/contrib/racecar/event.rb +78 -0
  526. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +38 -0
  527. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +35 -0
  528. data/lib/datadog/tracing/contrib/racecar/events/message.rb +38 -0
  529. data/lib/datadog/tracing/contrib/racecar/events.rb +36 -0
  530. data/lib/datadog/tracing/contrib/racecar/ext.rb +31 -0
  531. data/lib/datadog/tracing/contrib/racecar/integration.rb +44 -0
  532. data/lib/datadog/tracing/contrib/racecar/patcher.rb +29 -0
  533. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +51 -0
  534. data/lib/datadog/tracing/contrib/rack/ext.rb +25 -0
  535. data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
  536. data/lib/datadog/tracing/contrib/rack/integration.rb +50 -0
  537. data/lib/datadog/tracing/contrib/rack/middlewares.rb +323 -0
  538. data/lib/datadog/tracing/contrib/rack/patcher.rb +119 -0
  539. data/lib/datadog/tracing/contrib/rack/request_queue.rb +48 -0
  540. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +12 -0
  541. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +74 -0
  542. data/lib/datadog/tracing/contrib/rails/ext.rb +19 -0
  543. data/lib/datadog/tracing/contrib/rails/framework.rb +148 -0
  544. data/lib/datadog/tracing/contrib/rails/integration.rb +49 -0
  545. data/lib/datadog/tracing/contrib/rails/log_injection.rb +32 -0
  546. data/lib/datadog/tracing/contrib/rails/middlewares.rb +46 -0
  547. data/lib/datadog/tracing/contrib/rails/patcher.rb +120 -0
  548. data/lib/datadog/tracing/contrib/rails/railtie.rb +19 -0
  549. data/lib/datadog/tracing/contrib/rails/utils.rb +28 -0
  550. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +51 -0
  551. data/lib/datadog/tracing/contrib/rake/ext.rb +26 -0
  552. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +103 -0
  553. data/lib/datadog/tracing/contrib/rake/integration.rb +43 -0
  554. data/lib/datadog/tracing/contrib/rake/patcher.rb +33 -0
  555. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +49 -0
  556. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +43 -0
  557. data/lib/datadog/tracing/contrib/redis/ext.rb +29 -0
  558. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +88 -0
  559. data/lib/datadog/tracing/contrib/redis/integration.rb +80 -0
  560. data/lib/datadog/tracing/contrib/redis/patcher.rb +79 -0
  561. data/lib/datadog/tracing/contrib/redis/quantize.rb +82 -0
  562. data/lib/datadog/tracing/contrib/redis/tags.rb +56 -0
  563. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  564. data/lib/{ddtrace → datadog/tracing}/contrib/redis/vendor/LICENSE +0 -0
  565. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +162 -0
  566. data/lib/datadog/tracing/contrib/registerable.rb +50 -0
  567. data/lib/datadog/tracing/contrib/registry.rb +52 -0
  568. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +37 -0
  569. data/lib/datadog/tracing/contrib/resque/ext.rb +21 -0
  570. data/lib/datadog/tracing/contrib/resque/integration.rb +48 -0
  571. data/lib/datadog/tracing/contrib/resque/patcher.rb +29 -0
  572. data/lib/datadog/tracing/contrib/resque/resque_job.rb +104 -0
  573. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +42 -0
  574. data/lib/datadog/tracing/contrib/rest_client/ext.rb +22 -0
  575. data/lib/datadog/tracing/contrib/rest_client/integration.rb +43 -0
  576. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +29 -0
  577. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +106 -0
  578. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +23 -0
  579. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +15 -0
  580. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +50 -0
  581. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +52 -0
  582. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +29 -0
  583. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +33 -0
  584. data/lib/datadog/tracing/contrib/sequel/database.rb +59 -0
  585. data/lib/datadog/tracing/contrib/sequel/dataset.rb +64 -0
  586. data/lib/datadog/tracing/contrib/sequel/ext.rb +22 -0
  587. data/lib/datadog/tracing/contrib/sequel/integration.rb +43 -0
  588. data/lib/datadog/tracing/contrib/sequel/patcher.rb +37 -0
  589. data/lib/datadog/tracing/contrib/sequel/utils.rb +87 -0
  590. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +38 -0
  591. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +25 -0
  592. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +44 -0
  593. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +28 -0
  594. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +63 -0
  595. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +57 -0
  596. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +44 -0
  597. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +44 -0
  598. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +53 -0
  599. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +78 -0
  600. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +52 -0
  601. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +34 -0
  602. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +32 -0
  603. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  604. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +102 -0
  605. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +44 -0
  606. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +43 -0
  607. data/lib/datadog/tracing/contrib/sinatra/env.rb +55 -0
  608. data/lib/datadog/tracing/contrib/sinatra/ext.rb +36 -0
  609. data/lib/datadog/tracing/contrib/sinatra/framework.rb +116 -0
  610. data/lib/datadog/tracing/contrib/sinatra/headers.rb +35 -0
  611. data/lib/datadog/tracing/contrib/sinatra/integration.rb +43 -0
  612. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +76 -0
  613. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +86 -0
  614. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +127 -0
  615. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +38 -0
  616. data/lib/datadog/tracing/contrib/sneakers/ext.rb +26 -0
  617. data/lib/datadog/tracing/contrib/sneakers/integration.rb +46 -0
  618. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +29 -0
  619. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +59 -0
  620. data/lib/datadog/tracing/contrib/status_code_matcher.rb +75 -0
  621. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  622. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  623. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  624. data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
  625. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  626. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +35 -0
  627. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +28 -0
  628. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +27 -0
  629. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +104 -0
  630. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +43 -0
  631. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +36 -0
  632. data/lib/datadog/tracing/contrib/utils/database.rb +31 -0
  633. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +111 -0
  634. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +181 -0
  635. data/lib/datadog/tracing/contrib.rb +79 -0
  636. data/lib/datadog/tracing/correlation.rb +100 -0
  637. data/lib/datadog/tracing/diagnostics/ext.rb +36 -0
  638. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  639. data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
  640. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  641. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  642. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +85 -0
  643. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  644. data/lib/datadog/tracing/distributed/headers/ext.rb +35 -0
  645. data/lib/datadog/tracing/distributed/helpers.rb +80 -0
  646. data/lib/datadog/tracing/distributed/none.rb +19 -0
  647. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  648. data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
  649. data/lib/datadog/tracing/event.rb +78 -0
  650. data/lib/datadog/tracing/flush.rb +96 -0
  651. data/lib/datadog/tracing/metadata/analytics.rb +26 -0
  652. data/lib/datadog/tracing/metadata/errors.rb +24 -0
  653. data/lib/datadog/tracing/metadata/ext.rb +178 -0
  654. data/lib/datadog/tracing/metadata/tagging.rb +131 -0
  655. data/lib/datadog/tracing/metadata.rb +20 -0
  656. data/lib/datadog/tracing/pipeline/span_filter.rb +46 -0
  657. data/lib/datadog/tracing/pipeline/span_processor.rb +39 -0
  658. data/lib/datadog/tracing/pipeline.rb +65 -0
  659. data/lib/datadog/tracing/propagation/http.rb +14 -0
  660. data/lib/datadog/tracing/runtime/metrics.rb +19 -0
  661. data/lib/datadog/tracing/sampling/all_sampler.rb +25 -0
  662. data/lib/datadog/tracing/sampling/ext.rb +58 -0
  663. data/lib/datadog/tracing/sampling/matcher.rb +68 -0
  664. data/lib/datadog/tracing/sampling/priority_sampler.rb +165 -0
  665. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +96 -0
  666. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +65 -0
  667. data/lib/datadog/tracing/sampling/rate_limiter.rb +188 -0
  668. data/lib/datadog/tracing/sampling/rate_sampler.rb +72 -0
  669. data/lib/datadog/tracing/sampling/rule.rb +76 -0
  670. data/lib/datadog/tracing/sampling/rule_sampler.rb +132 -0
  671. data/lib/datadog/tracing/sampling/sampler.rb +44 -0
  672. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  673. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  674. data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
  675. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  676. data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
  677. data/lib/datadog/tracing/span.rb +216 -0
  678. data/lib/datadog/tracing/span_operation.rb +520 -0
  679. data/lib/datadog/tracing/sync_writer.rb +69 -0
  680. data/lib/datadog/tracing/trace_digest.rb +146 -0
  681. data/lib/datadog/tracing/trace_operation.rb +476 -0
  682. data/lib/datadog/tracing/trace_segment.rb +212 -0
  683. data/lib/datadog/tracing/tracer.rb +533 -0
  684. data/lib/datadog/tracing/utils.rb +50 -0
  685. data/lib/datadog/tracing/workers/trace_writer.rb +195 -0
  686. data/lib/datadog/tracing/workers.rb +125 -0
  687. data/lib/datadog/tracing/writer.rb +187 -0
  688. data/lib/datadog/tracing.rb +142 -0
  689. data/lib/ddtrace/auto_instrument.rb +14 -3
  690. data/lib/ddtrace/auto_instrument_base.rb +1 -0
  691. data/lib/ddtrace/profiling/preload.rb +2 -2
  692. data/lib/ddtrace/transport/ext.rb +41 -0
  693. data/lib/ddtrace/transport/http/adapters/net.rb +5 -3
  694. data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
  695. data/lib/ddtrace/transport/http/adapters/test.rb +2 -1
  696. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -3
  697. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  698. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  699. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  700. data/lib/ddtrace/transport/http/api/map.rb +2 -1
  701. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  702. data/lib/ddtrace/transport/http/api.rb +8 -14
  703. data/lib/ddtrace/transport/http/builder.rb +7 -6
  704. data/lib/ddtrace/transport/http/client.rb +5 -3
  705. data/lib/ddtrace/transport/http/env.rb +1 -0
  706. data/lib/ddtrace/transport/http/response.rb +36 -5
  707. data/lib/ddtrace/transport/http/statistics.rb +2 -1
  708. data/lib/ddtrace/transport/http/traces.rb +6 -3
  709. data/lib/ddtrace/transport/http.rb +39 -31
  710. data/lib/ddtrace/transport/io/client.rb +6 -3
  711. data/lib/ddtrace/transport/io/response.rb +2 -1
  712. data/lib/ddtrace/transport/io/traces.rb +5 -4
  713. data/lib/ddtrace/transport/io.rb +5 -4
  714. data/lib/ddtrace/transport/parcel.rb +2 -0
  715. data/lib/ddtrace/transport/request.rb +1 -0
  716. data/lib/ddtrace/transport/response.rb +1 -0
  717. data/lib/ddtrace/transport/serializable_trace.rb +118 -0
  718. data/lib/ddtrace/transport/statistics.rb +6 -4
  719. data/lib/ddtrace/transport/trace_formatter.rb +191 -0
  720. data/lib/ddtrace/transport/traces.rb +20 -8
  721. data/lib/ddtrace/version.rb +14 -12
  722. data/lib/ddtrace.rb +9 -48
  723. metadata +697 -499
  724. data/.editorconfig +0 -22
  725. data/.gitignore +0 -67
  726. data/.yardopts +0 -5
  727. data/CONTRIBUTING.md +0 -81
  728. data/ddtrace.gemspec +0 -53
  729. data/docs/DevelopmentGuide.md +0 -259
  730. data/docs/GettingStarted.md +0 -2585
  731. data/docs/ProfilingDevelopment.md +0 -107
  732. data/lib/datadog/ci/context_flush.rb +0 -29
  733. data/lib/datadog/contrib.rb +0 -71
  734. data/lib/ddtrace/analytics.rb +0 -39
  735. data/lib/ddtrace/buffer.rb +0 -328
  736. data/lib/ddtrace/chunker.rb +0 -35
  737. data/lib/ddtrace/configuration/agent_settings_resolver.rb +0 -298
  738. data/lib/ddtrace/configuration/base.rb +0 -82
  739. data/lib/ddtrace/configuration/components.rb +0 -292
  740. data/lib/ddtrace/configuration/dependency_resolver.rb +0 -25
  741. data/lib/ddtrace/configuration/option.rb +0 -65
  742. data/lib/ddtrace/configuration/option_definition.rb +0 -122
  743. data/lib/ddtrace/configuration/option_definition_set.rb +0 -19
  744. data/lib/ddtrace/configuration/option_set.rb +0 -7
  745. data/lib/ddtrace/configuration/options.rb +0 -112
  746. data/lib/ddtrace/configuration/pin_setup.rb +0 -32
  747. data/lib/ddtrace/configuration/settings.rb +0 -413
  748. data/lib/ddtrace/configuration.rb +0 -195
  749. data/lib/ddtrace/context.rb +0 -326
  750. data/lib/ddtrace/context_flush.rb +0 -82
  751. data/lib/ddtrace/context_provider.rb +0 -62
  752. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +0 -31
  753. data/lib/ddtrace/contrib/action_cable/event.rb +0 -67
  754. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +0 -50
  755. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +0 -56
  756. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +0 -51
  757. data/lib/ddtrace/contrib/action_cable/events.rb +0 -34
  758. data/lib/ddtrace/contrib/action_cable/ext.rb +0 -27
  759. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +0 -78
  760. data/lib/ddtrace/contrib/action_cable/integration.rb +0 -46
  761. data/lib/ddtrace/contrib/action_cable/patcher.rb +0 -29
  762. data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +0 -32
  763. data/lib/ddtrace/contrib/action_mailer/event.rb +0 -50
  764. data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +0 -54
  765. data/lib/ddtrace/contrib/action_mailer/events/process.rb +0 -41
  766. data/lib/ddtrace/contrib/action_mailer/events.rb +0 -31
  767. data/lib/ddtrace/contrib/action_mailer/ext.rb +0 -32
  768. data/lib/ddtrace/contrib/action_mailer/integration.rb +0 -45
  769. data/lib/ddtrace/contrib/action_mailer/patcher.rb +0 -27
  770. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +0 -157
  771. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +0 -26
  772. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +0 -33
  773. data/lib/ddtrace/contrib/action_pack/ext.rb +0 -20
  774. data/lib/ddtrace/contrib/action_pack/integration.rb +0 -46
  775. data/lib/ddtrace/contrib/action_pack/patcher.rb +0 -24
  776. data/lib/ddtrace/contrib/action_pack/utils.rb +0 -37
  777. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +0 -32
  778. data/lib/ddtrace/contrib/action_view/event.rb +0 -36
  779. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +0 -47
  780. data/lib/ddtrace/contrib/action_view/events/render_template.rb +0 -50
  781. data/lib/ddtrace/contrib/action_view/events.rb +0 -31
  782. data/lib/ddtrace/contrib/action_view/ext.rb +0 -21
  783. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +0 -75
  784. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +0 -168
  785. data/lib/ddtrace/contrib/action_view/integration.rb +0 -53
  786. data/lib/ddtrace/contrib/action_view/patcher.rb +0 -48
  787. data/lib/ddtrace/contrib/action_view/utils.rb +0 -33
  788. data/lib/ddtrace/contrib/active_job/configuration/settings.rb +0 -33
  789. data/lib/ddtrace/contrib/active_job/event.rb +0 -54
  790. data/lib/ddtrace/contrib/active_job/events/discard.rb +0 -46
  791. data/lib/ddtrace/contrib/active_job/events/enqueue.rb +0 -45
  792. data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +0 -45
  793. data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +0 -47
  794. data/lib/ddtrace/contrib/active_job/events/perform.rb +0 -45
  795. data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +0 -46
  796. data/lib/ddtrace/contrib/active_job/events.rb +0 -39
  797. data/lib/ddtrace/contrib/active_job/ext.rb +0 -32
  798. data/lib/ddtrace/contrib/active_job/integration.rb +0 -46
  799. data/lib/ddtrace/contrib/active_job/log_injection.rb +0 -21
  800. data/lib/ddtrace/contrib/active_job/patcher.rb +0 -33
  801. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +0 -31
  802. data/lib/ddtrace/contrib/active_model_serializers/event.rb +0 -69
  803. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +0 -33
  804. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +0 -36
  805. data/lib/ddtrace/contrib/active_model_serializers/events.rb +0 -31
  806. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +0 -21
  807. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +0 -41
  808. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +0 -30
  809. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +0 -31
  810. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +0 -135
  811. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +0 -36
  812. data/lib/ddtrace/contrib/active_record/event.rb +0 -31
  813. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +0 -61
  814. data/lib/ddtrace/contrib/active_record/events/sql.rb +0 -69
  815. data/lib/ddtrace/contrib/active_record/events.rb +0 -31
  816. data/lib/ddtrace/contrib/active_record/ext.rb +0 -25
  817. data/lib/ddtrace/contrib/active_record/integration.rb +0 -54
  818. data/lib/ddtrace/contrib/active_record/patcher.rb +0 -24
  819. data/lib/ddtrace/contrib/active_record/utils.rb +0 -124
  820. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +0 -259
  821. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +0 -70
  822. data/lib/ddtrace/contrib/active_support/cache/redis.rb +0 -44
  823. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +0 -31
  824. data/lib/ddtrace/contrib/active_support/ext.rb +0 -28
  825. data/lib/ddtrace/contrib/active_support/integration.rb +0 -47
  826. data/lib/ddtrace/contrib/active_support/notifications/event.rb +0 -76
  827. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +0 -68
  828. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +0 -164
  829. data/lib/ddtrace/contrib/active_support/patcher.rb +0 -24
  830. data/lib/ddtrace/contrib/analytics.rb +0 -25
  831. data/lib/ddtrace/contrib/auto_instrument.rb +0 -48
  832. data/lib/ddtrace/contrib/aws/configuration/settings.rb +0 -31
  833. data/lib/ddtrace/contrib/aws/ext.rb +0 -24
  834. data/lib/ddtrace/contrib/aws/instrumentation.rb +0 -91
  835. data/lib/ddtrace/contrib/aws/integration.rb +0 -43
  836. data/lib/ddtrace/contrib/aws/parsed_context.rb +0 -57
  837. data/lib/ddtrace/contrib/aws/patcher.rb +0 -54
  838. data/lib/ddtrace/contrib/aws/services.rb +0 -119
  839. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +0 -21
  840. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -42
  841. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +0 -13
  842. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +0 -24
  843. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +0 -39
  844. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +0 -30
  845. data/lib/ddtrace/contrib/configurable.rb +0 -103
  846. data/lib/ddtrace/contrib/configuration/resolver.rb +0 -82
  847. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +0 -40
  848. data/lib/ddtrace/contrib/configuration/settings.rb +0 -56
  849. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +0 -31
  850. data/lib/ddtrace/contrib/dalli/ext.rb +0 -21
  851. data/lib/ddtrace/contrib/dalli/instrumentation.rb +0 -55
  852. data/lib/ddtrace/contrib/dalli/integration.rb +0 -39
  853. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -26
  854. data/lib/ddtrace/contrib/dalli/quantize.rb +0 -23
  855. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +0 -33
  856. data/lib/ddtrace/contrib/delayed_job/ext.rb +0 -24
  857. data/lib/ddtrace/contrib/delayed_job/integration.rb +0 -39
  858. data/lib/ddtrace/contrib/delayed_job/patcher.rb +0 -29
  859. data/lib/ddtrace/contrib/delayed_job/plugin.rb +0 -85
  860. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +0 -32
  861. data/lib/ddtrace/contrib/elasticsearch/ext.rb +0 -23
  862. data/lib/ddtrace/contrib/elasticsearch/integration.rb +0 -40
  863. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +0 -123
  864. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +0 -84
  865. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +0 -33
  866. data/lib/ddtrace/contrib/ethon/easy_patch.rb +0 -152
  867. data/lib/ddtrace/contrib/ethon/ext.rb +0 -20
  868. data/lib/ddtrace/contrib/ethon/integration.rb +0 -44
  869. data/lib/ddtrace/contrib/ethon/multi_patch.rb +0 -85
  870. data/lib/ddtrace/contrib/ethon/patcher.rb +0 -27
  871. data/lib/ddtrace/contrib/excon/configuration/settings.rb +0 -34
  872. data/lib/ddtrace/contrib/excon/ext.rb +0 -18
  873. data/lib/ddtrace/contrib/excon/integration.rb +0 -44
  874. data/lib/ddtrace/contrib/excon/middleware.rb +0 -164
  875. data/lib/ddtrace/contrib/excon/patcher.rb +0 -28
  876. data/lib/ddtrace/contrib/extensions.rb +0 -169
  877. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +0 -39
  878. data/lib/ddtrace/contrib/faraday/connection.rb +0 -19
  879. data/lib/ddtrace/contrib/faraday/ext.rb +0 -18
  880. data/lib/ddtrace/contrib/faraday/integration.rb +0 -44
  881. data/lib/ddtrace/contrib/faraday/middleware.rb +0 -86
  882. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -54
  883. data/lib/ddtrace/contrib/faraday/rack_builder.rb +0 -19
  884. data/lib/ddtrace/contrib/grape/configuration/settings.rb +0 -39
  885. data/lib/ddtrace/contrib/grape/endpoint.rb +0 -246
  886. data/lib/ddtrace/contrib/grape/ext.rb +0 -24
  887. data/lib/ddtrace/contrib/grape/instrumentation.rb +0 -34
  888. data/lib/ddtrace/contrib/grape/integration.rb +0 -40
  889. data/lib/ddtrace/contrib/grape/patcher.rb +0 -32
  890. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +0 -33
  891. data/lib/ddtrace/contrib/graphql/ext.rb +0 -17
  892. data/lib/ddtrace/contrib/graphql/integration.rb +0 -40
  893. data/lib/ddtrace/contrib/graphql/patcher.rb +0 -61
  894. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +0 -32
  895. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +0 -59
  896. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +0 -80
  897. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +0 -79
  898. data/lib/ddtrace/contrib/grpc/ext.rb +0 -19
  899. data/lib/ddtrace/contrib/grpc/integration.rb +0 -39
  900. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +0 -50
  901. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -34
  902. data/lib/ddtrace/contrib/http/circuit_breaker.rb +0 -38
  903. data/lib/ddtrace/contrib/http/configuration/settings.rb +0 -33
  904. data/lib/ddtrace/contrib/http/ext.rb +0 -18
  905. data/lib/ddtrace/contrib/http/instrumentation.rb +0 -180
  906. data/lib/ddtrace/contrib/http/integration.rb +0 -46
  907. data/lib/ddtrace/contrib/http/patcher.rb +0 -27
  908. data/lib/ddtrace/contrib/http_annotation_helper.rb +0 -11
  909. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +0 -33
  910. data/lib/ddtrace/contrib/httpclient/ext.rb +0 -18
  911. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +0 -148
  912. data/lib/ddtrace/contrib/httpclient/integration.rb +0 -44
  913. data/lib/ddtrace/contrib/httpclient/patcher.rb +0 -39
  914. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +0 -33
  915. data/lib/ddtrace/contrib/httprb/ext.rb +0 -18
  916. data/lib/ddtrace/contrib/httprb/instrumentation.rb +0 -158
  917. data/lib/ddtrace/contrib/httprb/integration.rb +0 -44
  918. data/lib/ddtrace/contrib/httprb/patcher.rb +0 -39
  919. data/lib/ddtrace/contrib/integration.rb +0 -17
  920. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +0 -31
  921. data/lib/ddtrace/contrib/kafka/consumer_event.rb +0 -15
  922. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +0 -15
  923. data/lib/ddtrace/contrib/kafka/event.rb +0 -52
  924. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +0 -35
  925. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +0 -42
  926. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +0 -40
  927. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +0 -40
  928. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +0 -30
  929. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +0 -30
  930. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +0 -30
  931. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +0 -33
  932. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +0 -36
  933. data/lib/ddtrace/contrib/kafka/events.rb +0 -45
  934. data/lib/ddtrace/contrib/kafka/ext.rb +0 -42
  935. data/lib/ddtrace/contrib/kafka/integration.rb +0 -40
  936. data/lib/ddtrace/contrib/kafka/patcher.rb +0 -27
  937. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +0 -19
  938. data/lib/ddtrace/contrib/lograge/ext.rb +0 -11
  939. data/lib/ddtrace/contrib/lograge/instrumentation.rb +0 -39
  940. data/lib/ddtrace/contrib/lograge/integration.rb +0 -46
  941. data/lib/ddtrace/contrib/lograge/patcher.rb +0 -26
  942. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +0 -34
  943. data/lib/ddtrace/contrib/mongodb/ext.rb +0 -24
  944. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +0 -70
  945. data/lib/ddtrace/contrib/mongodb/integration.rb +0 -39
  946. data/lib/ddtrace/contrib/mongodb/parsers.rb +0 -69
  947. data/lib/ddtrace/contrib/mongodb/patcher.rb +0 -32
  948. data/lib/ddtrace/contrib/mongodb/subscribers.rb +0 -112
  949. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +0 -31
  950. data/lib/ddtrace/contrib/mysql2/ext.rb +0 -19
  951. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +0 -65
  952. data/lib/ddtrace/contrib/mysql2/integration.rb +0 -39
  953. data/lib/ddtrace/contrib/mysql2/patcher.rb +0 -28
  954. data/lib/ddtrace/contrib/patchable.rb +0 -71
  955. data/lib/ddtrace/contrib/patcher.rb +0 -66
  956. data/lib/ddtrace/contrib/presto/configuration/settings.rb +0 -31
  957. data/lib/ddtrace/contrib/presto/ext.rb +0 -29
  958. data/lib/ddtrace/contrib/presto/instrumentation.rb +0 -111
  959. data/lib/ddtrace/contrib/presto/integration.rb +0 -39
  960. data/lib/ddtrace/contrib/presto/patcher.rb +0 -34
  961. data/lib/ddtrace/contrib/qless/configuration/settings.rb +0 -36
  962. data/lib/ddtrace/contrib/qless/ext.rb +0 -21
  963. data/lib/ddtrace/contrib/qless/integration.rb +0 -39
  964. data/lib/ddtrace/contrib/qless/patcher.rb +0 -35
  965. data/lib/ddtrace/contrib/qless/qless_job.rb +0 -74
  966. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +0 -34
  967. data/lib/ddtrace/contrib/que/configuration/settings.rb +0 -44
  968. data/lib/ddtrace/contrib/que/ext.rb +0 -31
  969. data/lib/ddtrace/contrib/que/integration.rb +0 -43
  970. data/lib/ddtrace/contrib/que/patcher.rb +0 -25
  971. data/lib/ddtrace/contrib/que/tracer.rb +0 -58
  972. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +0 -31
  973. data/lib/ddtrace/contrib/racecar/event.rb +0 -77
  974. data/lib/ddtrace/contrib/racecar/events/batch.rb +0 -28
  975. data/lib/ddtrace/contrib/racecar/events/consume.rb +0 -28
  976. data/lib/ddtrace/contrib/racecar/events/message.rb +0 -28
  977. data/lib/ddtrace/contrib/racecar/events.rb +0 -33
  978. data/lib/ddtrace/contrib/racecar/ext.rb +0 -26
  979. data/lib/ddtrace/contrib/racecar/integration.rb +0 -40
  980. data/lib/ddtrace/contrib/racecar/patcher.rb +0 -27
  981. data/lib/ddtrace/contrib/rack/configuration/settings.rb +0 -47
  982. data/lib/ddtrace/contrib/rack/ext.rb +0 -22
  983. data/lib/ddtrace/contrib/rack/integration.rb +0 -46
  984. data/lib/ddtrace/contrib/rack/middlewares.rb +0 -288
  985. data/lib/ddtrace/contrib/rack/patcher.rb +0 -106
  986. data/lib/ddtrace/contrib/rack/request_queue.rb +0 -45
  987. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +0 -10
  988. data/lib/ddtrace/contrib/rails/configuration/settings.rb +0 -94
  989. data/lib/ddtrace/contrib/rails/ext.rb +0 -18
  990. data/lib/ddtrace/contrib/rails/framework.rb +0 -171
  991. data/lib/ddtrace/contrib/rails/integration.rb +0 -45
  992. data/lib/ddtrace/contrib/rails/log_injection.rb +0 -42
  993. data/lib/ddtrace/contrib/rails/middlewares.rb +0 -44
  994. data/lib/ddtrace/contrib/rails/patcher.rb +0 -119
  995. data/lib/ddtrace/contrib/rails/railtie.rb +0 -18
  996. data/lib/ddtrace/contrib/rails/utils.rb +0 -25
  997. data/lib/ddtrace/contrib/rake/configuration/settings.rb +0 -32
  998. data/lib/ddtrace/contrib/rake/ext.rb +0 -22
  999. data/lib/ddtrace/contrib/rake/instrumentation.rb +0 -91
  1000. data/lib/ddtrace/contrib/rake/integration.rb +0 -39
  1001. data/lib/ddtrace/contrib/rake/patcher.rb +0 -31
  1002. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +0 -46
  1003. data/lib/ddtrace/contrib/redis/configuration/settings.rb +0 -36
  1004. data/lib/ddtrace/contrib/redis/ext.rb +0 -23
  1005. data/lib/ddtrace/contrib/redis/integration.rb +0 -43
  1006. data/lib/ddtrace/contrib/redis/patcher.rb +0 -115
  1007. data/lib/ddtrace/contrib/redis/quantize.rb +0 -76
  1008. data/lib/ddtrace/contrib/redis/tags.rb +0 -47
  1009. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +0 -159
  1010. data/lib/ddtrace/contrib/registerable.rb +0 -33
  1011. data/lib/ddtrace/contrib/registry.rb +0 -43
  1012. data/lib/ddtrace/contrib/resque/configuration/settings.rb +0 -49
  1013. data/lib/ddtrace/contrib/resque/ext.rb +0 -18
  1014. data/lib/ddtrace/contrib/resque/integration.rb +0 -48
  1015. data/lib/ddtrace/contrib/resque/patcher.rb +0 -30
  1016. data/lib/ddtrace/contrib/resque/resque_job.rb +0 -104
  1017. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +0 -32
  1018. data/lib/ddtrace/contrib/rest_client/ext.rb +0 -18
  1019. data/lib/ddtrace/contrib/rest_client/integration.rb +0 -39
  1020. data/lib/ddtrace/contrib/rest_client/patcher.rb +0 -25
  1021. data/lib/ddtrace/contrib/rest_client/request_patch.rb +0 -92
  1022. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +0 -19
  1023. data/lib/ddtrace/contrib/semantic_logger/ext.rb +0 -11
  1024. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +0 -43
  1025. data/lib/ddtrace/contrib/semantic_logger/integration.rb +0 -48
  1026. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +0 -26
  1027. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +0 -29
  1028. data/lib/ddtrace/contrib/sequel/database.rb +0 -64
  1029. data/lib/ddtrace/contrib/sequel/dataset.rb +0 -64
  1030. data/lib/ddtrace/contrib/sequel/ext.rb +0 -20
  1031. data/lib/ddtrace/contrib/sequel/integration.rb +0 -39
  1032. data/lib/ddtrace/contrib/sequel/patcher.rb +0 -34
  1033. data/lib/ddtrace/contrib/sequel/utils.rb +0 -75
  1034. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +0 -32
  1035. data/lib/ddtrace/contrib/shoryuken/ext.rb +0 -22
  1036. data/lib/ddtrace/contrib/shoryuken/integration.rb +0 -40
  1037. data/lib/ddtrace/contrib/shoryuken/patcher.rb +0 -25
  1038. data/lib/ddtrace/contrib/shoryuken/tracer.rb +0 -56
  1039. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +0 -44
  1040. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +0 -38
  1041. data/lib/ddtrace/contrib/sidekiq/ext.rb +0 -31
  1042. data/lib/ddtrace/contrib/sidekiq/integration.rb +0 -49
  1043. data/lib/ddtrace/contrib/sidekiq/patcher.rb +0 -68
  1044. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +0 -30
  1045. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +0 -30
  1046. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +0 -29
  1047. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +0 -66
  1048. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -45
  1049. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +0 -40
  1050. data/lib/ddtrace/contrib/sinatra/env.rb +0 -59
  1051. data/lib/ddtrace/contrib/sinatra/ext.rb +0 -28
  1052. data/lib/ddtrace/contrib/sinatra/headers.rb +0 -30
  1053. data/lib/ddtrace/contrib/sinatra/integration.rb +0 -39
  1054. data/lib/ddtrace/contrib/sinatra/patcher.rb +0 -30
  1055. data/lib/ddtrace/contrib/sinatra/tracer.rb +0 -150
  1056. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +0 -112
  1057. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +0 -34
  1058. data/lib/ddtrace/contrib/sneakers/ext.rb +0 -23
  1059. data/lib/ddtrace/contrib/sneakers/integration.rb +0 -42
  1060. data/lib/ddtrace/contrib/sneakers/patcher.rb +0 -25
  1061. data/lib/ddtrace/contrib/sneakers/tracer.rb +0 -54
  1062. data/lib/ddtrace/contrib/status_code_matcher.rb +0 -70
  1063. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +0 -31
  1064. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +0 -25
  1065. data/lib/ddtrace/contrib/sucker_punch/ext.rb +0 -22
  1066. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +0 -89
  1067. data/lib/ddtrace/contrib/sucker_punch/integration.rb +0 -39
  1068. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +0 -44
  1069. data/lib/ddtrace/correlation.rb +0 -40
  1070. data/lib/ddtrace/diagnostics/environment_logger.rb +0 -280
  1071. data/lib/ddtrace/diagnostics/health.rb +0 -34
  1072. data/lib/ddtrace/distributed_tracing/headers/b3.rb +0 -45
  1073. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +0 -57
  1074. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +0 -43
  1075. data/lib/ddtrace/distributed_tracing/headers/headers.rb +0 -72
  1076. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +0 -44
  1077. data/lib/ddtrace/encoding.rb +0 -72
  1078. data/lib/ddtrace/error.rb +0 -97
  1079. data/lib/ddtrace/event.rb +0 -53
  1080. data/lib/ddtrace/ext/analytics.rb +0 -13
  1081. data/lib/ddtrace/ext/app_types.rb +0 -12
  1082. data/lib/ddtrace/ext/correlation.rb +0 -12
  1083. data/lib/ddtrace/ext/diagnostics.rb +0 -37
  1084. data/lib/ddtrace/ext/distributed.rb +0 -40
  1085. data/lib/ddtrace/ext/environment.rb +0 -24
  1086. data/lib/ddtrace/ext/errors.rb +0 -11
  1087. data/lib/ddtrace/ext/forced_tracing.rb +0 -26
  1088. data/lib/ddtrace/ext/git.rb +0 -32
  1089. data/lib/ddtrace/ext/http.rb +0 -47
  1090. data/lib/ddtrace/ext/integration.rb +0 -9
  1091. data/lib/ddtrace/ext/manual_tracing.rb +0 -10
  1092. data/lib/ddtrace/ext/metrics.rb +0 -16
  1093. data/lib/ddtrace/ext/net.rb +0 -11
  1094. data/lib/ddtrace/ext/priority.rb +0 -17
  1095. data/lib/ddtrace/ext/profiling.rb +0 -57
  1096. data/lib/ddtrace/ext/runtime.rb +0 -25
  1097. data/lib/ddtrace/ext/sampling.rb +0 -17
  1098. data/lib/ddtrace/ext/sql.rb +0 -9
  1099. data/lib/ddtrace/ext/test.rb +0 -9
  1100. data/lib/ddtrace/ext/transport.rb +0 -32
  1101. data/lib/ddtrace/forced_tracing.rb +0 -39
  1102. data/lib/ddtrace/logger.rb +0 -41
  1103. data/lib/ddtrace/metrics.rb +0 -282
  1104. data/lib/ddtrace/opentelemetry/extensions.rb +0 -14
  1105. data/lib/ddtrace/opentelemetry/span.rb +0 -34
  1106. data/lib/ddtrace/opentracer/binary_propagator.rb +0 -25
  1107. data/lib/ddtrace/opentracer/carrier.rb +0 -7
  1108. data/lib/ddtrace/opentracer/distributed_headers.rb +0 -56
  1109. data/lib/ddtrace/opentracer/global_tracer.rb +0 -16
  1110. data/lib/ddtrace/opentracer/propagator.rb +0 -23
  1111. data/lib/ddtrace/opentracer/rack_propagator.rb +0 -61
  1112. data/lib/ddtrace/opentracer/scope.rb +0 -16
  1113. data/lib/ddtrace/opentracer/scope_manager.rb +0 -7
  1114. data/lib/ddtrace/opentracer/span.rb +0 -95
  1115. data/lib/ddtrace/opentracer/span_context.rb +0 -15
  1116. data/lib/ddtrace/opentracer/span_context_factory.rb +0 -24
  1117. data/lib/ddtrace/opentracer/text_map_propagator.rb +0 -76
  1118. data/lib/ddtrace/opentracer/thread_local_scope.rb +0 -32
  1119. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +0 -41
  1120. data/lib/ddtrace/opentracer/tracer.rb +0 -209
  1121. data/lib/ddtrace/opentracer.rb +0 -22
  1122. data/lib/ddtrace/patcher.rb +0 -69
  1123. data/lib/ddtrace/pin.rb +0 -86
  1124. data/lib/ddtrace/pipeline/span_filter.rb +0 -39
  1125. data/lib/ddtrace/pipeline/span_processor.rb +0 -21
  1126. data/lib/ddtrace/pipeline.rb +0 -47
  1127. data/lib/ddtrace/profiling/backtrace_location.rb +0 -33
  1128. data/lib/ddtrace/profiling/buffer.rb +0 -42
  1129. data/lib/ddtrace/profiling/collectors/stack.rb +0 -301
  1130. data/lib/ddtrace/profiling/encoding/profile.rb +0 -46
  1131. data/lib/ddtrace/profiling/event.rb +0 -14
  1132. data/lib/ddtrace/profiling/events/stack.rb +0 -81
  1133. data/lib/ddtrace/profiling/exporter.rb +0 -24
  1134. data/lib/ddtrace/profiling/ext/cpu.rb +0 -67
  1135. data/lib/ddtrace/profiling/ext/cthread.rb +0 -156
  1136. data/lib/ddtrace/profiling/ext/forking.rb +0 -98
  1137. data/lib/ddtrace/profiling/flush.rb +0 -44
  1138. data/lib/ddtrace/profiling/native_extension.rb +0 -18
  1139. data/lib/ddtrace/profiling/pprof/builder.rb +0 -120
  1140. data/lib/ddtrace/profiling/pprof/converter.rb +0 -103
  1141. data/lib/ddtrace/profiling/pprof/message_set.rb +0 -15
  1142. data/lib/ddtrace/profiling/pprof/payload.rb +0 -19
  1143. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +0 -82
  1144. data/lib/ddtrace/profiling/pprof/stack_sample.rb +0 -143
  1145. data/lib/ddtrace/profiling/pprof/string_table.rb +0 -11
  1146. data/lib/ddtrace/profiling/pprof/template.rb +0 -119
  1147. data/lib/ddtrace/profiling/profiler.rb +0 -31
  1148. data/lib/ddtrace/profiling/recorder.rb +0 -96
  1149. data/lib/ddtrace/profiling/scheduler.rb +0 -134
  1150. data/lib/ddtrace/profiling/tasks/setup.rb +0 -81
  1151. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +0 -41
  1152. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +0 -46
  1153. data/lib/ddtrace/profiling/transport/client.rb +0 -15
  1154. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +0 -101
  1155. data/lib/ddtrace/profiling/transport/http/api/instance.rb +0 -37
  1156. data/lib/ddtrace/profiling/transport/http/api/spec.rb +0 -41
  1157. data/lib/ddtrace/profiling/transport/http/api.rb +0 -44
  1158. data/lib/ddtrace/profiling/transport/http/builder.rb +0 -29
  1159. data/lib/ddtrace/profiling/transport/http/client.rb +0 -34
  1160. data/lib/ddtrace/profiling/transport/http/response.rb +0 -22
  1161. data/lib/ddtrace/profiling/transport/http.rb +0 -111
  1162. data/lib/ddtrace/profiling/transport/io/client.rb +0 -28
  1163. data/lib/ddtrace/profiling/transport/io/response.rb +0 -17
  1164. data/lib/ddtrace/profiling/transport/io.rb +0 -31
  1165. data/lib/ddtrace/profiling/transport/parcel.rb +0 -18
  1166. data/lib/ddtrace/profiling/transport/request.rb +0 -16
  1167. data/lib/ddtrace/profiling/transport/response.rb +0 -9
  1168. data/lib/ddtrace/profiling.rb +0 -151
  1169. data/lib/ddtrace/propagation/grpc_propagator.rb +0 -75
  1170. data/lib/ddtrace/propagation/http_propagator.rb +0 -91
  1171. data/lib/ddtrace/quantization/hash.rb +0 -104
  1172. data/lib/ddtrace/quantization/http.rb +0 -90
  1173. data/lib/ddtrace/runtime/metrics.rb +0 -135
  1174. data/lib/ddtrace/sampler.rb +0 -293
  1175. data/lib/ddtrace/sampling/matcher.rb +0 -58
  1176. data/lib/ddtrace/sampling/rate_limiter.rb +0 -177
  1177. data/lib/ddtrace/sampling/rule.rb +0 -62
  1178. data/lib/ddtrace/sampling/rule_sampler.rb +0 -121
  1179. data/lib/ddtrace/sampling.rb +0 -3
  1180. data/lib/ddtrace/span.rb +0 -445
  1181. data/lib/ddtrace/sync_writer.rb +0 -69
  1182. data/lib/ddtrace/tasks/exec.rb +0 -47
  1183. data/lib/ddtrace/tasks/help.rb +0 -15
  1184. data/lib/ddtrace/tracer.rb +0 -449
  1185. data/lib/ddtrace/utils/compression.rb +0 -28
  1186. data/lib/ddtrace/utils/database.rb +0 -26
  1187. data/lib/ddtrace/utils/forking.rb +0 -53
  1188. data/lib/ddtrace/utils/object_set.rb +0 -40
  1189. data/lib/ddtrace/utils/only_once.rb +0 -41
  1190. data/lib/ddtrace/utils/sequence.rb +0 -18
  1191. data/lib/ddtrace/utils/string_table.rb +0 -46
  1192. data/lib/ddtrace/utils/time.rb +0 -45
  1193. data/lib/ddtrace/utils.rb +0 -80
  1194. data/lib/ddtrace/vendor/active_record/connection_specification.rb +0 -302
  1195. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -117
  1196. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +0 -58
  1197. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +0 -136
  1198. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +0 -10
  1199. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +0 -9
  1200. data/lib/ddtrace/vendor/multipart-post/multipart.rb +0 -13
  1201. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +0 -33
  1202. data/lib/ddtrace/worker.rb +0 -21
  1203. data/lib/ddtrace/workers/async.rb +0 -175
  1204. data/lib/ddtrace/workers/loop.rb +0 -132
  1205. data/lib/ddtrace/workers/polling.rb +0 -56
  1206. data/lib/ddtrace/workers/queue.rb +0 -41
  1207. data/lib/ddtrace/workers/runtime_metrics.rb +0 -65
  1208. data/lib/ddtrace/workers/trace_writer.rb +0 -200
  1209. data/lib/ddtrace/workers.rb +0 -123
  1210. data/lib/ddtrace/writer.rb +0 -200
@@ -0,0 +1,899 @@
1
+ #include <ruby.h>
2
+
3
+ #include "clock_id.h"
4
+ #include "collectors_cpu_and_wall_time.h"
5
+ #include "collectors_stack.h"
6
+ #include "helpers.h"
7
+ #include "libdatadog_helpers.h"
8
+ #include "private_vm_api_access.h"
9
+ #include "stack_recorder.h"
10
+ #include "time_helpers.h"
11
+
12
+ // Used to periodically sample threads, recording elapsed CPU-time and Wall-time between samples.
13
+ //
14
+ // This file implements the native bits of the Datadog::Profiling::Collectors::CpuAndWallTime class
15
+ //
16
+ // Triggering of this component (e.g. deciding when to take a sample) is implemented in Collectors::CpuAndWallTimeWorker.
17
+
18
+ // ---
19
+ // ## Tracking of cpu-time and wall-time spent during garbage collection
20
+ //
21
+ // This feature works by having an implicit state that a thread can be in: doing garbage collection. This state is
22
+ // tracked inside the thread's `per_thread_context.gc_tracking` data, and three functions, listed below. The functions
23
+ // will get called by the `Collectors::CpuAndWallTimeWorker` at very specific times in the VM lifetime.
24
+ //
25
+ // * `cpu_and_wall_time_collector_on_gc_start`: Called at the very beginning of the garbage collection process.
26
+ // 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.
28
+ // 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.
30
+ // The internal VM `during_gc` flag is set to `false`.
31
+ //
32
+ // Inside this component, here's what happens inside those three functions:
33
+ //
34
+ // When `cpu_and_wall_time_collector_on_gc_start` gets called, the current cpu and wall-time get recorded to the thread
35
+ // context: `cpu_time_at_gc_start_ns` and `wall_time_at_gc_start_ns`.
36
+ //
37
+ // While these fields are set, regular samples (if any) do not account for any time that passes after these two
38
+ // timestamps.
39
+ //
40
+ // (Regular samples can still account for the time between the previous sample and the start of GC.)
41
+ //
42
+ // When `cpu_and_wall_time_collector_on_gc_finish` gets called, the current cpu and wall-time again get recorded to the
43
+ // thread context: `cpu_time_at_gc_finish_ns` and `wall_time_at_gc_finish_ns`.
44
+ //
45
+ // Finally, when `cpu_and_wall_time_collector_sample_after_gc` gets called, the following happens:
46
+ //
47
+ // 1. A sample gets taken, using the special `SAMPLE_IN_GC` sample type, which produces a stack with a placeholder
48
+ // `Garbage Collection` frame as the latest frame. This sample gets assigned the cpu-time and wall-time period that was
49
+ // recorded between calls to `on_gc_start` and `on_gc_finish`.
50
+ //
51
+ // 2. The thread is no longer marked as being in gc (all gc tracking fields get reset back to `INVALID_TIME`).
52
+ //
53
+ // 3. The `cpu_time_at_previous_sample_ns` and `wall_time_at_previous_sample_ns` get updated with the elapsed time in
54
+ // GC, so that all time is accounted for -- e.g. the next sample will not get "blamed" by time spent in GC.
55
+ //
56
+ // 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),
59
+ // `sample_after_gc` could trigger memory allocation in rare occasions (usually exceptions), which is actually not
60
+ // allowed to happen during Ruby's garbage collection start/finish hooks.
61
+ // ---
62
+
63
+ #define INVALID_TIME -1
64
+ #define THREAD_ID_LIMIT_CHARS 44 // Why 44? "#{2**64} (#{2**64})".size + 1 for \0
65
+ #define IS_WALL_TIME true
66
+ #define IS_NOT_WALL_TIME false
67
+ #define MISSING_TRACER_CONTEXT_KEY 0
68
+
69
+ static ID at_active_span_id; // id of :@active_span in Ruby
70
+ static ID at_active_trace_id; // id of :@active_trace in Ruby
71
+ static ID at_id_id; // id of :@id in Ruby
72
+ static ID at_resource_id; // id of :@resource in Ruby
73
+ static ID at_root_span_id; // id of :@root_span in Ruby
74
+ static ID at_type_id; // id of :@type in Ruby
75
+
76
+ // Contains state for a single CpuAndWallTime instance
77
+ struct cpu_and_wall_time_collector_state {
78
+ // Note: Places in this file that usually need to be changed when this struct is changed are tagged with
79
+ // "Update this when modifying state struct"
80
+
81
+ // Required by Datadog::Profiling::Collectors::Stack as a scratch buffer during sampling
82
+ sampling_buffer *sampling_buffer;
83
+ // Hashmap <Thread Object, struct per_thread_context>
84
+ st_table *hash_map_per_thread_context;
85
+ // Datadog::Profiling::StackRecorder instance
86
+ VALUE recorder_instance;
87
+ // If the tracer is available and enabled, this will be the fiber-local symbol for accessing its running context,
88
+ // to enable code hotspots and endpoint aggregation.
89
+ // When not available, this is set to MISSING_TRACER_CONTEXT_KEY.
90
+ ID tracer_context_key;
91
+ // Track how many regular samples we've taken. Does not include garbage collection samples.
92
+ // Currently **outside** of stats struct because we also use it to decide when to clean the contexts, and thus this
93
+ // is not (just) a stat.
94
+ unsigned int sample_count;
95
+
96
+ struct stats {
97
+ // Track how many garbage collection samples we've taken.
98
+ unsigned int gc_samples;
99
+ // See cpu_and_wall_time_collector_on_gc_start for details
100
+ unsigned int gc_samples_missed_due_to_missing_context;
101
+ } stats;
102
+ };
103
+
104
+ // Tracks per-thread state
105
+ struct per_thread_context {
106
+ char thread_id[THREAD_ID_LIMIT_CHARS];
107
+ ddog_CharSlice thread_id_char_slice;
108
+ thread_cpu_time_id thread_cpu_time_id;
109
+ long cpu_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized or if getting it fails for another reason
110
+ long wall_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized
111
+
112
+ struct {
113
+ // Both of these fields are set by on_gc_start and kept until sample_after_gc is called.
114
+ // Outside of this window, they will be INVALID_TIME.
115
+ long cpu_time_at_start_ns;
116
+ long wall_time_at_start_ns;
117
+
118
+ // Both of these fields are set by on_gc_finish and kept until sample_after_gc is called.
119
+ // Outside of this window, they will be INVALID_TIME.
120
+ long cpu_time_at_finish_ns;
121
+ long wall_time_at_finish_ns;
122
+ } gc_tracking;
123
+ };
124
+
125
+ // Used to correlate profiles with traces
126
+ struct trace_identifiers {
127
+ #define MAXIMUM_LENGTH_64_BIT_IDENTIFIER 21 // Why 21? 2^64 => 20 digits + 1 for \0
128
+
129
+ bool valid;
130
+ ddog_CharSlice local_root_span_id;
131
+ uint64_t span_id;
132
+ char local_root_span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
133
+ VALUE trace_endpoint;
134
+ };
135
+
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 int hash_map_per_thread_context_mark(st_data_t key_thread, st_data_t _value, st_data_t _argument);
139
+ 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
+ static VALUE _native_new(VALUE klass);
141
+ 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);
143
+ static VALUE _native_on_gc_start(VALUE self, VALUE collector_instance);
144
+ static VALUE _native_on_gc_finish(VALUE self, VALUE collector_instance);
145
+ static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
146
+ static void trigger_sample_for_thread(
147
+ struct cpu_and_wall_time_collector_state *state,
148
+ VALUE thread,
149
+ struct per_thread_context *thread_context,
150
+ ddog_Slice_I64 metric_values_slice,
151
+ sample_type type
152
+ );
153
+ 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);
156
+ static void initialize_context(VALUE thread, struct per_thread_context *thread_context);
157
+ 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);
159
+ 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);
162
+ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument);
163
+ static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
164
+ 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
+ static long cpu_time_now_ns(struct per_thread_context *thread_context);
166
+ static long thread_id_for(VALUE thread);
167
+ 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);
169
+ static bool is_type_web(VALUE root_span_type);
170
+ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
171
+
172
+ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
173
+ 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);
175
+ // 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");
177
+
178
+ // Instances of the CpuAndWallTime class are "TypedData" objects.
179
+ // "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.
181
+ //
182
+ // Because Ruby doesn't know how to initialize native-level structs, we MUST override the allocation function for objects
183
+ // of this class so that we can manage this part. Not overriding or disabling the allocation function is a common
184
+ // gotcha for "TypedData" objects that can very easily lead to VM crashes, see for instance
185
+ // 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);
187
+
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);
192
+ rb_define_singleton_method(testing_module, "_native_on_gc_start", _native_on_gc_start, 1);
193
+ rb_define_singleton_method(testing_module, "_native_on_gc_finish", _native_on_gc_finish, 1);
194
+ rb_define_singleton_method(testing_module, "_native_sample_after_gc", _native_sample_after_gc, 1);
195
+ rb_define_singleton_method(testing_module, "_native_thread_list", _native_thread_list, 0);
196
+ rb_define_singleton_method(testing_module, "_native_per_thread_context", _native_per_thread_context, 1);
197
+ rb_define_singleton_method(testing_module, "_native_stats", _native_stats, 1);
198
+
199
+ at_active_span_id = rb_intern_const("@active_span");
200
+ at_active_trace_id = rb_intern_const("@active_trace");
201
+ at_id_id = rb_intern_const("@id");
202
+ at_resource_id = rb_intern_const("@resource");
203
+ at_root_span_id = rb_intern_const("@root_span");
204
+ at_type_id = rb_intern_const("@type");
205
+ }
206
+
207
+ // This structure is used to define a Ruby object that stores a pointer to a struct cpu_and_wall_time_collector_state
208
+ // 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",
211
+ .function = {
212
+ .dmark = cpu_and_wall_time_collector_typed_data_mark,
213
+ .dfree = cpu_and_wall_time_collector_typed_data_free,
214
+ .dsize = NULL, // We don't track profile memory usage (although it'd be cool if we did!)
215
+ //.dcompact = NULL, // FIXME: Add support for compaction
216
+ },
217
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
218
+ };
219
+
220
+ // 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
+ // 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;
224
+
225
+ // Update this when modifying state struct
226
+ rb_gc_mark(state->recorder_instance);
227
+ st_foreach(state->hash_map_per_thread_context, hash_map_per_thread_context_mark, 0 /* unused */);
228
+ }
229
+
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;
232
+
233
+ // Update this when modifying state struct
234
+
235
+ // Important: Remember that we're only guaranteed to see here what's been set in _native_new, aka
236
+ // pointers that have been set NULL there may still be NULL here.
237
+ if (state->sampling_buffer != NULL) sampling_buffer_free(state->sampling_buffer);
238
+
239
+ // Free each entry in the map
240
+ st_foreach(state->hash_map_per_thread_context, hash_map_per_thread_context_free_values, 0 /* unused */);
241
+ // ...and then the map
242
+ st_free_table(state->hash_map_per_thread_context);
243
+
244
+ ruby_xfree(state);
245
+ }
246
+
247
+ // Mark Ruby thread references we keep as keys in hash_map_per_thread_context
248
+ static int hash_map_per_thread_context_mark(st_data_t key_thread, DDTRACE_UNUSED st_data_t _value, DDTRACE_UNUSED st_data_t _argument) {
249
+ VALUE thread = (VALUE) key_thread;
250
+ rb_gc_mark(thread);
251
+ return ST_CONTINUE;
252
+ }
253
+
254
+ // Used to clear each of the per_thread_contexts inside the hash_map_per_thread_context
255
+ static int hash_map_per_thread_context_free_values(DDTRACE_UNUSED st_data_t _thread, st_data_t value_per_thread_context, DDTRACE_UNUSED st_data_t _argument) {
256
+ struct per_thread_context *per_thread_context = (struct per_thread_context*) value_per_thread_context;
257
+ ruby_xfree(per_thread_context);
258
+ return ST_CONTINUE;
259
+ }
260
+
261
+ 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));
263
+
264
+ // Update this when modifying state struct
265
+ state->sampling_buffer = NULL;
266
+ state->hash_map_per_thread_context =
267
+ // "numtable" is an awful name, but TL;DR it's what should be used when keys are `VALUE`s.
268
+ st_init_numtable();
269
+ state->recorder_instance = Qnil;
270
+ state->tracer_context_key = MISSING_TRACER_CONTEXT_KEY;
271
+
272
+ return TypedData_Wrap_Struct(klass, &cpu_and_wall_time_collector_typed_data, state);
273
+ }
274
+
275
+ 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);
278
+
279
+ int max_frames_requested = NUM2INT(max_frames);
280
+ if (max_frames_requested < 0) rb_raise(rb_eArgError, "Invalid max_frames: value must not be negative");
281
+
282
+ // Update this when modifying state struct
283
+ state->sampling_buffer = sampling_buffer_new(max_frames_requested);
284
+ // hash_map_per_thread_context is already initialized, nothing to do here
285
+ state->recorder_instance = enforce_recorder_instance(recorder_instance);
286
+
287
+ if (RTEST(tracer_context_key)) {
288
+ ENFORCE_TYPE(tracer_context_key, T_SYMBOL);
289
+ // Note about rb_to_id and dynamic symbols: calling `rb_to_id` prevents symbols from ever being garbage collected.
290
+ // In this case, we can't really escape this because as of this writing, ruby master still calls `rb_to_id` inside
291
+ // the implementation of Thread#[]= so any symbol that gets used as a key there will already be prevented from GC.
292
+ state->tracer_context_key = rb_to_id(tracer_context_key);
293
+ }
294
+
295
+ return Qtrue;
296
+ }
297
+
298
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
299
+ // 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));
302
+ return Qtrue;
303
+ }
304
+
305
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
306
+ // It SHOULD NOT be used for other purposes.
307
+ static VALUE _native_on_gc_start(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
308
+ cpu_and_wall_time_collector_on_gc_start(collector_instance);
309
+ return Qtrue;
310
+ }
311
+
312
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
313
+ // It SHOULD NOT be used for other purposes.
314
+ static VALUE _native_on_gc_finish(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
315
+ cpu_and_wall_time_collector_on_gc_finish(collector_instance);
316
+ return Qtrue;
317
+ }
318
+
319
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
320
+ // It SHOULD NOT be used for other purposes.
321
+ static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
322
+ cpu_and_wall_time_collector_sample_after_gc(collector_instance);
323
+ return Qtrue;
324
+ }
325
+
326
+ // This function gets called from the Collectors::CpuAndWallTimeWorker to trigger the actual sampling.
327
+ //
328
+ // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
329
+ // Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed.
330
+ // Assumption 3: This function IS NOT called from a signal handler. This function is not async-signal-safe.
331
+ // Assumption 4: This function IS NOT called in a reentrant way.
332
+ // 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);
336
+
337
+ VALUE threads = ddtrace_thread_list();
338
+
339
+ const long thread_count = RARRAY_LEN(threads);
340
+ for (long i = 0; i < thread_count; i++) {
341
+ VALUE thread = RARRAY_AREF(threads, i);
342
+ struct per_thread_context *thread_context = get_or_create_context_for(thread, state);
343
+
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;
364
+
365
+ trigger_sample_for_thread(
366
+ state,
367
+ thread,
368
+ thread_context,
369
+ (ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
370
+ SAMPLE_REGULAR
371
+ );
372
+ }
373
+
374
+ state->sample_count++;
375
+
376
+ // TODO: This seems somewhat overkill and inefficient to do often; right now we just do it every few samples
377
+ // but there's probably a better way to do this if we actually track when threads finish
378
+ if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
379
+ }
380
+
381
+ // This function gets called when Ruby is about to start running the Garbage Collector on the current thread.
382
+ // It updates the per_thread_context of the current thread to include the current cpu/wall times, to be used to later
383
+ // create a stack sample that blames the cpu/wall time spent from now until the end of the garbage collector work.
384
+ //
385
+ // Safety: This function gets called while Ruby is doing garbage collection. While Ruby is doing garbage collection,
386
+ // *NO ALLOCATION* is allowed. This function, and any it calls must never trigger memory or object allocation.
387
+ // This includes exceptions and use of ruby_xcalloc (because xcalloc can trigger GC)!
388
+ //
389
+ // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
390
+ // 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;
394
+ // 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);
396
+
397
+ struct per_thread_context *thread_context = get_context_for(rb_thread_current(), state);
398
+
399
+ // If there was no previously-existing context for this thread, we won't allocate one (see safety). For now we just drop
400
+ // the GC sample, under the assumption that "a thread that is so new that we never sampled it even once before it triggers
401
+ // GC" is a rare enough case that we can just ignore it.
402
+ // We can always improve this later if we find that this happens often (and we have the counter to help us figure that out)!
403
+ if (thread_context == NULL) {
404
+ state->stats.gc_samples_missed_due_to_missing_context++;
405
+ return;
406
+ }
407
+
408
+ // If these fields are set, there's an existing GC sample that still needs to be written out by `sample_after_gc`.
409
+ //
410
+ // When can this happen? Because we don't have precise control over when `sample_after_gc` gets called (it will be
411
+ // called sometime after GC finishes), there is no way to guarantee that Ruby will not trigger more than one GC cycle
412
+ // before we can actually run that method.
413
+ //
414
+ // We handle this by collapsing multiple GC cycles into one. That is, if the following happens:
415
+ // `on_gc_start` (time=0) -> `on_gc_finish` (time=1) -> `on_gc_start` (time=2) -> `on_gc_finish` (time=3) -> `sample_after_gc`
416
+ // then we just use time=0 from the first on_gc_start and time=3 from the last on_gc_finish, e.g. we behave as if
417
+ // there was a single, longer GC period.
418
+ if (thread_context->gc_tracking.cpu_time_at_finish_ns != INVALID_TIME &&
419
+ thread_context->gc_tracking.wall_time_at_finish_ns != INVALID_TIME) return;
420
+
421
+ // Here we record the wall-time first and in on_gc_finish we record it second to avoid having wall-time be slightly < cpu-time
422
+ thread_context->gc_tracking.wall_time_at_start_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
423
+ thread_context->gc_tracking.cpu_time_at_start_ns = cpu_time_now_ns(thread_context);
424
+ }
425
+
426
+ // This function gets called when Ruby has finished running the Garbage Collector on the current thread.
427
+ // It updates the per_thread_context of the current thread to include the current cpu/wall times, to be used to later
428
+ // create a stack sample that blames the cpu/wall time spent from the start of garbage collector work until now.
429
+ //
430
+ // Safety: This function gets called while Ruby is doing garbage collection. While Ruby is doing garbage collection,
431
+ // *NO ALLOCATION* is allowed. This function, and any it calls must never trigger memory or object allocation.
432
+ // This includes exceptions and use of ruby_xcalloc (because xcalloc can trigger GC)!
433
+ //
434
+ // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
435
+ // 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;
439
+ // 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);
441
+
442
+ struct per_thread_context *thread_context = get_context_for(rb_thread_current(), state);
443
+
444
+ // If there was no previously-existing context for this thread, we won't allocate one (see safety). We keep a metric for
445
+ // how often this happens -- see on_gc_start.
446
+ if (thread_context == NULL) return;
447
+
448
+ if (thread_context->gc_tracking.cpu_time_at_start_ns == INVALID_TIME &&
449
+ thread_context->gc_tracking.wall_time_at_start_ns == INVALID_TIME) {
450
+ // If this happened, it means that on_gc_start was either never called for the thread OR it was called but no thread
451
+ // context existed at the time. The former can be the result of a bug, but since we can't distinguish them, we just
452
+ // do nothing.
453
+ return;
454
+ }
455
+
456
+ // Here we record the wall-time second and in on_gc_start we record it first to avoid having wall-time be slightly < cpu-time
457
+ thread_context->gc_tracking.cpu_time_at_finish_ns = cpu_time_now_ns(thread_context);
458
+ thread_context->gc_tracking.wall_time_at_finish_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
459
+ }
460
+
461
+ // This function gets called shortly after Ruby has finished running the Garbage Collector.
462
+ // It creates a new sample including the cpu and wall-time spent by the garbage collector work, and resets any
463
+ // GC-related tracking.
464
+ //
465
+ // Specifically, it will search for thread(s) which have gone through a cycle of on_gc_start/on_gc_finish
466
+ // and thus have cpu_time_at_start_ns, cpu_time_at_finish_ns, wall_time_at_start_ns, wall_time_at_finish_ns
467
+ // set on their context.
468
+ //
469
+ // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
470
+ // Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed.
471
+ // Assumption 3: Unlike `on_gc_start` and `on_gc_finish`, this method is allowed to allocate memory as needed.
472
+ // 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);
476
+
477
+ VALUE threads = ddtrace_thread_list();
478
+ bool sampled_any_thread = false;
479
+
480
+ const long thread_count = RARRAY_LEN(threads);
481
+ for (long i = 0; i < thread_count; i++) {
482
+ VALUE thread = RARRAY_AREF(threads, i);
483
+ struct per_thread_context *thread_context = get_or_create_context_for(thread, state);
484
+
485
+ if (
486
+ thread_context->gc_tracking.cpu_time_at_start_ns == INVALID_TIME ||
487
+ thread_context->gc_tracking.cpu_time_at_finish_ns == INVALID_TIME ||
488
+ thread_context->gc_tracking.wall_time_at_start_ns == INVALID_TIME ||
489
+ thread_context->gc_tracking.wall_time_at_finish_ns == INVALID_TIME
490
+ ) continue; // Ignore threads with no/incomplete garbage collection data
491
+
492
+ sampled_any_thread = true;
493
+
494
+ long gc_cpu_time_elapsed_ns =
495
+ thread_context->gc_tracking.cpu_time_at_finish_ns - thread_context->gc_tracking.cpu_time_at_start_ns;
496
+ long gc_wall_time_elapsed_ns =
497
+ thread_context->gc_tracking.wall_time_at_finish_ns - thread_context->gc_tracking.wall_time_at_start_ns;
498
+
499
+ // We don't expect non-wall time to go backwards, so let's flag this as a bug
500
+ if (gc_cpu_time_elapsed_ns < 0) rb_raise(rb_eRuntimeError, "BUG: Unexpected negative gc_cpu_time_elapsed_ns between samples");
501
+ // Wall-time can actually go backwards (e.g. when the system clock gets set) so we can't assume time going backwards
502
+ // was a bug.
503
+ // @ivoanjo: I've also observed time going backwards spuriously on macOS, see discussion on
504
+ // https://github.com/DataDog/dd-trace-rb/pull/2336.
505
+ if (gc_wall_time_elapsed_ns < 0) gc_wall_time_elapsed_ns = 0;
506
+
507
+ if (thread_context->gc_tracking.wall_time_at_start_ns == 0 && thread_context->gc_tracking.wall_time_at_finish_ns != 0) {
508
+ // Avoid using wall-clock if we got 0 for a start (meaning there was an error) but not 0 for finish so we don't
509
+ // come up with a crazy value for the frame
510
+ rb_raise(rb_eRuntimeError, "BUG: Unexpected zero value for gc_tracking.wall_time_at_start_ns");
511
+ }
512
+
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
+ trigger_sample_for_thread(
520
+ state,
521
+ thread,
522
+ thread_context,
523
+ (ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
524
+ SAMPLE_IN_GC
525
+ );
526
+
527
+ // Mark thread as no longer in GC
528
+ thread_context->gc_tracking.cpu_time_at_start_ns = INVALID_TIME;
529
+ thread_context->gc_tracking.cpu_time_at_finish_ns = INVALID_TIME;
530
+ thread_context->gc_tracking.wall_time_at_start_ns = INVALID_TIME;
531
+ thread_context->gc_tracking.wall_time_at_finish_ns = INVALID_TIME;
532
+
533
+ // Update counters so that they won't include the time in GC during the next sample
534
+ if (thread_context->cpu_time_at_previous_sample_ns != INVALID_TIME) {
535
+ thread_context->cpu_time_at_previous_sample_ns += gc_cpu_time_elapsed_ns;
536
+ }
537
+ if (thread_context->wall_time_at_previous_sample_ns != INVALID_TIME) {
538
+ thread_context->wall_time_at_previous_sample_ns += gc_wall_time_elapsed_ns;
539
+ }
540
+ }
541
+
542
+ if (sampled_any_thread) state->stats.gc_samples++;
543
+
544
+ // Return a VALUE to make it easier to call this function from Ruby APIs that expect a return value (such as rb_rescue2)
545
+ return Qnil;
546
+ }
547
+
548
+ static void trigger_sample_for_thread(
549
+ struct cpu_and_wall_time_collector_state *state,
550
+ VALUE thread,
551
+ struct per_thread_context *thread_context,
552
+ ddog_Slice_I64 metric_values_slice,
553
+ sample_type type
554
+ ) {
555
+ int max_label_count =
556
+ 1 + // thread id
557
+ 1 + // thread name
558
+ 2; // local root span id and span id
559
+ ddog_prof_Label labels[max_label_count];
560
+ int label_pos = 0;
561
+
562
+ labels[label_pos++] = (ddog_prof_Label) {
563
+ .key = DDOG_CHARSLICE_C("thread id"),
564
+ .str = thread_context->thread_id_char_slice
565
+ };
566
+
567
+ VALUE thread_name = thread_name_for(thread);
568
+ if (thread_name != Qnil) {
569
+ labels[label_pos++] = (ddog_prof_Label) {
570
+ .key = DDOG_CHARSLICE_C("thread name"),
571
+ .str = char_slice_from_ruby_string(thread_name)
572
+ };
573
+ }
574
+
575
+ struct trace_identifiers trace_identifiers_result = {.valid = false, .trace_endpoint = Qnil};
576
+ trace_identifiers_for(state, thread, &trace_identifiers_result);
577
+
578
+ 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};
580
+ labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("span id"), .num = trace_identifiers_result.span_id};
581
+
582
+ if (trace_identifiers_result.trace_endpoint != Qnil) {
583
+ // The endpoint gets recorded in a different way because it is mutable in the tracer and can change during a
584
+ // trace.
585
+ //
586
+ // Instead of each sample for the same local_root_span_id getting a potentially-different endpoint,
587
+ // `record_endpoint` (via libdatadog) keeps a list of local_root_span_id values and their most-recently-seen
588
+ // endpoint values, and at serialization time the most-recently-seen endpoint is applied to all relevant samples.
589
+ //
590
+ // This is why the endpoint is not directly added in this function to the labels array, although it will later
591
+ // show up in the array in the output pprof.
592
+ record_endpoint(
593
+ state->recorder_instance,
594
+ trace_identifiers_result.local_root_span_id,
595
+ char_slice_from_ruby_string(trace_identifiers_result.trace_endpoint)
596
+ );
597
+ }
598
+ }
599
+
600
+ // The number of times `label_pos++` shows up in this function needs to match `max_label_count`. To avoid "oops I
601
+ // forgot to update max_label_count" in the future, we've also added this validation.
602
+ // @ivoanjo: I wonder if C compilers are smart enough to statically prove when this check never triggers happens and
603
+ // remove it entirely.
604
+ if (label_pos > max_label_count) {
605
+ rb_raise(rb_eRuntimeError, "BUG: Unexpected label_pos (%d) > max_label_count (%d)", label_pos, max_label_count);
606
+ }
607
+
608
+ sample_thread(
609
+ thread,
610
+ state->sampling_buffer,
611
+ state->recorder_instance,
612
+ metric_values_slice,
613
+ (ddog_prof_Slice_Label) {.ptr = labels, .len = label_pos},
614
+ type
615
+ );
616
+ }
617
+
618
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
619
+ // It SHOULD NOT be used for other purposes.
620
+ static VALUE _native_thread_list(DDTRACE_UNUSED VALUE _self) {
621
+ return ddtrace_thread_list();
622
+ }
623
+
624
+ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state) {
625
+ struct per_thread_context* thread_context = NULL;
626
+ st_data_t value_context = 0;
627
+
628
+ if (st_lookup(state->hash_map_per_thread_context, (st_data_t) thread, &value_context)) {
629
+ thread_context = (struct per_thread_context*) value_context;
630
+ } else {
631
+ thread_context = ruby_xcalloc(1, sizeof(struct per_thread_context));
632
+ initialize_context(thread, thread_context);
633
+ st_insert(state->hash_map_per_thread_context, (st_data_t) thread, (st_data_t) thread_context);
634
+ }
635
+
636
+ return thread_context;
637
+ }
638
+
639
+ static struct per_thread_context *get_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state) {
640
+ struct per_thread_context* thread_context = NULL;
641
+ st_data_t value_context = 0;
642
+
643
+ if (st_lookup(state->hash_map_per_thread_context, (st_data_t) thread, &value_context)) {
644
+ thread_context = (struct per_thread_context*) value_context;
645
+ }
646
+
647
+ return thread_context;
648
+ }
649
+
650
+ static void initialize_context(VALUE thread, struct per_thread_context *thread_context) {
651
+ snprintf(thread_context->thread_id, THREAD_ID_LIMIT_CHARS, "%"PRIu64" (%lu)", native_thread_id_for(thread), (unsigned long) thread_id_for(thread));
652
+ thread_context->thread_id_char_slice = (ddog_CharSlice) {.ptr = thread_context->thread_id, .len = strlen(thread_context->thread_id)};
653
+
654
+ thread_context->thread_cpu_time_id = thread_cpu_time_id_for(thread);
655
+
656
+ // These will get initialized during actual sampling
657
+ thread_context->cpu_time_at_previous_sample_ns = INVALID_TIME;
658
+ thread_context->wall_time_at_previous_sample_ns = INVALID_TIME;
659
+
660
+ // These will only be used during a GC operation
661
+ thread_context->gc_tracking.cpu_time_at_start_ns = INVALID_TIME;
662
+ thread_context->gc_tracking.cpu_time_at_finish_ns = INVALID_TIME;
663
+ thread_context->gc_tracking.wall_time_at_start_ns = INVALID_TIME;
664
+ thread_context->gc_tracking.wall_time_at_finish_ns = INVALID_TIME;
665
+ }
666
+
667
+ 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);
670
+
671
+ VALUE result = rb_str_new2(" (native state)");
672
+
673
+ // Update this when modifying state struct
674
+ rb_str_concat(result, rb_sprintf(" hash_map_per_thread_context=%"PRIsVALUE, per_thread_context_st_table_as_ruby_hash(state)));
675
+ rb_str_concat(result, rb_sprintf(" recorder_instance=%"PRIsVALUE, state->recorder_instance));
676
+ VALUE tracer_context_key = state->tracer_context_key == MISSING_TRACER_CONTEXT_KEY ? Qnil : ID2SYM(state->tracer_context_key);
677
+ rb_str_concat(result, rb_sprintf(" tracer_context_key=%+"PRIsVALUE, tracer_context_key));
678
+ rb_str_concat(result, rb_sprintf(" sample_count=%u", state->sample_count));
679
+ rb_str_concat(result, rb_sprintf(" stats=%"PRIsVALUE, stats_as_ruby_hash(state)));
680
+
681
+ return result;
682
+ }
683
+
684
+ static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_collector_state *state) {
685
+ VALUE result = rb_hash_new();
686
+ st_foreach(state->hash_map_per_thread_context, per_thread_context_as_ruby_hash, result);
687
+ return result;
688
+ }
689
+
690
+ static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash) {
691
+ VALUE thread = (VALUE) key_thread;
692
+ struct per_thread_context *thread_context = (struct per_thread_context*) value_context;
693
+ VALUE result = (VALUE) result_hash;
694
+ VALUE context_as_hash = rb_hash_new();
695
+ rb_hash_aset(result, thread, context_as_hash);
696
+
697
+ VALUE arguments[] = {
698
+ ID2SYM(rb_intern("thread_id")), /* => */ rb_str_new2(thread_context->thread_id),
699
+ ID2SYM(rb_intern("thread_cpu_time_id_valid?")), /* => */ thread_context->thread_cpu_time_id.valid ? Qtrue : Qfalse,
700
+ ID2SYM(rb_intern("thread_cpu_time_id")), /* => */ CLOCKID2NUM(thread_context->thread_cpu_time_id.clock_id),
701
+ ID2SYM(rb_intern("cpu_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->cpu_time_at_previous_sample_ns),
702
+ ID2SYM(rb_intern("wall_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->wall_time_at_previous_sample_ns),
703
+
704
+ ID2SYM(rb_intern("gc_tracking.cpu_time_at_start_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.cpu_time_at_start_ns),
705
+ ID2SYM(rb_intern("gc_tracking.cpu_time_at_finish_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.cpu_time_at_finish_ns),
706
+ ID2SYM(rb_intern("gc_tracking.wall_time_at_start_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.wall_time_at_start_ns),
707
+ ID2SYM(rb_intern("gc_tracking.wall_time_at_finish_ns")), /* => */ LONG2NUM(thread_context->gc_tracking.wall_time_at_finish_ns)
708
+ };
709
+ for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(context_as_hash, arguments[i], arguments[i+1]);
710
+
711
+ return ST_CONTINUE;
712
+ }
713
+
714
+ static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state) {
715
+ // Update this when modifying state struct (stats inner struct)
716
+ VALUE stats_as_hash = rb_hash_new();
717
+ VALUE arguments[] = {
718
+ ID2SYM(rb_intern("gc_samples")), /* => */ UINT2NUM(state->stats.gc_samples),
719
+ ID2SYM(rb_intern("gc_samples_missed_due_to_missing_context")), /* => */ UINT2NUM(state->stats.gc_samples_missed_due_to_missing_context),
720
+ };
721
+ for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(stats_as_hash, arguments[i], arguments[i+1]);
722
+ return stats_as_hash;
723
+ }
724
+
725
+ static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_state *state) {
726
+ st_foreach(state->hash_map_per_thread_context, remove_if_dead_thread, 0 /* unused */);
727
+ }
728
+
729
+ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, DDTRACE_UNUSED st_data_t _argument) {
730
+ VALUE thread = (VALUE) key_thread;
731
+ struct per_thread_context* thread_context = (struct per_thread_context*) value_context;
732
+
733
+ if (is_thread_alive(thread)) return ST_CONTINUE;
734
+
735
+ ruby_xfree(thread_context);
736
+ return ST_DELETE;
737
+ }
738
+
739
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
740
+ // It SHOULD NOT be used for other purposes.
741
+ //
742
+ // Returns the whole contents of the per_thread_context structs being tracked.
743
+ 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);
746
+
747
+ return per_thread_context_st_table_as_ruby_hash(state);
748
+ }
749
+
750
+ 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) {
751
+ // If we didn't have a time for the previous sample, we use the current one
752
+ if (*time_at_previous_sample_ns == INVALID_TIME) *time_at_previous_sample_ns = current_time_ns;
753
+
754
+ bool is_thread_doing_gc = gc_start_time_ns != INVALID_TIME;
755
+ long elapsed_time_ns = -1;
756
+
757
+ if (is_thread_doing_gc) {
758
+ bool previous_sample_was_during_gc = gc_start_time_ns <= *time_at_previous_sample_ns;
759
+
760
+ if (previous_sample_was_during_gc) {
761
+ elapsed_time_ns = 0; // No time to account for -- any time since the last sample is going to get assigned to GC separately
762
+ } else {
763
+ elapsed_time_ns = gc_start_time_ns - *time_at_previous_sample_ns; // Capture time between previous sample and start of GC only
764
+ }
765
+
766
+ // Remaining time (from gc_start_time to current_time_ns) will be accounted for inside `sample_after_gc`
767
+ *time_at_previous_sample_ns = gc_start_time_ns;
768
+ } else {
769
+ elapsed_time_ns = current_time_ns - *time_at_previous_sample_ns; // Capture all time since previous sample
770
+ *time_at_previous_sample_ns = current_time_ns;
771
+ }
772
+
773
+ if (elapsed_time_ns < 0) {
774
+ if (is_wall_time) {
775
+ // Wall-time can actually go backwards (e.g. when the system clock gets set) so we can't assume time going backwards
776
+ // was a bug.
777
+ // @ivoanjo: I've also observed time going backwards spuriously on macOS, see discussion on
778
+ // https://github.com/DataDog/dd-trace-rb/pull/2336.
779
+ elapsed_time_ns = 0;
780
+ } else {
781
+ // We don't expect non-wall time to go backwards, so let's flag this as a bug
782
+ rb_raise(rb_eRuntimeError, "BUG: Unexpected negative elapsed_time_ns between samples");
783
+ }
784
+ }
785
+
786
+ return elapsed_time_ns;
787
+ }
788
+
789
+ // Safety: This function is assumed never to raise exceptions by callers
790
+ static long cpu_time_now_ns(struct per_thread_context *thread_context) {
791
+ thread_cpu_time cpu_time = thread_cpu_time_for(thread_context->thread_cpu_time_id);
792
+
793
+ if (!cpu_time.valid) {
794
+ // Invalidate previous state of the counter (if any), it's no longer accurate. We need to get two good reads
795
+ // in a row to have an accurate delta.
796
+ thread_context->cpu_time_at_previous_sample_ns = INVALID_TIME;
797
+ return 0;
798
+ }
799
+
800
+ return cpu_time.result_ns;
801
+ }
802
+
803
+ static long thread_id_for(VALUE thread) {
804
+ VALUE object_id = rb_obj_id(thread);
805
+
806
+ // The API docs for Ruby state that `rb_obj_id` COULD be a BIGNUM and that if you want to be really sure you don't
807
+ // get a BIGNUM, then you should use `rb_memory_id`. But `rb_memory_id` is less interesting because it's less visible
808
+ // at the user level than the result of calling `#object_id`.
809
+ //
810
+ // It also seems uncommon to me that we'd ever get a BIGNUM; on old Ruby versions (pre-GC compaction), the object id
811
+ // was the pointer to the object, so that's not going to be a BIGNUM; on modern Ruby versions, Ruby keeps
812
+ // a counter, and only increments it for objects for which `#object_id`/`rb_obj_id` is called (e.g. most objects
813
+ // won't actually have an object id allocated).
814
+ //
815
+ // So, for now, let's simplify: we only support FIXNUMs, and we won't break if we get a BIGNUM; we just won't
816
+ // record the thread_id (but samples will still be collected).
817
+ return FIXNUM_P(object_id) ? FIX2LONG(object_id) : -1;
818
+ }
819
+
820
+ VALUE enforce_cpu_and_wall_time_collector_instance(VALUE object) {
821
+ Check_TypedStruct(object, &cpu_and_wall_time_collector_typed_data);
822
+ return object;
823
+ }
824
+
825
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
826
+ // It SHOULD NOT be used for other purposes.
827
+ //
828
+ // Returns the whole contents of the per_thread_context structs being tracked.
829
+ 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);
832
+
833
+ return stats_as_ruby_hash(state);
834
+ }
835
+
836
+ // 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) {
838
+ if (state->tracer_context_key == MISSING_TRACER_CONTEXT_KEY) return;
839
+
840
+ VALUE current_context = rb_thread_local_aref(thread, state->tracer_context_key);
841
+ if (current_context == Qnil) return;
842
+
843
+ VALUE active_trace = rb_ivar_get(current_context, at_active_trace_id /* @active_trace */);
844
+ if (active_trace == Qnil) return;
845
+
846
+ VALUE root_span = rb_ivar_get(active_trace, at_root_span_id /* @root_span */);
847
+ VALUE active_span = rb_ivar_get(active_trace, at_active_span_id /* @active_span */);
848
+ if (root_span == Qnil || active_span == Qnil) return;
849
+
850
+ VALUE numeric_local_root_span_id = rb_ivar_get(root_span, at_id_id /* @id */);
851
+ VALUE numeric_span_id = rb_ivar_get(active_span, at_id_id /* @id */);
852
+ if (numeric_local_root_span_id == Qnil || numeric_span_id == Qnil) return;
853
+
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
+ };
861
+ trace_identifiers_result->span_id = NUM2ULL(numeric_span_id);
862
+
863
+ trace_identifiers_result->valid = true;
864
+
865
+ VALUE root_span_type = rb_ivar_get(root_span, at_type_id /* @type */);
866
+ if (root_span_type == Qnil || !is_type_web(root_span_type)) return;
867
+
868
+ VALUE trace_resource = rb_ivar_get(active_trace, at_resource_id /* @resource */);
869
+ if (RB_TYPE_P(trace_resource, T_STRING)) {
870
+ trace_identifiers_result->trace_endpoint = trace_resource;
871
+ } else if (trace_resource == Qnil) {
872
+ // Fall back to resource from span, if any
873
+ trace_identifiers_result->trace_endpoint = rb_ivar_get(root_span, at_resource_id /* @resource */);
874
+ }
875
+ }
876
+
877
+ static bool is_type_web(VALUE root_span_type) {
878
+ ENFORCE_TYPE(root_span_type, T_STRING);
879
+
880
+ return RSTRING_LEN(root_span_type) == strlen("web") &&
881
+ (memcmp("web", StringValuePtr(root_span_type), strlen("web")) == 0);
882
+ }
883
+
884
+ // After the Ruby VM forks, this method gets called in the child process to clean up any leftover state from the parent.
885
+ //
886
+ // Assumption: This method gets called BEFORE restarting profiling -- e.g. there are no components attempting to
887
+ // trigger samples at the same time.
888
+ 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);
891
+
892
+ st_clear(state->hash_map_per_thread_context);
893
+
894
+ state->stats = (struct stats) {}; // Resets all stats back to zero
895
+
896
+ rb_funcall(state->recorder_instance, rb_intern("reset_after_fork"), 0);
897
+
898
+ return Qtrue;
899
+ }