ddtrace 1.1.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (641) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +423 -1
  3. data/LICENSE-3rdparty.csv +3 -0
  4. data/README.md +9 -4
  5. data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +21 -5
  6. data/ext/ddtrace_profiling_loader/extconf.rb +22 -1
  7. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +52 -8
  8. data/ext/ddtrace_profiling_native_extension/clock_id.h +22 -1
  9. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +34 -3
  10. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +11 -2
  11. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +899 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +9 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +776 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  15. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  16. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  17. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  18. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +175 -63
  19. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +18 -0
  20. data/ext/ddtrace_profiling_native_extension/extconf.rb +90 -18
  21. data/ext/ddtrace_profiling_native_extension/helpers.h +17 -0
  22. data/ext/ddtrace_profiling_native_extension/http_transport.c +354 -0
  23. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +18 -0
  24. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +154 -21
  25. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +256 -17
  26. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +17 -5
  27. data/ext/ddtrace_profiling_native_extension/profiling.c +223 -3
  28. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +110 -0
  29. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +89 -0
  30. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  31. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  32. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +392 -44
  33. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +25 -14
  34. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  35. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  36. data/lib/datadog/appsec/assets/blocked.html +98 -3
  37. data/lib/datadog/appsec/assets/blocked.json +1 -0
  38. data/lib/datadog/appsec/assets/blocked.text +5 -0
  39. data/lib/datadog/appsec/assets/waf_rules/recommended.json +1250 -300
  40. data/lib/datadog/appsec/assets/waf_rules/risky.json +78 -78
  41. data/lib/datadog/appsec/assets/waf_rules/strict.json +308 -73
  42. data/lib/datadog/appsec/assets.rb +3 -3
  43. data/lib/datadog/appsec/autoload.rb +4 -2
  44. data/lib/datadog/appsec/configuration/settings.rb +40 -23
  45. data/lib/datadog/appsec/configuration.rb +9 -3
  46. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -3
  47. data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -2
  48. data/lib/datadog/appsec/contrib/integration.rb +1 -1
  49. data/lib/datadog/appsec/contrib/patcher.rb +1 -1
  50. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +3 -3
  51. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  52. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +32 -27
  53. data/lib/datadog/appsec/contrib/rack/integration.rb +5 -5
  54. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -2
  55. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +17 -21
  56. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +13 -13
  57. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +13 -13
  58. data/lib/datadog/appsec/contrib/rack/request.rb +21 -1
  59. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -3
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +50 -23
  61. data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
  62. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +3 -3
  63. data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
  64. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
  65. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +12 -11
  66. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  67. data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -13
  68. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +13 -13
  69. data/lib/datadog/appsec/contrib/rails/request.rb +4 -1
  70. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
  71. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +3 -3
  72. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  73. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
  74. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +21 -19
  75. data/lib/datadog/appsec/contrib/sinatra/integration.rb +4 -4
  76. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +22 -15
  77. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +12 -12
  78. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
  79. data/lib/datadog/appsec/event.rb +10 -14
  80. data/lib/datadog/appsec/extensions.rb +43 -23
  81. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -3
  82. data/lib/datadog/appsec/processor.rb +51 -21
  83. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  84. data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
  85. data/lib/datadog/appsec/reactive/engine.rb +3 -3
  86. data/lib/datadog/appsec/reactive/operation.rb +5 -5
  87. data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
  88. data/lib/datadog/appsec/response.rb +63 -0
  89. data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
  90. data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
  91. data/lib/datadog/appsec/utils/http.rb +9 -0
  92. data/lib/datadog/appsec/utils.rb +7 -0
  93. data/lib/datadog/appsec.rb +6 -6
  94. data/lib/datadog/ci/configuration/components.rb +1 -1
  95. data/lib/datadog/ci/configuration/settings.rb +1 -1
  96. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -2
  97. data/lib/datadog/ci/contrib/cucumber/formatter.rb +5 -5
  98. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +1 -1
  99. data/lib/datadog/ci/contrib/cucumber/integration.rb +4 -4
  100. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -2
  101. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -2
  102. data/lib/datadog/ci/contrib/rspec/example.rb +5 -5
  103. data/lib/datadog/ci/contrib/rspec/integration.rb +4 -4
  104. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -2
  105. data/lib/datadog/ci/ext/environment.rb +78 -20
  106. data/lib/datadog/ci/extensions.rb +4 -4
  107. data/lib/datadog/ci/flush.rb +2 -2
  108. data/lib/datadog/ci/test.rb +3 -3
  109. data/lib/datadog/ci.rb +6 -6
  110. data/lib/datadog/core/buffer/cruby.rb +1 -1
  111. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  112. data/lib/datadog/core/configuration/agent_settings_resolver.rb +8 -11
  113. data/lib/datadog/core/configuration/base.rb +14 -2
  114. data/lib/datadog/core/configuration/components.rb +103 -52
  115. data/lib/datadog/core/configuration/ext.rb +26 -0
  116. data/lib/datadog/core/configuration/option_definition.rb +12 -3
  117. data/lib/datadog/core/configuration/option_definition_set.rb +1 -1
  118. data/lib/datadog/core/configuration/options.rb +3 -3
  119. data/lib/datadog/core/configuration/settings.rb +78 -250
  120. data/lib/datadog/core/configuration.rb +9 -6
  121. data/lib/datadog/core/diagnostics/environment_logger.rb +10 -5
  122. data/lib/datadog/core/diagnostics/health.rb +5 -23
  123. data/lib/datadog/core/environment/cgroup.rb +1 -1
  124. data/lib/datadog/core/environment/container.rb +1 -1
  125. data/lib/datadog/core/environment/ext.rb +1 -1
  126. data/lib/datadog/core/environment/identity.rb +2 -2
  127. data/lib/datadog/core/environment/platform.rb +40 -0
  128. data/lib/datadog/core/environment/socket.rb +1 -1
  129. data/lib/datadog/core/environment/variable_helpers.rb +58 -10
  130. data/lib/datadog/core/error.rb +1 -1
  131. data/lib/datadog/core/extensions.rb +1 -1
  132. data/lib/datadog/core/header_collection.rb +41 -0
  133. data/lib/datadog/core/metrics/client.rb +10 -9
  134. data/lib/datadog/core/metrics/ext.rb +0 -2
  135. data/lib/datadog/core/metrics/options.rb +3 -3
  136. data/lib/datadog/core/runtime/ext.rb +1 -1
  137. data/lib/datadog/core/runtime/metrics.rb +6 -6
  138. data/lib/datadog/core/telemetry/client.rb +79 -0
  139. data/lib/datadog/core/telemetry/collector.rb +233 -0
  140. data/lib/datadog/core/telemetry/emitter.rb +48 -0
  141. data/lib/datadog/core/telemetry/event.rb +71 -0
  142. data/lib/datadog/core/telemetry/ext.rb +11 -0
  143. data/lib/datadog/core/telemetry/heartbeat.rb +37 -0
  144. data/lib/datadog/core/telemetry/http/adapters/net.rb +113 -0
  145. data/lib/datadog/core/telemetry/http/env.rb +20 -0
  146. data/lib/datadog/core/telemetry/http/ext.rb +20 -0
  147. data/lib/datadog/core/telemetry/http/response.rb +68 -0
  148. data/lib/datadog/core/telemetry/http/transport.rb +53 -0
  149. data/lib/datadog/core/telemetry/v1/app_event.rb +52 -0
  150. data/lib/datadog/core/telemetry/v1/application.rb +86 -0
  151. data/lib/datadog/core/telemetry/v1/configuration.rb +25 -0
  152. data/lib/datadog/core/telemetry/v1/dependency.rb +36 -0
  153. data/lib/datadog/core/telemetry/v1/host.rb +51 -0
  154. data/lib/datadog/core/telemetry/v1/integration.rb +58 -0
  155. data/lib/datadog/core/telemetry/v1/product.rb +28 -0
  156. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +100 -0
  157. data/lib/datadog/core/utils/compression.rb +5 -1
  158. data/lib/datadog/core/utils/object_set.rb +1 -1
  159. data/lib/datadog/core/utils/sequence.rb +5 -0
  160. data/lib/datadog/core/utils/string_table.rb +1 -1
  161. data/lib/datadog/core/utils/time.rb +3 -3
  162. data/lib/datadog/core/utils.rb +1 -22
  163. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +2 -2
  164. data/lib/datadog/core/vendor/multipart-post/net/http/post/multipart.rb +3 -3
  165. data/lib/datadog/core/workers/async.rb +1 -3
  166. data/lib/datadog/core/workers/polling.rb +2 -2
  167. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  168. data/lib/datadog/core.rb +22 -56
  169. data/lib/datadog/kit/appsec/events.rb +75 -0
  170. data/lib/datadog/kit/enable_core_dumps.rb +1 -0
  171. data/lib/datadog/kit/identity.rb +8 -7
  172. data/lib/datadog/kit.rb +1 -1
  173. data/lib/datadog/opentelemetry/api/context.rb +187 -0
  174. data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
  175. data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
  176. data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
  177. data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
  178. data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
  179. data/lib/datadog/opentelemetry.rb +48 -0
  180. data/lib/datadog/opentracer/distributed_headers.rb +7 -9
  181. data/lib/datadog/opentracer/rack_propagator.rb +10 -9
  182. data/lib/datadog/opentracer/span.rb +1 -1
  183. data/lib/datadog/opentracer/text_map_propagator.rb +13 -12
  184. data/lib/datadog/opentracer/thread_local_scope_manager.rb +26 -3
  185. data/lib/datadog/opentracer/tracer.rb +23 -21
  186. data/lib/datadog/opentracer.rb +16 -16
  187. data/lib/datadog/profiling/buffer.rb +3 -3
  188. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -0
  189. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +43 -0
  190. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +91 -0
  191. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  192. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  193. data/lib/datadog/profiling/collectors/old_stack.rb +15 -8
  194. data/lib/datadog/profiling/collectors/stack.rb +3 -6
  195. data/lib/datadog/profiling/encoding/profile.rb +8 -12
  196. data/lib/datadog/profiling/events/stack.rb +1 -1
  197. data/lib/datadog/profiling/exporter.rb +69 -9
  198. data/lib/datadog/profiling/ext/forking.rb +41 -42
  199. data/lib/datadog/profiling/ext.rb +3 -15
  200. data/lib/datadog/profiling/flush.rb +25 -56
  201. data/lib/datadog/profiling/http_transport.rb +132 -0
  202. data/lib/datadog/profiling/old_recorder.rb +109 -0
  203. data/lib/datadog/profiling/pprof/builder.rb +4 -4
  204. data/lib/datadog/profiling/pprof/converter.rb +1 -1
  205. data/lib/datadog/profiling/pprof/message_set.rb +1 -1
  206. data/lib/datadog/profiling/pprof/stack_sample.rb +4 -4
  207. data/lib/datadog/profiling/pprof/string_table.rb +1 -1
  208. data/lib/datadog/profiling/pprof/template.rb +5 -5
  209. data/lib/datadog/profiling/preload.rb +1 -1
  210. data/lib/datadog/profiling/profiler.rb +7 -0
  211. data/lib/datadog/profiling/scheduler.rb +28 -49
  212. data/lib/datadog/profiling/stack_recorder.rb +50 -4
  213. data/lib/datadog/profiling/tag_builder.rb +6 -1
  214. data/lib/datadog/profiling/tasks/setup.rb +2 -9
  215. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +2 -2
  216. data/lib/datadog/profiling/trace_identifiers/helper.rb +1 -1
  217. data/lib/datadog/profiling.rb +24 -21
  218. data/lib/datadog/tracing/analytics.rb +1 -1
  219. data/lib/datadog/tracing/buffer.rb +5 -5
  220. data/lib/datadog/tracing/client_ip.rb +164 -0
  221. data/lib/datadog/tracing/configuration/ext.rb +47 -4
  222. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  223. data/lib/datadog/tracing/context.rb +1 -1
  224. data/lib/datadog/tracing/context_provider.rb +18 -2
  225. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  226. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -5
  227. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -4
  228. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +3 -3
  229. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -4
  230. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  231. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +3 -4
  232. data/lib/datadog/tracing/contrib/action_cable/integration.rb +4 -4
  233. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  234. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  235. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  236. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +3 -3
  237. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -3
  238. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  239. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +4 -4
  240. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  241. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +10 -6
  242. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  243. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +2 -2
  244. data/lib/datadog/tracing/contrib/action_pack/integration.rb +4 -4
  245. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -2
  246. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +2 -2
  248. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  249. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +5 -5
  250. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +5 -5
  251. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  252. data/lib/datadog/tracing/contrib/action_view/instrumentation/partial_renderer.rb +2 -2
  253. data/lib/datadog/tracing/contrib/action_view/instrumentation/template_renderer.rb +2 -2
  254. data/lib/datadog/tracing/contrib/action_view/integration.rb +4 -4
  255. data/lib/datadog/tracing/contrib/action_view/patcher.rb +7 -7
  256. data/lib/datadog/tracing/contrib/action_view/utils.rb +1 -1
  257. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +3 -3
  258. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  259. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -4
  260. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -4
  261. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -4
  262. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -4
  263. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -4
  264. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -4
  265. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  266. data/lib/datadog/tracing/contrib/active_job/integration.rb +4 -4
  267. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +0 -2
  268. data/lib/datadog/tracing/contrib/active_job/patcher.rb +4 -4
  269. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  270. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -5
  271. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +3 -3
  272. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +2 -2
  273. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  274. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +3 -3
  275. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -4
  276. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  277. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +3 -3
  278. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  279. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +4 -4
  280. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +6 -6
  281. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  282. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -6
  283. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  284. data/lib/datadog/tracing/contrib/active_record/utils.rb +2 -2
  285. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +19 -9
  286. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -2
  287. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +1 -1
  288. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -2
  289. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -5
  290. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  291. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +1 -1
  292. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  293. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  294. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  295. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +6 -3
  296. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  297. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -4
  298. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -3
  299. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  300. data/lib/datadog/tracing/contrib/aws/services.rb +0 -2
  301. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  302. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  303. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -3
  304. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -2
  305. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  306. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  307. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  308. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -3
  309. data/lib/datadog/tracing/contrib/dalli/ext.rb +2 -0
  310. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +8 -5
  311. data/lib/datadog/tracing/contrib/dalli/integration.rb +3 -3
  312. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  313. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  314. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +3 -3
  315. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +2 -0
  316. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +3 -3
  317. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +8 -2
  318. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +7 -4
  319. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +32 -0
  320. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +7 -3
  321. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -0
  322. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +3 -3
  323. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +9 -7
  324. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  325. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +8 -3
  326. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +6 -7
  327. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  328. data/lib/datadog/tracing/contrib/ethon/integration.rb +4 -4
  329. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +5 -4
  330. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  331. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +7 -3
  332. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  333. data/lib/datadog/tracing/contrib/excon/integration.rb +4 -4
  334. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -7
  335. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  336. data/lib/datadog/tracing/contrib/ext.rb +25 -0
  337. data/lib/datadog/tracing/contrib/extensions.rb +5 -3
  338. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +7 -3
  339. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  340. data/lib/datadog/tracing/contrib/faraday/integration.rb +4 -4
  341. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  342. data/lib/datadog/tracing/contrib/faraday/patcher.rb +5 -5
  343. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +3 -3
  344. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -7
  345. data/lib/datadog/tracing/contrib/grape/integration.rb +3 -3
  346. data/lib/datadog/tracing/contrib/grape/patcher.rb +4 -4
  347. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  348. data/lib/datadog/tracing/contrib/graphql/integration.rb +3 -3
  349. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -3
  350. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +10 -4
  351. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +20 -5
  352. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +17 -17
  353. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +7 -4
  354. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  355. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
  356. data/lib/datadog/tracing/contrib/grpc/ext.rb +4 -0
  357. data/lib/datadog/tracing/contrib/grpc/integration.rb +3 -3
  358. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -5
  359. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
  360. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
  361. data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
  362. data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
  363. data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
  364. data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
  365. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
  366. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
  367. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -2
  368. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +13 -3
  369. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +39 -0
  370. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
  371. data/lib/datadog/tracing/contrib/http/ext.rb +2 -0
  372. data/lib/datadog/tracing/contrib/http/instrumentation.rb +8 -10
  373. data/lib/datadog/tracing/contrib/http/integration.rb +6 -6
  374. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  375. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +13 -3
  376. data/lib/datadog/tracing/contrib/httpclient/ext.rb +2 -0
  377. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +9 -9
  378. data/lib/datadog/tracing/contrib/httpclient/integration.rb +4 -4
  379. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  380. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +13 -3
  381. data/lib/datadog/tracing/contrib/httprb/ext.rb +2 -0
  382. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -9
  383. data/lib/datadog/tracing/contrib/httprb/integration.rb +4 -4
  384. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  385. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  386. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  387. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
  388. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  389. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +2 -2
  390. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  391. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  392. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +4 -4
  393. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +4 -4
  394. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +4 -4
  395. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +4 -4
  396. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -2
  397. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -2
  398. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  399. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -3
  400. data/lib/datadog/tracing/contrib/kafka/patcher.rb +3 -3
  401. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  402. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -2
  403. data/lib/datadog/tracing/contrib/lograge/integration.rb +3 -3
  404. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -2
  405. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +7 -3
  406. data/lib/datadog/tracing/contrib/mongodb/ext.rb +8 -0
  407. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  408. data/lib/datadog/tracing/contrib/mongodb/integration.rb +4 -4
  409. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  410. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  411. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +10 -4
  412. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +18 -3
  413. data/lib/datadog/tracing/contrib/mysql2/ext.rb +2 -0
  414. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -5
  415. data/lib/datadog/tracing/contrib/mysql2/integration.rb +3 -3
  416. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  417. data/lib/datadog/tracing/contrib/patcher.rb +16 -4
  418. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +50 -0
  419. data/lib/datadog/tracing/contrib/pg/ext.rb +33 -0
  420. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +168 -0
  421. data/lib/datadog/tracing/contrib/pg/integration.rb +43 -0
  422. data/lib/datadog/tracing/contrib/pg/patcher.rb +31 -0
  423. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -3
  424. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  425. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -3
  426. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -3
  427. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  428. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
  429. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +33 -0
  430. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
  431. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +47 -0
  432. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -2
  433. data/lib/datadog/tracing/contrib/qless/integration.rb +3 -3
  434. data/lib/datadog/tracing/contrib/qless/patcher.rb +1 -2
  435. data/lib/datadog/tracing/contrib/qless/qless_job.rb +2 -3
  436. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +0 -2
  437. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +3 -3
  438. data/lib/datadog/tracing/contrib/que/integration.rb +4 -4
  439. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  440. data/lib/datadog/tracing/contrib/que/tracer.rb +3 -1
  441. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -2
  442. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -5
  443. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +6 -3
  444. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +2 -2
  445. data/lib/datadog/tracing/contrib/racecar/events/message.rb +6 -3
  446. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  447. data/lib/datadog/tracing/contrib/racecar/integration.rb +3 -3
  448. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  449. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  450. data/lib/datadog/tracing/contrib/rack/header_collection.rb +35 -0
  451. data/lib/datadog/tracing/contrib/rack/integration.rb +4 -4
  452. data/lib/datadog/tracing/contrib/rack/middlewares.rb +129 -61
  453. data/lib/datadog/tracing/contrib/rack/patcher.rb +12 -2
  454. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  455. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -1
  456. data/lib/datadog/tracing/contrib/rails/framework.rb +18 -22
  457. data/lib/datadog/tracing/contrib/rails/integration.rb +4 -4
  458. data/lib/datadog/tracing/contrib/rails/log_injection.rb +0 -2
  459. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -2
  460. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -8
  461. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  462. data/lib/datadog/tracing/contrib/rails/utils.rb +1 -1
  463. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +17 -2
  464. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +12 -7
  465. data/lib/datadog/tracing/contrib/rake/integration.rb +3 -3
  466. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -4
  467. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  468. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -3
  469. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -0
  470. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +36 -26
  471. data/lib/datadog/tracing/contrib/redis/integration.rb +37 -4
  472. data/lib/datadog/tracing/contrib/redis/patcher.rb +57 -13
  473. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  474. data/lib/datadog/tracing/contrib/redis/tags.rb +12 -10
  475. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  476. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +3 -3
  477. data/lib/datadog/tracing/contrib/resque/integration.rb +3 -3
  478. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -2
  479. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -4
  480. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +9 -3
  481. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  482. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -3
  483. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  484. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +7 -6
  485. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  486. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -2
  487. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +3 -3
  488. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  489. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  490. data/lib/datadog/tracing/contrib/sequel/database.rb +4 -5
  491. data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -5
  492. data/lib/datadog/tracing/contrib/sequel/integration.rb +3 -3
  493. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  494. data/lib/datadog/tracing/contrib/sequel/utils.rb +2 -2
  495. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +3 -3
  496. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +4 -4
  497. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  498. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +3 -1
  499. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +9 -5
  500. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -3
  501. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +6 -0
  502. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +3 -3
  503. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +14 -7
  504. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +19 -1
  505. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/{scheduled_push.rb → redis_info.rb} +5 -6
  506. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +53 -0
  507. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +10 -6
  508. data/lib/datadog/tracing/contrib/sidekiq/tracing.rb +2 -2
  509. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  510. data/lib/datadog/tracing/contrib/sinatra/env.rb +14 -25
  511. data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
  512. data/lib/datadog/tracing/contrib/sinatra/framework.rb +0 -2
  513. data/lib/datadog/tracing/contrib/sinatra/headers.rb +1 -1
  514. data/lib/datadog/tracing/contrib/sinatra/integration.rb +3 -3
  515. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +7 -7
  516. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +15 -88
  517. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +20 -16
  518. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +2 -2
  519. data/lib/datadog/tracing/contrib/sneakers/integration.rb +4 -4
  520. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  521. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -3
  522. data/lib/datadog/tracing/contrib/status_code_matcher.rb +2 -2
  523. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
  524. data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
  525. data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
  526. data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
  527. data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
  528. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  529. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +3 -4
  530. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +3 -3
  531. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -5
  532. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +92 -10
  533. data/lib/datadog/tracing/contrib.rb +50 -47
  534. data/lib/datadog/tracing/correlation.rb +1 -1
  535. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  536. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  537. data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
  538. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  539. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  540. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +85 -0
  541. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  542. data/lib/datadog/tracing/distributed/headers/ext.rb +19 -15
  543. data/lib/datadog/tracing/distributed/helpers.rb +40 -4
  544. data/lib/datadog/tracing/distributed/none.rb +19 -0
  545. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  546. data/lib/datadog/tracing/distributed/trace_context.rb +378 -0
  547. data/lib/datadog/tracing/event.rb +1 -1
  548. data/lib/datadog/tracing/flush.rb +57 -35
  549. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  550. data/lib/datadog/tracing/metadata/errors.rb +2 -2
  551. data/lib/datadog/tracing/metadata/ext.rb +28 -1
  552. data/lib/datadog/tracing/metadata/tagging.rb +23 -2
  553. data/lib/datadog/tracing/metadata.rb +3 -3
  554. data/lib/datadog/tracing/pipeline/span_filter.rb +10 -6
  555. data/lib/datadog/tracing/pipeline.rb +3 -3
  556. data/lib/datadog/tracing/propagation/http.rb +3 -98
  557. data/lib/datadog/tracing/runtime/metrics.rb +1 -1
  558. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  559. data/lib/datadog/tracing/sampling/ext.rb +31 -0
  560. data/lib/datadog/tracing/sampling/priority_sampler.rb +62 -9
  561. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +10 -11
  562. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +32 -8
  563. data/lib/datadog/tracing/sampling/rate_limiter.rb +4 -1
  564. data/lib/datadog/tracing/sampling/rate_sampler.rb +27 -10
  565. data/lib/datadog/tracing/sampling/rule.rb +3 -3
  566. data/lib/datadog/tracing/sampling/rule_sampler.rb +8 -7
  567. data/lib/datadog/tracing/sampling/span/ext.rb +25 -0
  568. data/lib/datadog/tracing/sampling/span/matcher.rb +89 -0
  569. data/lib/datadog/tracing/sampling/span/rule.rb +82 -0
  570. data/lib/datadog/tracing/sampling/span/rule_parser.rb +104 -0
  571. data/lib/datadog/tracing/sampling/span/sampler.rb +75 -0
  572. data/lib/datadog/tracing/span.rb +24 -20
  573. data/lib/datadog/tracing/span_operation.rb +13 -13
  574. data/lib/datadog/tracing/sync_writer.rb +5 -5
  575. data/lib/datadog/tracing/trace_digest.rb +88 -2
  576. data/lib/datadog/tracing/trace_operation.rb +60 -15
  577. data/lib/datadog/tracing/trace_segment.rb +13 -8
  578. data/lib/datadog/tracing/tracer.rb +49 -21
  579. data/lib/datadog/tracing/utils.rb +50 -0
  580. data/lib/datadog/tracing/workers/trace_writer.rb +9 -9
  581. data/lib/datadog/tracing/workers.rb +3 -3
  582. data/lib/datadog/tracing/writer.rb +12 -5
  583. data/lib/datadog/tracing.rb +8 -8
  584. data/lib/ddtrace/auto_instrument.rb +9 -2
  585. data/lib/ddtrace/transport/ext.rb +7 -1
  586. data/lib/ddtrace/transport/http/adapters/net.rb +3 -2
  587. data/lib/ddtrace/transport/http/adapters/test.rb +1 -1
  588. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -2
  589. data/lib/ddtrace/transport/http/api/map.rb +1 -1
  590. data/lib/ddtrace/transport/http/api.rb +4 -4
  591. data/lib/ddtrace/transport/http/builder.rb +5 -5
  592. data/lib/ddtrace/transport/http/client.rb +2 -2
  593. data/lib/ddtrace/transport/http/response.rb +1 -1
  594. data/lib/ddtrace/transport/http/statistics.rb +1 -1
  595. data/lib/ddtrace/transport/http/traces.rb +5 -5
  596. data/lib/ddtrace/transport/http.rb +12 -9
  597. data/lib/ddtrace/transport/io/client.rb +2 -2
  598. data/lib/ddtrace/transport/io/response.rb +1 -1
  599. data/lib/ddtrace/transport/io/traces.rb +3 -3
  600. data/lib/ddtrace/transport/io.rb +3 -3
  601. data/lib/ddtrace/transport/statistics.rb +2 -2
  602. data/lib/ddtrace/transport/trace_formatter.rb +14 -10
  603. data/lib/ddtrace/transport/traces.rb +8 -6
  604. data/lib/ddtrace/version.rb +1 -1
  605. data/lib/ddtrace.rb +6 -6
  606. metadata +127 -48
  607. data/.editorconfig +0 -22
  608. data/.gitignore +0 -58
  609. data/CONTRIBUTING.md +0 -81
  610. data/ddtrace.gemspec +0 -68
  611. data/docs/0.x-trace.png +0 -0
  612. data/docs/1.0-trace.png +0 -0
  613. data/docs/AutoInstrumentation.md +0 -36
  614. data/docs/Deprecation.md +0 -8
  615. data/docs/DevelopmentGuide.md +0 -259
  616. data/docs/GettingStarted.md +0 -2688
  617. data/docs/ProfilingDevelopment.md +0 -110
  618. data/docs/PublicApi.md +0 -14
  619. data/docs/UpgradeGuide.md +0 -736
  620. data/ext/ddtrace_profiling_native_extension/libddprof_helpers.h +0 -13
  621. data/lib/datadog/profiling/recorder.rb +0 -117
  622. data/lib/datadog/profiling/transport/client.rb +0 -16
  623. data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -107
  624. data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
  625. data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
  626. data/lib/datadog/profiling/transport/http/api.rb +0 -45
  627. data/lib/datadog/profiling/transport/http/builder.rb +0 -30
  628. data/lib/datadog/profiling/transport/http/client.rb +0 -35
  629. data/lib/datadog/profiling/transport/http/response.rb +0 -23
  630. data/lib/datadog/profiling/transport/http.rb +0 -112
  631. data/lib/datadog/profiling/transport/io/client.rb +0 -29
  632. data/lib/datadog/profiling/transport/io/response.rb +0 -18
  633. data/lib/datadog/profiling/transport/io.rb +0 -32
  634. data/lib/datadog/profiling/transport/parcel.rb +0 -19
  635. data/lib/datadog/profiling/transport/request.rb +0 -17
  636. data/lib/datadog/profiling/transport/response.rb +0 -10
  637. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  638. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  639. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -52
  640. data/lib/datadog/tracing/distributed/parser.rb +0 -70
  641. data/lib/datadog/tracing/propagation/grpc.rb +0 -88
