ddtrace 0.42.0 → 0.54.2

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 (602) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +22 -0
  3. data/.gitignore +7 -1
  4. data/CHANGELOG.md +1645 -370
  5. data/CONTRIBUTING.md +2 -6
  6. data/LICENSE-3rdparty.csv +2 -0
  7. data/README.md +1 -0
  8. data/bin/ddtracerb +15 -0
  9. data/ddtrace.gemspec +21 -39
  10. data/docs/DevelopmentGuide.md +46 -8
  11. data/docs/GettingStarted.md +439 -92
  12. data/docs/ProfilingDevelopment.md +107 -0
  13. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +86 -0
  14. data/ext/ddtrace_profiling_native_extension/clock_id.h +4 -0
  15. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +52 -0
  16. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +14 -0
  17. data/ext/ddtrace_profiling_native_extension/extconf.rb +197 -0
  18. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +35 -0
  19. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
  20. data/ext/ddtrace_profiling_native_extension/profiling.c +22 -0
  21. data/lib/datadog/ci/configuration/components.rb +31 -0
  22. data/lib/datadog/ci/configuration/settings.rb +37 -0
  23. data/lib/datadog/ci/context_flush.rb +29 -0
  24. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
  25. data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
  26. data/lib/datadog/ci/contrib/cucumber/formatter.rb +99 -0
  27. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
  28. data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
  29. data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
  30. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
  31. data/lib/datadog/ci/contrib/rspec/example.rb +75 -0
  32. data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
  33. data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
  34. data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
  35. data/lib/datadog/ci/ext/app_types.rb +10 -0
  36. data/lib/datadog/ci/ext/environment.rb +485 -0
  37. data/lib/datadog/ci/ext/settings.rb +11 -0
  38. data/lib/datadog/ci/ext/test.rb +36 -0
  39. data/lib/datadog/ci/extensions.rb +18 -0
  40. data/lib/datadog/ci/test.rb +81 -0
  41. data/lib/datadog/ci.rb +17 -0
  42. data/lib/datadog/contrib.rb +71 -0
  43. data/lib/datadog/core/environment/cgroup.rb +52 -0
  44. data/lib/datadog/core/environment/class_count.rb +20 -0
  45. data/lib/datadog/core/environment/container.rb +91 -0
  46. data/lib/datadog/core/environment/ext.rb +27 -0
  47. data/lib/datadog/core/environment/gc.rb +19 -0
  48. data/lib/datadog/core/environment/identity.rb +51 -0
  49. data/lib/datadog/core/environment/socket.rb +17 -0
  50. data/lib/datadog/core/environment/thread_count.rb +19 -0
  51. data/lib/datadog/core/environment/variable_helpers.rb +42 -0
  52. data/lib/datadog/core/environment/vm_cache.rb +46 -0
  53. data/lib/ddtrace/analytics.rb +3 -0
  54. data/lib/ddtrace/auto_instrument.rb +5 -0
  55. data/lib/ddtrace/auto_instrument_base.rb +7 -0
  56. data/lib/ddtrace/buffer.rb +38 -24
  57. data/lib/ddtrace/chunker.rb +1 -0
  58. data/lib/ddtrace/configuration/agent_settings_resolver.rb +309 -0
  59. data/lib/ddtrace/configuration/base.rb +9 -11
  60. data/lib/ddtrace/configuration/components.rb +167 -26
  61. data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
  62. data/lib/ddtrace/configuration/option.rb +1 -0
  63. data/lib/ddtrace/configuration/option_definition.rb +2 -3
  64. data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
  65. data/lib/ddtrace/configuration/option_set.rb +1 -0
  66. data/lib/ddtrace/configuration/options.rb +7 -9
  67. data/lib/ddtrace/configuration/pin_setup.rb +1 -0
  68. data/lib/ddtrace/configuration/settings.rb +142 -12
  69. data/lib/ddtrace/configuration.rb +132 -24
  70. data/lib/ddtrace/context.rb +51 -22
  71. data/lib/ddtrace/context_flush.rb +15 -2
  72. data/lib/ddtrace/context_provider.rb +13 -2
  73. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
  74. data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
  75. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
  76. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
  77. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
  78. data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
  79. data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
  80. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +47 -0
  81. data/lib/ddtrace/contrib/action_cable/integration.rb +8 -0
  82. data/lib/ddtrace/contrib/action_cable/patcher.rb +2 -0
  83. data/lib/ddtrace/contrib/action_mailer/configuration/settings.rb +32 -0
  84. data/lib/ddtrace/contrib/action_mailer/event.rb +50 -0
  85. data/lib/ddtrace/contrib/action_mailer/events/deliver.rb +54 -0
  86. data/lib/ddtrace/contrib/action_mailer/events/process.rb +41 -0
  87. data/lib/ddtrace/contrib/action_mailer/events.rb +31 -0
  88. data/lib/ddtrace/contrib/action_mailer/ext.rb +32 -0
  89. data/lib/ddtrace/contrib/action_mailer/integration.rb +45 -0
  90. data/lib/ddtrace/contrib/action_mailer/patcher.rb +27 -0
  91. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
  92. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
  93. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
  94. data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
  95. data/lib/ddtrace/contrib/action_pack/integration.rb +8 -0
  96. data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
  97. data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
  98. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
  99. data/lib/ddtrace/contrib/action_view/event.rb +4 -7
  100. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +2 -0
  101. data/lib/ddtrace/contrib/action_view/events/render_template.rb +2 -0
  102. data/lib/ddtrace/contrib/action_view/events.rb +1 -0
  103. data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
  104. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
  105. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
  106. data/lib/ddtrace/contrib/action_view/integration.rb +8 -0
  107. data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
  108. data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
  109. data/lib/ddtrace/contrib/active_job/configuration/settings.rb +33 -0
  110. data/lib/ddtrace/contrib/active_job/event.rb +54 -0
  111. data/lib/ddtrace/contrib/active_job/events/discard.rb +46 -0
  112. data/lib/ddtrace/contrib/active_job/events/enqueue.rb +45 -0
  113. data/lib/ddtrace/contrib/active_job/events/enqueue_at.rb +45 -0
  114. data/lib/ddtrace/contrib/active_job/events/enqueue_retry.rb +47 -0
  115. data/lib/ddtrace/contrib/active_job/events/perform.rb +45 -0
  116. data/lib/ddtrace/contrib/active_job/events/retry_stopped.rb +46 -0
  117. data/lib/ddtrace/contrib/active_job/events.rb +39 -0
  118. data/lib/ddtrace/contrib/active_job/ext.rb +32 -0
  119. data/lib/ddtrace/contrib/active_job/integration.rb +46 -0
  120. data/lib/ddtrace/contrib/active_job/log_injection.rb +21 -0
  121. data/lib/ddtrace/contrib/active_job/patcher.rb +33 -0
  122. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
  123. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
  124. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
  125. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
  126. data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
  127. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
  128. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
  129. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
  130. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
  131. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
  132. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
  133. data/lib/ddtrace/contrib/active_record/event.rb +3 -2
  134. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
  135. data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -0
  136. data/lib/ddtrace/contrib/active_record/events.rb +1 -0
  137. data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
  138. data/lib/ddtrace/contrib/active_record/integration.rb +8 -0
  139. data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
  140. data/lib/ddtrace/contrib/active_record/utils.rb +69 -21
  141. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +105 -3
  142. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +26 -4
  143. data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
  144. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
  145. data/lib/ddtrace/contrib/active_support/ext.rb +4 -0
  146. data/lib/ddtrace/contrib/active_support/integration.rb +8 -1
  147. data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -3
  148. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
  149. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +10 -5
  150. data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
  151. data/lib/ddtrace/contrib/analytics.rb +1 -0
  152. data/lib/ddtrace/contrib/auto_instrument.rb +48 -0
  153. data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
  154. data/lib/ddtrace/contrib/aws/ext.rb +1 -0
  155. data/lib/ddtrace/contrib/aws/instrumentation.rb +32 -1
  156. data/lib/ddtrace/contrib/aws/integration.rb +1 -0
  157. data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
  158. data/lib/ddtrace/contrib/aws/patcher.rb +6 -1
  159. data/lib/ddtrace/contrib/aws/services.rb +4 -0
  160. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
  161. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
  162. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  163. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
  164. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
  165. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
  166. data/lib/ddtrace/contrib/configurable.rb +65 -38
  167. data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
  168. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +21 -20
  169. data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
  170. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
  171. data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
  172. data/lib/ddtrace/contrib/dalli/instrumentation.rb +2 -1
  173. data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
  174. data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
  175. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
  176. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +2 -0
  177. data/lib/ddtrace/contrib/delayed_job/ext.rb +1 -0
  178. data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
  179. data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
  180. data/lib/ddtrace/contrib/delayed_job/plugin.rb +5 -3
  181. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
  182. data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
  183. data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
  184. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -0
  185. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
  186. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
  187. data/lib/ddtrace/contrib/ethon/easy_patch.rb +13 -11
  188. data/lib/ddtrace/contrib/ethon/ext.rb +2 -0
  189. data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
  190. data/lib/ddtrace/contrib/ethon/multi_patch.rb +2 -1
  191. data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
  192. data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
  193. data/lib/ddtrace/contrib/excon/ext.rb +1 -0
  194. data/lib/ddtrace/contrib/excon/integration.rb +1 -0
  195. data/lib/ddtrace/contrib/excon/middleware.rb +10 -7
  196. data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
  197. data/lib/ddtrace/contrib/extensions.rb +90 -14
  198. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
  199. data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
  200. data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
  201. data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
  202. data/lib/ddtrace/contrib/faraday/middleware.rb +2 -3
  203. data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
  204. data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
  205. data/lib/ddtrace/contrib/grape/configuration/settings.rb +8 -0
  206. data/lib/ddtrace/contrib/grape/endpoint.rb +68 -32
  207. data/lib/ddtrace/contrib/grape/ext.rb +2 -0
  208. data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
  209. data/lib/ddtrace/contrib/grape/integration.rb +1 -0
  210. data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
  211. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
  212. data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
  213. data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
  214. data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
  215. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
  216. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -0
  217. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -4
  218. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
  219. data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
  220. data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
  221. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
  222. data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
  223. data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
  224. data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
  225. data/lib/ddtrace/contrib/http/ext.rb +1 -0
  226. data/lib/ddtrace/contrib/http/instrumentation.rb +9 -8
  227. data/lib/ddtrace/contrib/http/integration.rb +1 -0
  228. data/lib/ddtrace/contrib/http/patcher.rb +2 -1
  229. data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
  230. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +33 -0
  231. data/lib/ddtrace/contrib/httpclient/ext.rb +18 -0
  232. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +148 -0
  233. data/lib/ddtrace/contrib/httpclient/integration.rb +44 -0
  234. data/lib/ddtrace/contrib/httpclient/patcher.rb +39 -0
  235. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
  236. data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
  237. data/lib/ddtrace/contrib/httprb/instrumentation.rb +17 -22
  238. data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
  239. data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
  240. data/lib/ddtrace/contrib/integration.rb +4 -3
  241. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
  242. data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
  243. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
  244. data/lib/ddtrace/contrib/kafka/event.rb +4 -3
  245. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
  246. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
  247. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
  248. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
  249. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
  250. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
  251. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
  252. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  253. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  254. data/lib/ddtrace/contrib/kafka/events.rb +1 -0
  255. data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
  256. data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
  257. data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
  258. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
  259. data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
  260. data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
  261. data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
  262. data/lib/ddtrace/contrib/lograge/patcher.rb +26 -0
  263. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
  264. data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
  265. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +6 -3
  266. data/lib/ddtrace/contrib/mongodb/integration.rb +6 -0
  267. data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
  268. data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
  269. data/lib/ddtrace/contrib/mongodb/subscribers.rb +3 -3
  270. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
  271. data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
  272. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +2 -1
  273. data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
  274. data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
  275. data/lib/ddtrace/contrib/patchable.rb +21 -9
  276. data/lib/ddtrace/contrib/patcher.rb +12 -8
  277. data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
  278. data/lib/ddtrace/contrib/presto/ext.rb +1 -0
  279. data/lib/ddtrace/contrib/presto/instrumentation.rb +2 -1
  280. data/lib/ddtrace/contrib/presto/integration.rb +1 -0
  281. data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
  282. data/lib/ddtrace/contrib/qless/configuration/settings.rb +36 -0
  283. data/lib/ddtrace/contrib/qless/ext.rb +21 -0
  284. data/lib/ddtrace/contrib/qless/integration.rb +39 -0
  285. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  286. data/lib/ddtrace/contrib/qless/qless_job.rb +74 -0
  287. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +34 -0
  288. data/lib/ddtrace/contrib/que/configuration/settings.rb +2 -0
  289. data/lib/ddtrace/contrib/que/ext.rb +20 -19
  290. data/lib/ddtrace/contrib/que/integration.rb +1 -0
  291. data/lib/ddtrace/contrib/que/patcher.rb +1 -0
  292. data/lib/ddtrace/contrib/que/tracer.rb +4 -2
  293. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
  294. data/lib/ddtrace/contrib/racecar/event.rb +4 -2
  295. data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
  296. data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
  297. data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
  298. data/lib/ddtrace/contrib/racecar/events.rb +1 -0
  299. data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
  300. data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
  301. data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
  302. data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
  303. data/lib/ddtrace/contrib/rack/ext.rb +1 -0
  304. data/lib/ddtrace/contrib/rack/integration.rb +8 -0
  305. data/lib/ddtrace/contrib/rack/middlewares.rb +8 -12
  306. data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
  307. data/lib/ddtrace/contrib/rack/request_queue.rb +7 -1
  308. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  309. data/lib/ddtrace/contrib/rails/configuration/settings.rb +8 -0
  310. data/lib/ddtrace/contrib/rails/ext.rb +1 -0
  311. data/lib/ddtrace/contrib/rails/framework.rb +50 -2
  312. data/lib/ddtrace/contrib/rails/integration.rb +1 -0
  313. data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
  314. data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
  315. data/lib/ddtrace/contrib/rails/patcher.rb +40 -21
  316. data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
  317. data/lib/ddtrace/contrib/rails/utils.rb +5 -0
  318. data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
  319. data/lib/ddtrace/contrib/rake/ext.rb +1 -0
  320. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
  321. data/lib/ddtrace/contrib/rake/integration.rb +2 -1
  322. data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
  323. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +15 -5
  324. data/lib/ddtrace/contrib/redis/configuration/settings.rb +6 -0
  325. data/lib/ddtrace/contrib/redis/ext.rb +2 -0
  326. data/lib/ddtrace/contrib/redis/instrumentation.rb +90 -0
  327. data/lib/ddtrace/contrib/redis/integration.rb +1 -0
  328. data/lib/ddtrace/contrib/redis/patcher.rb +3 -67
  329. data/lib/ddtrace/contrib/redis/quantize.rb +29 -0
  330. data/lib/ddtrace/contrib/redis/tags.rb +6 -1
  331. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  332. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
  333. data/lib/ddtrace/contrib/registerable.rb +4 -4
  334. data/lib/ddtrace/contrib/registry.rb +3 -2
  335. data/lib/ddtrace/contrib/resque/configuration/settings.rb +19 -1
  336. data/lib/ddtrace/contrib/resque/ext.rb +1 -0
  337. data/lib/ddtrace/contrib/resque/integration.rb +2 -5
  338. data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
  339. data/lib/ddtrace/contrib/resque/resque_job.rb +26 -2
  340. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
  341. data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
  342. data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
  343. data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
  344. data/lib/ddtrace/contrib/rest_client/request_patch.rb +3 -4
  345. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
  346. data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
  347. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
  348. data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
  349. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
  350. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
  351. data/lib/ddtrace/contrib/sequel/database.rb +2 -1
  352. data/lib/ddtrace/contrib/sequel/dataset.rb +2 -1
  353. data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
  354. data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
  355. data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
  356. data/lib/ddtrace/contrib/sequel/utils.rb +6 -6
  357. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +3 -0
  358. data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
  359. data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
  360. data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
  361. data/lib/ddtrace/contrib/shoryuken/tracer.rb +9 -2
  362. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
  363. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +2 -0
  364. data/lib/ddtrace/contrib/sidekiq/ext.rb +4 -0
  365. data/lib/ddtrace/contrib/sidekiq/integration.rb +11 -0
  366. data/lib/ddtrace/contrib/sidekiq/patcher.rb +27 -0
  367. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/heartbeat.rb +30 -0
  368. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/job_fetch.rb +30 -0
  369. data/lib/ddtrace/contrib/sidekiq/server_internal_tracer/scheduled_push.rb +29 -0
  370. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +6 -7
  371. data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
  372. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
  373. data/lib/ddtrace/contrib/sinatra/env.rb +4 -4
  374. data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
  375. data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
  376. data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
  377. data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
  378. data/lib/ddtrace/contrib/sinatra/tracer.rb +28 -7
  379. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +13 -6
  380. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +2 -0
  381. data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
  382. data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
  383. data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
  384. data/lib/ddtrace/contrib/sneakers/tracer.rb +17 -21
  385. data/lib/ddtrace/contrib/status_code_matcher.rb +70 -0
  386. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
  387. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
  388. data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
  389. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
  390. data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
  391. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
  392. data/lib/ddtrace/correlation.rb +3 -1
  393. data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
  394. data/lib/ddtrace/diagnostics/health.rb +1 -0
  395. data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
  396. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
  397. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
  398. data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
  399. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
  400. data/lib/ddtrace/encoding.rb +3 -0
  401. data/lib/ddtrace/error.rb +78 -8
  402. data/lib/ddtrace/event.rb +1 -0
  403. data/lib/ddtrace/ext/analytics.rb +1 -0
  404. data/lib/ddtrace/ext/app_types.rb +1 -0
  405. data/lib/ddtrace/ext/correlation.rb +1 -0
  406. data/lib/ddtrace/ext/diagnostics.rb +1 -0
  407. data/lib/ddtrace/ext/distributed.rb +9 -2
  408. data/lib/ddtrace/ext/environment.rb +8 -0
  409. data/lib/ddtrace/ext/errors.rb +1 -0
  410. data/lib/ddtrace/ext/forced_tracing.rb +1 -0
  411. data/lib/ddtrace/ext/git.rb +32 -0
  412. data/lib/ddtrace/ext/http.rb +2 -1
  413. data/lib/ddtrace/ext/integration.rb +1 -0
  414. data/lib/ddtrace/ext/manual_tracing.rb +1 -0
  415. data/lib/ddtrace/ext/metrics.rb +1 -0
  416. data/lib/ddtrace/ext/net.rb +1 -0
  417. data/lib/ddtrace/ext/priority.rb +7 -4
  418. data/lib/ddtrace/ext/profiling.rb +53 -0
  419. data/lib/ddtrace/ext/runtime.rb +5 -7
  420. data/lib/ddtrace/ext/sampling.rb +1 -0
  421. data/lib/ddtrace/ext/sql.rb +1 -0
  422. data/lib/ddtrace/ext/test.rb +9 -0
  423. data/lib/ddtrace/ext/transport.rb +14 -0
  424. data/lib/ddtrace/forced_tracing.rb +3 -0
  425. data/lib/ddtrace/logger.rb +2 -1
  426. data/lib/ddtrace/metrics.rb +84 -24
  427. data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
  428. data/lib/ddtrace/opentelemetry/span.rb +1 -0
  429. data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
  430. data/lib/ddtrace/opentracer/carrier.rb +1 -0
  431. data/lib/ddtrace/opentracer/distributed_headers.rb +4 -0
  432. data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
  433. data/lib/ddtrace/opentracer/propagator.rb +1 -0
  434. data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
  435. data/lib/ddtrace/opentracer/scope.rb +1 -0
  436. data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
  437. data/lib/ddtrace/opentracer/span.rb +3 -6
  438. data/lib/ddtrace/opentracer/span_context.rb +1 -0
  439. data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
  440. data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
  441. data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
  442. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
  443. data/lib/ddtrace/opentracer/tracer.rb +1 -0
  444. data/lib/ddtrace/opentracer.rb +21 -39
  445. data/lib/ddtrace/patcher.rb +28 -6
  446. data/lib/ddtrace/pin.rb +9 -61
  447. data/lib/ddtrace/pipeline/span_filter.rb +2 -1
  448. data/lib/ddtrace/pipeline/span_processor.rb +1 -0
  449. data/lib/ddtrace/pipeline.rb +1 -0
  450. data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
  451. data/lib/ddtrace/profiling/buffer.rb +42 -0
  452. data/lib/ddtrace/profiling/collectors/stack.rb +297 -0
  453. data/lib/ddtrace/profiling/encoding/profile.rb +46 -0
  454. data/lib/ddtrace/profiling/event.rb +14 -0
  455. data/lib/ddtrace/profiling/events/stack.rb +81 -0
  456. data/lib/ddtrace/profiling/exporter.rb +24 -0
  457. data/lib/ddtrace/profiling/ext/forking.rb +98 -0
  458. data/lib/ddtrace/profiling/flush.rb +44 -0
  459. data/lib/ddtrace/profiling/native_extension.rb +40 -0
  460. data/lib/ddtrace/profiling/pprof/builder.rb +126 -0
  461. data/lib/ddtrace/profiling/pprof/converter.rb +103 -0
  462. data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
  463. data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
  464. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  465. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
  466. data/lib/ddtrace/profiling/pprof/stack_sample.rb +140 -0
  467. data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
  468. data/lib/ddtrace/profiling/pprof/template.rb +119 -0
  469. data/lib/ddtrace/profiling/preload.rb +4 -0
  470. data/lib/ddtrace/profiling/profiler.rb +31 -0
  471. data/lib/ddtrace/profiling/recorder.rb +96 -0
  472. data/lib/ddtrace/profiling/scheduler.rb +150 -0
  473. data/lib/ddtrace/profiling/tasks/setup.rb +90 -0
  474. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +42 -0
  475. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
  476. data/lib/ddtrace/profiling/transport/client.rb +15 -0
  477. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +94 -0
  478. data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
  479. data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
  480. data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
  481. data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
  482. data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
  483. data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
  484. data/lib/ddtrace/profiling/transport/http.rb +111 -0
  485. data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
  486. data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
  487. data/lib/ddtrace/profiling/transport/io.rb +31 -0
  488. data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
  489. data/lib/ddtrace/profiling/transport/request.rb +16 -0
  490. data/lib/ddtrace/profiling/transport/response.rb +9 -0
  491. data/lib/ddtrace/profiling.rb +149 -0
  492. data/lib/ddtrace/propagation/grpc_propagator.rb +2 -0
  493. data/lib/ddtrace/propagation/http_propagator.rb +18 -2
  494. data/lib/ddtrace/quantization/hash.rb +1 -0
  495. data/lib/ddtrace/quantization/http.rb +4 -0
  496. data/lib/ddtrace/runtime/metrics.rb +35 -14
  497. data/lib/ddtrace/sampler.rb +20 -9
  498. data/lib/ddtrace/sampling/matcher.rb +1 -0
  499. data/lib/ddtrace/sampling/rate_limiter.rb +66 -16
  500. data/lib/ddtrace/sampling/rule.rb +2 -1
  501. data/lib/ddtrace/sampling/rule_sampler.rb +19 -11
  502. data/lib/ddtrace/sampling.rb +1 -0
  503. data/lib/ddtrace/span.rb +27 -14
  504. data/lib/ddtrace/sync_writer.rb +17 -15
  505. data/lib/ddtrace/tasks/exec.rb +47 -0
  506. data/lib/ddtrace/tasks/help.rb +15 -0
  507. data/lib/ddtrace/tracer.rb +61 -50
  508. data/lib/ddtrace/transport/http/adapters/net.rb +41 -11
  509. data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
  510. data/lib/ddtrace/transport/http/adapters/test.rb +5 -2
  511. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +26 -16
  512. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  513. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  514. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  515. data/lib/ddtrace/transport/http/api/map.rb +1 -0
  516. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  517. data/lib/ddtrace/transport/http/api.rb +1 -0
  518. data/lib/ddtrace/transport/http/builder.rb +21 -7
  519. data/lib/ddtrace/transport/http/client.rb +3 -1
  520. data/lib/ddtrace/transport/http/env.rb +9 -0
  521. data/lib/ddtrace/transport/http/response.rb +1 -0
  522. data/lib/ddtrace/transport/http/statistics.rb +3 -2
  523. data/lib/ddtrace/transport/http/traces.rb +6 -6
  524. data/lib/ddtrace/transport/http.rb +48 -41
  525. data/lib/ddtrace/transport/io/client.rb +17 -9
  526. data/lib/ddtrace/transport/io/response.rb +2 -3
  527. data/lib/ddtrace/transport/io/traces.rb +10 -1
  528. data/lib/ddtrace/transport/io.rb +2 -1
  529. data/lib/ddtrace/transport/parcel.rb +7 -0
  530. data/lib/ddtrace/transport/request.rb +1 -0
  531. data/lib/ddtrace/transport/response.rb +1 -0
  532. data/lib/ddtrace/transport/statistics.rb +1 -0
  533. data/lib/ddtrace/transport/traces.rb +21 -3
  534. data/lib/ddtrace/utils/compression.rb +28 -0
  535. data/lib/ddtrace/utils/database.rb +1 -0
  536. data/lib/ddtrace/utils/forking.rb +53 -0
  537. data/lib/ddtrace/utils/object_set.rb +40 -0
  538. data/lib/ddtrace/utils/only_once.rb +41 -0
  539. data/lib/ddtrace/utils/sequence.rb +18 -0
  540. data/lib/ddtrace/utils/string_table.rb +46 -0
  541. data/lib/ddtrace/utils/time.rb +40 -3
  542. data/lib/ddtrace/utils.rb +23 -12
  543. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  544. data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
  545. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  546. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
  547. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
  548. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
  549. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
  550. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
  551. data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
  552. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
  553. data/lib/ddtrace/version.rb +16 -3
  554. data/lib/ddtrace/worker.rb +1 -0
  555. data/lib/ddtrace/workers/async.rb +15 -5
  556. data/lib/ddtrace/workers/{loop.rb → interval_loop.rb} +23 -12
  557. data/lib/ddtrace/workers/polling.rb +14 -6
  558. data/lib/ddtrace/workers/queue.rb +3 -1
  559. data/lib/ddtrace/workers/runtime_metrics.rb +22 -4
  560. data/lib/ddtrace/workers/trace_writer.rb +14 -16
  561. data/lib/ddtrace/workers.rb +8 -2
  562. data/lib/ddtrace/writer.rb +33 -8
  563. data/lib/ddtrace.rb +22 -48
  564. metadata +182 -405
  565. data/.circleci/config.yml +0 -548
  566. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
  567. data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
  568. data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
  569. data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
  570. data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
  571. data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
  572. data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
  573. data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
  574. data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
  575. data/.dockerignore +0 -1
  576. data/.env +0 -26
  577. data/.github/CODEOWNERS +0 -1
  578. data/.gitlab-ci.yml +0 -27
  579. data/.rspec +0 -1
  580. data/.rubocop.yml +0 -85
  581. data/.simplecov +0 -38
  582. data/Appraisals +0 -1121
  583. data/Gemfile +0 -7
  584. data/Rakefile +0 -788
  585. data/benchmarks/postgres_database.yml +0 -9
  586. data/benchmarks/sidekiq_test.rb +0 -154
  587. data/docker-compose.yml +0 -370
  588. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  589. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  590. data/lib/ddtrace/augmentation/shim.rb +0 -102
  591. data/lib/ddtrace/augmentation.rb +0 -13
  592. data/lib/ddtrace/environment.rb +0 -41
  593. data/lib/ddtrace/monkey.rb +0 -58
  594. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  595. data/lib/ddtrace/runtime/class_count.rb +0 -17
  596. data/lib/ddtrace/runtime/container.rb +0 -73
  597. data/lib/ddtrace/runtime/gc.rb +0 -16
  598. data/lib/ddtrace/runtime/identity.rb +0 -41
  599. data/lib/ddtrace/runtime/object_space.rb +0 -19
  600. data/lib/ddtrace/runtime/socket.rb +0 -14
  601. data/lib/ddtrace/runtime/thread_count.rb +0 -16
  602. data/tasks/release_gem.rake +0 -28
