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
@@ -0,0 +1,90 @@
1
+ # typed: false
2
+ require 'ddtrace/utils/only_once'
3
+ require 'ddtrace/profiling'
4
+ require 'ddtrace/profiling/ext/forking'
5
+
6
+ module Datadog
7
+ module Profiling
8
+ module Tasks
9
+ # Takes care of loading our extensions/monkey patches to handle fork() and validating if CPU-time profiling is usable
10
+ class Setup
11
+ ACTIVATE_EXTENSIONS_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
12
+
13
+ def run
14
+ ACTIVATE_EXTENSIONS_ONLY_ONCE.run do
15
+ begin
16
+ check_if_cpu_time_profiling_is_supported
17
+ activate_forking_extensions
18
+ setup_at_fork_hooks
19
+ rescue StandardError, ScriptError => e
20
+ Datadog.logger.warn do
21
+ "Profiler extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ private
28
+
29
+ def activate_forking_extensions
30
+ if Ext::Forking.supported?
31
+ Ext::Forking.apply!
32
+ elsif Datadog.configuration.profiling.enabled
33
+ Datadog.logger.debug('Profiler forking extensions skipped; forking not supported.')
34
+ end
35
+ rescue StandardError, ScriptError => e
36
+ Datadog.logger.warn do
37
+ "Profiler forking extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
38
+ end
39
+ end
40
+
41
+ def check_if_cpu_time_profiling_is_supported
42
+ unsupported = cpu_time_profiling_unsupported_reason
43
+
44
+ if unsupported
45
+ Datadog.logger.info do
46
+ 'CPU time profiling skipped because native CPU time is not supported: ' \
47
+ "#{unsupported}. Profiles containing 'Wall time' data will still be reported."
48
+ end
49
+ end
50
+ end
51
+
52
+ def setup_at_fork_hooks
53
+ if Process.respond_to?(:at_fork)
54
+ Process.at_fork(:child) do
55
+ begin
56
+ # When Ruby forks, clock IDs for each of the threads
57
+ # will change. We can only update these IDs from the
58
+ # execution context of the thread that owns it.
59
+ # This hook will update the IDs for the main thread
60
+ # after a fork occurs.
61
+ Thread.current.send(:update_native_ids) if Thread.current.respond_to?(:update_native_ids, true)
62
+
63
+ # Restart profiler, if enabled
64
+ Datadog.profiler.start if Datadog.profiler
65
+ rescue StandardError => e
66
+ Datadog.logger.warn do
67
+ "Error during post-fork hooks. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ def cpu_time_profiling_unsupported_reason
75
+ # NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons
76
+
77
+ if RUBY_ENGINE == 'jruby'
78
+ 'JRuby is not supported'
79
+ elsif RUBY_PLATFORM.include?('darwin')
80
+ 'Feature requires Linux; macOS is not supported'
81
+ elsif RUBY_PLATFORM =~ /(mswin|mingw)/
82
+ 'Feature requires Linux; Windows is not supported'
83
+ elsif !RUBY_PLATFORM.include?('linux')
84
+ "Feature requires Linux; #{RUBY_PLATFORM} is not supported"
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,42 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require 'ddtrace/ext/http'
5
+
6
+ module Datadog
7
+ module Profiling
8
+ module TraceIdentifiers
9
+ # Used by Datadog::Profiling::TraceIdentifiers::Helper to get the trace identifiers (root span id and span id)
10
+ # for a given thread, if there is an active trace for that thread in the supplied tracer object.
11
+ class Ddtrace
12
+ def initialize(tracer:)
13
+ @tracer = (tracer if tracer.respond_to?(:call_context))
14
+ end
15
+
16
+ def trace_identifiers_for(thread)
17
+ return unless @tracer
18
+
19
+ context = @tracer.call_context(thread)
20
+ return unless context
21
+
22
+ span, root_span = context.current_span_and_root_span
23
+ return unless span && root_span
24
+
25
+ root_span_id = root_span.span_id || 0
26
+ span_id = span.span_id || 0
27
+
28
+ [root_span_id, span_id, maybe_extract_resource(root_span)] if root_span_id != 0 && span_id != 0
29
+ end
30
+
31
+ private
32
+
33
+ # NOTE: Currently we're only interested in HTTP service endpoints. Over time, this list may be expanded.
34
+ # Resources MUST NOT include personal identifiable information (PII); this should not be the case with
35
+ # ddtrace integrations, but worth mentioning just in case :)
36
+ def maybe_extract_resource(root_span)
37
+ root_span.resource if root_span.span_type == Datadog::Ext::HTTP::TYPE_INBOUND
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,46 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ require 'ddtrace/profiling/trace_identifiers/ddtrace'
5
+
6
+ module Datadog
7
+ module Profiling
8
+ module TraceIdentifiers
9
+ # Helper used to retrieve the trace identifiers (root span id and span id) for a given thread,
10
+ # if there is an active trace for that thread for the supported tracing APIs.
11
+ #
12
+ # This data is used to connect profiles to the traces -- samples in a profile will be tagged with this data and
13
+ # the profile can be filtered down to look at only the samples for a given trace.
14
+ class Helper
15
+ DEFAULT_SUPPORTED_APIS = [
16
+ ::Datadog::Profiling::TraceIdentifiers::Ddtrace
17
+ ].freeze
18
+ private_constant :DEFAULT_SUPPORTED_APIS
19
+
20
+ def initialize(
21
+ tracer:,
22
+ # If this is disabled, the helper will strip the optional trace_resource_container even if provided by the api
23
+ endpoint_collection_enabled:,
24
+ supported_apis: DEFAULT_SUPPORTED_APIS.map { |api| api.new(tracer: tracer) }
25
+ )
26
+ @endpoint_collection_enabled = endpoint_collection_enabled
27
+ @supported_apis = supported_apis
28
+ end
29
+
30
+ # Expected output of the #trace_identifiers_for
31
+ # duck type is [root_span_id, span_id, (optional trace_resource_container)]
32
+ def trace_identifiers_for(thread)
33
+ @supported_apis.each do |api|
34
+ trace_identifiers = api.trace_identifiers_for(thread)
35
+
36
+ if trace_identifiers
37
+ return @endpoint_collection_enabled ? trace_identifiers : trace_identifiers[0..1]
38
+ end
39
+ end
40
+
41
+ nil
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,15 @@
1
+ # typed: true
2
+ module Datadog
3
+ module Profiling
4
+ module Transport
5
+ # Generic interface for profiling transports
6
+ module Client
7
+ include Kernel # Ensure that kernel methods are always available (https://sorbet.org/docs/error-reference#7003)
8
+
9
+ def send_profiling_flush(flush)
10
+ raise NotImplementedError
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,94 @@
1
+ # typed: true
2
+ require 'ddtrace/ext/profiling'
3
+ require 'ddtrace/utils/compression'
4
+ require 'ddtrace/vendor/multipart-post/multipart/post/composite_read_io'
5
+
6
+ require 'ddtrace/transport/http/api/endpoint'
7
+ require 'ddtrace/profiling/transport/http/response'
8
+
9
+ module Datadog
10
+ module Profiling
11
+ module Transport
12
+ module HTTP
13
+ module API
14
+ # Datadog API endpoint for profiling
15
+ class Endpoint < Datadog::Transport::HTTP::API::Endpoint
16
+ include Datadog::Ext::Profiling::Transport::HTTP
17
+
18
+ # These tags are read from the flush object (see below) directly and so we ignore any extra copies that
19
+ # may come in the tags hash to avoid duplicates.
20
+ TAGS_TO_IGNORE_IN_TAGS_HASH = %w[service env version].freeze
21
+ private_constant :TAGS_TO_IGNORE_IN_TAGS_HASH
22
+
23
+ attr_reader \
24
+ :encoder
25
+
26
+ def initialize(path, encoder)
27
+ super(:post, path)
28
+ @encoder = encoder
29
+ end
30
+
31
+ def call(env, &block)
32
+ # Build request
33
+ env.form = build_form(env)
34
+
35
+ # Send request
36
+ http_response = super(env, &block)
37
+
38
+ # Build response
39
+ Profiling::Transport::HTTP::Response.new(http_response)
40
+ end
41
+
42
+ def build_form(env)
43
+ flush = env.request.parcel.data
44
+ pprof_file = build_pprof(flush)
45
+
46
+ form = {
47
+ FORM_FIELD_INTAKE_VERSION => '3', # Aka 1.3 intake format
48
+ FORM_FIELD_RECORDING_START => flush.start.utc.iso8601,
49
+ FORM_FIELD_RECORDING_END => flush.finish.utc.iso8601,
50
+ FORM_FIELD_TAGS => [
51
+ "#{FORM_FIELD_TAG_RUNTIME}:#{flush.language}",
52
+ "#{FORM_FIELD_TAG_RUNTIME_ID}:#{flush.runtime_id}",
53
+ "#{FORM_FIELD_TAG_RUNTIME_ENGINE}:#{flush.runtime_engine}",
54
+ "#{FORM_FIELD_TAG_RUNTIME_PLATFORM}:#{flush.runtime_platform}",
55
+ "#{FORM_FIELD_TAG_RUNTIME_VERSION}:#{flush.runtime_version}",
56
+ "#{FORM_FIELD_TAG_PID}:#{Process.pid}",
57
+ "#{FORM_FIELD_TAG_PROFILER_VERSION}:#{flush.profiler_version}",
58
+ # NOTE: Redundant w/ 'runtime'; may want to remove this later.
59
+ "#{FORM_FIELD_TAG_LANGUAGE}:#{flush.language}",
60
+ "#{FORM_FIELD_TAG_HOST}:#{flush.host}",
61
+ *flush
62
+ .tags
63
+ .reject { |tag_key| TAGS_TO_IGNORE_IN_TAGS_HASH.include?(tag_key) }
64
+ .map { |tag_key, tag_value| "#{tag_key}:#{tag_value}" }
65
+ ],
66
+ FORM_FIELD_PPROF_DATA => pprof_file,
67
+ FORM_FIELD_FAMILY => flush.language,
68
+ }
69
+
70
+ # Optional fields
71
+ form[FORM_FIELD_TAGS] << "#{FORM_FIELD_TAG_SERVICE}:#{flush.service}" unless flush.service.nil?
72
+ form[FORM_FIELD_TAGS] << "#{FORM_FIELD_TAG_ENV}:#{flush.env}" unless flush.env.nil?
73
+ form[FORM_FIELD_TAGS] << "#{FORM_FIELD_TAG_VERSION}:#{flush.version}" unless flush.version.nil?
74
+
75
+ form
76
+ end
77
+
78
+ def build_pprof(flush)
79
+ pprof = encoder.encode(flush)
80
+
81
+ gzipped_pprof_data = Datadog::Utils::Compression.gzip(pprof.data)
82
+
83
+ Datadog::Vendor::Multipart::Post::UploadIO.new(
84
+ StringIO.new(gzipped_pprof_data),
85
+ HEADER_CONTENT_TYPE_OCTET_STREAM,
86
+ PPROF_DEFAULT_FILENAME
87
+ )
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,37 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/http/api/instance'
3
+ require 'ddtrace/profiling/transport/http/api/spec'
4
+
5
+ module Datadog
6
+ module Profiling
7
+ module Transport
8
+ module HTTP
9
+ module API
10
+ # API instance for profiling
11
+ class Instance < Datadog::Transport::HTTP::API::Instance
12
+ def send_profiling_flush(env)
13
+ raise ProfilesNotSupportedError, spec unless spec.is_a?(Spec)
14
+
15
+ spec.send_profiling_flush(env) do |request_env|
16
+ call(request_env)
17
+ end
18
+ end
19
+
20
+ # Raised when profiles sent to API that does not support profiles
21
+ class ProfilesNotSupportedError < StandardError
22
+ attr_reader :spec
23
+
24
+ def initialize(spec)
25
+ @spec = spec
26
+ end
27
+
28
+ def message
29
+ 'Profiles not supported for this API!'
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/http/api/spec'
3
+
4
+ module Datadog
5
+ module Profiling
6
+ module Transport
7
+ module HTTP
8
+ module API
9
+ # API specification for profiling
10
+ class Spec < Datadog::Transport::HTTP::API::Spec
11
+ attr_accessor \
12
+ :profiles
13
+
14
+ def send_profiling_flush(env, &block)
15
+ raise NoProfilesEndpointDefinedError, self if profiles.nil?
16
+
17
+ profiles.call(env, &block)
18
+ end
19
+
20
+ def encoder
21
+ profiles.encoder
22
+ end
23
+
24
+ # Raised when profiles sent but no profiles endpoint is defined
25
+ class NoProfilesEndpointDefinedError < StandardError
26
+ attr_reader :spec
27
+
28
+ def initialize(spec)
29
+ @spec = spec
30
+ end
31
+
32
+ def message
33
+ 'No profiles endpoint is defined for API specification!'
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,44 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/http/api/map'
3
+ require 'ddtrace/profiling/encoding/profile'
4
+ require 'ddtrace/profiling/transport/http/api/spec'
5
+ require 'ddtrace/profiling/transport/http/api/instance'
6
+ require 'ddtrace/profiling/transport/http/api/endpoint'
7
+
8
+ module Datadog
9
+ module Profiling
10
+ module Transport
11
+ module HTTP
12
+ # Extensions for HTTP API Spec
13
+ module API
14
+ # Default API versions
15
+ V1 = 'v1'.freeze
16
+
17
+ module_function
18
+
19
+ def agent_defaults
20
+ @agent_defaults ||= Datadog::Transport::HTTP::API::Map[
21
+ V1 => Spec.new do |s|
22
+ s.profiles = Endpoint.new(
23
+ '/profiling/v1/input'.freeze,
24
+ Profiling::Encoding::Profile::Protobuf
25
+ )
26
+ end
27
+ ]
28
+ end
29
+
30
+ def api_defaults
31
+ @api_defaults ||= Datadog::Transport::HTTP::API::Map[
32
+ V1 => Spec.new do |s|
33
+ s.profiles = Endpoint.new(
34
+ '/v1/input'.freeze,
35
+ Profiling::Encoding::Profile::Protobuf
36
+ )
37
+ end
38
+ ]
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,29 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/http/builder'
3
+
4
+ require 'ddtrace/profiling/transport/http/api'
5
+ require 'ddtrace/profiling/transport/http/client'
6
+
7
+ module Datadog
8
+ module Profiling
9
+ module Transport
10
+ module HTTP
11
+ # Builds new instances of Transport::HTTP::Client
12
+ class Builder < Datadog::Transport::HTTP::Builder
13
+ def api_instance_class
14
+ API::Instance
15
+ end
16
+
17
+ def to_transport
18
+ raise Datadog::Transport::HTTP::Builder::NoDefaultApiError if @default_api.nil?
19
+
20
+ # TODO: Profiling doesn't have multiple APIs yet.
21
+ # When it does, we should build it out with these APIs.
22
+ # Just use :default_api for now.
23
+ Client.new(to_api_instances[@default_api])
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,34 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/http/client'
3
+ require 'ddtrace/profiling/transport/client'
4
+
5
+ module Datadog
6
+ module Profiling
7
+ module Transport
8
+ module HTTP
9
+ # Routes, encodes, and sends tracer data to the trace agent via HTTP.
10
+ class Client < Datadog::Transport::HTTP::Client
11
+ include Transport::Client
12
+
13
+ def send_profiling_flush(flush)
14
+ # Build a request
15
+ request = Profiling::Transport::Request.new(flush)
16
+ send_payload(request).tap do |response|
17
+ if response.ok?
18
+ Datadog.logger.debug('Successfully reported profiling data')
19
+ else
20
+ Datadog.logger.debug { "Failed to report profiling data -- #{response.inspect}" }
21
+ end
22
+ end
23
+ end
24
+
25
+ def send_payload(request)
26
+ send_request(request) do |api, env|
27
+ api.send_profiling_flush(env)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/http/response'
3
+ require 'ddtrace/profiling/transport/response'
4
+
5
+ module Datadog
6
+ module Profiling
7
+ module Transport
8
+ # HTTP transport behavior for profiling
9
+ module HTTP
10
+ # Response from HTTP transport for profiling
11
+ class Response
12
+ include Datadog::Transport::HTTP::Response
13
+ include Profiling::Transport::Response
14
+
15
+ def initialize(http_response, options = {})
16
+ super(http_response)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,111 @@
1
+ # typed: true
2
+ require 'datadog/core/environment/ext'
3
+ require 'ddtrace/ext/transport'
4
+
5
+ require 'datadog/core/environment/container'
6
+ require 'datadog/core/environment/variable_helpers'
7
+
8
+ require 'ddtrace/profiling/transport/http/builder'
9
+ require 'ddtrace/profiling/transport/http/api'
10
+
11
+ require 'ddtrace/transport/http/adapters/net'
12
+ require 'ddtrace/transport/http/adapters/test'
13
+ require 'ddtrace/transport/http/adapters/unix_socket'
14
+
15
+ module Datadog
16
+ module Profiling
17
+ module Transport
18
+ # Namespace for HTTP transport components
19
+ module HTTP
20
+ # Builds a new Transport::HTTP::Client
21
+ def self.new(&block)
22
+ Builder.new(&block).to_transport
23
+ end
24
+
25
+ # Builds a new Transport::HTTP::Client with default settings
26
+ def self.default(
27
+ profiling_upload_timeout_seconds:,
28
+ agent_settings:,
29
+ site: nil,
30
+ api_key: nil,
31
+ agentless_allowed: agentless_allowed?
32
+ )
33
+ new do |transport|
34
+ transport.headers default_headers
35
+
36
+ # Configure adapter & API
37
+ if site && api_key && agentless_allowed
38
+ configure_for_agentless(
39
+ transport,
40
+ profiling_upload_timeout_seconds: profiling_upload_timeout_seconds,
41
+ site: site,
42
+ api_key: api_key
43
+ )
44
+ else
45
+ configure_for_agent(
46
+ transport,
47
+ profiling_upload_timeout_seconds: profiling_upload_timeout_seconds,
48
+ agent_settings: agent_settings
49
+ )
50
+ end
51
+ end
52
+ end
53
+
54
+ def self.default_headers
55
+ {
56
+ Datadog::Ext::Transport::HTTP::HEADER_META_LANG => Core::Environment::Ext::LANG,
57
+ Datadog::Ext::Transport::HTTP::HEADER_META_LANG_VERSION => Core::Environment::Ext::LANG_VERSION,
58
+ Datadog::Ext::Transport::HTTP::HEADER_META_LANG_INTERPRETER => Core::Environment::Ext::LANG_INTERPRETER,
59
+ Datadog::Ext::Transport::HTTP::HEADER_META_TRACER_VERSION => Core::Environment::Ext::TRACER_VERSION
60
+ }.tap do |headers|
61
+ # Add container ID, if present.
62
+ container_id = Datadog::Core::Environment::Container.container_id
63
+ headers[Datadog::Ext::Transport::HTTP::HEADER_CONTAINER_ID] = container_id unless container_id.nil?
64
+ end
65
+ end
66
+
67
+ private_class_method def self.configure_for_agent(transport, profiling_upload_timeout_seconds:, agent_settings:)
68
+ apis = API.agent_defaults
69
+
70
+ transport.adapter(agent_settings.merge(timeout_seconds: profiling_upload_timeout_seconds))
71
+ transport.api(API::V1, apis[API::V1], default: true)
72
+
73
+ # NOTE: This proc, when it exists, usually overrides the transport specified above
74
+ if agent_settings.deprecated_for_removal_transport_configuration_proc
75
+ agent_settings.deprecated_for_removal_transport_configuration_proc.call(transport)
76
+ end
77
+ end
78
+
79
+ private_class_method def self.configure_for_agentless(transport, profiling_upload_timeout_seconds:, site:, api_key:)
80
+ apis = API.api_defaults
81
+
82
+ site_uri = URI(format(Datadog::Ext::Profiling::Transport::HTTP::URI_TEMPLATE_DD_API, site))
83
+ hostname = site_uri.host
84
+ port = site_uri.port
85
+
86
+ transport.adapter(
87
+ Datadog::Ext::Transport::HTTP::ADAPTER,
88
+ hostname,
89
+ port,
90
+ timeout: profiling_upload_timeout_seconds,
91
+ ssl: site_uri.scheme == 'https'
92
+ )
93
+ transport.api(API::V1, apis[API::V1], default: true)
94
+ transport.headers(Datadog::Ext::Transport::HTTP::HEADER_DD_API_KEY => api_key)
95
+ end
96
+
97
+ private_class_method def self.agentless_allowed?
98
+ Datadog::Core::Environment::VariableHelpers.env_to_bool(Datadog::Ext::Profiling::ENV_AGENTLESS, false)
99
+ end
100
+
101
+ # Add adapters to registry
102
+ Datadog::Transport::HTTP::Builder::REGISTRY.set(Datadog::Transport::HTTP::Adapters::Net,
103
+ Datadog::Ext::Transport::HTTP::ADAPTER)
104
+ Datadog::Transport::HTTP::Builder::REGISTRY.set(Datadog::Transport::HTTP::Adapters::Test,
105
+ Datadog::Ext::Transport::Test::ADAPTER)
106
+ Datadog::Transport::HTTP::Builder::REGISTRY.set(Datadog::Transport::HTTP::Adapters::UnixSocket,
107
+ Datadog::Ext::Transport::UnixSocket::ADAPTER)
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,28 @@
1
+ # typed: true
2
+ require 'ddtrace/transport/io/client'
3
+ require 'ddtrace/profiling/transport/client'
4
+ require 'ddtrace/profiling/transport/request'
5
+ require 'ddtrace/profiling/transport/io/response'
6
+
7
+ module Datadog
8
+ module Profiling
9
+ module Transport
10
+ module IO
11
+ # IO transport for profiling
12
+ class Client < Datadog::Transport::IO::Client
13
+ include Transport::Client
14
+
15
+ def send_profiling_flush(flush)
16
+ # Build a request
17
+ request = Profiling::Transport::Request.new(flush)
18
+ send_request(request)
19
+ end
20
+
21
+ def build_response(_request, _data, result)
22
+ Profiling::Transport::IO::Response.new(result)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ # typed: strict
2
+ require 'ddtrace/transport/io/response'
3
+ require 'ddtrace/profiling/transport/response'
4
+
5
+ module Datadog
6
+ module Profiling
7
+ module Transport
8
+ # IO transport behavior for profiling
9
+ module IO
10
+ # Response from IO transport for profiling
11
+ class Response < Datadog::Transport::IO::Response
12
+ include Profiling::Transport::Response
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end