ddtrace 0.54.2 → 1.4.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 (1160) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +283 -1
  3. data/LICENSE-3rdparty.csv +5 -1
  4. data/README.md +10 -1
  5. data/bin/ddtracerb +5 -5
  6. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +118 -0
  7. data/ext/ddtrace_profiling_loader/extconf.rb +54 -0
  8. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +43 -9
  9. data/ext/ddtrace_profiling_native_extension/clock_id.h +21 -1
  10. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +31 -10
  11. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +390 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +6 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +391 -0
  15. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +282 -0
  16. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +9 -0
  17. data/ext/ddtrace_profiling_native_extension/extconf.rb +140 -113
  18. data/ext/ddtrace_profiling_native_extension/helpers.h +12 -0
  19. data/ext/ddtrace_profiling_native_extension/http_transport.c +334 -0
  20. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +14 -0
  21. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +290 -0
  22. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +665 -8
  23. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +30 -0
  24. data/ext/ddtrace_profiling_native_extension/profiling.c +16 -2
  25. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +25 -0
  26. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +65 -0
  27. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +422 -0
  28. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +38 -0
  29. data/lib/datadog/appsec/assets/blocked.html +4 -0
  30. data/lib/datadog/appsec/assets/waf_rules/README.md +7 -0
  31. data/lib/datadog/appsec/assets/waf_rules/recommended.json +5638 -0
  32. data/lib/datadog/appsec/assets/waf_rules/risky.json +1499 -0
  33. data/lib/datadog/appsec/assets/waf_rules/strict.json +1298 -0
  34. data/lib/datadog/appsec/assets.rb +38 -0
  35. data/lib/datadog/appsec/autoload.rb +18 -0
  36. data/lib/datadog/appsec/configuration/settings.rb +194 -0
  37. data/lib/datadog/appsec/configuration.rb +80 -0
  38. data/lib/datadog/appsec/contrib/auto_instrument.rb +27 -0
  39. data/lib/datadog/appsec/contrib/configuration/settings.rb +20 -0
  40. data/lib/datadog/appsec/contrib/integration.rb +37 -0
  41. data/lib/datadog/appsec/contrib/patcher.rb +12 -0
  42. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +22 -0
  43. data/lib/datadog/appsec/contrib/rack/ext.rb +15 -0
  44. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +169 -0
  45. data/lib/datadog/appsec/contrib/rack/integration.rb +49 -0
  46. data/lib/datadog/appsec/contrib/rack/patcher.rb +32 -0
  47. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +87 -0
  48. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +64 -0
  49. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +64 -0
  50. data/lib/datadog/appsec/contrib/rack/request.rb +58 -0
  51. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +41 -0
  52. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +112 -0
  53. data/lib/datadog/appsec/contrib/rack/response.rb +24 -0
  54. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +22 -0
  55. data/lib/datadog/appsec/contrib/rails/ext.rb +15 -0
  56. data/lib/datadog/appsec/contrib/rails/framework.rb +30 -0
  57. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +81 -0
  58. data/lib/datadog/appsec/contrib/rails/integration.rb +48 -0
  59. data/lib/datadog/appsec/contrib/rails/patcher.rb +162 -0
  60. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +68 -0
  61. data/lib/datadog/appsec/contrib/rails/request.rb +33 -0
  62. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +20 -0
  63. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +22 -0
  64. data/lib/datadog/appsec/contrib/sinatra/ext.rb +15 -0
  65. data/lib/datadog/appsec/contrib/sinatra/framework.rb +34 -0
  66. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +124 -0
  67. data/lib/datadog/appsec/contrib/sinatra/integration.rb +48 -0
  68. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +148 -0
  69. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +63 -0
  70. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +20 -0
  71. data/lib/datadog/appsec/event.rb +121 -0
  72. data/lib/datadog/appsec/extensions.rb +118 -0
  73. data/lib/datadog/appsec/instrumentation/gateway.rb +44 -0
  74. data/lib/datadog/appsec/processor.rb +164 -0
  75. data/lib/datadog/appsec/rate_limiter.rb +60 -0
  76. data/lib/datadog/appsec/reactive/address_hash.rb +18 -0
  77. data/lib/datadog/appsec/reactive/engine.rb +44 -0
  78. data/lib/datadog/appsec/reactive/operation.rb +51 -0
  79. data/lib/datadog/appsec/reactive/subscriber.rb +18 -0
  80. data/lib/datadog/appsec.rb +23 -0
  81. data/lib/datadog/ci/configuration/components.rb +9 -8
  82. data/lib/datadog/ci/configuration/settings.rb +20 -4
  83. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +5 -3
  84. data/lib/datadog/ci/contrib/cucumber/ext.rb +2 -0
  85. data/lib/datadog/ci/contrib/cucumber/formatter.rb +9 -14
  86. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +3 -2
  87. data/lib/datadog/ci/contrib/cucumber/integration.rb +6 -5
  88. data/lib/datadog/ci/contrib/cucumber/patcher.rb +4 -3
  89. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +5 -3
  90. data/lib/datadog/ci/contrib/rspec/example.rb +9 -14
  91. data/lib/datadog/ci/contrib/rspec/ext.rb +2 -0
  92. data/lib/datadog/ci/contrib/rspec/integration.rb +6 -5
  93. data/lib/datadog/ci/contrib/rspec/patcher.rb +4 -3
  94. data/lib/datadog/ci/ext/app_types.rb +2 -1
  95. data/lib/datadog/ci/ext/environment.rb +135 -115
  96. data/lib/datadog/ci/ext/settings.rb +2 -1
  97. data/lib/datadog/ci/ext/test.rb +1 -0
  98. data/lib/datadog/ci/extensions.rb +7 -6
  99. data/lib/datadog/ci/flush.rb +38 -0
  100. data/lib/datadog/ci/test.rb +17 -15
  101. data/lib/datadog/ci.rb +7 -4
  102. data/lib/datadog/core/buffer/cruby.rb +55 -0
  103. data/lib/datadog/core/buffer/random.rb +134 -0
  104. data/lib/datadog/core/buffer/thread_safe.rb +58 -0
  105. data/lib/datadog/core/chunker.rb +35 -0
  106. data/lib/datadog/core/configuration/agent_settings_resolver.rb +365 -0
  107. data/lib/datadog/core/configuration/base.rb +98 -0
  108. data/lib/datadog/core/configuration/components.rb +429 -0
  109. data/lib/datadog/core/configuration/dependency_resolver.rb +28 -0
  110. data/lib/datadog/core/configuration/option.rb +69 -0
  111. data/lib/datadog/core/configuration/option_definition.rb +126 -0
  112. data/lib/datadog/core/configuration/option_definition_set.rb +22 -0
  113. data/lib/datadog/core/configuration/option_set.rb +10 -0
  114. data/lib/datadog/core/configuration/options.rb +118 -0
  115. data/lib/datadog/core/configuration/settings.rb +652 -0
  116. data/lib/datadog/core/configuration.rb +289 -0
  117. data/lib/datadog/core/diagnostics/environment_logger.rb +283 -0
  118. data/lib/datadog/core/diagnostics/ext.rb +41 -0
  119. data/lib/datadog/core/diagnostics/health.rb +37 -0
  120. data/lib/datadog/core/encoding.rb +76 -0
  121. data/lib/datadog/core/environment/cgroup.rb +5 -2
  122. data/lib/datadog/core/environment/class_count.rb +1 -0
  123. data/lib/datadog/core/environment/container.rb +4 -2
  124. data/lib/datadog/core/environment/ext.rb +29 -10
  125. data/lib/datadog/core/environment/gc.rb +1 -0
  126. data/lib/datadog/core/environment/identity.rb +12 -5
  127. data/lib/datadog/core/environment/platform.rb +40 -0
  128. data/lib/datadog/core/environment/socket.rb +9 -2
  129. data/lib/datadog/core/environment/thread_count.rb +1 -0
  130. data/lib/datadog/core/environment/variable_helpers.rb +28 -2
  131. data/lib/datadog/core/environment/vm_cache.rb +1 -0
  132. data/lib/datadog/core/error.rb +101 -0
  133. data/lib/datadog/core/extensions.rb +16 -0
  134. data/lib/datadog/core/git/ext.rb +35 -0
  135. data/lib/datadog/core/logger.rb +46 -0
  136. data/lib/datadog/core/logging/ext.rb +11 -0
  137. data/lib/datadog/core/metrics/client.rb +198 -0
  138. data/lib/datadog/core/metrics/ext.rb +20 -0
  139. data/lib/datadog/core/metrics/helpers.rb +25 -0
  140. data/lib/datadog/core/metrics/logging.rb +44 -0
  141. data/lib/datadog/core/metrics/metric.rb +14 -0
  142. data/lib/datadog/core/metrics/options.rb +50 -0
  143. data/lib/datadog/core/pin.rb +75 -0
  144. data/lib/datadog/core/runtime/ext.rb +28 -0
  145. data/lib/datadog/core/runtime/metrics.rb +126 -0
  146. data/lib/datadog/core/telemetry/client.rb +79 -0
  147. data/lib/datadog/core/telemetry/collector.rb +234 -0
  148. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  149. data/lib/datadog/core/telemetry/event.rb +71 -0
  150. data/lib/datadog/core/telemetry/ext.rb +11 -0
  151. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  152. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  153. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  154. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  155. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  156. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  157. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  158. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  159. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  160. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  161. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  162. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  163. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  164. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  165. data/lib/datadog/core/utils/compression.rb +32 -0
  166. data/lib/datadog/core/utils/forking.rb +63 -0
  167. data/lib/datadog/core/utils/object_set.rb +43 -0
  168. data/lib/datadog/core/utils/only_once.rb +44 -0
  169. data/lib/datadog/core/utils/safe_dup.rb +27 -0
  170. data/lib/datadog/core/utils/sequence.rb +26 -0
  171. data/lib/datadog/core/utils/string_table.rb +49 -0
  172. data/lib/datadog/core/utils/time.rb +54 -0
  173. data/lib/datadog/core/utils.rb +115 -0
  174. data/lib/{ddtrace → datadog/core}/vendor/multipart-post/LICENSE +0 -0
  175. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +120 -0
  176. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +61 -0
  177. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +139 -0
  178. data/lib/datadog/core/vendor/multipart-post/multipart/post/version.rb +13 -0
  179. data/lib/datadog/core/vendor/multipart-post/multipart/post.rb +12 -0
  180. data/lib/datadog/core/vendor/multipart-post/multipart.rb +16 -0
  181. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +36 -0
  182. data/lib/datadog/core/worker.rb +24 -0
  183. data/lib/datadog/core/workers/async.rb +182 -0
  184. data/lib/datadog/core/workers/interval_loop.rb +119 -0
  185. data/lib/datadog/core/workers/polling.rb +59 -0
  186. data/lib/datadog/core/workers/queue.rb +44 -0
  187. data/lib/datadog/core/workers/runtime_metrics.rb +62 -0
  188. data/lib/datadog/core.rb +80 -0
  189. data/lib/datadog/kit/enable_core_dumps.rb +50 -0
  190. data/lib/datadog/kit/identity.rb +63 -0
  191. data/lib/datadog/kit.rb +11 -0
  192. data/lib/datadog/opentracer/binary_propagator.rb +26 -0
  193. data/lib/datadog/opentracer/carrier.rb +9 -0
  194. data/lib/datadog/opentracer/distributed_headers.rb +58 -0
  195. data/lib/datadog/opentracer/global_tracer.rb +17 -0
  196. data/lib/datadog/opentracer/propagator.rb +26 -0
  197. data/lib/datadog/opentracer/rack_propagator.rb +76 -0
  198. data/lib/datadog/opentracer/scope.rb +18 -0
  199. data/lib/datadog/opentracer/scope_manager.rb +9 -0
  200. data/lib/datadog/opentracer/span.rb +101 -0
  201. data/lib/datadog/opentracer/span_context.rb +19 -0
  202. data/lib/datadog/opentracer/span_context_factory.rb +27 -0
  203. data/lib/datadog/opentracer/text_map_propagator.rb +90 -0
  204. data/lib/datadog/opentracer/thread_local_scope.rb +34 -0
  205. data/lib/datadog/opentracer/thread_local_scope_manager.rb +66 -0
  206. data/lib/datadog/opentracer/tracer.rb +216 -0
  207. data/lib/datadog/opentracer.rb +24 -0
  208. data/lib/datadog/profiling/backtrace_location.rb +34 -0
  209. data/lib/datadog/profiling/buffer.rb +43 -0
  210. data/lib/datadog/profiling/collectors/code_provenance.rb +115 -0
  211. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +27 -0
  212. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +74 -0
  213. data/lib/datadog/profiling/collectors/old_stack.rb +298 -0
  214. data/lib/datadog/profiling/collectors/stack.rb +13 -0
  215. data/lib/datadog/profiling/encoding/profile.rb +43 -0
  216. data/lib/datadog/profiling/event.rb +15 -0
  217. data/lib/datadog/profiling/events/stack.rb +82 -0
  218. data/lib/datadog/profiling/exporter.rb +82 -0
  219. data/lib/datadog/profiling/ext/forking.rb +98 -0
  220. data/lib/datadog/profiling/ext.rb +45 -0
  221. data/lib/datadog/profiling/flush.rb +38 -0
  222. data/lib/datadog/profiling/http_transport.rb +132 -0
  223. data/lib/datadog/profiling/load_native_extension.rb +22 -0
  224. data/lib/datadog/profiling/native_extension.rb +41 -0
  225. data/lib/datadog/profiling/old_ext.rb +42 -0
  226. data/lib/datadog/profiling/old_recorder.rb +101 -0
  227. data/lib/datadog/profiling/pprof/builder.rb +127 -0
  228. data/lib/datadog/profiling/pprof/converter.rb +104 -0
  229. data/lib/datadog/profiling/pprof/message_set.rb +16 -0
  230. data/lib/datadog/profiling/pprof/payload.rb +20 -0
  231. data/lib/{ddtrace → datadog}/profiling/pprof/pprof.proto +0 -0
  232. data/lib/datadog/profiling/pprof/pprof_pb.rb +83 -0
  233. data/lib/datadog/profiling/pprof/stack_sample.rb +141 -0
  234. data/lib/datadog/profiling/pprof/string_table.rb +12 -0
  235. data/lib/datadog/profiling/pprof/template.rb +120 -0
  236. data/lib/datadog/profiling/preload.rb +5 -0
  237. data/lib/datadog/profiling/profiler.rb +34 -0
  238. data/lib/datadog/profiling/scheduler.rb +133 -0
  239. data/lib/datadog/profiling/stack_recorder.rb +43 -0
  240. data/lib/datadog/profiling/tag_builder.rb +53 -0
  241. data/lib/datadog/profiling/tasks/exec.rb +50 -0
  242. data/lib/datadog/profiling/tasks/help.rb +18 -0
  243. data/lib/datadog/profiling/tasks/setup.rb +93 -0
  244. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +45 -0
  245. data/lib/datadog/profiling/trace_identifiers/helper.rb +47 -0
  246. data/lib/datadog/profiling/transport/http/api/endpoint.rb +85 -0
  247. data/lib/datadog/profiling/transport/http/api/instance.rb +38 -0
  248. data/lib/datadog/profiling/transport/http/api/spec.rb +42 -0
  249. data/lib/datadog/profiling/transport/http/api.rb +45 -0
  250. data/lib/datadog/profiling/transport/http/builder.rb +30 -0
  251. data/lib/datadog/profiling/transport/http/client.rb +37 -0
  252. data/lib/datadog/profiling/transport/http/response.rb +21 -0
  253. data/lib/datadog/profiling/transport/http.rb +118 -0
  254. data/lib/datadog/profiling.rb +171 -0
  255. data/lib/datadog/tracing/analytics.rb +25 -0
  256. data/lib/datadog/tracing/buffer.rb +132 -0
  257. data/lib/datadog/tracing/configuration/ext.rb +51 -0
  258. data/lib/datadog/tracing/context.rb +68 -0
  259. data/lib/datadog/tracing/context_provider.rb +82 -0
  260. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +35 -0
  261. data/lib/datadog/tracing/contrib/action_cable/event.rb +71 -0
  262. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +58 -0
  263. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +63 -0
  264. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +59 -0
  265. data/lib/datadog/tracing/contrib/action_cable/events.rb +37 -0
  266. data/lib/datadog/tracing/contrib/action_cable/ext.rb +32 -0
  267. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +90 -0
  268. data/lib/datadog/tracing/contrib/action_cable/integration.rb +50 -0
  269. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +31 -0
  270. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +36 -0
  271. data/lib/datadog/tracing/contrib/action_mailer/event.rb +52 -0
  272. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +60 -0
  273. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +47 -0
  274. data/lib/datadog/tracing/contrib/action_mailer/events.rb +34 -0
  275. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +33 -0
  276. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +50 -0
  277. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +29 -0
  278. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +160 -0
  279. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +29 -0
  280. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +36 -0
  281. data/lib/datadog/tracing/contrib/action_pack/ext.rb +22 -0
  282. data/lib/datadog/tracing/contrib/action_pack/integration.rb +50 -0
  283. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +27 -0
  284. data/lib/datadog/tracing/contrib/action_pack/utils.rb +40 -0
  285. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +36 -0
  286. data/lib/datadog/tracing/contrib/action_view/event.rb +35 -0
  287. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +54 -0
  288. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +57 -0
  289. data/lib/datadog/tracing/contrib/action_view/events.rb +34 -0
  290. data/lib/datadog/tracing/contrib/action_view/ext.rb +24 -0
  291. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +78 -0
  292. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +91 -0
  293. data/lib/datadog/tracing/contrib/action_view/integration.rb +57 -0
  294. data/lib/datadog/tracing/contrib/action_view/patcher.rb +47 -0
  295. data/lib/datadog/tracing/contrib/action_view/utils.rb +36 -0
  296. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +37 -0
  297. data/lib/datadog/tracing/contrib/active_job/event.rb +58 -0
  298. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +50 -0
  299. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +49 -0
  300. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +49 -0
  301. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +51 -0
  302. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +49 -0
  303. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +50 -0
  304. data/lib/datadog/tracing/contrib/active_job/events.rb +42 -0
  305. data/lib/datadog/tracing/contrib/active_job/ext.rb +39 -0
  306. data/lib/datadog/tracing/contrib/active_job/integration.rb +50 -0
  307. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +24 -0
  308. data/lib/datadog/tracing/contrib/active_job/patcher.rb +36 -0
  309. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +33 -0
  310. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +68 -0
  311. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +45 -0
  312. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +47 -0
  313. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +34 -0
  314. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +24 -0
  315. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +45 -0
  316. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +32 -0
  317. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +36 -0
  318. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +138 -0
  319. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +39 -0
  320. data/lib/datadog/tracing/contrib/active_record/event.rb +30 -0
  321. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +58 -0
  322. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +78 -0
  323. data/lib/datadog/tracing/contrib/active_record/events.rb +34 -0
  324. data/lib/datadog/tracing/contrib/active_record/ext.rb +29 -0
  325. data/lib/datadog/tracing/contrib/active_record/integration.rb +56 -0
  326. data/lib/datadog/tracing/contrib/active_record/patcher.rb +27 -0
  327. data/lib/datadog/tracing/contrib/active_record/utils.rb +128 -0
  328. data/lib/{ddtrace/vendor/active_record → datadog/tracing/contrib/active_record/vendor}/MIT-LICENSE +0 -0
  329. data/lib/datadog/tracing/contrib/active_record/vendor/connection_specification.rb +307 -0
  330. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +280 -0
  331. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +73 -0
  332. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +47 -0
  333. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +35 -0
  334. data/lib/datadog/tracing/contrib/active_support/ext.rb +31 -0
  335. data/lib/datadog/tracing/contrib/active_support/integration.rb +51 -0
  336. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +71 -0
  337. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +71 -0
  338. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +164 -0
  339. data/lib/datadog/tracing/contrib/active_support/patcher.rb +27 -0
  340. data/lib/datadog/tracing/contrib/analytics.rb +29 -0
  341. data/lib/datadog/tracing/contrib/auto_instrument.rb +53 -0
  342. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +35 -0
  343. data/lib/datadog/tracing/contrib/aws/ext.rb +27 -0
  344. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +94 -0
  345. data/lib/datadog/tracing/contrib/aws/integration.rb +47 -0
  346. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +60 -0
  347. data/lib/datadog/tracing/contrib/aws/patcher.rb +57 -0
  348. data/lib/datadog/tracing/contrib/aws/services.rb +123 -0
  349. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +23 -0
  350. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +53 -0
  351. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +16 -0
  352. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +27 -0
  353. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +43 -0
  354. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +33 -0
  355. data/lib/datadog/tracing/contrib/configurable.rb +102 -0
  356. data/lib/datadog/tracing/contrib/configuration/resolver.rb +85 -0
  357. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +43 -0
  358. data/lib/datadog/tracing/contrib/configuration/settings.rb +43 -0
  359. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +35 -0
  360. data/lib/datadog/tracing/contrib/dalli/ext.rb +24 -0
  361. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +57 -0
  362. data/lib/datadog/tracing/contrib/dalli/integration.rb +52 -0
  363. data/lib/datadog/tracing/contrib/dalli/patcher.rb +28 -0
  364. data/lib/datadog/tracing/contrib/dalli/quantize.rb +26 -0
  365. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +38 -0
  366. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +28 -0
  367. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +43 -0
  368. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +37 -0
  369. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +100 -0
  370. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  371. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +36 -0
  372. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +26 -0
  373. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +50 -0
  374. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +150 -0
  375. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +89 -0
  376. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +37 -0
  377. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +176 -0
  378. data/lib/datadog/tracing/contrib/ethon/ext.rb +24 -0
  379. data/lib/datadog/tracing/contrib/ethon/integration.rb +48 -0
  380. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +95 -0
  381. data/lib/datadog/tracing/contrib/ethon/patcher.rb +31 -0
  382. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +38 -0
  383. data/lib/datadog/tracing/contrib/excon/ext.rb +21 -0
  384. data/lib/datadog/tracing/contrib/excon/integration.rb +48 -0
  385. data/lib/datadog/tracing/contrib/excon/middleware.rb +169 -0
  386. data/lib/datadog/tracing/contrib/excon/patcher.rb +31 -0
  387. data/lib/datadog/tracing/contrib/extensions.rb +199 -0
  388. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +42 -0
  389. data/lib/datadog/tracing/contrib/faraday/connection.rb +22 -0
  390. data/lib/datadog/tracing/contrib/faraday/ext.rb +21 -0
  391. data/lib/datadog/tracing/contrib/faraday/integration.rb +48 -0
  392. data/lib/datadog/tracing/contrib/faraday/middleware.rb +92 -0
  393. data/lib/datadog/tracing/contrib/faraday/patcher.rb +56 -0
  394. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +22 -0
  395. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +42 -0
  396. data/lib/datadog/tracing/contrib/grape/endpoint.rb +252 -0
  397. data/lib/datadog/tracing/contrib/grape/ext.rb +28 -0
  398. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +37 -0
  399. data/lib/datadog/tracing/contrib/grape/integration.rb +44 -0
  400. data/lib/datadog/tracing/contrib/grape/patcher.rb +33 -0
  401. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +36 -0
  402. data/lib/datadog/tracing/contrib/graphql/ext.rb +19 -0
  403. data/lib/datadog/tracing/contrib/graphql/integration.rb +44 -0
  404. data/lib/datadog/tracing/contrib/graphql/patcher.rb +90 -0
  405. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +38 -0
  406. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +93 -0
  407. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +90 -0
  408. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +107 -0
  409. data/lib/datadog/tracing/contrib/grpc/ext.rb +24 -0
  410. data/lib/datadog/tracing/contrib/grpc/integration.rb +43 -0
  411. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +53 -0
  412. data/lib/datadog/tracing/contrib/grpc/patcher.rb +37 -0
  413. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +43 -0
  414. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +37 -0
  415. data/lib/datadog/tracing/contrib/http/ext.rb +21 -0
  416. data/lib/datadog/tracing/contrib/http/instrumentation.rb +138 -0
  417. data/lib/datadog/tracing/contrib/http/integration.rb +49 -0
  418. data/lib/datadog/tracing/contrib/http/patcher.rb +30 -0
  419. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +17 -0
  420. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +37 -0
  421. data/lib/datadog/tracing/contrib/httpclient/ext.rb +21 -0
  422. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +116 -0
  423. data/lib/datadog/tracing/contrib/httpclient/integration.rb +48 -0
  424. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +42 -0
  425. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +37 -0
  426. data/lib/datadog/tracing/contrib/httprb/ext.rb +21 -0
  427. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +127 -0
  428. data/lib/datadog/tracing/contrib/httprb/integration.rb +48 -0
  429. data/lib/datadog/tracing/contrib/httprb/patcher.rb +42 -0
  430. data/lib/datadog/tracing/contrib/integration.rb +78 -0
  431. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +35 -0
  432. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +18 -0
  433. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +18 -0
  434. data/lib/datadog/tracing/contrib/kafka/event.rb +52 -0
  435. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +42 -0
  436. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +49 -0
  437. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +47 -0
  438. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +47 -0
  439. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +37 -0
  440. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +37 -0
  441. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +37 -0
  442. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +40 -0
  443. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +43 -0
  444. data/lib/datadog/tracing/contrib/kafka/events.rb +48 -0
  445. data/lib/datadog/tracing/contrib/kafka/ext.rb +52 -0
  446. data/lib/datadog/tracing/contrib/kafka/integration.rb +44 -0
  447. data/lib/datadog/tracing/contrib/kafka/patcher.rb +29 -0
  448. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +23 -0
  449. data/lib/datadog/tracing/contrib/lograge/ext.rb +15 -0
  450. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +46 -0
  451. data/lib/datadog/tracing/contrib/lograge/integration.rb +50 -0
  452. data/lib/datadog/tracing/contrib/lograge/patcher.rb +29 -0
  453. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +38 -0
  454. data/lib/datadog/tracing/contrib/mongodb/ext.rb +27 -0
  455. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +47 -0
  456. data/lib/datadog/tracing/contrib/mongodb/integration.rb +48 -0
  457. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +49 -0
  458. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +34 -0
  459. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +121 -0
  460. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +35 -0
  461. data/lib/datadog/tracing/contrib/mysql2/ext.rb +22 -0
  462. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +61 -0
  463. data/lib/datadog/tracing/contrib/mysql2/integration.rb +43 -0
  464. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +31 -0
  465. data/lib/datadog/tracing/contrib/patchable.rb +109 -0
  466. data/lib/datadog/tracing/contrib/patcher.rb +85 -0
  467. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +35 -0
  468. data/lib/datadog/tracing/contrib/pg/ext.rb +31 -0
  469. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +128 -0
  470. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  471. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  472. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +35 -0
  473. data/lib/datadog/tracing/contrib/presto/ext.rb +32 -0
  474. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +124 -0
  475. data/lib/datadog/tracing/contrib/presto/integration.rb +43 -0
  476. data/lib/datadog/tracing/contrib/presto/patcher.rb +37 -0
  477. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +40 -0
  478. data/lib/datadog/tracing/contrib/qless/ext.rb +26 -0
  479. data/lib/datadog/tracing/contrib/qless/integration.rb +43 -0
  480. data/lib/datadog/tracing/contrib/qless/patcher.rb +37 -0
  481. data/lib/datadog/tracing/contrib/qless/qless_job.rb +74 -0
  482. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +30 -0
  483. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +49 -0
  484. data/lib/datadog/tracing/contrib/que/ext.rb +34 -0
  485. data/lib/datadog/tracing/contrib/que/integration.rb +46 -0
  486. data/lib/datadog/tracing/contrib/que/patcher.rb +28 -0
  487. data/lib/datadog/tracing/contrib/que/tracer.rb +61 -0
  488. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +35 -0
  489. data/lib/datadog/tracing/contrib/racecar/event.rb +78 -0
  490. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +35 -0
  491. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +35 -0
  492. data/lib/datadog/tracing/contrib/racecar/events/message.rb +35 -0
  493. data/lib/datadog/tracing/contrib/racecar/events.rb +36 -0
  494. data/lib/datadog/tracing/contrib/racecar/ext.rb +31 -0
  495. data/lib/datadog/tracing/contrib/racecar/integration.rb +44 -0
  496. data/lib/datadog/tracing/contrib/racecar/patcher.rb +29 -0
  497. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +51 -0
  498. data/lib/datadog/tracing/contrib/rack/ext.rb +25 -0
  499. data/lib/datadog/tracing/contrib/rack/integration.rb +50 -0
  500. data/lib/datadog/tracing/contrib/rack/middlewares.rb +259 -0
  501. data/lib/datadog/tracing/contrib/rack/patcher.rb +119 -0
  502. data/lib/datadog/tracing/contrib/rack/request_queue.rb +48 -0
  503. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +12 -0
  504. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +74 -0
  505. data/lib/datadog/tracing/contrib/rails/ext.rb +19 -0
  506. data/lib/datadog/tracing/contrib/rails/framework.rb +148 -0
  507. data/lib/datadog/tracing/contrib/rails/integration.rb +49 -0
  508. data/lib/datadog/tracing/contrib/rails/log_injection.rb +32 -0
  509. data/lib/datadog/tracing/contrib/rails/middlewares.rb +46 -0
  510. data/lib/datadog/tracing/contrib/rails/patcher.rb +120 -0
  511. data/lib/datadog/tracing/contrib/rails/railtie.rb +19 -0
  512. data/lib/datadog/tracing/contrib/rails/utils.rb +28 -0
  513. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +51 -0
  514. data/lib/datadog/tracing/contrib/rake/ext.rb +26 -0
  515. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +103 -0
  516. data/lib/datadog/tracing/contrib/rake/integration.rb +43 -0
  517. data/lib/datadog/tracing/contrib/rake/patcher.rb +33 -0
  518. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +49 -0
  519. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +40 -0
  520. data/lib/datadog/tracing/contrib/redis/ext.rb +26 -0
  521. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +77 -0
  522. data/lib/datadog/tracing/contrib/redis/integration.rb +47 -0
  523. data/lib/datadog/tracing/contrib/redis/patcher.rb +35 -0
  524. data/lib/datadog/tracing/contrib/redis/quantize.rb +79 -0
  525. data/lib/datadog/tracing/contrib/redis/tags.rb +53 -0
  526. data/lib/{ddtrace → datadog/tracing}/contrib/redis/vendor/LICENSE +0 -0
  527. data/lib/datadog/tracing/contrib/redis/vendor/resolver.rb +162 -0
  528. data/lib/datadog/tracing/contrib/registerable.rb +50 -0
  529. data/lib/datadog/tracing/contrib/registry.rb +52 -0
  530. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +37 -0
  531. data/lib/datadog/tracing/contrib/resque/ext.rb +21 -0
  532. data/lib/datadog/tracing/contrib/resque/integration.rb +48 -0
  533. data/lib/datadog/tracing/contrib/resque/patcher.rb +29 -0
  534. data/lib/datadog/tracing/contrib/resque/resque_job.rb +102 -0
  535. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +37 -0
  536. data/lib/datadog/tracing/contrib/rest_client/ext.rb +21 -0
  537. data/lib/datadog/tracing/contrib/rest_client/integration.rb +43 -0
  538. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +29 -0
  539. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +104 -0
  540. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +23 -0
  541. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +15 -0
  542. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +50 -0
  543. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +52 -0
  544. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +29 -0
  545. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +33 -0
  546. data/lib/datadog/tracing/contrib/sequel/database.rb +59 -0
  547. data/lib/datadog/tracing/contrib/sequel/dataset.rb +64 -0
  548. data/lib/datadog/tracing/contrib/sequel/ext.rb +22 -0
  549. data/lib/datadog/tracing/contrib/sequel/integration.rb +43 -0
  550. data/lib/datadog/tracing/contrib/sequel/patcher.rb +37 -0
  551. data/lib/datadog/tracing/contrib/sequel/utils.rb +87 -0
  552. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +38 -0
  553. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +25 -0
  554. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +44 -0
  555. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +28 -0
  556. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +61 -0
  557. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +52 -0
  558. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +44 -0
  559. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +44 -0
  560. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +53 -0
  561. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +78 -0
  562. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +52 -0
  563. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +34 -0
  564. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +32 -0
  565. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  566. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +97 -0
  567. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +44 -0
  568. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +43 -0
  569. data/lib/datadog/tracing/contrib/sinatra/env.rb +66 -0
  570. data/lib/datadog/tracing/contrib/sinatra/ext.rb +32 -0
  571. data/lib/datadog/tracing/contrib/sinatra/framework.rb +116 -0
  572. data/lib/datadog/tracing/contrib/sinatra/headers.rb +35 -0
  573. data/lib/datadog/tracing/contrib/sinatra/integration.rb +43 -0
  574. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +76 -0
  575. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +158 -0
  576. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +122 -0
  577. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +38 -0
  578. data/lib/datadog/tracing/contrib/sneakers/ext.rb +26 -0
  579. data/lib/datadog/tracing/contrib/sneakers/integration.rb +46 -0
  580. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +29 -0
  581. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +57 -0
  582. data/lib/datadog/tracing/contrib/status_code_matcher.rb +75 -0
  583. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +35 -0
  584. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +28 -0
  585. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +27 -0
  586. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +104 -0
  587. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +43 -0
  588. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +36 -0
  589. data/lib/datadog/tracing/contrib/utils/database.rb +31 -0
  590. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +111 -0
  591. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +99 -0
  592. data/lib/datadog/tracing/contrib.rb +77 -0
  593. data/lib/datadog/tracing/correlation.rb +100 -0
  594. data/lib/datadog/tracing/distributed/headers/b3.rb +55 -0
  595. data/lib/datadog/tracing/distributed/headers/b3_single.rb +67 -0
  596. data/lib/datadog/tracing/distributed/headers/datadog.rb +52 -0
  597. data/lib/datadog/tracing/distributed/headers/ext.rb +31 -0
  598. data/lib/datadog/tracing/distributed/headers/parser.rb +37 -0
  599. data/lib/datadog/tracing/distributed/helpers.rb +78 -0
  600. data/lib/datadog/tracing/distributed/metadata/b3.rb +55 -0
  601. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +66 -0
  602. data/lib/datadog/tracing/distributed/metadata/datadog.rb +73 -0
  603. data/lib/datadog/tracing/distributed/metadata/parser.rb +34 -0
  604. data/lib/datadog/tracing/event.rb +78 -0
  605. data/lib/datadog/tracing/flush.rb +74 -0
  606. data/lib/datadog/tracing/metadata/analytics.rb +26 -0
  607. data/lib/datadog/tracing/metadata/errors.rb +24 -0
  608. data/lib/datadog/tracing/metadata/ext.rb +176 -0
  609. data/lib/datadog/tracing/metadata/tagging.rb +116 -0
  610. data/lib/datadog/tracing/metadata.rb +20 -0
  611. data/lib/datadog/tracing/pipeline/span_filter.rb +46 -0
  612. data/lib/datadog/tracing/pipeline/span_processor.rb +39 -0
  613. data/lib/datadog/tracing/pipeline.rb +65 -0
  614. data/lib/datadog/tracing/propagation/grpc.rb +98 -0
  615. data/lib/datadog/tracing/propagation/http.rb +109 -0
  616. data/lib/datadog/tracing/runtime/metrics.rb +19 -0
  617. data/lib/datadog/tracing/sampling/all_sampler.rb +25 -0
  618. data/lib/datadog/tracing/sampling/ext.rb +27 -0
  619. data/lib/datadog/tracing/sampling/matcher.rb +68 -0
  620. data/lib/datadog/tracing/sampling/priority_sampler.rb +112 -0
  621. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +97 -0
  622. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +41 -0
  623. data/lib/datadog/tracing/sampling/rate_limiter.rb +185 -0
  624. data/lib/datadog/tracing/sampling/rate_sampler.rb +55 -0
  625. data/lib/datadog/tracing/sampling/rule.rb +76 -0
  626. data/lib/datadog/tracing/sampling/rule_sampler.rb +131 -0
  627. data/lib/datadog/tracing/sampling/sampler.rb +44 -0
  628. data/lib/datadog/tracing/sampling/span/matcher.rb +80 -0
  629. data/lib/datadog/tracing/span.rb +232 -0
  630. data/lib/datadog/tracing/span_operation.rb +521 -0
  631. data/lib/datadog/tracing/sync_writer.rb +69 -0
  632. data/lib/datadog/tracing/trace_digest.rb +60 -0
  633. data/lib/datadog/tracing/trace_operation.rb +438 -0
  634. data/lib/datadog/tracing/trace_segment.rb +207 -0
  635. data/lib/datadog/tracing/tracer.rb +505 -0
  636. data/lib/datadog/tracing/workers/trace_writer.rb +195 -0
  637. data/lib/datadog/tracing/workers.rb +125 -0
  638. data/lib/datadog/tracing/writer.rb +180 -0
  639. data/lib/datadog/tracing.rb +142 -0
  640. data/lib/ddtrace/auto_instrument.rb +14 -3
  641. data/lib/ddtrace/auto_instrument_base.rb +1 -0
  642. data/lib/ddtrace/profiling/preload.rb +2 -2
  643. data/lib/ddtrace/transport/ext.rb +41 -0
  644. data/lib/ddtrace/transport/http/adapters/net.rb +5 -3
  645. data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
  646. data/lib/ddtrace/transport/http/adapters/test.rb +2 -1
  647. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -3
  648. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  649. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  650. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  651. data/lib/ddtrace/transport/http/api/map.rb +2 -1
  652. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  653. data/lib/ddtrace/transport/http/api.rb +8 -14
  654. data/lib/ddtrace/transport/http/builder.rb +7 -6
  655. data/lib/ddtrace/transport/http/client.rb +5 -3
  656. data/lib/ddtrace/transport/http/env.rb +1 -0
  657. data/lib/ddtrace/transport/http/response.rb +36 -5
  658. data/lib/ddtrace/transport/http/statistics.rb +2 -1
  659. data/lib/ddtrace/transport/http/traces.rb +6 -3
  660. data/lib/ddtrace/transport/http.rb +39 -31
  661. data/lib/ddtrace/transport/io/client.rb +6 -3
  662. data/lib/ddtrace/transport/io/response.rb +2 -1
  663. data/lib/ddtrace/transport/io/traces.rb +5 -4
  664. data/lib/ddtrace/transport/io.rb +5 -4
  665. data/lib/ddtrace/transport/parcel.rb +2 -0
  666. data/lib/ddtrace/transport/request.rb +1 -0
  667. data/lib/ddtrace/transport/response.rb +1 -0
  668. data/lib/ddtrace/transport/serializable_trace.rb +118 -0
  669. data/lib/ddtrace/transport/statistics.rb +6 -4
  670. data/lib/ddtrace/transport/trace_formatter.rb +187 -0
  671. data/lib/ddtrace/transport/traces.rb +17 -7
  672. data/lib/ddtrace/version.rb +15 -13
  673. data/lib/ddtrace.rb +9 -48
  674. metadata +637 -499
  675. data/.editorconfig +0 -22
  676. data/.gitignore +0 -67
  677. data/.yardopts +0 -5
  678. data/CONTRIBUTING.md +0 -81
  679. data/ddtrace.gemspec +0 -56
  680. data/docs/DevelopmentGuide.md +0 -259
  681. data/docs/GettingStarted.md +0 -2626
  682. data/docs/ProfilingDevelopment.md +0 -107
  683. data/lib/datadog/ci/context_flush.rb +0 -29
  684. data/lib/datadog/contrib.rb +0 -71
  685. data/lib/ddtrace/analytics.rb +0 -39
  686. data/lib/ddtrace/buffer.rb +0 -340
  687. data/lib/ddtrace/chunker.rb +0 -35
  688. data/lib/ddtrace/configuration/agent_settings_resolver.rb +0 -309
  689. data/lib/ddtrace/configuration/base.rb +0 -82
  690. data/lib/ddtrace/configuration/components.rb +0 -292
  691. data/lib/ddtrace/configuration/dependency_resolver.rb +0 -25
  692. data/lib/ddtrace/configuration/option.rb +0 -65
  693. data/lib/ddtrace/configuration/option_definition.rb +0 -122
  694. data/lib/ddtrace/configuration/option_definition_set.rb +0 -19
  695. data/lib/ddtrace/configuration/option_set.rb +0 -7
  696. data/lib/ddtrace/configuration/options.rb +0 -112
  697. data/lib/ddtrace/configuration/pin_setup.rb +0 -32
  698. data/lib/ddtrace/configuration/settings.rb +0 -413
  699. data/lib/ddtrace/configuration.rb +0 -195
  700. data/lib/ddtrace/context.rb +0 -334
  701. data/lib/ddtrace/context_flush.rb +0 -82
  702. data/lib/ddtrace/context_provider.rb +0 -62
  703. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +0 -31
  704. data/lib/ddtrace/contrib/action_cable/event.rb +0 -67
  705. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +0 -50
  706. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +0 -56
  707. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +0 -51
  708. data/lib/ddtrace/contrib/action_cable/events.rb +0 -34
  709. data/lib/ddtrace/contrib/action_cable/ext.rb +0 -27
  710. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +0 -78
  711. data/lib/ddtrace/contrib/action_cable/integration.rb +0 -46
  712. data/lib/ddtrace/contrib/action_cable/patcher.rb +0 -29
  713. data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +0 -32
  714. data/lib/ddtrace/contrib/action_mailer/event.rb +0 -50
  715. data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +0 -54
  716. data/lib/ddtrace/contrib/action_mailer/events/process.rb +0 -41
  717. data/lib/ddtrace/contrib/action_mailer/events.rb +0 -31
  718. data/lib/ddtrace/contrib/action_mailer/ext.rb +0 -32
  719. data/lib/ddtrace/contrib/action_mailer/integration.rb +0 -45
  720. data/lib/ddtrace/contrib/action_mailer/patcher.rb +0 -27
  721. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +0 -157
  722. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +0 -26
  723. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +0 -33
  724. data/lib/ddtrace/contrib/action_pack/ext.rb +0 -20
  725. data/lib/ddtrace/contrib/action_pack/integration.rb +0 -46
  726. data/lib/ddtrace/contrib/action_pack/patcher.rb +0 -24
  727. data/lib/ddtrace/contrib/action_pack/utils.rb +0 -37
  728. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +0 -32
  729. data/lib/ddtrace/contrib/action_view/event.rb +0 -36
  730. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +0 -47
  731. data/lib/ddtrace/contrib/action_view/events/render_template.rb +0 -50
  732. data/lib/ddtrace/contrib/action_view/events.rb +0 -31
  733. data/lib/ddtrace/contrib/action_view/ext.rb +0 -21
  734. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +0 -75
  735. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +0 -168
  736. data/lib/ddtrace/contrib/action_view/integration.rb +0 -53
  737. data/lib/ddtrace/contrib/action_view/patcher.rb +0 -48
  738. data/lib/ddtrace/contrib/action_view/utils.rb +0 -33
  739. data/lib/ddtrace/contrib/active_job/configuration/settings.rb +0 -33
  740. data/lib/ddtrace/contrib/active_job/event.rb +0 -54
  741. data/lib/ddtrace/contrib/active_job/events/discard.rb +0 -46
  742. data/lib/ddtrace/contrib/active_job/events/enqueue.rb +0 -45
  743. data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +0 -45
  744. data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +0 -47
  745. data/lib/ddtrace/contrib/active_job/events/perform.rb +0 -45
  746. data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +0 -46
  747. data/lib/ddtrace/contrib/active_job/events.rb +0 -39
  748. data/lib/ddtrace/contrib/active_job/ext.rb +0 -32
  749. data/lib/ddtrace/contrib/active_job/integration.rb +0 -46
  750. data/lib/ddtrace/contrib/active_job/log_injection.rb +0 -21
  751. data/lib/ddtrace/contrib/active_job/patcher.rb +0 -33
  752. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +0 -31
  753. data/lib/ddtrace/contrib/active_model_serializers/event.rb +0 -69
  754. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +0 -33
  755. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +0 -36
  756. data/lib/ddtrace/contrib/active_model_serializers/events.rb +0 -31
  757. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +0 -21
  758. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +0 -41
  759. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +0 -30
  760. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +0 -31
  761. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +0 -135
  762. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +0 -36
  763. data/lib/ddtrace/contrib/active_record/event.rb +0 -31
  764. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +0 -61
  765. data/lib/ddtrace/contrib/active_record/events/sql.rb +0 -69
  766. data/lib/ddtrace/contrib/active_record/events.rb +0 -31
  767. data/lib/ddtrace/contrib/active_record/ext.rb +0 -25
  768. data/lib/ddtrace/contrib/active_record/integration.rb +0 -54
  769. data/lib/ddtrace/contrib/active_record/patcher.rb +0 -24
  770. data/lib/ddtrace/contrib/active_record/utils.rb +0 -124
  771. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +0 -259
  772. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +0 -70
  773. data/lib/ddtrace/contrib/active_support/cache/redis.rb +0 -44
  774. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +0 -31
  775. data/lib/ddtrace/contrib/active_support/ext.rb +0 -28
  776. data/lib/ddtrace/contrib/active_support/integration.rb +0 -47
  777. data/lib/ddtrace/contrib/active_support/notifications/event.rb +0 -76
  778. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +0 -68
  779. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +0 -164
  780. data/lib/ddtrace/contrib/active_support/patcher.rb +0 -24
  781. data/lib/ddtrace/contrib/analytics.rb +0 -25
  782. data/lib/ddtrace/contrib/auto_instrument.rb +0 -48
  783. data/lib/ddtrace/contrib/aws/configuration/settings.rb +0 -31
  784. data/lib/ddtrace/contrib/aws/ext.rb +0 -24
  785. data/lib/ddtrace/contrib/aws/instrumentation.rb +0 -91
  786. data/lib/ddtrace/contrib/aws/integration.rb +0 -43
  787. data/lib/ddtrace/contrib/aws/parsed_context.rb +0 -57
  788. data/lib/ddtrace/contrib/aws/patcher.rb +0 -54
  789. data/lib/ddtrace/contrib/aws/services.rb +0 -119
  790. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +0 -21
  791. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +0 -42
  792. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +0 -13
  793. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +0 -24
  794. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +0 -39
  795. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +0 -30
  796. data/lib/ddtrace/contrib/configurable.rb +0 -103
  797. data/lib/ddtrace/contrib/configuration/resolver.rb +0 -82
  798. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +0 -40
  799. data/lib/ddtrace/contrib/configuration/settings.rb +0 -56
  800. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +0 -31
  801. data/lib/ddtrace/contrib/dalli/ext.rb +0 -21
  802. data/lib/ddtrace/contrib/dalli/instrumentation.rb +0 -55
  803. data/lib/ddtrace/contrib/dalli/integration.rb +0 -39
  804. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -26
  805. data/lib/ddtrace/contrib/dalli/quantize.rb +0 -23
  806. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +0 -33
  807. data/lib/ddtrace/contrib/delayed_job/ext.rb +0 -24
  808. data/lib/ddtrace/contrib/delayed_job/integration.rb +0 -39
  809. data/lib/ddtrace/contrib/delayed_job/patcher.rb +0 -29
  810. data/lib/ddtrace/contrib/delayed_job/plugin.rb +0 -85
  811. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +0 -32
  812. data/lib/ddtrace/contrib/elasticsearch/ext.rb +0 -23
  813. data/lib/ddtrace/contrib/elasticsearch/integration.rb +0 -40
  814. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +0 -123
  815. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +0 -84
  816. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +0 -33
  817. data/lib/ddtrace/contrib/ethon/easy_patch.rb +0 -152
  818. data/lib/ddtrace/contrib/ethon/ext.rb +0 -20
  819. data/lib/ddtrace/contrib/ethon/integration.rb +0 -44
  820. data/lib/ddtrace/contrib/ethon/multi_patch.rb +0 -85
  821. data/lib/ddtrace/contrib/ethon/patcher.rb +0 -27
  822. data/lib/ddtrace/contrib/excon/configuration/settings.rb +0 -34
  823. data/lib/ddtrace/contrib/excon/ext.rb +0 -18
  824. data/lib/ddtrace/contrib/excon/integration.rb +0 -44
  825. data/lib/ddtrace/contrib/excon/middleware.rb +0 -164
  826. data/lib/ddtrace/contrib/excon/patcher.rb +0 -28
  827. data/lib/ddtrace/contrib/extensions.rb +0 -169
  828. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +0 -39
  829. data/lib/ddtrace/contrib/faraday/connection.rb +0 -19
  830. data/lib/ddtrace/contrib/faraday/ext.rb +0 -18
  831. data/lib/ddtrace/contrib/faraday/integration.rb +0 -44
  832. data/lib/ddtrace/contrib/faraday/middleware.rb +0 -86
  833. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -54
  834. data/lib/ddtrace/contrib/faraday/rack_builder.rb +0 -19
  835. data/lib/ddtrace/contrib/grape/configuration/settings.rb +0 -39
  836. data/lib/ddtrace/contrib/grape/endpoint.rb +0 -246
  837. data/lib/ddtrace/contrib/grape/ext.rb +0 -24
  838. data/lib/ddtrace/contrib/grape/instrumentation.rb +0 -34
  839. data/lib/ddtrace/contrib/grape/integration.rb +0 -40
  840. data/lib/ddtrace/contrib/grape/patcher.rb +0 -32
  841. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +0 -33
  842. data/lib/ddtrace/contrib/graphql/ext.rb +0 -17
  843. data/lib/ddtrace/contrib/graphql/integration.rb +0 -40
  844. data/lib/ddtrace/contrib/graphql/patcher.rb +0 -61
  845. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +0 -32
  846. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +0 -59
  847. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +0 -80
  848. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +0 -79
  849. data/lib/ddtrace/contrib/grpc/ext.rb +0 -19
  850. data/lib/ddtrace/contrib/grpc/integration.rb +0 -39
  851. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +0 -50
  852. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -34
  853. data/lib/ddtrace/contrib/http/circuit_breaker.rb +0 -38
  854. data/lib/ddtrace/contrib/http/configuration/settings.rb +0 -33
  855. data/lib/ddtrace/contrib/http/ext.rb +0 -18
  856. data/lib/ddtrace/contrib/http/instrumentation.rb +0 -180
  857. data/lib/ddtrace/contrib/http/integration.rb +0 -46
  858. data/lib/ddtrace/contrib/http/patcher.rb +0 -27
  859. data/lib/ddtrace/contrib/http_annotation_helper.rb +0 -11
  860. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +0 -33
  861. data/lib/ddtrace/contrib/httpclient/ext.rb +0 -18
  862. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +0 -148
  863. data/lib/ddtrace/contrib/httpclient/integration.rb +0 -44
  864. data/lib/ddtrace/contrib/httpclient/patcher.rb +0 -39
  865. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +0 -33
  866. data/lib/ddtrace/contrib/httprb/ext.rb +0 -18
  867. data/lib/ddtrace/contrib/httprb/instrumentation.rb +0 -158
  868. data/lib/ddtrace/contrib/httprb/integration.rb +0 -44
  869. data/lib/ddtrace/contrib/httprb/patcher.rb +0 -39
  870. data/lib/ddtrace/contrib/integration.rb +0 -17
  871. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +0 -31
  872. data/lib/ddtrace/contrib/kafka/consumer_event.rb +0 -15
  873. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +0 -15
  874. data/lib/ddtrace/contrib/kafka/event.rb +0 -52
  875. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +0 -35
  876. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +0 -42
  877. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +0 -40
  878. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +0 -40
  879. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +0 -30
  880. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +0 -30
  881. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +0 -30
  882. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +0 -33
  883. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +0 -36
  884. data/lib/ddtrace/contrib/kafka/events.rb +0 -45
  885. data/lib/ddtrace/contrib/kafka/ext.rb +0 -42
  886. data/lib/ddtrace/contrib/kafka/integration.rb +0 -40
  887. data/lib/ddtrace/contrib/kafka/patcher.rb +0 -27
  888. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +0 -19
  889. data/lib/ddtrace/contrib/lograge/ext.rb +0 -11
  890. data/lib/ddtrace/contrib/lograge/instrumentation.rb +0 -39
  891. data/lib/ddtrace/contrib/lograge/integration.rb +0 -46
  892. data/lib/ddtrace/contrib/lograge/patcher.rb +0 -26
  893. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +0 -34
  894. data/lib/ddtrace/contrib/mongodb/ext.rb +0 -24
  895. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +0 -70
  896. data/lib/ddtrace/contrib/mongodb/integration.rb +0 -44
  897. data/lib/ddtrace/contrib/mongodb/parsers.rb +0 -69
  898. data/lib/ddtrace/contrib/mongodb/patcher.rb +0 -32
  899. data/lib/ddtrace/contrib/mongodb/subscribers.rb +0 -112
  900. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +0 -31
  901. data/lib/ddtrace/contrib/mysql2/ext.rb +0 -19
  902. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +0 -65
  903. data/lib/ddtrace/contrib/mysql2/integration.rb +0 -39
  904. data/lib/ddtrace/contrib/mysql2/patcher.rb +0 -28
  905. data/lib/ddtrace/contrib/patchable.rb +0 -71
  906. data/lib/ddtrace/contrib/patcher.rb +0 -66
  907. data/lib/ddtrace/contrib/presto/configuration/settings.rb +0 -31
  908. data/lib/ddtrace/contrib/presto/ext.rb +0 -29
  909. data/lib/ddtrace/contrib/presto/instrumentation.rb +0 -111
  910. data/lib/ddtrace/contrib/presto/integration.rb +0 -39
  911. data/lib/ddtrace/contrib/presto/patcher.rb +0 -34
  912. data/lib/ddtrace/contrib/qless/configuration/settings.rb +0 -36
  913. data/lib/ddtrace/contrib/qless/ext.rb +0 -21
  914. data/lib/ddtrace/contrib/qless/integration.rb +0 -39
  915. data/lib/ddtrace/contrib/qless/patcher.rb +0 -35
  916. data/lib/ddtrace/contrib/qless/qless_job.rb +0 -74
  917. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +0 -34
  918. data/lib/ddtrace/contrib/que/configuration/settings.rb +0 -44
  919. data/lib/ddtrace/contrib/que/ext.rb +0 -31
  920. data/lib/ddtrace/contrib/que/integration.rb +0 -43
  921. data/lib/ddtrace/contrib/que/patcher.rb +0 -25
  922. data/lib/ddtrace/contrib/que/tracer.rb +0 -58
  923. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +0 -31
  924. data/lib/ddtrace/contrib/racecar/event.rb +0 -77
  925. data/lib/ddtrace/contrib/racecar/events/batch.rb +0 -28
  926. data/lib/ddtrace/contrib/racecar/events/consume.rb +0 -28
  927. data/lib/ddtrace/contrib/racecar/events/message.rb +0 -28
  928. data/lib/ddtrace/contrib/racecar/events.rb +0 -33
  929. data/lib/ddtrace/contrib/racecar/ext.rb +0 -26
  930. data/lib/ddtrace/contrib/racecar/integration.rb +0 -40
  931. data/lib/ddtrace/contrib/racecar/patcher.rb +0 -27
  932. data/lib/ddtrace/contrib/rack/configuration/settings.rb +0 -47
  933. data/lib/ddtrace/contrib/rack/ext.rb +0 -22
  934. data/lib/ddtrace/contrib/rack/integration.rb +0 -46
  935. data/lib/ddtrace/contrib/rack/middlewares.rb +0 -288
  936. data/lib/ddtrace/contrib/rack/patcher.rb +0 -106
  937. data/lib/ddtrace/contrib/rack/request_queue.rb +0 -45
  938. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +0 -10
  939. data/lib/ddtrace/contrib/rails/configuration/settings.rb +0 -101
  940. data/lib/ddtrace/contrib/rails/ext.rb +0 -18
  941. data/lib/ddtrace/contrib/rails/framework.rb +0 -172
  942. data/lib/ddtrace/contrib/rails/integration.rb +0 -45
  943. data/lib/ddtrace/contrib/rails/log_injection.rb +0 -42
  944. data/lib/ddtrace/contrib/rails/middlewares.rb +0 -44
  945. data/lib/ddtrace/contrib/rails/patcher.rb +0 -119
  946. data/lib/ddtrace/contrib/rails/railtie.rb +0 -18
  947. data/lib/ddtrace/contrib/rails/utils.rb +0 -25
  948. data/lib/ddtrace/contrib/rake/configuration/settings.rb +0 -32
  949. data/lib/ddtrace/contrib/rake/ext.rb +0 -22
  950. data/lib/ddtrace/contrib/rake/instrumentation.rb +0 -91
  951. data/lib/ddtrace/contrib/rake/integration.rb +0 -39
  952. data/lib/ddtrace/contrib/rake/patcher.rb +0 -31
  953. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +0 -46
  954. data/lib/ddtrace/contrib/redis/configuration/settings.rb +0 -36
  955. data/lib/ddtrace/contrib/redis/ext.rb +0 -23
  956. data/lib/ddtrace/contrib/redis/instrumentation.rb +0 -90
  957. data/lib/ddtrace/contrib/redis/integration.rb +0 -43
  958. data/lib/ddtrace/contrib/redis/patcher.rb +0 -33
  959. data/lib/ddtrace/contrib/redis/quantize.rb +0 -76
  960. data/lib/ddtrace/contrib/redis/tags.rb +0 -47
  961. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +0 -159
  962. data/lib/ddtrace/contrib/registerable.rb +0 -33
  963. data/lib/ddtrace/contrib/registry.rb +0 -43
  964. data/lib/ddtrace/contrib/resque/configuration/settings.rb +0 -49
  965. data/lib/ddtrace/contrib/resque/ext.rb +0 -18
  966. data/lib/ddtrace/contrib/resque/integration.rb +0 -44
  967. data/lib/ddtrace/contrib/resque/patcher.rb +0 -30
  968. data/lib/ddtrace/contrib/resque/resque_job.rb +0 -104
  969. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +0 -32
  970. data/lib/ddtrace/contrib/rest_client/ext.rb +0 -18
  971. data/lib/ddtrace/contrib/rest_client/integration.rb +0 -39
  972. data/lib/ddtrace/contrib/rest_client/patcher.rb +0 -25
  973. data/lib/ddtrace/contrib/rest_client/request_patch.rb +0 -92
  974. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +0 -19
  975. data/lib/ddtrace/contrib/semantic_logger/ext.rb +0 -11
  976. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +0 -43
  977. data/lib/ddtrace/contrib/semantic_logger/integration.rb +0 -48
  978. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +0 -26
  979. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +0 -29
  980. data/lib/ddtrace/contrib/sequel/database.rb +0 -64
  981. data/lib/ddtrace/contrib/sequel/dataset.rb +0 -64
  982. data/lib/ddtrace/contrib/sequel/ext.rb +0 -20
  983. data/lib/ddtrace/contrib/sequel/integration.rb +0 -39
  984. data/lib/ddtrace/contrib/sequel/patcher.rb +0 -34
  985. data/lib/ddtrace/contrib/sequel/utils.rb +0 -75
  986. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +0 -32
  987. data/lib/ddtrace/contrib/shoryuken/ext.rb +0 -22
  988. data/lib/ddtrace/contrib/shoryuken/integration.rb +0 -40
  989. data/lib/ddtrace/contrib/shoryuken/patcher.rb +0 -25
  990. data/lib/ddtrace/contrib/shoryuken/tracer.rb +0 -56
  991. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +0 -44
  992. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +0 -38
  993. data/lib/ddtrace/contrib/sidekiq/ext.rb +0 -31
  994. data/lib/ddtrace/contrib/sidekiq/integration.rb +0 -49
  995. data/lib/ddtrace/contrib/sidekiq/patcher.rb +0 -68
  996. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +0 -30
  997. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +0 -30
  998. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +0 -29
  999. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +0 -66
  1000. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -45
  1001. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +0 -40
  1002. data/lib/ddtrace/contrib/sinatra/env.rb +0 -59
  1003. data/lib/ddtrace/contrib/sinatra/ext.rb +0 -28
  1004. data/lib/ddtrace/contrib/sinatra/headers.rb +0 -30
  1005. data/lib/ddtrace/contrib/sinatra/integration.rb +0 -39
  1006. data/lib/ddtrace/contrib/sinatra/patcher.rb +0 -30
  1007. data/lib/ddtrace/contrib/sinatra/tracer.rb +0 -150
  1008. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +0 -112
  1009. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +0 -34
  1010. data/lib/ddtrace/contrib/sneakers/ext.rb +0 -23
  1011. data/lib/ddtrace/contrib/sneakers/integration.rb +0 -42
  1012. data/lib/ddtrace/contrib/sneakers/patcher.rb +0 -25
  1013. data/lib/ddtrace/contrib/sneakers/tracer.rb +0 -54
  1014. data/lib/ddtrace/contrib/status_code_matcher.rb +0 -70
  1015. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +0 -31
  1016. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +0 -25
  1017. data/lib/ddtrace/contrib/sucker_punch/ext.rb +0 -22
  1018. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +0 -89
  1019. data/lib/ddtrace/contrib/sucker_punch/integration.rb +0 -39
  1020. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +0 -44
  1021. data/lib/ddtrace/correlation.rb +0 -40
  1022. data/lib/ddtrace/diagnostics/environment_logger.rb +0 -280
  1023. data/lib/ddtrace/diagnostics/health.rb +0 -34
  1024. data/lib/ddtrace/distributed_tracing/headers/b3.rb +0 -45
  1025. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +0 -57
  1026. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +0 -43
  1027. data/lib/ddtrace/distributed_tracing/headers/headers.rb +0 -72
  1028. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +0 -44
  1029. data/lib/ddtrace/encoding.rb +0 -72
  1030. data/lib/ddtrace/error.rb +0 -97
  1031. data/lib/ddtrace/event.rb +0 -53
  1032. data/lib/ddtrace/ext/analytics.rb +0 -13
  1033. data/lib/ddtrace/ext/app_types.rb +0 -12
  1034. data/lib/ddtrace/ext/correlation.rb +0 -12
  1035. data/lib/ddtrace/ext/diagnostics.rb +0 -37
  1036. data/lib/ddtrace/ext/distributed.rb +0 -40
  1037. data/lib/ddtrace/ext/environment.rb +0 -24
  1038. data/lib/ddtrace/ext/errors.rb +0 -11
  1039. data/lib/ddtrace/ext/forced_tracing.rb +0 -26
  1040. data/lib/ddtrace/ext/git.rb +0 -32
  1041. data/lib/ddtrace/ext/http.rb +0 -47
  1042. data/lib/ddtrace/ext/integration.rb +0 -9
  1043. data/lib/ddtrace/ext/manual_tracing.rb +0 -10
  1044. data/lib/ddtrace/ext/metrics.rb +0 -16
  1045. data/lib/ddtrace/ext/net.rb +0 -11
  1046. data/lib/ddtrace/ext/priority.rb +0 -19
  1047. data/lib/ddtrace/ext/profiling.rb +0 -53
  1048. data/lib/ddtrace/ext/runtime.rb +0 -25
  1049. data/lib/ddtrace/ext/sampling.rb +0 -17
  1050. data/lib/ddtrace/ext/sql.rb +0 -9
  1051. data/lib/ddtrace/ext/test.rb +0 -9
  1052. data/lib/ddtrace/ext/transport.rb +0 -32
  1053. data/lib/ddtrace/forced_tracing.rb +0 -39
  1054. data/lib/ddtrace/logger.rb +0 -41
  1055. data/lib/ddtrace/metrics.rb +0 -282
  1056. data/lib/ddtrace/opentelemetry/extensions.rb +0 -14
  1057. data/lib/ddtrace/opentelemetry/span.rb +0 -34
  1058. data/lib/ddtrace/opentracer/binary_propagator.rb +0 -25
  1059. data/lib/ddtrace/opentracer/carrier.rb +0 -7
  1060. data/lib/ddtrace/opentracer/distributed_headers.rb +0 -56
  1061. data/lib/ddtrace/opentracer/global_tracer.rb +0 -16
  1062. data/lib/ddtrace/opentracer/propagator.rb +0 -23
  1063. data/lib/ddtrace/opentracer/rack_propagator.rb +0 -61
  1064. data/lib/ddtrace/opentracer/scope.rb +0 -16
  1065. data/lib/ddtrace/opentracer/scope_manager.rb +0 -7
  1066. data/lib/ddtrace/opentracer/span.rb +0 -95
  1067. data/lib/ddtrace/opentracer/span_context.rb +0 -15
  1068. data/lib/ddtrace/opentracer/span_context_factory.rb +0 -24
  1069. data/lib/ddtrace/opentracer/text_map_propagator.rb +0 -76
  1070. data/lib/ddtrace/opentracer/thread_local_scope.rb +0 -32
  1071. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +0 -41
  1072. data/lib/ddtrace/opentracer/tracer.rb +0 -209
  1073. data/lib/ddtrace/opentracer.rb +0 -22
  1074. data/lib/ddtrace/patcher.rb +0 -69
  1075. data/lib/ddtrace/pin.rb +0 -86
  1076. data/lib/ddtrace/pipeline/span_filter.rb +0 -39
  1077. data/lib/ddtrace/pipeline/span_processor.rb +0 -21
  1078. data/lib/ddtrace/pipeline.rb +0 -47
  1079. data/lib/ddtrace/profiling/backtrace_location.rb +0 -33
  1080. data/lib/ddtrace/profiling/buffer.rb +0 -42
  1081. data/lib/ddtrace/profiling/collectors/stack.rb +0 -297
  1082. data/lib/ddtrace/profiling/encoding/profile.rb +0 -46
  1083. data/lib/ddtrace/profiling/event.rb +0 -14
  1084. data/lib/ddtrace/profiling/events/stack.rb +0 -81
  1085. data/lib/ddtrace/profiling/exporter.rb +0 -24
  1086. data/lib/ddtrace/profiling/ext/forking.rb +0 -98
  1087. data/lib/ddtrace/profiling/flush.rb +0 -44
  1088. data/lib/ddtrace/profiling/native_extension.rb +0 -40
  1089. data/lib/ddtrace/profiling/pprof/builder.rb +0 -126
  1090. data/lib/ddtrace/profiling/pprof/converter.rb +0 -103
  1091. data/lib/ddtrace/profiling/pprof/message_set.rb +0 -15
  1092. data/lib/ddtrace/profiling/pprof/payload.rb +0 -19
  1093. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +0 -82
  1094. data/lib/ddtrace/profiling/pprof/stack_sample.rb +0 -140
  1095. data/lib/ddtrace/profiling/pprof/string_table.rb +0 -11
  1096. data/lib/ddtrace/profiling/pprof/template.rb +0 -119
  1097. data/lib/ddtrace/profiling/profiler.rb +0 -31
  1098. data/lib/ddtrace/profiling/recorder.rb +0 -96
  1099. data/lib/ddtrace/profiling/scheduler.rb +0 -150
  1100. data/lib/ddtrace/profiling/tasks/setup.rb +0 -90
  1101. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +0 -42
  1102. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +0 -46
  1103. data/lib/ddtrace/profiling/transport/client.rb +0 -15
  1104. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +0 -94
  1105. data/lib/ddtrace/profiling/transport/http/api/instance.rb +0 -37
  1106. data/lib/ddtrace/profiling/transport/http/api/spec.rb +0 -41
  1107. data/lib/ddtrace/profiling/transport/http/api.rb +0 -44
  1108. data/lib/ddtrace/profiling/transport/http/builder.rb +0 -29
  1109. data/lib/ddtrace/profiling/transport/http/client.rb +0 -34
  1110. data/lib/ddtrace/profiling/transport/http/response.rb +0 -22
  1111. data/lib/ddtrace/profiling/transport/http.rb +0 -111
  1112. data/lib/ddtrace/profiling/transport/io/client.rb +0 -28
  1113. data/lib/ddtrace/profiling/transport/io/response.rb +0 -17
  1114. data/lib/ddtrace/profiling/transport/io.rb +0 -31
  1115. data/lib/ddtrace/profiling/transport/parcel.rb +0 -18
  1116. data/lib/ddtrace/profiling/transport/request.rb +0 -16
  1117. data/lib/ddtrace/profiling/transport/response.rb +0 -9
  1118. data/lib/ddtrace/profiling.rb +0 -149
  1119. data/lib/ddtrace/propagation/grpc_propagator.rb +0 -75
  1120. data/lib/ddtrace/propagation/http_propagator.rb +0 -91
  1121. data/lib/ddtrace/quantization/hash.rb +0 -104
  1122. data/lib/ddtrace/quantization/http.rb +0 -90
  1123. data/lib/ddtrace/runtime/metrics.rb +0 -135
  1124. data/lib/ddtrace/sampler.rb +0 -303
  1125. data/lib/ddtrace/sampling/matcher.rb +0 -58
  1126. data/lib/ddtrace/sampling/rate_limiter.rb +0 -177
  1127. data/lib/ddtrace/sampling/rule.rb +0 -62
  1128. data/lib/ddtrace/sampling/rule_sampler.rb +0 -133
  1129. data/lib/ddtrace/sampling.rb +0 -3
  1130. data/lib/ddtrace/span.rb +0 -445
  1131. data/lib/ddtrace/sync_writer.rb +0 -69
  1132. data/lib/ddtrace/tasks/exec.rb +0 -47
  1133. data/lib/ddtrace/tasks/help.rb +0 -15
  1134. data/lib/ddtrace/tracer.rb +0 -449
  1135. data/lib/ddtrace/utils/compression.rb +0 -28
  1136. data/lib/ddtrace/utils/database.rb +0 -26
  1137. data/lib/ddtrace/utils/forking.rb +0 -53
  1138. data/lib/ddtrace/utils/object_set.rb +0 -40
  1139. data/lib/ddtrace/utils/only_once.rb +0 -41
  1140. data/lib/ddtrace/utils/sequence.rb +0 -18
  1141. data/lib/ddtrace/utils/string_table.rb +0 -46
  1142. data/lib/ddtrace/utils/time.rb +0 -51
  1143. data/lib/ddtrace/utils.rb +0 -80
  1144. data/lib/ddtrace/vendor/active_record/connection_specification.rb +0 -302
  1145. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +0 -117
  1146. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +0 -58
  1147. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +0 -136
  1148. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +0 -10
  1149. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +0 -9
  1150. data/lib/ddtrace/vendor/multipart-post/multipart.rb +0 -13
  1151. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +0 -33
  1152. data/lib/ddtrace/worker.rb +0 -21
  1153. data/lib/ddtrace/workers/async.rb +0 -175
  1154. data/lib/ddtrace/workers/interval_loop.rb +0 -116
  1155. data/lib/ddtrace/workers/polling.rb +0 -56
  1156. data/lib/ddtrace/workers/queue.rb +0 -41
  1157. data/lib/ddtrace/workers/runtime_metrics.rb +0 -65
  1158. data/lib/ddtrace/workers/trace_writer.rb +0 -200
  1159. data/lib/ddtrace/workers.rb +0 -123
  1160. data/lib/ddtrace/writer.rb +0 -200