data/lib/ddtrace/pin.rb CHANGED
@@ -1,4 +1,6 @@
1
+ # typed: true
1
2
  require 'ddtrace/patcher'
3
+ require 'ddtrace/utils/only_once'
2
4
 
3
5
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
4
6
  module Datadog
@@ -7,19 +9,15 @@ module Datadog
7
9
  # This is useful if you wanted to, say, trace two different
8
10
  # database clusters.
9
11
  class Pin
12
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
13
+
10
14
  def self.get_from(obj)
11
15
  return nil unless obj.respond_to? :datadog_pin
16
+
12
17
  obj.datadog_pin
13
18
  end
14
19
 
15
- attr_accessor :app
16
- attr_accessor :app_type
17
- attr_accessor :config
18
- attr_accessor :name
19
- attr_accessor :service_name
20
- attr_accessor :tags
21
- attr_reader :tracer
22
- attr_accessor :writer
20
+ attr_accessor :app, :app_type, :config, :name, :service_name, :tags, :writer
23
21
 
24
22
  alias service= service_name=
25
23
  alias service service_name
@@ -42,6 +40,7 @@ module Datadog
42
40
 
43
41
  def enabled?
44
42
  return tracer.enabled if tracer
43
+
45
44
  false
46
45
  end
47
46
 
