ddtrace 0.45.0 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (586) hide show
  1. checksums.yaml +4 -4
  2. data/.editorconfig +22 -0
  3. data/.gitignore +7 -1
  4. data/CHANGELOG.md +406 -1
  5. data/CONTRIBUTING.md +1 -5
  6. data/LICENSE-3rdparty.csv +2 -0
  7. data/bin/ddtracerb +15 -0
  8. data/ddtrace.gemspec +19 -38
  9. data/docs/DevelopmentGuide.md +43 -0
  10. data/docs/GettingStarted.md +164 -76
  11. data/docs/ProfilingDevelopment.md +107 -0
  12. data/ext/ddtrace_profiling_native_extension/extconf.rb +28 -0
  13. data/ext/ddtrace_profiling_native_extension/profiling.c +17 -0
  14. data/lib/datadog/ci/configuration/components.rb +31 -0
  15. data/lib/datadog/ci/configuration/settings.rb +37 -0
  16. data/lib/datadog/ci/context_flush.rb +29 -0
  17. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +31 -0
  18. data/lib/datadog/ci/contrib/cucumber/ext.rb +20 -0
  19. data/lib/datadog/ci/contrib/cucumber/formatter.rb +98 -0
  20. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +27 -0
  21. data/lib/datadog/ci/contrib/cucumber/integration.rb +48 -0
  22. data/lib/datadog/ci/contrib/cucumber/patcher.rb +26 -0
  23. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +31 -0
  24. data/lib/datadog/ci/contrib/rspec/example.rb +74 -0
  25. data/lib/datadog/ci/contrib/rspec/ext.rb +19 -0
  26. data/lib/datadog/ci/contrib/rspec/integration.rb +49 -0
  27. data/lib/datadog/ci/contrib/rspec/patcher.rb +26 -0
  28. data/lib/datadog/ci/ext/app_types.rb +10 -0
  29. data/lib/datadog/ci/ext/environment.rb +443 -0
  30. data/lib/datadog/ci/ext/settings.rb +11 -0
  31. data/lib/datadog/ci/ext/test.rb +35 -0
  32. data/lib/datadog/ci/extensions.rb +18 -0
  33. data/lib/datadog/ci/test.rb +77 -0
  34. data/lib/datadog/ci.rb +17 -0
  35. data/lib/datadog/contrib.rb +69 -0
  36. data/lib/datadog/core/environment/cgroup.rb +52 -0
  37. data/lib/datadog/core/environment/class_count.rb +20 -0
  38. data/lib/datadog/core/environment/container.rb +91 -0
  39. data/lib/datadog/core/environment/ext.rb +27 -0
  40. data/lib/datadog/core/environment/gc.rb +19 -0
  41. data/lib/datadog/core/environment/identity.rb +51 -0
  42. data/lib/datadog/core/environment/socket.rb +17 -0
  43. data/lib/datadog/core/environment/thread_count.rb +19 -0
  44. data/lib/datadog/core/environment/variable_helpers.rb +42 -0
  45. data/lib/ddtrace/analytics.rb +3 -0
  46. data/lib/ddtrace/auto_instrument.rb +2 -0
  47. data/lib/ddtrace/auto_instrument_base.rb +1 -0
  48. data/lib/ddtrace/buffer.rb +10 -8
  49. data/lib/ddtrace/chunker.rb +1 -0
  50. data/lib/ddtrace/configuration/agent_settings_resolver.rb +231 -0
  51. data/lib/ddtrace/configuration/base.rb +9 -11
  52. data/lib/ddtrace/configuration/components.rb +167 -26
  53. data/lib/ddtrace/configuration/dependency_resolver.rb +1 -0
  54. data/lib/ddtrace/configuration/option.rb +1 -0
  55. data/lib/ddtrace/configuration/option_definition.rb +2 -3
  56. data/lib/ddtrace/configuration/option_definition_set.rb +1 -0
  57. data/lib/ddtrace/configuration/option_set.rb +1 -0
  58. data/lib/ddtrace/configuration/options.rb +7 -9
  59. data/lib/ddtrace/configuration/pin_setup.rb +1 -0
  60. data/lib/ddtrace/configuration/settings.rb +128 -10
  61. data/lib/ddtrace/configuration.rb +118 -26
  62. data/lib/ddtrace/context.rb +23 -20
  63. data/lib/ddtrace/context_flush.rb +15 -2
  64. data/lib/ddtrace/context_provider.rb +1 -1
  65. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +1 -0
  66. data/lib/ddtrace/contrib/action_cable/event.rb +6 -4
  67. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +1 -0
  68. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +1 -0
  69. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +1 -0
  70. data/lib/ddtrace/contrib/action_cable/events.rb +1 -0
  71. data/lib/ddtrace/contrib/action_cable/ext.rb +1 -0
  72. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +1 -0
  73. data/lib/ddtrace/contrib/action_cable/integration.rb +1 -0
  74. data/lib/ddtrace/contrib/action_cable/patcher.rb +1 -0
  75. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +22 -13
  76. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +2 -1
  77. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +1 -0
  78. data/lib/ddtrace/contrib/action_pack/ext.rb +1 -0
  79. data/lib/ddtrace/contrib/action_pack/integration.rb +1 -0
  80. data/lib/ddtrace/contrib/action_pack/patcher.rb +1 -0
  81. data/lib/ddtrace/contrib/action_pack/utils.rb +2 -1
  82. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +1 -0
  83. data/lib/ddtrace/contrib/action_view/event.rb +4 -3
  84. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
  85. data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
  86. data/lib/ddtrace/contrib/action_view/events.rb +1 -0
  87. data/lib/ddtrace/contrib/action_view/ext.rb +1 -0
  88. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +1 -0
  89. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +1 -0
  90. data/lib/ddtrace/contrib/action_view/integration.rb +1 -0
  91. data/lib/ddtrace/contrib/action_view/patcher.rb +5 -4
  92. data/lib/ddtrace/contrib/action_view/utils.rb +2 -1
  93. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +1 -0
  94. data/lib/ddtrace/contrib/active_model_serializers/event.rb +3 -2
  95. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +1 -0
  96. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +1 -0
  97. data/lib/ddtrace/contrib/active_model_serializers/events.rb +1 -0
  98. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +1 -0
  99. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +1 -0
  100. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +1 -0
  101. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +31 -0
  102. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +108 -18
  103. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +1 -0
  104. data/lib/ddtrace/contrib/active_record/event.rb +3 -2
  105. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +1 -0
  106. data/lib/ddtrace/contrib/active_record/events/sql.rb +1 -0
  107. data/lib/ddtrace/contrib/active_record/events.rb +1 -0
  108. data/lib/ddtrace/contrib/active_record/ext.rb +1 -0
  109. data/lib/ddtrace/contrib/active_record/integration.rb +1 -0
  110. data/lib/ddtrace/contrib/active_record/patcher.rb +1 -0
  111. data/lib/ddtrace/contrib/active_record/utils.rb +5 -3
  112. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +1 -0
  113. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +8 -7
  114. data/lib/ddtrace/contrib/active_support/cache/redis.rb +2 -5
  115. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +1 -0
  116. data/lib/ddtrace/contrib/active_support/ext.rb +1 -0
  117. data/lib/ddtrace/contrib/active_support/integration.rb +1 -0
  118. data/lib/ddtrace/contrib/active_support/notifications/event.rb +5 -3
  119. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -1
  120. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +10 -5
  121. data/lib/ddtrace/contrib/active_support/patcher.rb +1 -0
  122. data/lib/ddtrace/contrib/analytics.rb +1 -0
  123. data/lib/ddtrace/contrib/auto_instrument.rb +4 -3
  124. data/lib/ddtrace/contrib/aws/configuration/settings.rb +1 -0
  125. data/lib/ddtrace/contrib/aws/ext.rb +1 -0
  126. data/lib/ddtrace/contrib/aws/instrumentation.rb +30 -0
  127. data/lib/ddtrace/contrib/aws/integration.rb +1 -0
  128. data/lib/ddtrace/contrib/aws/parsed_context.rb +1 -0
  129. data/lib/ddtrace/contrib/aws/patcher.rb +6 -0
  130. data/lib/ddtrace/contrib/aws/services.rb +3 -0
  131. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +1 -0
  132. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -0
  133. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  134. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +1 -0
  135. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +1 -0
  136. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +3 -1
  137. data/lib/ddtrace/contrib/configurable.rb +65 -40
  138. data/lib/ddtrace/contrib/configuration/resolver.rb +71 -5
  139. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +20 -20
  140. data/lib/ddtrace/contrib/configuration/settings.rb +8 -6
  141. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +1 -0
  142. data/lib/ddtrace/contrib/dalli/ext.rb +1 -0
  143. data/lib/ddtrace/contrib/dalli/instrumentation.rb +2 -1
  144. data/lib/ddtrace/contrib/dalli/integration.rb +1 -0
  145. data/lib/ddtrace/contrib/dalli/patcher.rb +2 -39
  146. data/lib/ddtrace/contrib/dalli/quantize.rb +1 -0
  147. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +1 -0
  148. data/lib/ddtrace/contrib/delayed_job/ext.rb +1 -0
  149. data/lib/ddtrace/contrib/delayed_job/integration.rb +1 -0
  150. data/lib/ddtrace/contrib/delayed_job/patcher.rb +1 -0
  151. data/lib/ddtrace/contrib/delayed_job/plugin.rb +1 -1
  152. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +1 -0
  153. data/lib/ddtrace/contrib/elasticsearch/ext.rb +1 -0
  154. data/lib/ddtrace/contrib/elasticsearch/integration.rb +1 -0
  155. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +2 -0
  156. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +6 -2
  157. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +1 -0
  158. data/lib/ddtrace/contrib/ethon/easy_patch.rb +7 -6
  159. data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
  160. data/lib/ddtrace/contrib/ethon/integration.rb +1 -0
  161. data/lib/ddtrace/contrib/ethon/multi_patch.rb +2 -1
  162. data/lib/ddtrace/contrib/ethon/patcher.rb +4 -2
  163. data/lib/ddtrace/contrib/excon/configuration/settings.rb +1 -0
  164. data/lib/ddtrace/contrib/excon/ext.rb +1 -0
  165. data/lib/ddtrace/contrib/excon/integration.rb +1 -0
  166. data/lib/ddtrace/contrib/excon/middleware.rb +3 -6
  167. data/lib/ddtrace/contrib/excon/patcher.rb +1 -0
  168. data/lib/ddtrace/contrib/extensions.rb +64 -14
  169. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +1 -0
  170. data/lib/ddtrace/contrib/faraday/connection.rb +1 -0
  171. data/lib/ddtrace/contrib/faraday/ext.rb +1 -0
  172. data/lib/ddtrace/contrib/faraday/integration.rb +1 -0
  173. data/lib/ddtrace/contrib/faraday/middleware.rb +2 -3
  174. data/lib/ddtrace/contrib/faraday/patcher.rb +3 -38
  175. data/lib/ddtrace/contrib/faraday/rack_builder.rb +1 -0
  176. data/lib/ddtrace/contrib/grape/configuration/settings.rb +1 -0
  177. data/lib/ddtrace/contrib/grape/endpoint.rb +34 -31
  178. data/lib/ddtrace/contrib/grape/ext.rb +1 -0
  179. data/lib/ddtrace/contrib/grape/instrumentation.rb +4 -3
  180. data/lib/ddtrace/contrib/grape/integration.rb +1 -0
  181. data/lib/ddtrace/contrib/grape/patcher.rb +2 -43
  182. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -0
  183. data/lib/ddtrace/contrib/graphql/ext.rb +1 -0
  184. data/lib/ddtrace/contrib/graphql/integration.rb +1 -0
  185. data/lib/ddtrace/contrib/graphql/patcher.rb +1 -0
  186. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +2 -0
  187. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -0
  188. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -4
  189. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +13 -8
  190. data/lib/ddtrace/contrib/grpc/ext.rb +1 -0
  191. data/lib/ddtrace/contrib/grpc/integration.rb +1 -0
  192. data/lib/ddtrace/contrib/grpc/intercept_with_datadog.rb +1 -0
  193. data/lib/ddtrace/contrib/grpc/patcher.rb +3 -37
  194. data/lib/ddtrace/contrib/http/circuit_breaker.rb +2 -3
  195. data/lib/ddtrace/contrib/http/configuration/settings.rb +1 -0
  196. data/lib/ddtrace/contrib/http/ext.rb +1 -0
  197. data/lib/ddtrace/contrib/http/instrumentation.rb +7 -6
  198. data/lib/ddtrace/contrib/http/integration.rb +1 -0
  199. data/lib/ddtrace/contrib/http/patcher.rb +2 -1
  200. data/lib/ddtrace/contrib/http_annotation_helper.rb +1 -0
  201. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +1 -0
  202. data/lib/ddtrace/contrib/httpclient/ext.rb +1 -0
  203. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +16 -20
  204. data/lib/ddtrace/contrib/httpclient/integration.rb +1 -0
  205. data/lib/ddtrace/contrib/httpclient/patcher.rb +8 -4
  206. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +1 -0
  207. data/lib/ddtrace/contrib/httprb/ext.rb +1 -0
  208. data/lib/ddtrace/contrib/httprb/instrumentation.rb +16 -21
  209. data/lib/ddtrace/contrib/httprb/integration.rb +1 -0
  210. data/lib/ddtrace/contrib/httprb/patcher.rb +8 -4
  211. data/lib/ddtrace/contrib/integration.rb +4 -3
  212. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +1 -0
  213. data/lib/ddtrace/contrib/kafka/consumer_event.rb +1 -0
  214. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +1 -0
  215. data/lib/ddtrace/contrib/kafka/event.rb +3 -2
  216. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +1 -0
  217. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +1 -0
  218. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +1 -0
  219. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +1 -0
  220. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +1 -0
  221. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +1 -0
  222. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +1 -0
  223. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  224. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  225. data/lib/ddtrace/contrib/kafka/events.rb +1 -0
  226. data/lib/ddtrace/contrib/kafka/ext.rb +1 -0
  227. data/lib/ddtrace/contrib/kafka/integration.rb +1 -0
  228. data/lib/ddtrace/contrib/kafka/patcher.rb +1 -0
  229. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +19 -0
  230. data/lib/ddtrace/contrib/lograge/ext.rb +11 -0
  231. data/lib/ddtrace/contrib/lograge/instrumentation.rb +39 -0
  232. data/lib/ddtrace/contrib/lograge/integration.rb +46 -0
  233. data/lib/ddtrace/contrib/{cucumber → lograge}/patcher.rb +7 -4
  234. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +1 -0
  235. data/lib/ddtrace/contrib/mongodb/ext.rb +1 -0
  236. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +5 -2
  237. data/lib/ddtrace/contrib/mongodb/integration.rb +1 -0
  238. data/lib/ddtrace/contrib/mongodb/parsers.rb +1 -0
  239. data/lib/ddtrace/contrib/mongodb/patcher.rb +3 -2
  240. data/lib/ddtrace/contrib/mongodb/subscribers.rb +3 -3
  241. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +1 -0
  242. data/lib/ddtrace/contrib/mysql2/ext.rb +1 -0
  243. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +2 -1
  244. data/lib/ddtrace/contrib/mysql2/integration.rb +1 -0
  245. data/lib/ddtrace/contrib/mysql2/patcher.rb +2 -1
  246. data/lib/ddtrace/contrib/patchable.rb +3 -2
  247. data/lib/ddtrace/contrib/patcher.rb +12 -8
  248. data/lib/ddtrace/contrib/presto/configuration/settings.rb +1 -0
  249. data/lib/ddtrace/contrib/presto/ext.rb +1 -0
  250. data/lib/ddtrace/contrib/presto/instrumentation.rb +2 -1
  251. data/lib/ddtrace/contrib/presto/integration.rb +1 -0
  252. data/lib/ddtrace/contrib/presto/patcher.rb +7 -3
  253. data/lib/ddtrace/contrib/qless/configuration/settings.rb +1 -0
  254. data/lib/ddtrace/contrib/qless/ext.rb +1 -0
  255. data/lib/ddtrace/contrib/qless/integration.rb +1 -0
  256. data/lib/ddtrace/contrib/qless/patcher.rb +5 -5
  257. data/lib/ddtrace/contrib/qless/qless_job.rb +2 -0
  258. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +2 -0
  259. data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
  260. data/lib/ddtrace/contrib/que/ext.rb +20 -19
  261. data/lib/ddtrace/contrib/que/integration.rb +1 -0
  262. data/lib/ddtrace/contrib/que/patcher.rb +1 -0
  263. data/lib/ddtrace/contrib/que/tracer.rb +2 -1
  264. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +1 -0
  265. data/lib/ddtrace/contrib/racecar/event.rb +4 -2
  266. data/lib/ddtrace/contrib/racecar/events/batch.rb +1 -0
  267. data/lib/ddtrace/contrib/racecar/events/consume.rb +1 -0
  268. data/lib/ddtrace/contrib/racecar/events/message.rb +1 -0
  269. data/lib/ddtrace/contrib/racecar/events.rb +1 -0
  270. data/lib/ddtrace/contrib/racecar/ext.rb +1 -0
  271. data/lib/ddtrace/contrib/racecar/integration.rb +1 -0
  272. data/lib/ddtrace/contrib/racecar/patcher.rb +1 -0
  273. data/lib/ddtrace/contrib/rack/configuration/settings.rb +4 -3
  274. data/lib/ddtrace/contrib/rack/ext.rb +1 -0
  275. data/lib/ddtrace/contrib/rack/integration.rb +1 -0
  276. data/lib/ddtrace/contrib/rack/middlewares.rb +7 -11
  277. data/lib/ddtrace/contrib/rack/patcher.rb +2 -3
  278. data/lib/ddtrace/contrib/rack/request_queue.rb +1 -0
  279. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +1 -0
  280. data/lib/ddtrace/contrib/rails/configuration/settings.rb +1 -0
  281. data/lib/ddtrace/contrib/rails/ext.rb +1 -0
  282. data/lib/ddtrace/contrib/rails/framework.rb +26 -1
  283. data/lib/ddtrace/contrib/rails/integration.rb +1 -0
  284. data/lib/ddtrace/contrib/rails/log_injection.rb +1 -40
  285. data/lib/ddtrace/contrib/rails/middlewares.rb +1 -0
  286. data/lib/ddtrace/contrib/rails/patcher.rb +18 -11
  287. data/lib/ddtrace/contrib/rails/railtie.rb +1 -0
  288. data/lib/ddtrace/contrib/rails/utils.rb +1 -0
  289. data/lib/ddtrace/contrib/rake/configuration/settings.rb +1 -0
  290. data/lib/ddtrace/contrib/rake/ext.rb +1 -0
  291. data/lib/ddtrace/contrib/rake/instrumentation.rb +6 -3
  292. data/lib/ddtrace/contrib/rake/integration.rb +1 -0
  293. data/lib/ddtrace/contrib/rake/patcher.rb +2 -1
  294. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +12 -4
  295. data/lib/ddtrace/contrib/redis/configuration/settings.rb +1 -0
  296. data/lib/ddtrace/contrib/redis/ext.rb +1 -0
  297. data/lib/ddtrace/contrib/redis/integration.rb +1 -0
  298. data/lib/ddtrace/contrib/redis/patcher.rb +1 -0
  299. data/lib/ddtrace/contrib/redis/quantize.rb +2 -0
  300. data/lib/ddtrace/contrib/redis/tags.rb +1 -0
  301. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  302. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +7 -7
  303. data/lib/ddtrace/contrib/registerable.rb +5 -4
  304. data/lib/ddtrace/contrib/registry.rb +3 -2
  305. data/lib/ddtrace/contrib/resque/configuration/settings.rb +18 -1
  306. data/lib/ddtrace/contrib/resque/ext.rb +1 -0
  307. data/lib/ddtrace/contrib/resque/integration.rb +2 -1
  308. data/lib/ddtrace/contrib/resque/patcher.rb +5 -4
  309. data/lib/ddtrace/contrib/resque/resque_job.rb +25 -1
  310. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -0
  311. data/lib/ddtrace/contrib/rest_client/ext.rb +1 -0
  312. data/lib/ddtrace/contrib/rest_client/integration.rb +1 -0
  313. data/lib/ddtrace/contrib/rest_client/patcher.rb +3 -1
  314. data/lib/ddtrace/contrib/rest_client/request_patch.rb +3 -4
  315. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +19 -0
  316. data/lib/ddtrace/contrib/semantic_logger/ext.rb +11 -0
  317. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +43 -0
  318. data/lib/ddtrace/contrib/semantic_logger/integration.rb +48 -0
  319. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +26 -0
  320. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +1 -0
  321. data/lib/ddtrace/contrib/sequel/database.rb +2 -1
  322. data/lib/ddtrace/contrib/sequel/dataset.rb +2 -1
  323. data/lib/ddtrace/contrib/sequel/ext.rb +1 -0
  324. data/lib/ddtrace/contrib/sequel/integration.rb +1 -0
  325. data/lib/ddtrace/contrib/sequel/patcher.rb +3 -2
  326. data/lib/ddtrace/contrib/sequel/utils.rb +6 -6
  327. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +2 -0
  328. data/lib/ddtrace/contrib/shoryuken/ext.rb +1 -0
  329. data/lib/ddtrace/contrib/shoryuken/integration.rb +1 -0
  330. data/lib/ddtrace/contrib/shoryuken/patcher.rb +1 -0
  331. data/lib/ddtrace/contrib/shoryuken/tracer.rb +8 -4
  332. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +1 -0
  333. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  334. data/lib/ddtrace/contrib/sidekiq/ext.rb +1 -0
  335. data/lib/ddtrace/contrib/sidekiq/integration.rb +1 -0
  336. data/lib/ddtrace/contrib/sidekiq/patcher.rb +1 -0
  337. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +3 -7
  338. data/lib/ddtrace/contrib/sidekiq/tracing.rb +1 -1
  339. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -0
  340. data/lib/ddtrace/contrib/sinatra/env.rb +2 -3
  341. data/lib/ddtrace/contrib/sinatra/ext.rb +1 -0
  342. data/lib/ddtrace/contrib/sinatra/headers.rb +2 -3
  343. data/lib/ddtrace/contrib/sinatra/integration.rb +1 -0
  344. data/lib/ddtrace/contrib/sinatra/patcher.rb +3 -1
  345. data/lib/ddtrace/contrib/sinatra/tracer.rb +14 -6
  346. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +11 -4
  347. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
  348. data/lib/ddtrace/contrib/sneakers/ext.rb +12 -11
  349. data/lib/ddtrace/contrib/sneakers/integration.rb +1 -0
  350. data/lib/ddtrace/contrib/sneakers/patcher.rb +1 -0
  351. data/lib/ddtrace/contrib/sneakers/tracer.rb +3 -4
  352. data/lib/ddtrace/contrib/status_code_matcher.rb +6 -3
  353. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +1 -0
  354. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +5 -6
  355. data/lib/ddtrace/contrib/sucker_punch/ext.rb +1 -0
  356. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +5 -0
  357. data/lib/ddtrace/contrib/sucker_punch/integration.rb +1 -0
  358. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +2 -0
  359. data/lib/ddtrace/correlation.rb +3 -1
  360. data/lib/ddtrace/diagnostics/environment_logger.rb +9 -7
  361. data/lib/ddtrace/diagnostics/health.rb +1 -0
  362. data/lib/ddtrace/distributed_tracing/headers/b3.rb +1 -0
  363. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +1 -0
  364. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +1 -0
  365. data/lib/ddtrace/distributed_tracing/headers/headers.rb +2 -0
  366. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +2 -3
  367. data/lib/ddtrace/encoding.rb +3 -0
  368. data/lib/ddtrace/error.rb +78 -8
  369. data/lib/ddtrace/event.rb +1 -0
  370. data/lib/ddtrace/ext/analytics.rb +1 -0
  371. data/lib/ddtrace/ext/app_types.rb +1 -1
  372. data/lib/ddtrace/ext/correlation.rb +1 -0
  373. data/lib/ddtrace/ext/diagnostics.rb +1 -0
  374. data/lib/ddtrace/ext/distributed.rb +2 -1
  375. data/lib/ddtrace/ext/environment.rb +8 -0
  376. data/lib/ddtrace/ext/errors.rb +1 -0
  377. data/lib/ddtrace/ext/forced_tracing.rb +1 -0
  378. data/lib/ddtrace/ext/git.rb +10 -1
  379. data/lib/ddtrace/ext/http.rb +2 -1
  380. data/lib/ddtrace/ext/integration.rb +1 -0
  381. data/lib/ddtrace/ext/manual_tracing.rb +1 -0
  382. data/lib/ddtrace/ext/metrics.rb +1 -0
  383. data/lib/ddtrace/ext/net.rb +1 -0
  384. data/lib/ddtrace/ext/priority.rb +1 -0
  385. data/lib/ddtrace/ext/profiling.rb +56 -0
  386. data/lib/ddtrace/ext/runtime.rb +1 -7
  387. data/lib/ddtrace/ext/sampling.rb +1 -0
  388. data/lib/ddtrace/ext/sql.rb +1 -0
  389. data/lib/ddtrace/ext/test.rb +3 -18
  390. data/lib/ddtrace/ext/transport.rb +3 -0
  391. data/lib/ddtrace/forced_tracing.rb +3 -0
  392. data/lib/ddtrace/logger.rb +2 -1
  393. data/lib/ddtrace/metrics.rb +84 -24
  394. data/lib/ddtrace/opentelemetry/extensions.rb +2 -1
  395. data/lib/ddtrace/opentelemetry/span.rb +1 -0
  396. data/lib/ddtrace/opentracer/binary_propagator.rb +1 -0
  397. data/lib/ddtrace/opentracer/carrier.rb +1 -0
  398. data/lib/ddtrace/opentracer/distributed_headers.rb +4 -0
  399. data/lib/ddtrace/opentracer/global_tracer.rb +1 -0
  400. data/lib/ddtrace/opentracer/propagator.rb +1 -0
  401. data/lib/ddtrace/opentracer/rack_propagator.rb +1 -0
  402. data/lib/ddtrace/opentracer/scope.rb +1 -0
  403. data/lib/ddtrace/opentracer/scope_manager.rb +1 -0
  404. data/lib/ddtrace/opentracer/span.rb +3 -6
  405. data/lib/ddtrace/opentracer/span_context.rb +1 -0
  406. data/lib/ddtrace/opentracer/span_context_factory.rb +1 -0
  407. data/lib/ddtrace/opentracer/text_map_propagator.rb +1 -0
  408. data/lib/ddtrace/opentracer/thread_local_scope.rb +2 -0
  409. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +1 -0
  410. data/lib/ddtrace/opentracer/tracer.rb +1 -0
  411. data/lib/ddtrace/opentracer.rb +21 -39
  412. data/lib/ddtrace/patcher.rb +28 -6
  413. data/lib/ddtrace/pin.rb +9 -61
  414. data/lib/ddtrace/pipeline/span_filter.rb +2 -1
  415. data/lib/ddtrace/pipeline/span_processor.rb +1 -0
  416. data/lib/ddtrace/pipeline.rb +1 -0
  417. data/lib/ddtrace/profiling/backtrace_location.rb +33 -0
  418. data/lib/ddtrace/profiling/buffer.rb +42 -0
  419. data/lib/ddtrace/profiling/collectors/stack.rb +257 -0
  420. data/lib/ddtrace/profiling/encoding/profile.rb +38 -0
  421. data/lib/ddtrace/profiling/event.rb +14 -0
  422. data/lib/ddtrace/profiling/events/stack.rb +81 -0
  423. data/lib/ddtrace/profiling/exporter.rb +24 -0
  424. data/lib/ddtrace/profiling/ext/cpu.rb +67 -0
  425. data/lib/ddtrace/profiling/ext/cthread.rb +156 -0
  426. data/lib/ddtrace/profiling/ext/forking.rb +98 -0
  427. data/lib/ddtrace/profiling/flush.rb +44 -0
  428. data/lib/ddtrace/profiling/native_extension.rb +18 -0
  429. data/lib/ddtrace/profiling/pprof/builder.rb +120 -0
  430. data/lib/ddtrace/profiling/pprof/converter.rb +90 -0
  431. data/lib/ddtrace/profiling/pprof/message_set.rb +15 -0
  432. data/lib/ddtrace/profiling/pprof/payload.rb +19 -0
  433. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  434. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +82 -0
  435. data/lib/ddtrace/profiling/pprof/stack_sample.rb +117 -0
  436. data/lib/ddtrace/profiling/pprof/string_table.rb +11 -0
  437. data/lib/ddtrace/profiling/pprof/template.rb +119 -0
  438. data/lib/ddtrace/profiling/preload.rb +4 -0
  439. data/lib/ddtrace/profiling/profiler.rb +31 -0
  440. data/lib/ddtrace/profiling/recorder.rb +96 -0
  441. data/lib/ddtrace/profiling/scheduler.rb +134 -0
  442. data/lib/ddtrace/profiling/tasks/setup.rb +82 -0
  443. data/lib/ddtrace/profiling/trace_identifiers/ddtrace.rb +41 -0
  444. data/lib/ddtrace/profiling/trace_identifiers/helper.rb +46 -0
  445. data/lib/ddtrace/profiling/transport/client.rb +15 -0
  446. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +101 -0
  447. data/lib/ddtrace/profiling/transport/http/api/instance.rb +37 -0
  448. data/lib/ddtrace/profiling/transport/http/api/spec.rb +41 -0
  449. data/lib/ddtrace/profiling/transport/http/api.rb +44 -0
  450. data/lib/ddtrace/profiling/transport/http/builder.rb +29 -0
  451. data/lib/ddtrace/profiling/transport/http/client.rb +34 -0
  452. data/lib/ddtrace/profiling/transport/http/response.rb +22 -0
  453. data/lib/ddtrace/profiling/transport/http.rb +120 -0
  454. data/lib/ddtrace/profiling/transport/io/client.rb +28 -0
  455. data/lib/ddtrace/profiling/transport/io/response.rb +17 -0
  456. data/lib/ddtrace/profiling/transport/io.rb +31 -0
  457. data/lib/ddtrace/profiling/transport/parcel.rb +18 -0
  458. data/lib/ddtrace/profiling/transport/request.rb +16 -0
  459. data/lib/ddtrace/profiling/transport/response.rb +9 -0
  460. data/lib/ddtrace/profiling.rb +151 -0
  461. data/lib/ddtrace/propagation/grpc_propagator.rb +2 -0
  462. data/lib/ddtrace/propagation/http_propagator.rb +3 -2
  463. data/lib/ddtrace/quantization/hash.rb +1 -0
  464. data/lib/ddtrace/quantization/http.rb +4 -0
  465. data/lib/ddtrace/runtime/metrics.rb +21 -14
  466. data/lib/ddtrace/sampler.rb +2 -1
  467. data/lib/ddtrace/sampling/matcher.rb +1 -0
  468. data/lib/ddtrace/sampling/rate_limiter.rb +1 -0
  469. data/lib/ddtrace/sampling/rule.rb +2 -1
  470. data/lib/ddtrace/sampling/rule_sampler.rb +6 -10
  471. data/lib/ddtrace/sampling.rb +1 -0
  472. data/lib/ddtrace/span.rb +44 -19
  473. data/lib/ddtrace/sync_writer.rb +17 -15
  474. data/lib/ddtrace/tasks/exec.rb +47 -0
  475. data/lib/ddtrace/tasks/help.rb +15 -0
  476. data/lib/ddtrace/tracer.rb +48 -50
  477. data/lib/ddtrace/transport/http/adapters/net.rb +28 -8
  478. data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
  479. data/lib/ddtrace/transport/http/adapters/test.rb +1 -0
  480. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +3 -4
  481. data/lib/ddtrace/transport/http/api/endpoint.rb +1 -0
  482. data/lib/ddtrace/transport/http/api/fallbacks.rb +1 -0
  483. data/lib/ddtrace/transport/http/api/instance.rb +1 -0
  484. data/lib/ddtrace/transport/http/api/map.rb +1 -0
  485. data/lib/ddtrace/transport/http/api/spec.rb +1 -0
  486. data/lib/ddtrace/transport/http/api.rb +1 -0
  487. data/lib/ddtrace/transport/http/builder.rb +8 -1
  488. data/lib/ddtrace/transport/http/client.rb +3 -1
  489. data/lib/ddtrace/transport/http/env.rb +9 -0
  490. data/lib/ddtrace/transport/http/response.rb +1 -0
  491. data/lib/ddtrace/transport/http/statistics.rb +3 -2
  492. data/lib/ddtrace/transport/http/traces.rb +6 -6
  493. data/lib/ddtrace/transport/http.rb +51 -38
  494. data/lib/ddtrace/transport/io/client.rb +17 -9
  495. data/lib/ddtrace/transport/io/response.rb +2 -3
  496. data/lib/ddtrace/transport/io/traces.rb +10 -1
  497. data/lib/ddtrace/transport/io.rb +2 -1
  498. data/lib/ddtrace/transport/parcel.rb +7 -0
  499. data/lib/ddtrace/transport/request.rb +1 -0
  500. data/lib/ddtrace/transport/response.rb +1 -0
  501. data/lib/ddtrace/transport/statistics.rb +1 -0
  502. data/lib/ddtrace/transport/traces.rb +21 -3
  503. data/lib/ddtrace/utils/compression.rb +28 -0
  504. data/lib/ddtrace/utils/database.rb +1 -0
  505. data/lib/ddtrace/utils/forking.rb +2 -1
  506. data/lib/ddtrace/utils/object_set.rb +40 -0
  507. data/lib/ddtrace/utils/only_once.rb +41 -0
  508. data/lib/ddtrace/utils/sequence.rb +18 -0
  509. data/lib/ddtrace/utils/string_table.rb +46 -0
  510. data/lib/ddtrace/utils/time.rb +34 -2
  511. data/lib/ddtrace/utils.rb +14 -2
  512. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  513. data/lib/ddtrace/vendor/active_record/connection_specification.rb +1 -0
  514. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  515. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +117 -0
  516. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +58 -0
  517. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +136 -0
  518. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +10 -0
  519. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +9 -0
  520. data/lib/ddtrace/vendor/multipart-post/multipart.rb +13 -0
  521. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +33 -0
  522. data/lib/ddtrace/version.rb +15 -2
  523. data/lib/ddtrace/worker.rb +1 -0
  524. data/lib/ddtrace/workers/async.rb +15 -5
  525. data/lib/ddtrace/workers/loop.rb +32 -5
  526. data/lib/ddtrace/workers/polling.rb +13 -5
  527. data/lib/ddtrace/workers/queue.rb +3 -1
  528. data/lib/ddtrace/workers/runtime_metrics.rb +15 -1
  529. data/lib/ddtrace/workers/trace_writer.rb +14 -16
  530. data/lib/ddtrace/workers.rb +8 -2
  531. data/lib/ddtrace/writer.rb +14 -7
  532. data/lib/ddtrace.rb +20 -56
  533. metadata +130 -446
  534. data/.circleci/config.yml +0 -566
  535. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
  536. data/.circleci/images/primary/Dockerfile-2.1.10 +0 -73
  537. data/.circleci/images/primary/Dockerfile-2.2.10 +0 -73
  538. data/.circleci/images/primary/Dockerfile-2.3.8 +0 -75
  539. data/.circleci/images/primary/Dockerfile-2.4.6 +0 -73
  540. data/.circleci/images/primary/Dockerfile-2.5.6 +0 -73
  541. data/.circleci/images/primary/Dockerfile-2.6.4 +0 -73
  542. data/.circleci/images/primary/Dockerfile-2.7.0 +0 -73
  543. data/.circleci/images/primary/Dockerfile-3.0.0 +0 -73
  544. data/.circleci/images/primary/Dockerfile-jruby-9.2 +0 -77
  545. data/.dockerignore +0 -1
  546. data/.env +0 -26
  547. data/.github/CODEOWNERS +0 -1
  548. data/.github/workflows/add-milestone-to-pull-requests.yml +0 -42
  549. data/.github/workflows/create-next-milestone.yml +0 -20
  550. data/.gitlab-ci.yml +0 -27
  551. data/.rspec +0 -1
  552. data/.rubocop.yml +0 -85
  553. data/.simplecov +0 -41
  554. data/Appraisals +0 -1350
  555. data/Gemfile +0 -9
  556. data/Rakefile +0 -993
  557. data/benchmarks/postgres_database.yml +0 -9
  558. data/benchmarks/sidekiq_test.rb +0 -154
  559. data/docker-compose.yml +0 -400
  560. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  561. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  562. data/lib/ddtrace/augmentation/shim.rb +0 -102
  563. data/lib/ddtrace/augmentation.rb +0 -13
  564. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -38
  565. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -19
  566. data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -104
  567. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
  568. data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
  569. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -38
  570. data/lib/ddtrace/contrib/rspec/example.rb +0 -61
  571. data/lib/ddtrace/contrib/rspec/example_group.rb +0 -61
  572. data/lib/ddtrace/contrib/rspec/ext.rb +0 -19
  573. data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
  574. data/lib/ddtrace/contrib/rspec/patcher.rb +0 -25
  575. data/lib/ddtrace/environment.rb +0 -41
  576. data/lib/ddtrace/ext/ci.rb +0 -297
  577. data/lib/ddtrace/monkey.rb +0 -58
  578. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  579. data/lib/ddtrace/runtime/class_count.rb +0 -17
  580. data/lib/ddtrace/runtime/container.rb +0 -73
  581. data/lib/ddtrace/runtime/gc.rb +0 -16
  582. data/lib/ddtrace/runtime/identity.rb +0 -40
  583. data/lib/ddtrace/runtime/object_space.rb +0 -19
  584. data/lib/ddtrace/runtime/socket.rb +0 -14
  585. data/lib/ddtrace/runtime/thread_count.rb +0 -16
  586. data/tasks/release_gem.rake +0 -28