@@ -1,32 +1,65 @@
1
1
  # Profiling Native Extension Design
2
2
 
3
- The profiling native extension is used to implement features which are expensive (in terms of resources) or otherwise
4
- impossible to implement using Ruby code.
3
+ The profiling native extension is used to:
4
+ 1. Implement features which are expensive (in terms of resources) or otherwise impossible to implement using Ruby code.
5
+ 2. Bridge between Ruby-specific profiling features and [`libdatadog`](https://github.com/DataDog/libdatadog), a Rust-based
6
+ library with common profiling functionality.
5
7
 
6
- This extension is quite coupled with MRI Ruby ("C Ruby") internals, and is not intended to support other rubies such as
8
+ Due to (1), this extension is quite coupled with MRI Ruby ("C Ruby") internals, and is not intended to support other rubies such as
7
9
  JRuby or TruffleRuby. When below we say "Ruby", read it as "MRI Ruby".
8
10
 
9
11
  ## Disabling
10
12
 
11
- The profiling native extension can be disabled by setting `DD_PROFILING_NO_EXTENSION=true` when installing or running
13
+ The profiling native extension can be disabled by setting `DD_PROFILING_NO_EXTENSION=true` when installing
12
14
  the gem. Setting `DD_PROFILING_NO_EXTENSION` at installation time skips compilation of the extension entirely.
13
15
 
14
16
  (If you're a customer and needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.)
15
17
 
16
- Currently the profiler can still "limp along" when the native extension is disabled, but the plan is to require it
17
- in future releases -- e.g. disabling the extension will disable profiling entirely.
18
+ In past releases, it was possible for the profiler to run without the native extension, but that's no longer the case,
19
+ and disabling the extension will disable profiling.
18
20
 
19
- ## Safety
21
+ ## Who is this page for?
22
+
23
+ This documentation is intended to be used by dd-trace-rb developers. Please see the `docs/` folder for user-level
24
+ documentation.
25
+
26
+ ## Must not block or break users that cannot use it
20
27
 
21
28
  The profiling native extension is (and must always be) designed to **not cause failures** during gem installation, even
22
29
  if some features, Ruby versions, or operating systems are not supported.
23
30
 
24
- E.g. the extension must cleanly build on Ruby 2.1 (or the oldest Ruby version we support at the time) on Windows,
31
+ E.g. the extension must not break installation on Ruby 2.1 (or the oldest Ruby version we support at the time) on 64-bit ARM macOS,
25
32
  even if at run time it will effectively do nothing for such a setup.
26
33
 
27
34
  We have a CI setup to help validate this, but this is really important to keep in mind when adding to or changing the
28
35
  existing codebase.
29
36
 
37
+ ## Memory leaks and Interaction with Ruby VM APIs
38
+
39
+ When adding to or changing the native extension, we must always consider what API calls can lead to Ruby exceptions to
40
+ be raised, and whether there are is dynamically-allocated memory that can be leaked if that happens.
41
+
42
+ (When a Ruby exception is raised, the VM will use `setjmp` and `longjmp` to jump back in the stack and thus skip
43
+ our clean-up code, like in a Ruby-level exception.)
44
+
45
+ We avoid issues using a combination of:
46
+
47
+ * Avoiding dynamic allocation as much as possible
48
+ * Getting all needed data and doing all validations before doing any dynamic allocations
49
+ * Avoiding calling Ruby VM APIs after doing dynamic allocations
50
+ * Wrapping dynamic allocations into Ruby GC-managed objects (using `TypedData_Wrap_Struct`), so that Ruby will manage
51
+ their lifetime and call `free` when the GC-managed object is no longer being referenced
52
+ * Using [`rb_protect` and similar APIs](https://silverhammermba.github.io/emberb/c/?#rescue) to run cleanup code on
53
+ exception cases
54
+
55
+ Non-exhaustive list of APIs that cause exceptions to be raised:
56
+
57
+ * `Check_TypedStruct`, `Check_Type`, `ENFORCE_TYPE`
58
+ * `rb_funcall`
59
+ * `rb_thread_call_without_gvl`, `rb_thread_call_without_gvl2`
60
+ * [Numeric conversion APIs, e.g. `NUM2LONG`, `NUM2INT`, etc.](https://silverhammermba.github.io/emberb/c/?#translation)
61
+ * Our `char_slice_from_ruby_string` helper
62
+
30
63
  ## Usage of private VM headers
31
64
 
32
65
  To implement some of the features below, we sometimes require access to private Ruby header files (that describe VM
@@ -39,6 +72,8 @@ Because these private header files are not included in regular Ruby installation
39
72
 
40
73
  Functions which make use of these headers are defined in the <private_vm_api_acccess.c> file.
41
74
 
75
+ There is currently no way for disabling usage of the private MJIT header for Ruby 2.6+.
76
+
42
77
  **Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
43
78
  contribute upstream changes so that they become official public VM APIs.
44
79
 
@@ -64,7 +99,6 @@ Thus, even though a regular Ruby installation does not include these files, we c
64
99
  ## Feature: Getting thread CPU-time clock_ids
65
100
 
66
101
  * **OS support**: Linux
67
- * **Ruby support**: 2.6+
68
102
 
69
103
  To enable CPU-time profiling, we use the `pthread_getcpuclockid(pthread_t thread, clockid_t *clockid)` C function to
70
104
  obtain a `clockid_t` that can then be used with the `Process.clock_gettime` method (or directly with the
@@ -1,4 +1,24 @@
1
1
  #pragma once
2
2
 
3
- void self_test_clock_id();
3
+ #include <stdbool.h>
4
+ #include <time.h>
5
+
6
+ // Contains the operating-system specific identifier needed to fetch CPU-time, and a flag to indicate if we failed to fetch it
7
+ typedef struct thread_cpu_time_id {
8
+ bool valid;
9
+ clockid_t clock_id;
10
+ } thread_cpu_time_id;
11
+
12
+ // Contains the current cpu time, and a flag to indicate if we failed to fetch it
13
+ typedef struct thread_cpu_time {
14
+ bool valid;
15
+ long result_ns;
16
+ } thread_cpu_time;
17
+
18
+ void self_test_clock_id(void);
19
+
20
+ // TODO: Remove this after the OldStack profiler gets removed
4
21
  VALUE clock_id_for(VALUE self, VALUE thread);
22
+
23
+ thread_cpu_time_id thread_cpu_time_id_for(VALUE thread);
24
+ thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id);
@@ -9,26 +9,20 @@
9
9
  #include <errno.h>
10
10
 
11
11
  #include <ruby.h>
12
-
13
- #ifdef RUBY_2_1_WORKAROUND
14
- #include <thread_native.h>
15
- #else
16
- #include <ruby/thread_native.h>
17
- #endif
18
-
12
+ #include "helpers.h"
19
13
  #include "private_vm_api_access.h"
20
-
21
14
  #include "clock_id.h"
22
15
 
23
16
  // Validate that our home-cooked pthread_id_for() matches pthread_self() for the current thread
24
- void self_test_clock_id() {
17
+ void self_test_clock_id(void) {
25
18
  rb_nativethread_id_t expected_pthread_id = pthread_self();
26
19
  rb_nativethread_id_t actual_pthread_id = pthread_id_for(rb_thread_current());
27
20
 
28
21
  if (expected_pthread_id != actual_pthread_id) rb_raise(rb_eRuntimeError, "pthread_id_for() self-test failed");
29
22
  }
30
23
 
31
- VALUE clock_id_for(VALUE self, VALUE thread) {
24
+ // TODO: Remove this after the OldStack profiler gets removed
25
+ VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, VALUE thread) {
32
26
  rb_nativethread_id_t thread_id = pthread_id_for(thread);
33
27
 
34
28
  clockid_t clock_id;
@@ -49,4 +43,31 @@ VALUE clock_id_for(VALUE self, VALUE thread) {
49
43
  }
50
44
  }
51
45
 
46
+ thread_cpu_time_id thread_cpu_time_id_for(VALUE thread) {
47
+ rb_nativethread_id_t thread_id = pthread_id_for(thread);
48
+ clockid_t clock_id;
49
+
50
+ int error = pthread_getcpuclockid(thread_id, &clock_id);
51
+
52
+ if (error == 0) {
53
+ return (thread_cpu_time_id) {.valid = true, .clock_id = clock_id};
54
+ } else {
55
+ // TODO: Include the error code in some way in the output?
56
+ return (thread_cpu_time_id) {.valid = false};
57
+ }
58
+ }
59
+
60
+ thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id) {
61
+ thread_cpu_time error = (thread_cpu_time) {.valid = false};
62
+
63
+ if (!time_id.valid) { return error; }
64
+
65
+ struct timespec current_cpu;
66
+
67
+ // TODO: Include the error code in some way in the output?
68
+ if (clock_gettime(time_id.clock_id, &current_cpu) != 0) return error;
69
+
70
+ return (thread_cpu_time) {.valid = true, .result_ns = current_cpu.tv_nsec + (current_cpu.tv_sec * 1000 * 1000 * 1000)};
71
+ }
72
+
52
73
  #endif
@@ -7,8 +7,17 @@
7
7
  #include <ruby.h>
8
8
 
9
9
  #include "clock_id.h"
10
+ #include "helpers.h"
10
11
 
11
- void self_test_clock_id() { } // Nothing to check
12
- VALUE clock_id_for(VALUE self, VALUE thread) { return Qnil; } // Nothing to return
12
+ void self_test_clock_id(void) { } // Nothing to check
13
+ VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, DDTRACE_UNUSED VALUE _thread) { return Qnil; } // Nothing to return
14
+
15
+ thread_cpu_time_id thread_cpu_time_id_for(DDTRACE_UNUSED VALUE _thread) {
16
+ return (thread_cpu_time_id) {.valid = false};
17
+ }
18
+
19
+ thread_cpu_time thread_cpu_time_for(DDTRACE_UNUSED thread_cpu_time_id _time_id) {
20
+ return (thread_cpu_time) {.valid = false};
21
+ }
13
22
 
14
23
  #endif
@@ -0,0 +1,390 @@
1
+ #include <ruby.h>
2
+ #include "helpers.h"
3
+ #include "clock_id.h"
4
+ #include "collectors_stack.h"
5
+ #include "libdatadog_helpers.h"
6
+ #include "private_vm_api_access.h"
7
+ #include "stack_recorder.h"
8
+ #include "collectors_cpu_and_wall_time.h"
9
+
10
+ // Used to periodically sample threads, recording elapsed CPU-time and Wall-time between samples.
11
+ //
12
+ // This file implements the native bits of the Datadog::Profiling::Collectors::CpuAndWallTime class
13
+ //
14
+ // Triggering of this component (e.g. deciding when to take a sample) is implemented in Collectors::CpuAndWallTimeWorker.
15
+
16
+ #define INVALID_TIME -1
17
+ #define THREAD_ID_LIMIT_CHARS 20
18
+
19
+ // Contains state for a single CpuAndWallTime instance
20
+ struct cpu_and_wall_time_collector_state {
21
+ // Note: Places in this file that usually need to be changed when this struct is changed are tagged with
22
+ // "Update this when modifying state struct"
23
+
24
+ // Required by Datadog::Profiling::Collectors::Stack as a scratch buffer during sampling
25
+ sampling_buffer *sampling_buffer;
26
+ // Hashmap <Thread Object, struct per_thread_context>
27
+ st_table *hash_map_per_thread_context;
28
+ // Datadog::Profiling::StackRecorder instance
29
+ VALUE recorder_instance;
30
+ // Track how many samples we've taken.
31
+ unsigned int sample_count;
32
+ };
33
+
34
+ // Tracks per-thread state
35
+ struct per_thread_context {
36
+ char thread_id[THREAD_ID_LIMIT_CHARS];
37
+ ddprof_ffi_CharSlice thread_id_char_slice;
38
+ thread_cpu_time_id thread_cpu_time_id;
39
+ long cpu_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized or if getting it fails for another reason
40
+ long wall_time_at_previous_sample_ns; // Can be INVALID_TIME until initialized
41
+ };
42
+
43
+ static void cpu_and_wall_time_collector_typed_data_mark(void *state_ptr);
44
+ static void cpu_and_wall_time_collector_typed_data_free(void *state_ptr);
45
+ static int hash_map_per_thread_context_mark(st_data_t key_thread, st_data_t _value, st_data_t _argument);
46
+ static int hash_map_per_thread_context_free_values(st_data_t _thread, st_data_t value_per_thread_context, st_data_t _argument);
47
+ static VALUE _native_new(VALUE klass);
48
+ static VALUE _native_initialize(VALUE self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames);
49
+ static VALUE _native_sample(VALUE self, VALUE collector_instance);
50
+ static VALUE _native_thread_list(VALUE self);
51
+ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state);
52
+ static void initialize_context(VALUE thread, struct per_thread_context *thread_context);
53
+ static VALUE _native_inspect(VALUE self, VALUE collector_instance);
54
+ static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_collector_state *state);
55
+ static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash);
56
+ static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_state *state);
57
+ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, st_data_t _argument);
58
+ static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
59
+ static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns);
60
+ static long cpu_time_now_ns(struct per_thread_context *thread_context);
61
+ static long wall_time_now_ns();
62
+ static long thread_id_for(VALUE thread);
63
+
64
+ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
65
+ VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
66
+ VALUE collectors_cpu_and_wall_time_class = rb_define_class_under(collectors_module, "CpuAndWallTime", rb_cObject);
67
+ // Hosts methods used for testing the native code using RSpec
68
+ VALUE testing_module = rb_define_module_under(collectors_cpu_and_wall_time_class, "Testing");
69
+
70
+ // Instances of the CpuAndWallTime class are "TypedData" objects.
71
+ // "TypedData" objects are special objects in the Ruby VM that can wrap C structs.
72
+ // In this case, it wraps the cpu_and_wall_time_collector_state.
73
+ //
74
+ // Because Ruby doesn't know how to initialize native-level structs, we MUST override the allocation function for objects
75
+ // of this class so that we can manage this part. Not overriding or disabling the allocation function is a common
76
+ // gotcha for "TypedData" objects that can very easily lead to VM crashes, see for instance
77
+ // https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
78
+ rb_define_alloc_func(collectors_cpu_and_wall_time_class, _native_new);
79
+
80
+ rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_initialize", _native_initialize, 3);
81
+ rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_inspect", _native_inspect, 1);
82
+ rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 1);
83
+ rb_define_singleton_method(testing_module, "_native_thread_list", _native_thread_list, 0);
84
+ rb_define_singleton_method(testing_module, "_native_per_thread_context", _native_per_thread_context, 1);
85
+ }
86
+
87
+ // This structure is used to define a Ruby object that stores a pointer to a struct cpu_and_wall_time_collector_state
88
+ // See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
89
+ static const rb_data_type_t cpu_and_wall_time_collector_typed_data = {
90
+ .wrap_struct_name = "Datadog::Profiling::Collectors::CpuAndWallTime",
91
+ .function = {
92
+ .dmark = cpu_and_wall_time_collector_typed_data_mark,
93
+ .dfree = cpu_and_wall_time_collector_typed_data_free,
94
+ .dsize = NULL, // We don't track profile memory usage (although it'd be cool if we did!)
95
+ //.dcompact = NULL, // FIXME: Add support for compaction
96
+ },
97
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
98
+ };
99
+
100
+ // This function is called by the Ruby GC to give us a chance to mark any Ruby objects that we're holding on to,
101
+ // so that they don't get garbage collected
102
+ static void cpu_and_wall_time_collector_typed_data_mark(void *state_ptr) {
103
+ struct cpu_and_wall_time_collector_state *state = (struct cpu_and_wall_time_collector_state *) state_ptr;
104
+
105
+ // Update this when modifying state struct
106
+ rb_gc_mark(state->recorder_instance);
107
+ st_foreach(state->hash_map_per_thread_context, hash_map_per_thread_context_mark, 0 /* unused */);
108
+ }
109
+
110
+ static void cpu_and_wall_time_collector_typed_data_free(void *state_ptr) {
111
+ struct cpu_and_wall_time_collector_state *state = (struct cpu_and_wall_time_collector_state *) state_ptr;
112
+
113
+ // Update this when modifying state struct
114
+
115
+ // Important: Remember that we're only guaranteed to see here what's been set in _native_new, aka
116
+ // pointers that have been set NULL there may still be NULL here.
117
+ if (state->sampling_buffer != NULL) sampling_buffer_free(state->sampling_buffer);
118
+
119
+ // Free each entry in the map
120
+ st_foreach(state->hash_map_per_thread_context, hash_map_per_thread_context_free_values, 0 /* unused */);
121
+ // ...and then the map
122
+ st_free_table(state->hash_map_per_thread_context);
123
+
124
+ ruby_xfree(state);
125
+ }
126
+
127
+ // Mark Ruby thread references we keep as keys in hash_map_per_thread_context
128
+ 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) {
129
+ VALUE thread = (VALUE) key_thread;
130
+ rb_gc_mark(thread);
131
+ return ST_CONTINUE;
132
+ }
133
+
134
+ // Used to clear each of the per_thread_contexts inside the hash_map_per_thread_context
135
+ 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) {
136
+ struct per_thread_context *per_thread_context = (struct per_thread_context*) value_per_thread_context;
137
+ ruby_xfree(per_thread_context);
138
+ return ST_CONTINUE;
139
+ }
140
+
141
+ static VALUE _native_new(VALUE klass) {
142
+ struct cpu_and_wall_time_collector_state *state = ruby_xcalloc(1, sizeof(struct cpu_and_wall_time_collector_state));
143
+
144
+ // Update this when modifying state struct
145
+ state->sampling_buffer = NULL;
146
+ state->hash_map_per_thread_context =
147
+ // "numtable" is an awful name, but TL;DR it's what should be used when keys are `VALUE`s.
148
+ st_init_numtable();
149
+ state->recorder_instance = Qnil;
150
+ state->sample_count = 0;
151
+
152
+ return TypedData_Wrap_Struct(klass, &cpu_and_wall_time_collector_typed_data, state);
153
+ }
154
+
155
+ static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_instance, VALUE recorder_instance, VALUE max_frames) {
156
+ struct cpu_and_wall_time_collector_state *state;
157
+ TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
158
+
159
+ int max_frames_requested = NUM2INT(max_frames);
160
+ if (max_frames_requested < 0) rb_raise(rb_eArgError, "Invalid max_frames: value must not be negative");
161
+
162
+ // Update this when modifying state struct
163
+ state->sampling_buffer = sampling_buffer_new(max_frames_requested);
164
+ // hash_map_per_thread_context is already initialized, nothing to do here
165
+ state->recorder_instance = enforce_recorder_instance(recorder_instance);
166
+
167
+ return Qtrue;
168
+ }
169
+
170
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
171
+ // It SHOULD NOT be used for other purposes.
172
+ static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
173
+ cpu_and_wall_time_collector_sample(collector_instance);
174
+ return Qtrue;
175
+ }
176
+
177
+ // This function gets called from the Collectors::CpuAndWallTimeWorker to trigger the actual sampling.
178
+ //
179
+ // Assumption 1: This function is called in a thread that is holding the Global VM Lock. Caller is responsible for enforcing this.
180
+ // Assumption 2: This function is allowed to raise exceptions. Caller is responsible for handling them, if needed.
181
+ // Assumption 3: This function IS NOT called from a signal handler. This function is not async-signal-safe.
182
+ // Assumption 4: This function IS NOT called in a reentrant way.
183
+ VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
184
+ struct cpu_and_wall_time_collector_state *state;
185
+ TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
186
+
187
+ VALUE threads = ddtrace_thread_list();
188
+ long current_wall_time_ns = wall_time_now_ns();
189
+
190
+ const long thread_count = RARRAY_LEN(threads);
191
+ for (long i = 0; i < thread_count; i++) {
192
+ VALUE thread = RARRAY_AREF(threads, i);
193
+ struct per_thread_context *thread_context = get_or_create_context_for(thread, state);
194
+
195
+ long current_cpu_time_ns = cpu_time_now_ns(thread_context);
196
+
197
+ long cpu_time_elapsed_ns =
198
+ update_time_since_previous_sample(&thread_context->cpu_time_at_previous_sample_ns, current_cpu_time_ns);
199
+ long wall_time_elapsed_ns =
200
+ update_time_since_previous_sample(&thread_context->wall_time_at_previous_sample_ns, current_wall_time_ns);
201
+
202
+ int64_t metric_values[ENABLED_VALUE_TYPES_COUNT] = {0};
203
+
204
+ metric_values[CPU_TIME_VALUE_POS] = cpu_time_elapsed_ns;
205
+ metric_values[CPU_SAMPLES_VALUE_POS] = 1;
206
+ metric_values[WALL_TIME_VALUE_POS] = wall_time_elapsed_ns;
207
+
208
+ VALUE thread_name = thread_name_for(thread);
209
+ bool have_thread_name = thread_name != Qnil;
210
+
211
+ int label_count = 1 + (have_thread_name ? 1 : 0);
212
+ ddprof_ffi_Label labels[label_count];
213
+
214
+ labels[0] = (ddprof_ffi_Label) {.key = DDPROF_FFI_CHARSLICE_C("thread id"), .str = thread_context->thread_id_char_slice};
215
+ if (have_thread_name) {
216
+ labels[1] = (ddprof_ffi_Label) {
217
+ .key = DDPROF_FFI_CHARSLICE_C("thread name"),
218
+ .str = char_slice_from_ruby_string(thread_name)
219
+ };
220
+ }
221
+
222
+ sample_thread(
223
+ thread,
224
+ state->sampling_buffer,
225
+ state->recorder_instance,
226
+ (ddprof_ffi_Slice_i64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
227
+ (ddprof_ffi_Slice_label) {.ptr = labels, .len = label_count}
228
+ );
229
+ }
230
+
231
+ state->sample_count++;
232
+
233
+ // TODO: This seems somewhat overkill and inefficient to do often; right now we just doing every few samples
234
+ // but there's probably a better way to do this if we actually track when threads finish
235
+ if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
236
+
237
+ // Return a VALUE to make it easier to call this function from Ruby APIs that expect a return value (such as rb_rescue2)
238
+ return Qnil;
239
+ }
240
+
241
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
242
+ // It SHOULD NOT be used for other purposes.
243
+ static VALUE _native_thread_list(DDTRACE_UNUSED VALUE _self) {
244
+ return ddtrace_thread_list();
245
+ }
246
+
247
+ static struct per_thread_context *get_or_create_context_for(VALUE thread, struct cpu_and_wall_time_collector_state *state) {
248
+ struct per_thread_context* thread_context = NULL;
249
+ st_data_t value_context = 0;
250
+
251
+ if (st_lookup(state->hash_map_per_thread_context, (st_data_t) thread, &value_context)) {
252
+ thread_context = (struct per_thread_context*) value_context;
253
+ } else {
254
+ thread_context = ruby_xcalloc(1, sizeof(struct per_thread_context));
255
+ initialize_context(thread, thread_context);
256
+ st_insert(state->hash_map_per_thread_context, (st_data_t) thread, (st_data_t) thread_context);
257
+ }
258
+
259
+ return thread_context;
260
+ }
261
+
262
+ static void initialize_context(VALUE thread, struct per_thread_context *thread_context) {
263
+ snprintf(thread_context->thread_id, THREAD_ID_LIMIT_CHARS, "%ld", thread_id_for(thread));
264
+ thread_context->thread_id_char_slice = (ddprof_ffi_CharSlice) {.ptr = thread_context->thread_id, .len = strlen(thread_context->thread_id)};
265
+
266
+ thread_context->thread_cpu_time_id = thread_cpu_time_id_for(thread);
267
+
268
+ // These will get initialized during actual sampling
269
+ thread_context->cpu_time_at_previous_sample_ns = INVALID_TIME;
270
+ thread_context->wall_time_at_previous_sample_ns = INVALID_TIME;
271
+ }
272
+
273
+ static VALUE _native_inspect(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
274
+ struct cpu_and_wall_time_collector_state *state;
275
+ TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
276
+
277
+ VALUE result = rb_str_new2(" (native state)");
278
+
279
+ // Update this when modifying state struct
280
+ rb_str_concat(result, rb_sprintf(" hash_map_per_thread_context=%"PRIsVALUE, per_thread_context_st_table_as_ruby_hash(state)));
281
+ rb_str_concat(result, rb_sprintf(" recorder_instance=%"PRIsVALUE, state->recorder_instance));
282
+ rb_str_concat(result, rb_sprintf(" sample_count=%u", state->sample_count));
283
+
284
+ return result;
285
+ }
286
+
287
+ static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_collector_state *state) {
288
+ VALUE result = rb_hash_new();
289
+ st_foreach(state->hash_map_per_thread_context, per_thread_context_as_ruby_hash, result);
290
+ return result;
291
+ }
292
+
293
+ #define VALUE_COUNT(array) (sizeof(array) / sizeof(VALUE))
294
+
295
+ static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash) {
296
+ VALUE thread = (VALUE) key_thread;
297
+ struct per_thread_context *thread_context = (struct per_thread_context*) value_context;
298
+ VALUE result = (VALUE) result_hash;
299
+ VALUE context_as_hash = rb_hash_new();
300
+ rb_hash_aset(result, thread, context_as_hash);
301
+
302
+ VALUE arguments[] = {
303
+ ID2SYM(rb_intern("thread_id")), /* => */ rb_str_new2(thread_context->thread_id),
304
+ ID2SYM(rb_intern("thread_cpu_time_id_valid?")), /* => */ thread_context->thread_cpu_time_id.valid ? Qtrue : Qfalse,
305
+ ID2SYM(rb_intern("thread_cpu_time_id")), /* => */ CLOCKID2NUM(thread_context->thread_cpu_time_id.clock_id),
306
+ ID2SYM(rb_intern("cpu_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->cpu_time_at_previous_sample_ns),
307
+ ID2SYM(rb_intern("wall_time_at_previous_sample_ns")), /* => */ LONG2NUM(thread_context->wall_time_at_previous_sample_ns)
308
+ };
309
+ for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(context_as_hash, arguments[i], arguments[i+1]);
310
+
311
+ return ST_CONTINUE;
312
+ }
313
+
314
+ static void remove_context_for_dead_threads(struct cpu_and_wall_time_collector_state *state) {
315
+ st_foreach(state->hash_map_per_thread_context, remove_if_dead_thread, 0 /* unused */);
316
+ }
317
+
318
+ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context, DDTRACE_UNUSED st_data_t _argument) {
319
+ VALUE thread = (VALUE) key_thread;
320
+ struct per_thread_context* thread_context = (struct per_thread_context*) value_context;
321
+
322
+ if (is_thread_alive(thread)) return ST_CONTINUE;
323
+
324
+ ruby_xfree(thread_context);
325
+ return ST_DELETE;
326
+ }
327
+
328
+ // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
329
+ // It SHOULD NOT be used for other purposes.
330
+ //
331
+ // Returns the whole contents of the per_thread_context structs being tracked.
332
+ static VALUE _native_per_thread_context(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
333
+ struct cpu_and_wall_time_collector_state *state;
334
+ TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
335
+
336
+ return per_thread_context_st_table_as_ruby_hash(state);
337
+ }
338
+
339
+ static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns) {
340
+ // If we didn't have a time for the previous sample, we use the current one
341
+ if (*time_at_previous_sample_ns == INVALID_TIME) *time_at_previous_sample_ns = current_time_ns;
342
+
343
+ long elapsed_time_ns = current_time_ns - *time_at_previous_sample_ns;
344
+ *time_at_previous_sample_ns = current_time_ns;
345
+
346
+ return elapsed_time_ns >= 0 ? elapsed_time_ns : 0 /* In case something really weird happened */;
347
+ }
348
+
349
+ static long wall_time_now_ns() {
350
+ struct timespec current_monotonic;
351
+
352
+ if (clock_gettime(CLOCK_MONOTONIC, &current_monotonic) != 0) rb_sys_fail("Failed to read CLOCK_MONOTONIC");
353
+
354
+ return current_monotonic.tv_nsec + (current_monotonic.tv_sec * 1000 * 1000 * 1000);
355
+ }
356
+
357
+ static long cpu_time_now_ns(struct per_thread_context *thread_context) {
358
+ thread_cpu_time cpu_time = thread_cpu_time_for(thread_context->thread_cpu_time_id);
359
+
360
+ if (!cpu_time.valid) {
361
+ // Invalidate previous state of the counter (if any), it's no longer accurate. We need to get two good reads
362
+ // in a row to have an accurate delta.
363
+ thread_context->cpu_time_at_previous_sample_ns = INVALID_TIME;
364
+ return 0;
365
+ }
366
+
367
+ return cpu_time.result_ns;
368
+ }
369
+
370
+ static long thread_id_for(VALUE thread) {
371
+ VALUE object_id = rb_obj_id(thread);
372
+
373
+ // 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
374
+ // get a BIGNUM, then you should use `rb_memory_id`. But `rb_memory_id` is less interesting because it's less visible
375
+ // at the user level than the result of calling `#object_id`.
376
+ //
377
+ // It also seems uncommon to me that we'd ever get a BIGNUM; on old Ruby versions (pre-GC compaction), the object id
378
+ // was the pointer to the object, so that's not going to be a BIGNUM; on modern Ruby versions, Ruby keeps
379
+ // a counter, and only increments it for objects for which `#object_id`/`rb_obj_id` is called (e.g. most objects
380
+ // won't actually have an object id allocated).
381
+ //
382
+ // So, for now, let's simplify: we only support FIXNUMs, and we won't break if we get a BIGNUM; we just won't
383
+ // record the thread_id (but samples will still be collected).
384
+ return FIXNUM_P(object_id) ? FIX2LONG(object_id) : -1;
385
+ }
386
+
387
+ VALUE enforce_cpu_and_wall_time_collector_instance(VALUE object) {
388
+ Check_TypedStruct(object, &cpu_and_wall_time_collector_typed_data);
389
+ return object;
390
+ }
@@ -0,0 +1,6 @@
1
+ #pragma once
2
+
3
+ #include <ruby.h>
4
+
5
+ VALUE cpu_and_wall_time_collector_sample(VALUE self_instance);
6
+ VALUE enforce_cpu_and_wall_time_collector_instance(VALUE object);