@@ -79,59 +78,8 @@ module Datadog
79
78
  ).freeze
80
79
 
81
80
  def deprecation_warning
82
- log_deprecation_warning('Datadog::Pin.new')
83
- end
84
-
85
- include Datadog::Patcher
86
-
87
- def log_deprecation_warning(method_name)
88
- # Only log each deprecation warning once (safeguard against log spam)
89
- do_once(method_name) do
90
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
91
- end
92
- end
93
- end
94
-
95
- # Modification to Pin which logs deprecation warnings if accessed.
96
- # Will be used by integrations which are phasing out the direct use of #datadog_pin.
97
- module DeprecatedPin
98
- include Datadog::Patcher
99
-
100
- DEPRECATION_WARNING = %(
101
- Use of Datadog::Pin is DEPRECATED.
102
- Upgrade to the configuration API using the migration guide here:
103
- https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
104
-
105
- # Raise a deprecation warning when #datadog_pin or #datadog_pin= is accessed.
106
- def onto(obj)
107
- obj.instance_exec(self) do |pin|
108
- @datadog_deprecated_pin = pin
109
-
110
- unless respond_to? :datadog_pin=
111
- def datadog_pin=(pin)
112
- @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin=')
113
- @datadog_pin = pin
114
- end
115
- end
116
-
117
- unless respond_to? :datadog_pin
118
- def datadog_pin
119
- @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin')
120
- @datadog_pin
121
- end
122
- end
123
-
124
- # Set instance variable to avoid deprecation warnings
125
- @datadog_pin = @datadog_deprecated_pin
126
- end
127
-
128
- self
129
- end
130
-
131
- def log_deprecation_warning(method_name)
132
- # Only log each deprecation warning once (safeguard against log spam)
133
- do_once(method_name) do
134
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
81
+ DEPRECATION_WARN_ONLY_ONCE.run do
82
+ Datadog.logger.warn("Datadog::Pin.new:#{DEPRECATION_WARNING}")
135
83
  end
136
84
  end
137
85
  end
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  module Pipeline
3
4
  # SpanFilter implements a processor that filters entire span subtrees
@@ -10,7 +11,7 @@ module Datadog
10
11
  @criteria = filter || block
11
12
  end
12
13
 
13
- # Note: this SpanFilter implementation only handles traces in which child spans appear
14
+ # NOTE: this SpanFilter implementation only handles traces in which child spans appear
14
15
  # after parent spans in the trace array. If in the future child spans can be before
15
16
  # parent spans, then the code below will need to be updated.
16
17
  def call(trace)
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  module Pipeline
3
4
  # SpanProcessor
@@ -1,3 +1,4 @@
1
+ # typed: true
1
2
  module Datadog
2
3
  # Pipeline
3
4
  module Pipeline
@@ -0,0 +1,33 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Profiling
4
+ # Entity class used to represent an entry in a stack trace.
5
+ # Its fields are a simplified struct version of `Thread::Backtrace::Location`.
6
+ class BacktraceLocation
7
+ attr_reader \
8
+ :base_label,
9
+ :lineno,
10
+ :path,
11
+ :hash
12
+
13
+ def initialize(
14
+ base_label,
15
+ lineno,
16
+ path
17
+ )
18
+ @base_label = base_label
19
+ @lineno = lineno
20
+ @path = path
21
+ @hash = [base_label, lineno, path].hash
22
+ end
23
+
24
+ def ==(other)
25
+ hash == other.hash
26
+ end
27
+
28
+ def eql?(other)
29
+ hash == other.hash
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,42 @@
1
+ # typed: true
2
+ require 'ddtrace/buffer'
3
+ require 'ddtrace/utils/string_table'
4
+ require 'ddtrace/utils/object_set'
5
+
6
+ module Datadog
7
+ module Profiling
8
+ # Profiling buffer that stores profiling events. The buffer has a maximum size and when
9
+ # the buffer is full, a random event is discarded. This class is thread-safe.
10
+ class Buffer < Datadog::ThreadSafeBuffer
11
+ def initialize(*args)
12
+ super
13
+ @caches = {}
14
+ @string_table = Utils::StringTable.new
15
+ end
16
+
17
+ def cache(cache_name)
18
+ synchronize do
19
+ @caches[cache_name] ||= Utils::ObjectSet.new
20
+ end
21
+ end
22
+
23
+ def string_table
24
+ synchronize do
25
+ @string_table
26
+ end
27
+ end
28
+
29
+ protected
30
+
31
+ def drain!
32
+ items = super
33
+
34
+ # Clear caches
35
+ @caches = {}
36
+ @string_table = Utils::StringTable.new
37
+
38
+ items
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,297 @@
1
+ # typed: true
2
+
3
+ require 'ddtrace/profiling/native_extension'
4
+ require 'ddtrace/profiling/backtrace_location'
5
+ require 'ddtrace/profiling/events/stack'
6
+ require 'ddtrace/utils/only_once'
7
+ require 'ddtrace/utils/time'
8
+ require 'ddtrace/worker'
9
+ require 'ddtrace/workers/polling'
10
+
11
+ module Datadog
12
+ module Profiling
13
+ module Collectors
14
+ # Collects stack trace samples from Ruby threads for both CPU-time (if available) and wall-clock.
15
+ # Runs on its own background thread.
16
+ #
17
+ class Stack < Worker # rubocop:disable Metrics/ClassLength
18
+ include Workers::Polling
19
+
20
+ DEFAULT_MAX_TIME_USAGE_PCT = 2.0
21
+ MIN_INTERVAL = 0.01
22
+ THREAD_LAST_CPU_TIME_KEY = :datadog_profiler_last_cpu_time
23
+ THREAD_LAST_WALL_CLOCK_KEY = :datadog_profiler_last_wall_clock
24
+ SYNTHETIC_STACK_IN_NATIVE_CODE = [BacktraceLocation.new('', 0, 'In native code').freeze].freeze
25
+
26
+ # This default was picked based on the current sampling performance and on expected concurrency on an average
27
+ # Ruby MRI application. Lowering this optimizes for latency (less impact each time we sample), and raising
28
+ # optimizes for coverage (less chance to miss what a given thread is doing).
29
+ DEFAULT_MAX_THREADS_SAMPLED = 16
30
+
31
+ attr_reader \
32
+ :recorder,
33
+ :max_frames,
34
+ :trace_identifiers_helper,
35
+ :ignore_thread,
36
+ :max_time_usage_pct,
37
+ :thread_api,
38
+ :cpu_time_provider
39
+
40
+ def initialize(
41
+ recorder,
42
+ max_frames:,
43
+ trace_identifiers_helper:, # Usually an instance of Datadog::Profiling::TraceIdentifiers::Helper
44
+ ignore_thread: nil,
45
+ max_time_usage_pct: DEFAULT_MAX_TIME_USAGE_PCT,
46
+ max_threads_sampled: DEFAULT_MAX_THREADS_SAMPLED,
47
+ thread_api: Thread,
48
+ cpu_time_provider: Datadog::Profiling::NativeExtension,
49
+ fork_policy: Workers::Async::Thread::FORK_POLICY_RESTART, # Restart in forks by default
50
+ interval: MIN_INTERVAL,
51
+ enabled: true
52
+ )
53
+ @recorder = recorder
54
+ @max_frames = max_frames
55
+ @trace_identifiers_helper = trace_identifiers_helper
56
+ @ignore_thread = ignore_thread
57
+ @max_time_usage_pct = max_time_usage_pct
58
+ @max_threads_sampled = max_threads_sampled
59
+ @thread_api = thread_api
60
+ # Only set the provider if it's able to work in the current Ruby/OS combo
61
+ @cpu_time_provider = cpu_time_provider unless cpu_time_provider.cpu_time_ns_for(thread_api.current).nil?
62
+
63
+ # Workers::Async::Thread settings
64
+ self.fork_policy = fork_policy
65
+
66
+ # Workers::IntervalLoop settings
67
+ self.loop_base_interval = interval
68
+
69
+ # Workers::Polling settings
70
+ self.enabled = enabled
71
+
72
+ # Cache this proc, since it's pretty expensive to keep recreating it
73
+ @build_backtrace_location = method(:build_backtrace_location).to_proc
74
+ # Cache this buffer, since it's pretty expensive to keep accessing it
75
+ @stack_sample_event_recorder = recorder[Events::StackSample]
76
+ # See below for details on why this is needed
77
+ @needs_process_waiter_workaround =
78
+ Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.3') &&
79
+ Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
80
+ end
81
+
82
+ def start
83
+ reset_cpu_time_tracking
84
+ perform
85
+ end
86
+
87
+ def perform
88
+ collect_and_wait
89
+ end
90
+
91
+ def collect_and_wait
92
+ run_time = Datadog::Utils::Time.measure do
93
+ collect_events
94
+ end
95
+
96
+ # Update wait time to throttle profiling
97
+ self.loop_wait_time = compute_wait_time(run_time)
98
+ end
99
+
100
+ def collect_events
101
+ events = []
102
+ current_wall_time_ns = get_current_wall_time_timestamp_ns
103
+
104
+ # Collect backtraces from each thread
105
+ threads_to_sample.each do |thread|
106
+ next unless thread.alive?
107
+ next if ignore_thread.is_a?(Proc) && ignore_thread.call(thread)
108
+
109
+ event = collect_thread_event(thread, current_wall_time_ns)
110
+ events << event unless event.nil?
111
+ end
112
+
113
+ # Send events to recorder
114
+ recorder.push(events) unless events.empty?
115
+
116
+ events
117
+ end
118
+
119
+ def collect_thread_event(thread, current_wall_time_ns)
120
+ locations = thread.backtrace_locations
121
+ return if locations.nil?
122
+
123
+ # Having empty locations means that the thread is alive, but we don't know what it's doing:
124
+ #
125
+ # 1. It can be starting up
126
+ # ```
127
+ # > Thread.new { sleep }.backtrace
128
+ # => [] # <-- note the thread hasn't actually started running sleep yet, we got there first
129
+ # ```
130
+ # 2. It can be running native code
131
+ # ```
132
+ # > t = Process.detach(fork { sleep })
133
+ # => #<Process::Waiter:0x00007ffe7285f7a0 run>
134
+ # > t.backtrace
135
+ # => [] # <-- this can happen even minutes later, e.g. it's not a race as in 1.
136
+ # ```
137
+ # This effect has been observed in threads created by the Iodine web server and the ffi gem
138
+ #
139
+ # To give customers visibility into these threads, we replace the empty stack with one containing a
140
+ # synthetic placeholder frame, so that these threads are properly represented in the UX.
141
+ locations = SYNTHETIC_STACK_IN_NATIVE_CODE if locations.empty?
142
+
143
+ # Get actual stack size then trim the stack
144
+ stack_size = locations.length
145
+ locations = locations[0..(max_frames - 1)]
146
+
147
+ # Convert backtrace locations into structs
148
+ locations = convert_backtrace_locations(locations)
149
+
150
+ thread_id = thread.object_id
151
+ root_span_id, span_id, trace_resource = trace_identifiers_helper.trace_identifiers_for(thread)
152
+ cpu_time = get_cpu_time_interval!(thread)
153
+ wall_time_interval_ns =
154
+ get_elapsed_since_last_sample_and_set_value(thread, THREAD_LAST_WALL_CLOCK_KEY, current_wall_time_ns)
155
+
156
+ Events::StackSample.new(
157
+ nil,
158
+ locations,
159
+ stack_size,
160
+ thread_id,
161
+ root_span_id,
162
+ span_id,
163
+ trace_resource,
164
+ cpu_time,
165
+ wall_time_interval_ns
166
+ )
167
+ end
168
+
169
+ def get_cpu_time_interval!(thread)
170
+ return unless cpu_time_provider
171
+
172
+ current_cpu_time_ns = cpu_time_provider.cpu_time_ns_for(thread)
173
+
174
+ return unless current_cpu_time_ns
175
+
176
+ get_elapsed_since_last_sample_and_set_value(thread, THREAD_LAST_CPU_TIME_KEY, current_cpu_time_ns)
177
+ end
178
+
179
+ def compute_wait_time(used_time)
180
+ # We took used_time to get the last sample.
181
+ #
182
+ # What we're computing here is -- if used_time corresponds to max_time_usage_pct of the time we should
183
+ # spend working, how much is (100% - max_time_usage_pct) of the time?
184
+ #
185
+ # For instance, if we took 10ms to sample, and max_time_usage_pct is 1%, then the other 99% is 990ms, which
186
+ # means we need to sleep for 990ms to guarantee that we don't spend more than 1% of the time working.
187
+ used_time_ns = used_time * 1e9
188
+ interval = (used_time_ns / (max_time_usage_pct / 100.0)) - used_time_ns
189
+ [interval / 1e9, MIN_INTERVAL].max
190
+ end
191
+
192
+ # Convert backtrace locations into structs
193
+ # Re-use old backtrace location objects if they already exist in the buffer
194
+ def convert_backtrace_locations(locations)
195
+ locations.collect do |location|
196
+ # Re-use existing BacktraceLocation if identical copy, otherwise build a new one.
197
+ @stack_sample_event_recorder.cache(:backtrace_locations).fetch(
198
+ # Function name
199
+ location.base_label,
200
+ # Line number
201
+ location.lineno,
202
+ # Filename
203
+ location.path,
204
+ # Build function
205
+ &@build_backtrace_location
206
+ )
207
+ end
208
+ end
209
+
210
+ def build_backtrace_location(_id, base_label, lineno, path)
211
+ string_table = @stack_sample_event_recorder.string_table
212
+
213
+ Profiling::BacktraceLocation.new(
214
+ string_table.fetch_string(base_label),
215
+ lineno,
216
+ string_table.fetch_string(path)
217
+ )
218
+ end
219
+
220
+ private
221
+
222
+ # If the profiler is started for a while, stopped and then restarted OR whenever the process forks, we need to
223
+ # clean up any leftover per-thread counters, so that the first sample after starting doesn't end up with:
224
+ #
225
+ # a) negative time: At least on my test docker container, and on the reliability environment, after the process
226
+ # forks, the cpu time reference changes and (old cpu time - new cpu time) can be < 0
227
+ #
228
+ # b) large amount of time: if the profiler was started, then stopped for some amount of time, and then
229
+ # restarted, we don't want the first sample to be "blamed" for multiple minutes of CPU time
230
+ #
231
+ # By resetting the last cpu time seen, we start with a clean slate every time we start the stack collector.
232
+ def reset_cpu_time_tracking
233
+ thread_api.list.each do |thread|
234
+ # See below for details on why this is needed
235
+ next if @needs_process_waiter_workaround && thread.is_a?(::Process::Waiter)
236
+
237
+ thread.thread_variable_set(THREAD_LAST_CPU_TIME_KEY, nil)
238
+ thread.thread_variable_set(THREAD_LAST_WALL_CLOCK_KEY, nil)
239
+ end
240
+ end
241
+
242
+ def get_elapsed_since_last_sample_and_set_value(thread, key, current_value)
243
+ # Process::Waiter crash workaround:
244
+ #
245
+ # This is a workaround for a Ruby VM segfault (usually something like
246
+ # "[BUG] Segmentation fault at 0x0000000000000008") in the affected Ruby versions.
247
+ # See https://bugs.ruby-lang.org/issues/17807 for details.
248
+ #
249
+ # In those Ruby versions, there's a very special subclass of `Thread` called `Process::Waiter` that causes VM
250
+ # crashes whenever something tries to read its instance or thread variables. This subclass of thread only
251
+ # shows up when the `Process.detach` API gets used.
252
+ # In the specs you'll find crash regression tests that include a way of reproducing it.
253
+ #
254
+ # As workaround for now we just skip it for the affected Rubies
255
+ return 0 if @needs_process_waiter_workaround && thread.is_a?(::Process::Waiter)
256
+
257
+ last_value = thread.thread_variable_get(key) || current_value
258
+ thread.thread_variable_set(key, current_value)
259
+
260
+ current_value - last_value
261
+ end
262
+
263
+ # Whenever there are more than max_threads_sampled active, we only sample a subset of them.
264
+ # We do this to avoid impacting the latency of the service being profiled. We want to avoid doing
265
+ # a big burst of work all at once (sample everything), and instead do a little work each time
266
+ # (sample a bit by bit).
267
+ #
268
+ # Because we pick the threads to sample randomly, we'll eventually sample all threads -- just not at once.
269
+ # Notice also that this will interact with our dynamic sampling mechanism -- if samples are faster, we take
270
+ # them more often, if they are slower, we take them less often -- which again means that over a longer period
271
+ # we should take sample roughly the same samples.
272
+ #
273
+ # One downside of this approach is that if there really are many threads, the resulting wall clock times
274
+ # in a one minute profile may "drift" around the 60 second mark, e.g. maybe we only sampled a thread once per
275
+ # second and only 59 times, so we'll report 59s, but on the next report we'll include the missing one, so
276
+ # then the result will be 61s. I've observed 60 +- 1.68 secs for an app with ~65 threads, given the
277
+ # default maximum of 16 threads. This seems a reasonable enough margin of error given the improvement to
278
+ # latency (especially on such a large application! -> even bigger latency impact if we tried to sample all
279
+ # threads).
280
+ #
281
+ def threads_to_sample
282
+ all_threads = thread_api.list
283
+
284
+ if all_threads.size > @max_threads_sampled
285
+ all_threads.sample(@max_threads_sampled)
286
+ else
287
+ all_threads
288
+ end
289
+ end
290
+
291
+ def get_current_wall_time_timestamp_ns
292
+ Datadog::Utils::Time.get_time(:nanosecond)
293
+ end
294
+ end
295
+ end
296
+ end
297
+ end
@@ -0,0 +1,46 @@
1
+ # typed: true
2
+ require 'set'
3
+ require 'time'
4
+
5
+ require 'ddtrace/profiling/flush'
6
+ require 'ddtrace/profiling/pprof/template'
7
+
8
+ module Datadog
9
+ module Profiling
10
+ module Encoding
11
+ module Profile
12
+ # Encodes gathered data into the pprof format
13
+ module Protobuf
14
+ module_function
15
+
16
+ def encode(flush)
17
+ return unless flush
18
+
19
+ # Create a pprof template from the list of event types
20
+ event_classes = flush.event_groups.collect(&:event_class).uniq
21
+ template = Pprof::Template.for_event_classes(event_classes)
22
+
23
+ # Add all events to the pprof
24
+ flush.event_groups.each { |event_group| template.add_events!(event_group.event_class, event_group.events) }
25
+
26
+ Datadog.logger.debug do
27
+ max_events = Datadog.configuration.profiling.advanced.max_events
28
+ events_sampled =
29
+ if flush.event_count == max_events
30
+ 'max events limit hit, events were sampled [profile will be biased], '
31
+ else
32
+ ''
33
+ end
34
+
35
+ "Encoding profile covering #{flush.start.iso8601} to #{flush.finish.iso8601}, " \
36
+ "events: #{flush.event_count} (#{events_sampled}#{template.debug_statistics})"
37
+ end
38
+
39
+ # Build the profile and encode it
40
+ template.to_pprof(start: flush.start, finish: flush.finish)
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,14 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Profiling
4
+ # Describes a sample of some data obtained from the runtime.
5
+ class Event
6
+ attr_reader \
7
+ :timestamp
8
+
9
+ def initialize(timestamp = nil)
10
+ @timestamp = timestamp || Time.now.utc.to_f
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,81 @@
1
+ # typed: true
2
+ require 'ddtrace/profiling/event'
3
+
4
+ module Datadog
5
+ module Profiling
6
+ module Events
7
+ # Describes a stack profiling event
8
+ class Stack < Event
9
+ attr_reader \
10
+ :hash,
11
+ :frames,
12
+ :total_frame_count,
13
+ :thread_id,
14
+ :root_span_id,
15
+ :span_id,
16
+ :trace_resource
17
+
18
+ def initialize(
19
+ timestamp,
20
+ frames,
21
+ total_frame_count,
22
+ thread_id,
23
+ root_span_id,
24
+ span_id,
25
+ trace_resource
26
+ )
27
+ super(timestamp)
28
+
29
+ @frames = frames
30
+ @total_frame_count = total_frame_count
31
+ @thread_id = thread_id
32
+ @root_span_id = root_span_id
33
+ @span_id = span_id
34
+ @trace_resource = trace_resource
35
+
36
+ @hash = [
37
+ thread_id,
38
+ root_span_id,
39
+ span_id,
40
+ # trace_resource is deliberately not included -- events that share the same (root_span_id, span_id) refer
41
+ # to the same trace
42
+ frames.collect(&:hash),
43
+ total_frame_count
44
+ ].hash
45
+ end
46
+ end
47
+
48
+ # Describes a stack sample
49
+ class StackSample < Stack
50
+ attr_reader \
51
+ :cpu_time_interval_ns,
52
+ :wall_time_interval_ns
53
+
54
+ def initialize(
55
+ timestamp,
56
+ frames,
57
+ total_frame_count,
58
+ thread_id,
59
+ root_span_id,
60
+ span_id,
61
+ trace_resource,
62
+ cpu_time_interval_ns,
63
+ wall_time_interval_ns
64
+ )
65
+ super(
66
+ timestamp,
67
+ frames,
68
+ total_frame_count,
69
+ thread_id,
70
+ root_span_id,
71
+ span_id,
72
+ trace_resource
73
+ )
74
+
75
+ @cpu_time_interval_ns = cpu_time_interval_ns
76
+ @wall_time_interval_ns = wall_time_interval_ns
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,24 @@
1
+ # typed: true
2
+ require 'ddtrace/profiling/transport/io/client'
3
+
4
+ module Datadog
5
+ module Profiling
6
+ # Writes profiling data to a given transport
7
+ class Exporter
8
+ attr_reader \
9
+ :transport
10
+
11
+ def initialize(transport)
12
+ unless transport.is_a?(Profiling::Transport::Client)
13
+ raise ArgumentError, 'Unsupported transport for profiling exporter.'
14
+ end
15
+
16
+ @transport = transport
17
+ end
18
+
19
+ def export(flush)
20
+ transport.send_profiling_flush(flush)
21
+ end
22
+ end
23
+ end
24
+ end