@@ -0,0 +1,82 @@
1
+ # typed: false
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: lib/ddtrace/profiling/pprof/pprof.proto
4
+
5
+ require 'google/protobuf'
6
+
7
+ Google::Protobuf::DescriptorPool.generated_pool.build do
8
+ add_message "perftools.profiles.Profile" do
9
+ repeated :sample_type, :message, 1, "perftools.profiles.ValueType"
10
+ repeated :sample, :message, 2, "perftools.profiles.Sample"
11
+ repeated :mapping, :message, 3, "perftools.profiles.Mapping"
12
+ repeated :location, :message, 4, "perftools.profiles.Location"
13
+ repeated :function, :message, 5, "perftools.profiles.Function"
14
+ repeated :string_table, :string, 6
15
+ optional :drop_frames, :int64, 7
16
+ optional :keep_frames, :int64, 8
17
+ optional :time_nanos, :int64, 9
18
+ optional :duration_nanos, :int64, 10
19
+ optional :period_type, :message, 11, "perftools.profiles.ValueType"
20
+ optional :period, :int64, 12
21
+ repeated :comment, :int64, 13
22
+ optional :default_sample_type, :int64, 14
23
+ end
24
+ add_message "perftools.profiles.ValueType" do
25
+ optional :type, :int64, 1
26
+ optional :unit, :int64, 2
27
+ end
28
+ add_message "perftools.profiles.Sample" do
29
+ repeated :location_id, :uint64, 1
30
+ repeated :value, :int64, 2
31
+ repeated :label, :message, 3, "perftools.profiles.Label"
32
+ end
33
+ add_message "perftools.profiles.Label" do
34
+ optional :key, :int64, 1
35
+ optional :str, :int64, 2
36
+ optional :num, :int64, 3
37
+ optional :num_unit, :int64, 4
38
+ end
39
+ add_message "perftools.profiles.Mapping" do
40
+ optional :id, :uint64, 1
41
+ optional :memory_start, :uint64, 2
42
+ optional :memory_limit, :uint64, 3
43
+ optional :file_offset, :uint64, 4
44
+ optional :filename, :int64, 5
45
+ optional :build_id, :int64, 6
46
+ optional :has_functions, :bool, 7
47
+ optional :has_filenames, :bool, 8
48
+ optional :has_line_numbers, :bool, 9
49
+ optional :has_inline_frames, :bool, 10
50
+ end
51
+ add_message "perftools.profiles.Location" do
52
+ optional :id, :uint64, 1
53
+ optional :mapping_id, :uint64, 2
54
+ optional :address, :uint64, 3
55
+ repeated :line, :message, 4, "perftools.profiles.Line"
56
+ optional :is_folded, :bool, 5
57
+ end
58
+ add_message "perftools.profiles.Line" do
59
+ optional :function_id, :uint64, 1
60
+ optional :line, :int64, 2
61
+ end
62
+ add_message "perftools.profiles.Function" do
63
+ optional :id, :uint64, 1
64
+ optional :name, :int64, 2
65
+ optional :system_name, :int64, 3
66
+ optional :filename, :int64, 4
67
+ optional :start_line, :int64, 5
68
+ end
69
+ end
70
+
71
+ module Perftools
72
+ module Profiles
73
+ Profile = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Profile").msgclass
74
+ ValueType = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.ValueType").msgclass
75
+ Sample = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Sample").msgclass
76
+ Label = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Label").msgclass
77
+ Mapping = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Mapping").msgclass
78
+ Location = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Location").msgclass
79
+ Line = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Line").msgclass
80
+ Function = Google::Protobuf::DescriptorPool.generated_pool.lookup("perftools.profiles.Function").msgclass
81
+ end
82
+ end
@@ -0,0 +1,117 @@
1
+ # typed: true
2
+ require 'ddtrace/ext/profiling'
3
+ require 'ddtrace/profiling/events/stack'
4
+ require 'ddtrace/profiling/pprof/builder'
5
+ require 'ddtrace/profiling/pprof/converter'
6
+
7
+ module Datadog
8
+ module Profiling
9
+ module Pprof
10
+ # Builds a profile from a StackSample
11
+ #
12
+ # NOTE: This class may appear stateless but is in fact stateful; a new instance should be created for every
13
+ # encoded profile.
14
+ class StackSample < Converter
15
+ SAMPLE_TYPES = {
16
+ cpu_time_ns: [
17
+ Datadog::Ext::Profiling::Pprof::VALUE_TYPE_CPU,
18
+ Datadog::Ext::Profiling::Pprof::VALUE_UNIT_NANOSECONDS
19
+ ],
20
+ wall_time_ns: [
21
+ Datadog::Ext::Profiling::Pprof::VALUE_TYPE_WALL,
22
+ Datadog::Ext::Profiling::Pprof::VALUE_UNIT_NANOSECONDS
23
+ ]
24
+ }.freeze
25
+
26
+ def self.sample_value_types
27
+ SAMPLE_TYPES
28
+ end
29
+
30
+ def initialize(*_)
31
+ super
32
+
33
+ @processed_unique_stacks = 0
34
+ @processed_with_trace_ids = 0
35
+ end
36
+
37
+ def add_events!(stack_samples)
38
+ new_samples = build_samples(stack_samples)
39
+ builder.samples.concat(new_samples)
40
+ end
41
+
42
+ def stack_sample_group_key(stack_sample)
43
+ stack_sample.hash
44
+ end
45
+
46
+ def build_samples(stack_samples)
47
+ groups = group_events(stack_samples, &method(:stack_sample_group_key))
48
+ groups.collect do |_group_key, group|
49
+ @processed_unique_stacks += 1
50
+ build_sample(group.sample, group.values)
51
+ end
52
+ end
53
+
54
+ def build_sample(stack_sample, values)
55
+ locations = builder.build_locations(
56
+ stack_sample.frames,
57
+ stack_sample.total_frame_count
58
+ )
59
+
60
+ Perftools::Profiles::Sample.new(
61
+ location_id: locations.collect { |location| location['id'.freeze] },
62
+ value: values,
63
+ label: build_sample_labels(stack_sample)
64
+ )
65
+ end
66
+
67
+ def build_sample_values(stack_sample)
68
+ no_value = Datadog::Ext::Profiling::Pprof::SAMPLE_VALUE_NO_VALUE
69
+ values = super(stack_sample)
70
+ values[sample_value_index(:cpu_time_ns)] = stack_sample.cpu_time_interval_ns || no_value
71
+ values[sample_value_index(:wall_time_ns)] = stack_sample.wall_time_interval_ns || no_value
72
+ values
73
+ end
74
+
75
+ def build_sample_labels(stack_sample)
76
+ labels = [
77
+ Perftools::Profiles::Label.new(
78
+ key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_THREAD_ID),
79
+ str: builder.string_table.fetch(stack_sample.thread_id.to_s)
80
+ )
81
+ ]
82
+
83
+ trace_id = stack_sample.trace_id || 0
84
+ span_id = stack_sample.span_id || 0
85
+
86
+ if trace_id != 0 && span_id != 0
87
+ @processed_with_trace_ids += 1
88
+
89
+ labels << Perftools::Profiles::Label.new(
90
+ key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_TRACE_ID),
91
+ str: builder.string_table.fetch(trace_id.to_s)
92
+ )
93
+
94
+ labels << Perftools::Profiles::Label.new(
95
+ key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_SPAN_ID),
96
+ str: builder.string_table.fetch(span_id.to_s)
97
+ )
98
+
99
+ trace_resource = stack_sample.trace_resource_container && stack_sample.trace_resource_container.latest
100
+ if trace_resource && !trace_resource.empty?
101
+ labels << Perftools::Profiles::Label.new(
102
+ key: builder.string_table.fetch(Datadog::Ext::Profiling::Pprof::LABEL_KEY_TRACE_ENDPOINT),
103
+ str: builder.string_table.fetch(trace_resource)
104
+ )
105
+ end
106
+ end
107
+
108
+ labels
109
+ end
110
+
111
+ def debug_statistics
112
+ "unique stacks: #{@processed_unique_stacks}, of which had active traces: #{@processed_with_trace_ids}"
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,11 @@
1
+ # typed: strict
2
+ require 'ddtrace/utils/string_table'
3
+
4
+ module Datadog
5
+ module Profiling
6
+ module Pprof
7
+ # Tracks strings and returns IDs
8
+ class StringTable < Utils::StringTable; end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,119 @@
1
+ # typed: false
2
+ require 'ddtrace/profiling/pprof/payload'
3
+ require 'ddtrace/profiling/pprof/message_set'
4
+ require 'ddtrace/profiling/pprof/builder'
5
+
6
+ require 'ddtrace/profiling/events/stack'
7
+ require 'ddtrace/profiling/pprof/stack_sample'
8
+
9
+ module Datadog
10
+ module Profiling
11
+ module Pprof
12
+ # Converts a collection of profiling events into a Perftools::Profiles::Profile
13
+ class Template
14
+ DEFAULT_MAPPINGS = {
15
+ Events::StackSample => Pprof::StackSample
16
+ }.freeze
17
+
18
+ attr_reader \
19
+ :builder,
20
+ :converters,
21
+ :sample_type_mappings
22
+
23
+ def self.for_event_classes(event_classes)
24
+ # Build a map of event class --> converter class
25
+ mappings = event_classes.each_with_object({}) do |event_class, m|
26
+ converter_class = DEFAULT_MAPPINGS[event_class]
27
+ raise NoProfilingEventConversionError, event_class unless converter_class
28
+
29
+ m[event_class] = converter_class
30
+ end
31
+
32
+ new(mappings)
33
+ end
34
+
35
+ def initialize(mappings)
36
+ @builder = Builder.new
37
+ @converters = Hash.new { |_h, event_class| raise NoProfilingEventConversionError, event_class }
38
+ @sample_type_mappings = Hash.new { |_h, type| raise UnknownSampleTypeMappingError, type }
39
+
40
+ # Add default mapping
41
+ builder.mappings.fetch($PROGRAM_NAME, &builder.method(:build_mapping))
42
+
43
+ # Combine all sample types from each converter class
44
+ types = mappings.values.each_with_object({}) do |converter_class, t|
45
+ t.merge!(converter_class.sample_value_types)
46
+ end
47
+
48
+ # Build the sample types into sample type objects
49
+ types.each do |type_name, type_args|
50
+ index = nil
51
+
52
+ sample_type = builder.sample_types.fetch(*type_args) do |id, type, unit|
53
+ index = id
54
+ builder.build_value_type(type, unit)
55
+ end
56
+
57
+ # Create mapping between the type and index to which its assigned.
58
+ # Do this for faster lookup while building profile sample values.
59
+ sample_type_mappings[type_name] = index || builder.sample_types.messages.index(sample_type)
60
+ end
61
+
62
+ # Freeze them so they can't be modified.
63
+ # We don't want the number of sample types to vary between samples within the same profile.
64
+ builder.sample_types.freeze
65
+ sample_type_mappings.freeze
66
+
67
+ # Add converters
68
+ mappings.each do |event_class, converter_class|
69
+ converters[event_class] = converter_class.new(builder, sample_type_mappings)
70
+ end
71
+
72
+ converters.freeze
73
+ end
74
+
75
+ def add_events!(event_class, events)
76
+ converters[event_class].add_events!(events)
77
+ end
78
+
79
+ def debug_statistics
80
+ converters.values.map(&:debug_statistics).join(', ')
81
+ end
82
+
83
+ def to_pprof
84
+ profile = builder.build_profile
85
+ data = builder.encode_profile(profile)
86
+ types = sample_type_mappings.keys
87
+
88
+ Payload.new(data, types)
89
+ end
90
+
91
+ # Error when an unknown event type is given to be converted
92
+ class NoProfilingEventConversionError < ArgumentError
93
+ attr_reader :type
94
+
95
+ def initialize(type)
96
+ @type = type
97
+ end
98
+
99
+ def message
100
+ "Profiling event type '#{type}' cannot be converted to pprof."
101
+ end
102
+ end
103
+
104
+ # Error when the mapping of a sample type to value index is unknown
105
+ class UnknownSampleTypeMappingError < ArgumentError
106
+ attr_reader :type
107
+
108
+ def initialize(type)
109
+ @type = type
110
+ end
111
+
112
+ def message
113
+ "Mapping for sample value type '#{type}' is unknown."
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,4 @@
1
+ # typed: strict
2
+ require 'ddtrace'
3
+
4
+ Datadog.profiler.start if Datadog.profiler
@@ -0,0 +1,31 @@
1
+ # typed: true
2
+ module Datadog
3
+ # Profiling entry point, which coordinates collectors and a scheduler
4
+ class Profiler
5
+ attr_reader \
6
+ :collectors,
7
+ :scheduler
8
+
9
+ def initialize(collectors, scheduler)
10
+ @collectors = collectors
11
+ @scheduler = scheduler
12
+ end
13
+
14
+ def start
15
+ collectors.each(&:start)
16
+ scheduler.start
17
+ end
18
+
19
+ def shutdown!
20
+ Datadog.logger.debug('Shutting down profiler')
21
+
22
+ collectors.each do |collector|
23
+ collector.enabled = false
24
+ collector.stop(true)
25
+ end
26
+
27
+ scheduler.enabled = false
28
+ scheduler.stop(true)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,96 @@
1
+ # typed: true
2
+ require 'ddtrace/profiling/buffer'
3
+ require 'ddtrace/profiling/flush'
4
+
5
+ module Datadog
6
+ module Profiling
7
+ # Stores profiling events gathered by `Collector`s
8
+ class Recorder
9
+ attr_reader :max_size
10
+
11
+ def initialize(event_classes, max_size, last_flush_time: Time.now.utc)
12
+ @buffers = {}
13
+ @last_flush_time = last_flush_time
14
+ @max_size = max_size
15
+
16
+ # Add a buffer for each class
17
+ event_classes.each do |event_class|
18
+ @buffers[event_class] = Profiling::Buffer.new(max_size)
19
+ end
20
+
21
+ # Event classes can only be added ahead of time
22
+ @buffers.freeze
23
+ end
24
+
25
+ def [](event_class)
26
+ @buffers[event_class]
27
+ end
28
+
29
+ def push(events)
30
+ if events.is_a?(Array)
31
+ # Push multiple events
32
+ event_class = events.first.class
33
+ raise UnknownEventError, event_class unless @buffers.key?(event_class)
34
+
35
+ @buffers[event_class].concat(events)
36
+ else
37
+ # Push single event
38
+ event_class = events.class
39
+ raise UnknownEventError, event_class unless @buffers.key?(event_class)
40
+
41
+ @buffers[event_class].push(events)
42
+ end
43
+ end
44
+
45
+ def flush
46
+ event_count = 0
47
+
48
+ event_groups, start, finish = update_time do
49
+ @buffers.collect do |event_class, buffer|
50
+ events = buffer.pop
51
+ next if events.empty?
52
+
53
+ event_count += events.length
54
+ EventGroup.new(event_class, events)
55
+ end.compact
56
+ end
57
+
58
+ Flush.new(
59
+ start,
60
+ finish,
61
+ event_groups,
62
+ event_count
63
+ )
64
+ end
65
+
66
+ # NOTE: Remember that if the recorder is being accessed by multiple threads, this is an inherently racy operation.
67
+ def empty?
68
+ @buffers.values.all?(&:empty?)
69
+ end
70
+
71
+ # Error when event of an unknown type is used with the Recorder
72
+ class UnknownEventError < StandardError
73
+ attr_reader :event_class
74
+
75
+ def initialize(event_class)
76
+ @event_class = event_class
77
+ end
78
+
79
+ def message
80
+ @message ||= "Unknown event class '#{event_class}' for profiling recorder."
81
+ end
82
+ end
83
+
84
+ private
85
+
86
+ def update_time
87
+ start = @last_flush_time
88
+ result = yield
89
+ @last_flush_time = Time.now.utc
90
+
91
+ # Return event groups, start time, finish time
92
+ [result, start, @last_flush_time]
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,134 @@
1
+ # typed: true
2
+ require 'ddtrace/utils/time'
3
+
4
+ require 'ddtrace/worker'
5
+ require 'ddtrace/workers/polling'
6
+
7
+ module Datadog
8
+ module Profiling
9
+ # Periodically (every DEFAULT_INTERVAL_SECONDS) takes data from the `Recorder` and pushes them to all configured
10
+ # `Exporter`s. Runs on its own background thread.
11
+ class Scheduler < Worker
12
+ include Workers::Polling
13
+
14
+ DEFAULT_INTERVAL_SECONDS = 60
15
+ MINIMUM_INTERVAL_SECONDS = 0
16
+
17
+ # Profiles with duration less than this will not be reported
18
+ PROFILE_DURATION_THRESHOLD_SECONDS = 1
19
+
20
+ private_constant :DEFAULT_INTERVAL_SECONDS, :MINIMUM_INTERVAL_SECONDS, :PROFILE_DURATION_THRESHOLD_SECONDS
21
+
22
+ attr_reader \
23
+ :exporters,
24
+ :recorder
25
+
26
+ def initialize(
27
+ recorder,
28
+ exporters,
29
+ fork_policy: Workers::Async::Thread::FORK_POLICY_RESTART, # Restart in forks by default
30
+ interval: DEFAULT_INTERVAL_SECONDS,
31
+ enabled: true
32
+ )
33
+ @recorder = recorder
34
+ @exporters = [exporters].flatten
35
+
36
+ # Workers::Async::Thread settings
37
+ self.fork_policy = fork_policy
38
+
39
+ # Workers::IntervalLoop settings
40
+ self.loop_base_interval = interval
41
+
42
+ # Workers::Polling settings
43
+ self.enabled = enabled
44
+ end
45
+
46
+ def start
47
+ perform
48
+ end
49
+
50
+ def perform
51
+ # A profiling flush may be called while the VM is shutting down, to report the last profile. When we do so,
52
+ # we impose a strict timeout. This means this last profile may or may not be sent, depending on if the flush can
53
+ # successfully finish in the strict timeout.
54
+ # This can be somewhat confusing (why did it not get reported?), so let's at least log what happened.
55
+ interrupted = true
56
+
57
+ begin
58
+ flush_and_wait
59
+ interrupted = false
60
+ ensure
61
+ Datadog.logger.debug('#flush was interrupted or failed before it could complete') if interrupted
62
+ end
63
+ end
64
+
65
+ def loop_back_off?
66
+ false
67
+ end
68
+
69
+ def after_fork
70
+ # Clear recorder's buffers by flushing events.
71
+ # Objects from parent process will copy-on-write,
72
+ # and we don't want to send events for the wrong process.
73
+ recorder.flush
74
+ end
75
+
76
+ # Configure Workers::IntervalLoop to not report immediately when scheduler starts
77
+ #
78
+ # When a scheduler gets created (or reset), we don't want it to immediately try to flush; we want it to wait for
79
+ # the loop wait time first. This avoids an issue where the scheduler reported a mostly-empty profile if the
80
+ # application just started but this thread took a bit longer so there's already samples in the recorder.
81
+ def loop_wait_before_first_iteration?
82
+ true
83
+ end
84
+
85
+ def work_pending?
86
+ !recorder.empty?
87
+ end
88
+
89
+ private
90
+
91
+ def flush_and_wait
92
+ run_time = Datadog::Utils::Time.measure do
93
+ flush_events
94
+ end
95
+
96
+ # Update wait time to try to wake consistently on time.
97
+ # Don't drop below the minimum interval.
98
+ self.loop_wait_time = [loop_base_interval - run_time, MINIMUM_INTERVAL_SECONDS].max
99
+ end
100
+
101
+ def flush_events
102
+ # Get events from recorder
103
+ flush = recorder.flush
104
+
105
+ if duration_below_threshold?(flush)
106
+ Datadog.logger.debug do
107
+ "Skipped exporting profiling events as profile duration is below minimum (#{flush.event_count} events skipped)"
108
+ end
109
+
110
+ return flush
111
+ end
112
+
113
+ # Send events to each exporter
114
+ if flush.event_count > 0
115
+ exporters.each do |exporter|
116
+ begin
117
+ exporter.export(flush)
118
+ rescue StandardError => e
119
+ Datadog.logger.error(
120
+ "Unable to export #{flush.event_count} profiling events. Cause: #{e} Location: #{Array(e.backtrace).first}"
121
+ )
122
+ end
123
+ end
124
+ end
125
+
126
+ flush
127
+ end
128
+
129
+ def duration_below_threshold?(flush)
130
+ (flush.finish - flush.start) < PROFILE_DURATION_THRESHOLD_SECONDS
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,82 @@
1
+ # typed: false
2
+ require 'ddtrace'
3
+ require 'ddtrace/utils/only_once'
4
+ require 'ddtrace/profiling'
5
+ require 'ddtrace/profiling/ext/cpu'
6
+ require 'ddtrace/profiling/ext/forking'
7
+
8
+ module Datadog
9
+ module Profiling
10
+ module Tasks
11
+ # Takes care of loading our extensions/monkey patches to handle fork() and CPU profiling.
12
+ class Setup
13
+ ACTIVATE_EXTENSIONS_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
14
+
15
+ def run
16
+ ACTIVATE_EXTENSIONS_ONLY_ONCE.run do
17
+ begin
18
+ activate_forking_extensions
19
+ activate_cpu_extensions
20
+ setup_at_fork_hooks
21
+ rescue StandardError, ScriptError => e
22
+ Datadog.logger.warn do
23
+ "Profiler extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def activate_forking_extensions
32
+ if Ext::Forking.supported?
33
+ Ext::Forking.apply!
34
+ elsif Datadog.configuration.profiling.enabled
35
+ Datadog.logger.debug('Profiler forking extensions skipped; forking not supported.')
36
+ end
37
+ rescue StandardError, ScriptError => e
38
+ Datadog.logger.warn do
39
+ "Profiler forking extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
40
+ end
41
+ end
42
+
43
+ def activate_cpu_extensions
44
+ if Ext::CPU.supported?
45
+ Ext::CPU.apply!
46
+ elsif Datadog.configuration.profiling.enabled
47
+ Datadog.logger.info do
48
+ 'CPU time profiling skipped because native CPU time is not supported: ' \
49
+ "#{Ext::CPU.unsupported_reason}. Profiles containing Wall time will still be reported."
50
+ end
51
+ end
52
+ rescue StandardError, ScriptError => e
53
+ Datadog.logger.warn do
54
+ "Profiler CPU profiling extensions unavailable. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
55
+ end
56
+ end
57
+
58
+ def setup_at_fork_hooks
59
+ if Process.respond_to?(:at_fork)
60
+ Process.at_fork(:child) do
61
+ begin
62
+ # When Ruby forks, clock IDs for each of the threads
63
+ # will change. We can only update these IDs from the
64
+ # execution context of the thread that owns it.
65
+ # This hook will update the IDs for the main thread
66
+ # after a fork occurs.
67
+ Thread.current.send(:update_native_ids) if Thread.current.respond_to?(:update_native_ids, true)
68
+
69
+ # Restart profiler, if enabled
70
+ Datadog.profiler.start if Datadog.profiler
71
+ rescue StandardError => e
72
+ Datadog.logger.warn do
73
+ "Error during post-fork hooks. Cause: #{e.message} Location: #{Array(e.backtrace).first}"
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end