@@ -1,9 +1,12 @@
1
1
  #include <ruby.h>
2
2
  #include <ruby/debug.h>
3
3
  #include "extconf.h"
4
- #include "libddprof_helpers.h"
4
+ #include "helpers.h"
5
+ #include "libdatadog_helpers.h"
6
+ #include "ruby_helpers.h"
5
7
  #include "private_vm_api_access.h"
6
8
  #include "stack_recorder.h"
9
+ #include "collectors_stack.h"
7
10
 
8
11
  // Gathers stack traces from running threads, storing them in a StackRecorder instance
9
12
  // This file implements the native bits of the Datadog::Profiling::Collectors::Stack class
@@ -14,37 +17,68 @@
14
17
  static VALUE missing_string = Qnil;
15
18
 
16
19
  // Used as scratch space during sampling
17
- typedef struct sampling_buffer {
20
+ struct sampling_buffer {
18
21
  unsigned int max_frames;
19
22
  VALUE *stack_buffer;
20
23
  int *lines_buffer;
21
24
  bool *is_ruby_frame;
22
- ddprof_ffi_Location *locations;
23
- ddprof_ffi_Line *lines;
24
- } sampling_buffer;
25
-
26
- static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, VALUE metric_values_hash, VALUE labels_array, VALUE max_frames);
27
- void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels);
28
- void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size);
29
- void record_placeholder_stack_in_native_code(VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels);
30
- sampling_buffer *sampling_buffer_new(unsigned int max_frames);
31
- void sampling_buffer_free(sampling_buffer *buffer);
25
+ ddog_prof_Location *locations;
26
+ ddog_prof_Line *lines;
27
+ }; // Note: typedef'd in the header to sampling_buffer
28
+
29
+ static VALUE _native_sample(
30
+ VALUE self,
31
+ VALUE thread,
32
+ VALUE recorder_instance,
33
+ VALUE metric_values_hash,
34
+ VALUE labels_array,
35
+ VALUE max_frames,
36
+ VALUE in_gc
37
+ );
38
+ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size);
39
+ static void record_placeholder_stack_in_native_code(
40
+ sampling_buffer* buffer,
41
+ VALUE recorder_instance,
42
+ ddog_Slice_I64 metric_values,
43
+ ddog_prof_Slice_Label labels,
44
+ sampling_buffer *record_buffer,
45
+ int extra_frames_in_record_buffer
46
+ );
47
+ static void sample_thread_internal(
48
+ VALUE thread,
49
+ sampling_buffer* buffer,
50
+ VALUE recorder_instance,
51
+ ddog_Slice_I64 metric_values,
52
+ ddog_prof_Slice_Label labels,
53
+ sampling_buffer *record_buffer,
54
+ int extra_frames_in_record_buffer
55
+ );
32
56
 
33
57
  void collectors_stack_init(VALUE profiling_module) {
34
58
  VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
35
59
  VALUE collectors_stack_class = rb_define_class_under(collectors_module, "Stack", rb_cObject);
60
+ // Hosts methods used for testing the native code using RSpec
61
+ VALUE testing_module = rb_define_module_under(collectors_stack_class, "Testing");
36
62
 
37
- rb_define_singleton_method(collectors_stack_class, "_native_sample", _native_sample, 5);
63
+ rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 6);
38
64
 
39
65
  missing_string = rb_str_new2("");
40
66
  rb_global_variable(&missing_string);
41
67
  }
42
68
 
43
- // This method exists only to enable testing Collectors::Stack behavior using RSpec.
69
+ // This method exists only to enable testing Datadog::Profiling::Collectors::Stack behavior using RSpec.
44
70
  // It SHOULD NOT be used for other purposes.
45
- static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, VALUE metric_values_hash, VALUE labels_array, VALUE max_frames) {
46
- Check_Type(metric_values_hash, T_HASH);
47
- Check_Type(labels_array, T_ARRAY);
71
+ static VALUE _native_sample(
72
+ DDTRACE_UNUSED VALUE _self,
73
+ VALUE thread,
74
+ VALUE recorder_instance,
75
+ VALUE metric_values_hash,
76
+ VALUE labels_array,
77
+ VALUE max_frames,
78
+ VALUE in_gc
79
+ ) {
80
+ ENFORCE_TYPE(metric_values_hash, T_HASH);
81
+ ENFORCE_TYPE(labels_array, T_ARRAY);
48
82
 
49
83
  if (RHASH_SIZE(metric_values_hash) != ENABLED_VALUE_TYPES_COUNT) {
50
84
  rb_raise(
@@ -62,12 +96,12 @@ static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, V
62
96
  }
63
97
 
64
98
  long labels_count = RARRAY_LEN(labels_array);
65
- ddprof_ffi_Label labels[labels_count];
99
+ ddog_prof_Label labels[labels_count];
66
100
 
67
101
  for (int i = 0; i < labels_count; i++) {
68
102
  VALUE key_str_pair = rb_ary_entry(labels_array, i);
69
103
 
70
- labels[i] = (ddprof_ffi_Label) {
104
+ labels[i] = (ddog_prof_Label) {
71
105
  .key = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 0)),
72
106
  .str = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 1))
73
107
  };
@@ -78,12 +112,13 @@ static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, V
78
112
 
79
113
  sampling_buffer *buffer = sampling_buffer_new(max_frames_requested);
80
114
 
81
- sample(
115
+ sample_thread(
82
116
  thread,
83
117
  buffer,
84
118
  recorder_instance,
85
- (ddprof_ffi_Slice_i64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
86
- (ddprof_ffi_Slice_label) {.ptr = labels, .len = labels_count}
119
+ (ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
120
+ (ddog_prof_Slice_Label) {.ptr = labels, .len = labels_count},
121
+ RTEST(in_gc) ? SAMPLE_IN_GC : SAMPLE_REGULAR
87
122
  );
88
123
 
89
124
  sampling_buffer_free(buffer);
@@ -91,7 +126,77 @@ static VALUE _native_sample(VALUE self, VALUE thread, VALUE recorder_instance, V
91
126
  return Qtrue;
92
127
  }
93
128
 
94
- void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels) {
129
+ void sample_thread(
130
+ VALUE thread,
131
+ sampling_buffer* buffer,
132
+ VALUE recorder_instance,
133
+ ddog_Slice_I64 metric_values,
134
+ ddog_prof_Slice_Label labels,
135
+ sample_type type
136
+ ) {
137
+ // Samples thread into recorder
138
+ if (type == SAMPLE_REGULAR) {
139
+ sampling_buffer *record_buffer = buffer;
140
+ int extra_frames_in_record_buffer = 0;
141
+ sample_thread_internal(thread, buffer, recorder_instance, metric_values, labels, record_buffer, extra_frames_in_record_buffer);
142
+ return;
143
+ }
144
+
145
+ // Samples thread into recorder, including as a top frame in the stack a frame named "Garbage Collection"
146
+ if (type == SAMPLE_IN_GC) {
147
+ ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
148
+ ddog_CharSlice function_filename = DDOG_CHARSLICE_C("Garbage Collection");
149
+ buffer->lines[0] = (ddog_prof_Line) {
150
+ .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
151
+ .line = 0
152
+ };
153
+ // To avoid changing sample_thread_internal, we just prepare a new buffer struct that uses the same underlying storage as the
154
+ // original buffer, but has capacity one less, so that we can keep the above Garbage Collection frame untouched.
155
+ sampling_buffer thread_in_gc_buffer = (struct sampling_buffer) {
156
+ .max_frames = buffer->max_frames - 1,
157
+ .stack_buffer = buffer->stack_buffer + 1,
158
+ .lines_buffer = buffer->lines_buffer + 1,
159
+ .is_ruby_frame = buffer->is_ruby_frame + 1,
160
+ .locations = buffer->locations + 1,
161
+ .lines = buffer->lines + 1
162
+ };
163
+ sampling_buffer *record_buffer = buffer; // We pass in the original buffer as the record_buffer, but not as the regular buffer
164
+ int extra_frames_in_record_buffer = 1;
165
+ sample_thread_internal(thread, &thread_in_gc_buffer, recorder_instance, metric_values, labels, record_buffer, extra_frames_in_record_buffer);
166
+ return;
167
+ }
168
+
169
+ rb_raise(rb_eArgError, "Unexpected value for sample_type: %d", type);
170
+ }
171
+
172
+ // Idea: Should we release the global vm lock (GVL) after we get the data from `rb_profile_frames`? That way other Ruby threads
173
+ // could continue making progress while the sample was ingested into the profile.
174
+ //
175
+ // Other things to take into consideration if we go in that direction:
176
+ // * Is it safe to call `rb_profile_frame_...` methods on things from the `stack_buffer` without the GVL acquired?
177
+ // * We need to make `VALUE` references in the `stack_buffer` visible to the Ruby GC
178
+ // * Should we move this into a different thread entirely?
179
+ // * If we don't move it into a different thread, does releasing the GVL on a Ruby thread mean that we're introducing
180
+ // a new thread switch point where there previously was none?
181
+ //
182
+ // ---
183
+ //
184
+ // Why the weird extra record_buffer and extra_frames_in_record_buffer?
185
+ // The answer is: to support both sample_thread() and sample_thread_in_gc().
186
+ //
187
+ // For sample_thread(), buffer == record_buffer and extra_frames_in_record_buffer == 0, so it's a no-op.
188
+ // For sample_thread_in_gc(), the buffer is a special buffer that is the same as the record_buffer, but with every
189
+ // pointer shifted forward extra_frames_in_record_buffer elements, so that the caller can actually inject those extra
190
+ // frames, and this function doesn't have to care about it.
191
+ static void sample_thread_internal(
192
+ VALUE thread,
193
+ sampling_buffer* buffer,
194
+ VALUE recorder_instance,
195
+ ddog_Slice_I64 metric_values,
196
+ ddog_prof_Slice_Label labels,
197
+ sampling_buffer *record_buffer,
198
+ int extra_frames_in_record_buffer
199
+ ) {
95
200
  int captured_frames = ddtrace_rb_profile_frames(
96
201
  thread,
97
202
  0 /* stack starting depth */,
@@ -101,15 +206,17 @@ void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddpr
101
206
  buffer->is_ruby_frame
102
207
  );
103
208
 
104
- // Idea: Should we release the global vm lock (GVL) after we get the data from `rb_profile_frames`? That way other Ruby threads
105
- // could continue making progress while the sample was ingested into the profile.
106
- //
107
- // Other things to take into consideration if we go in that direction:
108
- // * Is it safe to call `rb_profile_frame_...` methods on things from the `stack_buffer` without the GVL acquired?
109
- // * We need to make `VALUE` references in the `stack_buffer` visible to the Ruby GC
110
- // * Should we move this into a different thread entirely?
111
- // * If we don't move it into a different thread, does releasing the GVL on a Ruby thread mean that we're introducing
112
- // a new thread switch point where there previously was none?
209
+ if (captured_frames == PLACEHOLDER_STACK_IN_NATIVE_CODE) {
210
+ record_placeholder_stack_in_native_code(
211
+ buffer,
212
+ recorder_instance,
213
+ metric_values,
214
+ labels,
215
+ record_buffer,
216
+ extra_frames_in_record_buffer
217
+ );
218
+ return;
219
+ }
113
220
 
114
221
  // Ruby does not give us path and line number for methods implemented using native code.
115
222
  // The convention in Kernel#caller_locations is to instead use the path and line number of the first Ruby frame
@@ -119,11 +226,6 @@ void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddpr
119
226
  VALUE last_ruby_frame = Qnil;
120
227
  int last_ruby_line = 0;
121
228
 
122
- if (captured_frames == PLACEHOLDER_STACK_IN_NATIVE_CODE) {
123
- record_placeholder_stack_in_native_code(recorder_instance, metric_values, labels);
124
- return;
125
- }
126
-
127
229
  for (int i = captured_frames - 1; i >= 0; i--) {
128
230
  VALUE name, filename;
129
231
  int line;
@@ -139,8 +241,8 @@ void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddpr
139
241
  // **IMPORTANT**: Be very careful when calling any `rb_profile_frame_...` API with a non-Ruby frame, as legacy
140
242
  // Rubies may assume that what's in a buffer will lead to a Ruby frame.
141
243
  //
142
- // In particular for Ruby 2.2 and below the buffer contains a Ruby string (see the notes on our custom
143
- // rb_profile_frames for Ruby 2.2 and below) and CALLING **ANY** OF THOSE APIs ON IT WILL CAUSE INSTANT VM CRASHES
244
+ // In particular for Ruby 2.2 the buffer contains a Ruby string (see the notes on our custom
245
+ // rb_profile_frames for Ruby 2.2) and CALLING **ANY** OF THOSE APIs ON IT WILL CAUSE INSTANT VM CRASHES
144
246
 
145
247
  #ifndef USE_LEGACY_RB_PROFILE_FRAMES // Modern Rubies
146
248
  name = ddtrace_rb_profile_frame_method_name(buffer->stack_buffer[i]);
@@ -155,15 +257,13 @@ void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddpr
155
257
  name = NIL_P(name) ? missing_string : name;
156
258
  filename = NIL_P(filename) ? missing_string : filename;
157
259
 
158
- buffer->lines[i] = (ddprof_ffi_Line) {
159
- .function = (ddprof_ffi_Function) {
260
+ buffer->lines[i] = (ddog_prof_Line) {
261
+ .function = (ddog_prof_Function) {
160
262
  .name = char_slice_from_ruby_string(name),
161
263
  .filename = char_slice_from_ruby_string(filename)
162
264
  },
163
265
  .line = line,
164
266
  };
165
-
166
- buffer->locations[i] = (ddprof_ffi_Location) {.lines = (ddprof_ffi_Slice_line) {.ptr = &buffer->lines[i], .len = 1}};
167
267
  }
168
268
 
169
269
  // Used below; since we want to stack-allocate this, we must do it here rather than in maybe_add_placeholder_frames_omitted
@@ -178,15 +278,15 @@ void sample(VALUE thread, sampling_buffer* buffer, VALUE recorder_instance, ddpr
178
278
 
179
279
  record_sample(
180
280
  recorder_instance,
181
- (ddprof_ffi_Sample) {
182
- .locations = (ddprof_ffi_Slice_location) {.ptr = buffer->locations, .len = captured_frames},
281
+ (ddog_prof_Sample) {
282
+ .locations = (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = captured_frames + extra_frames_in_record_buffer},
183
283
  .values = metric_values,
184
284
  .labels = labels,
185
285
  }
186
286
  );
187
287
  }
188
288
 
189
- void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size) {
289
+ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size) {
190
290
  ptrdiff_t frames_omitted = stack_depth_for(thread) - buffer->max_frames;
191
291
 
192
292
  if (frames_omitted == 0) return; // Perfect fit!
@@ -199,11 +299,10 @@ void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer,
199
299
 
200
300
  // Important note: `frames_omitted_message` MUST have a lifetime that is at least as long as the call to
201
301
  // `record_sample`. So be careful where it gets allocated. (We do have tests for this, at least!)
202
- buffer->lines[buffer->max_frames - 1] = (ddprof_ffi_Line) {
203
- .function = (ddprof_ffi_Function) {
204
- .name = DDPROF_FFI_CHARSLICE_C(""),
205
- .filename = ((ddprof_ffi_CharSlice) {.ptr = frames_omitted_message, .len = strlen(frames_omitted_message)})
206
- },
302
+ ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
303
+ ddog_CharSlice function_filename = {.ptr = frames_omitted_message, .len = strlen(frames_omitted_message)};
304
+ buffer->lines[buffer->max_frames - 1] = (ddog_prof_Line) {
305
+ .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
207
306
  .line = 0,
208
307
  };
209
308
  }
@@ -228,21 +327,25 @@ void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer,
228
327
  //
229
328
  // To give customers visibility into these threads, rather than reporting an empty stack, we replace the empty stack
230
329
  // with one containing a placeholder frame, so that these threads are properly represented in the UX.
231
- void record_placeholder_stack_in_native_code(VALUE recorder_instance, ddprof_ffi_Slice_i64 metric_values, ddprof_ffi_Slice_label labels) {
232
- ddprof_ffi_Line placeholder_stack_in_native_code_line = {
233
- .function = (ddprof_ffi_Function) {
234
- .name = DDPROF_FFI_CHARSLICE_C(""),
235
- .filename = DDPROF_FFI_CHARSLICE_C("In native code")
236
- },
330
+ static void record_placeholder_stack_in_native_code(
331
+ sampling_buffer* buffer,
332
+ VALUE recorder_instance,
333
+ ddog_Slice_I64 metric_values,
334
+ ddog_prof_Slice_Label labels,
335
+ sampling_buffer *record_buffer,
336
+ int extra_frames_in_record_buffer
337
+ ) {
338
+ ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
339
+ ddog_CharSlice function_filename = DDOG_CHARSLICE_C("In native code");
340
+ buffer->lines[0] = (ddog_prof_Line) {
341
+ .function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
237
342
  .line = 0
238
343
  };
239
- ddprof_ffi_Location placeholder_stack_in_native_code_location =
240
- {.lines = (ddprof_ffi_Slice_line) {.ptr = &placeholder_stack_in_native_code_line, .len = 1}};
241
344
 
242
345
  record_sample(
243
346
  recorder_instance,
244
- (ddprof_ffi_Sample) {
245
- .locations = (ddprof_ffi_Slice_location) {.ptr = &placeholder_stack_in_native_code_location, .len = 1},
347
+ (ddog_prof_Sample) {
348
+ .locations = (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = 1 + extra_frames_in_record_buffer},
246
349
  .values = metric_values,
247
350
  .labels = labels,
248
351
  }
@@ -261,13 +364,22 @@ sampling_buffer *sampling_buffer_new(unsigned int max_frames) {
261
364
  buffer->stack_buffer = ruby_xcalloc(max_frames, sizeof(VALUE));
262
365
  buffer->lines_buffer = ruby_xcalloc(max_frames, sizeof(int));
263
366
  buffer->is_ruby_frame = ruby_xcalloc(max_frames, sizeof(bool));
264
- buffer->locations = ruby_xcalloc(max_frames, sizeof(ddprof_ffi_Location));
265
- buffer->lines = ruby_xcalloc(max_frames, sizeof(ddprof_ffi_Line));
367
+ buffer->locations = ruby_xcalloc(max_frames, sizeof(ddog_prof_Location));
368
+ buffer->lines = ruby_xcalloc(max_frames, sizeof(ddog_prof_Line));
369
+
370
+ // Currently we have a 1-to-1 correspondence between lines and locations, so we just initialize the locations once
371
+ // here and then only mutate the contents of the lines.
372
+ for (unsigned int i = 0; i < max_frames; i++) {
373
+ ddog_prof_Slice_Line lines = (ddog_prof_Slice_Line) {.ptr = &buffer->lines[i], .len = 1};
374
+ buffer->locations[i] = (ddog_prof_Location) {.lines = lines};
375
+ }
266
376
 
267
377
  return buffer;
268
378
  }
269
379
 
270
380
  void sampling_buffer_free(sampling_buffer *buffer) {
381
+ if (buffer == NULL) rb_raise(rb_eArgError, "sampling_buffer_free called with NULL buffer");
382
+
271
383
  ruby_xfree(buffer->stack_buffer);
272
384
  ruby_xfree(buffer->lines_buffer);
273
385
  ruby_xfree(buffer->is_ruby_frame);
@@ -0,0 +1,18 @@
1
+ #pragma once
2
+
3
+ #include <datadog/profiling.h>
4
+
5
+ typedef struct sampling_buffer sampling_buffer;
6
+
7
+ typedef enum { SAMPLE_REGULAR, SAMPLE_IN_GC } sample_type;
8
+
9
+ void sample_thread(
10
+ VALUE thread,
11
+ sampling_buffer* buffer,
12
+ VALUE recorder_instance,
13
+ ddog_Slice_I64 metric_values,
14
+ ddog_prof_Slice_Label labels,
15
+ sample_type type
16
+ );
17
+ sampling_buffer *sampling_buffer_new(unsigned int max_frames);
18
+ void sampling_buffer_free(sampling_buffer *buffer);
@@ -10,13 +10,31 @@ SKIPPED_REASON_FILE = "#{__dir__}/skipped_reason.txt".freeze
10
10
  File.delete(SKIPPED_REASON_FILE) rescue nil
11
11
 
12
12
  def skip_building_extension!(reason)
13
- $stderr.puts(Datadog::Profiling::NativeExtensionHelpers::Supported.failure_banner_for(**reason))
13
+ fail_install_if_missing_extension =
14
+ Datadog::Profiling::NativeExtensionHelpers.fail_install_if_missing_extension?
15
+
16
+ $stderr.puts(
17
+ Datadog::Profiling::NativeExtensionHelpers::Supported.failure_banner_for(
18
+ **reason,
19
+ fail_install: fail_install_if_missing_extension,
20
+ )
21
+ )
22
+
14
23
  File.write(
15
24
  SKIPPED_REASON_FILE,
16
25
  Datadog::Profiling::NativeExtensionHelpers::Supported.render_skipped_reason_file(**reason),
17
26
  )
18
27
 
19
- File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
28
+ if fail_install_if_missing_extension
29
+ require 'mkmf'
30
+ Logging.message(
31
+ ' [ddtrace] Failure cause: ' \
32
+ "#{Datadog::Profiling::NativeExtensionHelpers::Supported.render_skipped_reason_file(**reason)}\n"
33
+ )
34
+ else
35
+ File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
36
+ end
37
+
20
38
  exit
21
39
  end
22
40
 
@@ -24,7 +42,8 @@ unless Datadog::Profiling::NativeExtensionHelpers::Supported.supported?
24
42
  skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported.unsupported_reason)
25
43
  end
26
44
 
27
- $stderr.puts(%(
45
+ $stderr.puts(
46
+ %(
28
47
  +------------------------------------------------------------------------------+
29
48
  | ** Preparing to build the ddtrace profiling native extension... ** |
30
49
  | |
@@ -41,12 +60,17 @@ $stderr.puts(%(
41
60
  | Thanks for using ddtrace! You rock! |
42
61
  +------------------------------------------------------------------------------+
43
62
 
44
- ))
63
+ )
64
+ )
45
65
 
46
66
  # NOTE: we MUST NOT require 'mkmf' before we check the #skip_building_extension? because the require triggers checks
47
67
  # that may fail on an environment not properly setup for building Ruby extensions.
48
68
  require 'mkmf'
49
69
 
70
+ Logging.message(" [ddtrace] Using compiler:\n")
71
+ xsystem("#{CONFIG['CC']} -v")
72
+ Logging.message(" [ddtrace] End of compiler information\n")
73
+
50
74
  # mkmf on modern Rubies actually has an append_cflags that does something similar
51
75
  # (see https://github.com/ruby/ruby/pull/5760), but as usual we need a bit more boilerplate to deal with legacy Rubies
52
76
  def add_compiler_flag(flag)
@@ -57,13 +81,17 @@ def add_compiler_flag(flag)
57
81
  end
58
82
  end
59
83
 
84
+ # Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
85
+ # But we can enable it in CI, so that we quickly spot any new warnings that just got introduced.
86
+ add_compiler_flag '-Werror' if ENV['DDTRACE_CI'] == 'true'
87
+
60
88
  # Older gcc releases may not default to C99 and we need to ask for this. This is also used:
61
89
  # * by upstream Ruby -- search for gnu99 in the codebase
62
90
  # * by msgpack, another ddtrace dependency
63
91
  # (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
64
92
  add_compiler_flag '-std=gnu99'
65
93
 
66
- # Gets really noisy when we include the MJIT header, let's omit it
94
+ # Gets really noisy when we include the MJIT header, let's omit it (TODO: Use #pragma GCC diagnostic instead?)
67
95
  add_compiler_flag '-Wno-unused-function'
68
96
 
69
97
  # Allow defining variables at any point in a function
@@ -73,6 +101,9 @@ add_compiler_flag '-Wno-declaration-after-statement'
73
101
  # cause a segfault later. Let's ensure that never happens.
74
102
  add_compiler_flag '-Werror-implicit-function-declaration'
75
103
 
104
+ # Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
105
+ add_compiler_flag '-Wunused-parameter'
106
+
76
107
  # The native extension is not intended to expose any symbols/functions for other native libraries to use;
77
108
  # the sole exception being `Init_ddtrace_profiling_native_extension` which needs to be visible for Ruby to call it when
78
109
  # it `dlopen`s the library.
@@ -81,23 +112,48 @@ add_compiler_flag '-Werror-implicit-function-declaration'
81
112
  # For more details see https://gcc.gnu.org/wiki/Visibility
82
113
  add_compiler_flag '-fvisibility=hidden'
83
114
 
115
+ # Avoid legacy C definitions
116
+ add_compiler_flag '-Wold-style-definition'
117
+
118
+ # Enable all other compiler warnings
119
+ add_compiler_flag '-Wall'
120
+ add_compiler_flag '-Wextra'
121
+
84
122
  if RUBY_PLATFORM.include?('linux')
85
123
  # Supposedly, the correct way to do this is
86
124
  # ```
87
125
  # have_library 'pthread'
88
126
  # have_func 'pthread_getcpuclockid'
89
127
  # ```
90
- # but it broke the build on Windows and on older Ruby versions (2.1 and 2.2)
128
+ # but it broke the build on Windows and on older Ruby versions (2.2)
91
129
  # so instead we just assume that we have the function we need on Linux, and nowhere else
92
130
  $defs << '-DHAVE_PTHREAD_GETCPUCLOCKID'
93
131
  end
94
132
 
133
+ # On older Rubies, there was no struct rb_native_thread. See private_vm_api_acccess.c for details.
134
+ $defs << '-DNO_RB_NATIVE_THREAD' if RUBY_VERSION < '3.2'
135
+
136
+ # On older Rubies, there was no struct rb_thread_sched (it was struct rb_global_vm_lock_struct)
137
+ $defs << '-DNO_RB_THREAD_SCHED' if RUBY_VERSION < '3.2'
138
+
139
+ # On older Rubies, there was no tid member in the internal thread structure
140
+ $defs << '-DNO_THREAD_TID' if RUBY_VERSION < '3.1'
141
+
95
142
  # On older Rubies, we need to use a backported version of this function. See private_vm_api_access.h for details.
96
143
  $defs << '-DUSE_BACKPORTED_RB_PROFILE_FRAME_METHOD_NAME' if RUBY_VERSION < '3'
97
144
 
145
+ # On older Rubies, there are no Ractors
146
+ $defs << '-DNO_RACTORS' if RUBY_VERSION < '3'
147
+
148
+ # On older Rubies, rb_global_vm_lock_struct did not include the owner field
149
+ $defs << '-DNO_GVL_OWNER' if RUBY_VERSION < '2.6'
150
+
98
151
  # On older Rubies, we need to use rb_thread_t instead of rb_execution_context_t
99
152
  $defs << '-DUSE_THREAD_INSTEAD_OF_EXECUTION_CONTEXT' if RUBY_VERSION < '2.5'
100
153
 
154
+ # On older Rubies, extensions can't use GET_VM()
155
+ $defs << '-DNO_GET_VM' if RUBY_VERSION < '2.5'
156
+
101
157
  # On older Rubies...
102
158
  if RUBY_VERSION < '2.4'
103
159
  # ...we need to use RUBY_VM_NORMAL_ISEQ_P instead of VM_FRAME_RUBYFRAME_P
@@ -112,14 +168,37 @@ if RUBY_VERSION < '2.3'
112
168
  $defs << '-DNO_RB_TIME_TIMESPEC_NEW'
113
169
  # ...the VM changed enough that we need an alternative legacy rb_profile_frames
114
170
  $defs << '-DUSE_LEGACY_RB_PROFILE_FRAMES'
171
+ # ... you couldn't name threads
172
+ $defs << '-DNO_THREAD_NAMES'
115
173
  end
116
174
 
117
- # If we got here, libddprof is available and loaded
118
- ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libddprof.pkgconfig_folder}"
119
- unless pkg_config('ddprof_ffi_with_rpath')
120
- skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported::FAILED_TO_CONFIGURE_LIBDDPROF)
175
+ # If we got here, libdatadog is available and loaded
176
+ ENV['PKG_CONFIG_PATH'] = "#{ENV['PKG_CONFIG_PATH']}:#{Libdatadog.pkgconfig_folder}"
177
+ Logging.message(" [ddtrace] PKG_CONFIG_PATH set to #{ENV['PKG_CONFIG_PATH'].inspect}\n")
178
+
179
+ unless pkg_config('datadog_profiling_with_rpath')
180
+ skip_building_extension!(
181
+ if Datadog::Profiling::NativeExtensionHelpers::Supported.pkg_config_missing?
182
+ Datadog::Profiling::NativeExtensionHelpers::Supported::PKG_CONFIG_IS_MISSING
183
+ else
184
+ # Less specific error message
185
+ Datadog::Profiling::NativeExtensionHelpers::Supported::FAILED_TO_CONFIGURE_LIBDATADOG
186
+ end
187
+ )
188
+ end
189
+
190
+ unless have_type('atomic_int', ['stdatomic.h'])
191
+ skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported::COMPILER_ATOMIC_MISSING)
121
192
  end
122
193
 
194
+ # See comments on the helper method being used for why we need to additionally set this.
195
+ # The extremely excessive escaping around ORIGIN below seems to be correct and was determined after a lot of
196
+ # experimentation. We need to get these special characters across a lot of tools untouched...
197
+ $LDFLAGS += \
198
+ ' -Wl,-rpath,$$$\\\\{ORIGIN\\}/' \
199
+ "#{Datadog::Profiling::NativeExtensionHelpers.libdatadog_folder_relative_to_native_lib_folder}"
200
+ Logging.message(" [ddtrace] After pkg-config $LDFLAGS were set to: #{$LDFLAGS.inspect}\n")
201
+
123
202
  # Tag the native extension library with the Ruby version and Ruby platform.
124
203
  # This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
125
204
  # the wrong library is never loaded.
@@ -153,13 +232,6 @@ else
153
232
  # This gem ships source code copies of these VM headers for the different Ruby VM versions;
154
233
  # see https://github.com/ruby-debug/debase-ruby_core_source for details
155
234
 
156
- thread_native_for_ruby_2_1 = proc { true }
157
- if RUBY_VERSION < '2.2'
158
- # This header became public in Ruby 2.2, but we need to pull it from the private headers folder for 2.1
159
- thread_native_for_ruby_2_1 = proc { have_header('thread_native.h') }
160
- $defs << '-DRUBY_2_1_WORKAROUND'
161
- end
162
-
163
235
  create_header
164
236
 
165
237
  require 'debase/ruby_core_source'
@@ -167,7 +239,7 @@ else
167
239
 
168
240
  Debase::RubyCoreSource
169
241
  .create_makefile_with_core(
170
- proc { have_header('vm_core.h') && have_header('iseq.h') && thread_native_for_ruby_2_1.call },
242
+ proc { have_header('vm_core.h') && have_header('iseq.h') },
171
243
  EXTENSION_NAME,
172
244
  )
173
245
  end
@@ -0,0 +1,17 @@
1
+ #pragma once
2
+
3
+ // Used to mark symbols to be exported to the outside of the extension.
4
+ // Consider very carefully before tagging a function with this.
5
+ #define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
6
+
7
+ // Used to mark function arguments that are deliberately left unused
8
+ #ifdef __GNUC__
9
+ #define DDTRACE_UNUSED __attribute__((unused))
10
+ #else
11
+ #define DDTRACE_UNUSED
12
+ #endif
13
+
14
+ // @ivoanjo: After trying to read through https://stackoverflow.com/questions/3437404/min-and-max-in-c I decided I
15
+ // don't like C and I just implemented this as a function.
16
+ inline static uint64_t uint64_max_of(uint64_t a, uint64_t b) { return a > b ? a : b; }
17
+ inline static uint64_t uint64_min_of(uint64_t a, uint64_t b) { return a > b ? b : a; }