ddtrace 0.49.0 → 0.50.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 (377) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +49 -73
  3. data/.circleci/images/primary/{Dockerfile-truffleruby-21.0.0 → Dockerfile-truffleruby-21.1.0} +1 -1
  4. data/.gitignore +0 -2
  5. data/.rubocop.yml +0 -8
  6. data/.rubocop_todo.yml +7 -7
  7. data/Appraisals +1 -107
  8. data/CHANGELOG.md +47 -0
  9. data/Rakefile +278 -333
  10. data/benchmarks/data/profiler-submission-marshal.gz +0 -0
  11. data/benchmarks/profiler_submission.rb +93 -0
  12. data/ddtrace.gemspec +1 -1
  13. data/docker-compose.yml +4 -34
  14. data/docs/GettingStarted.md +24 -9
  15. data/gemfiles/jruby_9.2.0.0_contrib.gemfile.lock +1 -1
  16. data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile.lock +1 -1
  17. data/gemfiles/jruby_9.2.0.0_core_old.gemfile.lock +1 -1
  18. data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile.lock +1 -1
  19. data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile.lock +1 -1
  20. data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile.lock +1 -1
  21. data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile.lock +1 -1
  22. data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile.lock +1 -1
  23. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile.lock +1 -1
  24. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  25. data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile.lock +1 -1
  26. data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile.lock +1 -1
  27. data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile.lock +1 -1
  28. data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile.lock +1 -1
  29. data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile.lock +1 -1
  30. data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile.lock +1 -1
  31. data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile.lock +1 -1
  32. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile.lock +1 -1
  33. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  34. data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile.lock +1 -1
  35. data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile.lock +1 -1
  36. data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile.lock +1 -1
  37. data/gemfiles/jruby_9.2.11.1_contrib.gemfile.lock +1 -1
  38. data/gemfiles/jruby_9.2.11.1_contrib_old.gemfile.lock +1 -1
  39. data/gemfiles/jruby_9.2.11.1_core_old.gemfile.lock +1 -1
  40. data/gemfiles/jruby_9.2.11.1_cucumber3.gemfile.lock +1 -1
  41. data/gemfiles/jruby_9.2.11.1_cucumber4.gemfile.lock +1 -1
  42. data/gemfiles/jruby_9.2.11.1_cucumber5.gemfile.lock +1 -1
  43. data/gemfiles/jruby_9.2.11.1_rails5_mysql2.gemfile.lock +1 -1
  44. data/gemfiles/jruby_9.2.11.1_rails5_postgres.gemfile.lock +1 -1
  45. data/gemfiles/jruby_9.2.11.1_rails5_postgres_redis.gemfile.lock +1 -1
  46. data/gemfiles/jruby_9.2.11.1_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  47. data/gemfiles/jruby_9.2.11.1_rails5_postgres_sidekiq.gemfile.lock +1 -1
  48. data/gemfiles/jruby_9.2.11.1_rails61_mysql2.gemfile.lock +1 -1
  49. data/gemfiles/jruby_9.2.11.1_rails61_postgres.gemfile.lock +1 -1
  50. data/gemfiles/jruby_9.2.11.1_rails61_postgres_redis.gemfile.lock +1 -1
  51. data/gemfiles/jruby_9.2.11.1_rails61_postgres_sidekiq.gemfile.lock +1 -1
  52. data/gemfiles/jruby_9.2.11.1_rails6_mysql2.gemfile.lock +1 -1
  53. data/gemfiles/jruby_9.2.11.1_rails6_postgres.gemfile.lock +1 -1
  54. data/gemfiles/jruby_9.2.11.1_rails6_postgres_redis.gemfile.lock +1 -1
  55. data/gemfiles/jruby_9.2.11.1_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  56. data/gemfiles/jruby_9.2.11.1_rails6_postgres_sidekiq.gemfile.lock +1 -1
  57. data/gemfiles/jruby_9.2.11.1_resque2_redis3.gemfile.lock +1 -1
  58. data/gemfiles/jruby_9.2.11.1_resque2_redis4.gemfile.lock +1 -1
  59. data/gemfiles/ruby_2.1.10_contrib_old.gemfile.lock +1 -1
  60. data/gemfiles/ruby_2.1.10_core_old.gemfile.lock +1 -1
  61. data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile.lock +1 -1
  62. data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile.lock +1 -1
  63. data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock +1 -1
  64. data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock +1 -1
  65. data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock +1 -1
  66. data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock +1 -1
  67. data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock +1 -1
  68. data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock +1 -1
  69. data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock +1 -1
  70. data/gemfiles/ruby_2.2.10_contrib.gemfile.lock +1 -1
  71. data/gemfiles/ruby_2.2.10_core_old.gemfile.lock +1 -1
  72. data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile.lock +1 -1
  73. data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile.lock +1 -1
  74. data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile.lock +1 -1
  75. data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile.lock +1 -1
  76. data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile.lock +1 -1
  77. data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile.lock +1 -1
  78. data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile.lock +1 -1
  79. data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile.lock +1 -1
  80. data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile.lock +1 -1
  81. data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile.lock +1 -1
  82. data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile.lock +1 -1
  83. data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile.lock +1 -1
  84. data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile.lock +1 -1
  85. data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  86. data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile.lock +1 -1
  87. data/gemfiles/ruby_2.3.8_contrib.gemfile.lock +1 -1
  88. data/gemfiles/ruby_2.3.8_contrib_old.gemfile.lock +1 -1
  89. data/gemfiles/ruby_2.3.8_core_old.gemfile.lock +1 -1
  90. data/gemfiles/ruby_2.3.8_cucumber3.gemfile.lock +1 -1
  91. data/gemfiles/ruby_2.3.8_cucumber4.gemfile.lock +1 -1
  92. data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile.lock +1 -1
  93. data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile.lock +1 -1
  94. data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile.lock +1 -1
  95. data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile.lock +1 -1
  96. data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile.lock +1 -1
  97. data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile.lock +1 -1
  98. data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile.lock +1 -1
  99. data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile.lock +1 -1
  100. data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile.lock +1 -1
  101. data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile.lock +1 -1
  102. data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile.lock +1 -1
  103. data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile.lock +1 -1
  104. data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile.lock +1 -1
  105. data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  106. data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile.lock +1 -1
  107. data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile.lock +1 -1
  108. data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile.lock +1 -1
  109. data/gemfiles/ruby_2.4.6_contrib.gemfile.lock +1 -1
  110. data/gemfiles/ruby_2.4.6_contrib_old.gemfile.lock +1 -1
  111. data/gemfiles/ruby_2.4.6_core_old.gemfile.lock +1 -1
  112. data/gemfiles/ruby_2.4.6_cucumber3.gemfile.lock +1 -1
  113. data/gemfiles/ruby_2.4.6_cucumber4.gemfile.lock +1 -1
  114. data/gemfiles/ruby_2.4.6_rails5_mysql2.gemfile.lock +1 -1
  115. data/gemfiles/ruby_2.4.6_rails5_postgres.gemfile.lock +1 -1
  116. data/gemfiles/ruby_2.4.6_rails5_postgres_redis.gemfile.lock +1 -1
  117. data/gemfiles/ruby_2.4.6_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  118. data/gemfiles/ruby_2.4.6_rails5_postgres_sidekiq.gemfile.lock +1 -1
  119. data/gemfiles/ruby_2.4.6_resque2_redis3.gemfile.lock +1 -1
  120. data/gemfiles/ruby_2.4.6_resque2_redis4.gemfile.lock +1 -1
  121. data/gemfiles/ruby_2.5.6_contrib.gemfile.lock +1 -1
  122. data/gemfiles/ruby_2.5.6_contrib_old.gemfile.lock +1 -1
  123. data/gemfiles/ruby_2.5.6_core_old.gemfile.lock +1 -1
  124. data/gemfiles/ruby_2.5.6_cucumber3.gemfile.lock +1 -1
  125. data/gemfiles/ruby_2.5.6_cucumber4.gemfile.lock +1 -1
  126. data/gemfiles/ruby_2.5.6_cucumber5.gemfile.lock +1 -1
  127. data/gemfiles/ruby_2.5.6_rails5_mysql2.gemfile.lock +1 -1
  128. data/gemfiles/ruby_2.5.6_rails5_postgres.gemfile.lock +1 -1
  129. data/gemfiles/ruby_2.5.6_rails5_postgres_redis.gemfile.lock +1 -1
  130. data/gemfiles/ruby_2.5.6_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  131. data/gemfiles/ruby_2.5.6_rails5_postgres_sidekiq.gemfile.lock +1 -1
  132. data/gemfiles/ruby_2.5.6_rails61_mysql2.gemfile.lock +1 -1
  133. data/gemfiles/ruby_2.5.6_rails61_postgres.gemfile.lock +1 -1
  134. data/gemfiles/ruby_2.5.6_rails61_postgres_redis.gemfile.lock +1 -1
  135. data/gemfiles/ruby_2.5.6_rails61_postgres_sidekiq.gemfile.lock +1 -1
  136. data/gemfiles/ruby_2.5.6_rails6_mysql2.gemfile.lock +1 -1
  137. data/gemfiles/ruby_2.5.6_rails6_postgres.gemfile.lock +1 -1
  138. data/gemfiles/ruby_2.5.6_rails6_postgres_redis.gemfile.lock +1 -1
  139. data/gemfiles/ruby_2.5.6_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  140. data/gemfiles/ruby_2.5.6_rails6_postgres_sidekiq.gemfile.lock +1 -1
  141. data/gemfiles/ruby_2.5.6_resque2_redis3.gemfile.lock +1 -1
  142. data/gemfiles/ruby_2.5.6_resque2_redis4.gemfile.lock +1 -1
  143. data/gemfiles/ruby_2.6.4_contrib.gemfile.lock +1 -1
  144. data/gemfiles/ruby_2.6.4_contrib_old.gemfile.lock +1 -1
  145. data/gemfiles/ruby_2.6.4_core_old.gemfile.lock +1 -1
  146. data/gemfiles/ruby_2.6.4_cucumber3.gemfile.lock +1 -1
  147. data/gemfiles/ruby_2.6.4_cucumber4.gemfile.lock +1 -1
  148. data/gemfiles/ruby_2.6.4_cucumber5.gemfile.lock +1 -1
  149. data/gemfiles/ruby_2.6.4_rails5_mysql2.gemfile.lock +1 -1
  150. data/gemfiles/ruby_2.6.4_rails5_postgres.gemfile.lock +1 -1
  151. data/gemfiles/ruby_2.6.4_rails5_postgres_redis.gemfile.lock +1 -1
  152. data/gemfiles/ruby_2.6.4_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  153. data/gemfiles/ruby_2.6.4_rails5_postgres_sidekiq.gemfile.lock +1 -1
  154. data/gemfiles/ruby_2.6.4_rails61_mysql2.gemfile.lock +1 -1
  155. data/gemfiles/ruby_2.6.4_rails61_postgres.gemfile.lock +1 -1
  156. data/gemfiles/ruby_2.6.4_rails61_postgres_redis.gemfile.lock +1 -1
  157. data/gemfiles/ruby_2.6.4_rails61_postgres_sidekiq.gemfile.lock +1 -1
  158. data/gemfiles/ruby_2.6.4_rails6_mysql2.gemfile.lock +1 -1
  159. data/gemfiles/ruby_2.6.4_rails6_postgres.gemfile.lock +1 -1
  160. data/gemfiles/ruby_2.6.4_rails6_postgres_redis.gemfile.lock +1 -1
  161. data/gemfiles/ruby_2.6.4_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  162. data/gemfiles/ruby_2.6.4_rails6_postgres_sidekiq.gemfile.lock +1 -1
  163. data/gemfiles/ruby_2.6.4_resque2_redis3.gemfile.lock +1 -1
  164. data/gemfiles/ruby_2.6.4_resque2_redis4.gemfile.lock +1 -1
  165. data/gemfiles/ruby_2.7.0_contrib.gemfile.lock +1 -1
  166. data/gemfiles/ruby_2.7.0_contrib_old.gemfile.lock +1 -1
  167. data/gemfiles/ruby_2.7.0_core_old.gemfile.lock +1 -1
  168. data/gemfiles/ruby_2.7.0_cucumber3.gemfile.lock +1 -1
  169. data/gemfiles/ruby_2.7.0_cucumber4.gemfile.lock +1 -1
  170. data/gemfiles/ruby_2.7.0_cucumber5.gemfile.lock +1 -1
  171. data/gemfiles/ruby_2.7.0_rails5_mysql2.gemfile.lock +1 -1
  172. data/gemfiles/ruby_2.7.0_rails5_postgres.gemfile.lock +1 -1
  173. data/gemfiles/ruby_2.7.0_rails5_postgres_redis.gemfile.lock +1 -1
  174. data/gemfiles/ruby_2.7.0_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  175. data/gemfiles/ruby_2.7.0_rails5_postgres_sidekiq.gemfile.lock +1 -1
  176. data/gemfiles/ruby_2.7.0_rails61_mysql2.gemfile.lock +1 -1
  177. data/gemfiles/ruby_2.7.0_rails61_postgres.gemfile.lock +1 -1
  178. data/gemfiles/ruby_2.7.0_rails61_postgres_redis.gemfile.lock +1 -1
  179. data/gemfiles/ruby_2.7.0_rails61_postgres_sidekiq.gemfile.lock +1 -1
  180. data/gemfiles/ruby_2.7.0_rails6_mysql2.gemfile.lock +1 -1
  181. data/gemfiles/ruby_2.7.0_rails6_postgres.gemfile.lock +1 -1
  182. data/gemfiles/ruby_2.7.0_rails6_postgres_redis.gemfile.lock +1 -1
  183. data/gemfiles/ruby_2.7.0_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  184. data/gemfiles/ruby_2.7.0_rails6_postgres_sidekiq.gemfile.lock +1 -1
  185. data/gemfiles/ruby_2.7.0_resque2_redis3.gemfile.lock +1 -1
  186. data/gemfiles/ruby_2.7.0_resque2_redis4.gemfile.lock +1 -1
  187. data/gemfiles/ruby_3.0.0_contrib.gemfile +1 -0
  188. data/gemfiles/ruby_3.0.0_contrib.gemfile.lock +7 -1
  189. data/gemfiles/ruby_3.0.0_core_old.gemfile.lock +1 -1
  190. data/gemfiles/ruby_3.0.0_cucumber3.gemfile.lock +1 -1
  191. data/gemfiles/ruby_3.0.0_cucumber4.gemfile.lock +1 -1
  192. data/gemfiles/ruby_3.0.0_cucumber5.gemfile.lock +1 -1
  193. data/gemfiles/ruby_3.0.0_rails61_mysql2.gemfile.lock +1 -1
  194. data/gemfiles/ruby_3.0.0_rails61_postgres.gemfile.lock +1 -1
  195. data/gemfiles/ruby_3.0.0_rails61_postgres_redis.gemfile.lock +1 -1
  196. data/gemfiles/ruby_3.0.0_rails61_postgres_sidekiq.gemfile.lock +1 -1
  197. data/gemfiles/ruby_3.0.0_resque2_redis3.gemfile.lock +1 -1
  198. data/gemfiles/ruby_3.0.0_resque2_redis4.gemfile.lock +1 -1
  199. data/integration/apps/rack/README.md +2 -2
  200. data/integration/apps/rack/script/ci +2 -1
  201. data/integration/apps/rails-five/README.md +2 -2
  202. data/integration/apps/rails-five/script/ci +2 -1
  203. data/integration/apps/rspec/.dockerignore +1 -0
  204. data/integration/apps/rspec/.envrc.sample +1 -0
  205. data/integration/apps/rspec/.gitignore +2 -0
  206. data/integration/apps/rspec/.rspec +1 -0
  207. data/integration/apps/rspec/Dockerfile +25 -0
  208. data/integration/apps/rspec/Dockerfile-ci +11 -0
  209. data/integration/apps/rspec/Gemfile +14 -0
  210. data/integration/apps/rspec/README.md +70 -0
  211. data/integration/apps/rspec/agent.yaml +3 -0
  212. data/integration/apps/rspec/app/datadog.rb +13 -0
  213. data/integration/apps/rspec/app/fibonacci.rb +30 -0
  214. data/integration/apps/rspec/bin/run +20 -0
  215. data/integration/apps/rspec/bin/setup +17 -0
  216. data/integration/apps/rspec/bin/test +21 -0
  217. data/integration/apps/rspec/docker-compose.ci.yml +51 -0
  218. data/integration/apps/rspec/docker-compose.yml +63 -0
  219. data/integration/apps/rspec/script/build-images +37 -0
  220. data/integration/apps/rspec/script/ci +53 -0
  221. data/integration/apps/rspec/spec/fibonacci_spec.rb +16 -0
  222. data/integration/apps/rspec/spec/rspec_spec.rb +58 -0
  223. data/integration/apps/rspec/spec/spec_helper.rb +24 -0
  224. data/integration/apps/ruby/README.md +2 -2
  225. data/integration/apps/ruby/script/ci +2 -1
  226. data/lib/datadog/ci.rb +16 -0
  227. data/lib/datadog/ci/configuration/components.rb +30 -0
  228. data/lib/datadog/ci/configuration/settings.rb +36 -0
  229. data/lib/datadog/ci/context_flush.rb +28 -0
  230. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +30 -0
  231. data/lib/datadog/ci/contrib/cucumber/ext.rb +19 -0
  232. data/lib/datadog/ci/contrib/cucumber/formatter.rb +97 -0
  233. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +26 -0
  234. data/lib/datadog/ci/contrib/cucumber/integration.rb +47 -0
  235. data/lib/datadog/ci/contrib/cucumber/patcher.rb +25 -0
  236. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +30 -0
  237. data/lib/datadog/ci/contrib/rspec/example.rb +73 -0
  238. data/lib/datadog/ci/contrib/rspec/ext.rb +18 -0
  239. data/lib/datadog/ci/contrib/rspec/integration.rb +48 -0
  240. data/lib/datadog/ci/contrib/rspec/patcher.rb +25 -0
  241. data/lib/datadog/ci/ext/app_types.rb +9 -0
  242. data/lib/datadog/ci/ext/environment.rb +303 -0
  243. data/lib/datadog/ci/ext/settings.rb +10 -0
  244. data/lib/datadog/ci/ext/test.rb +28 -0
  245. data/lib/datadog/ci/extensions.rb +17 -0
  246. data/lib/datadog/ci/test.rb +63 -0
  247. data/lib/ddtrace.rb +0 -2
  248. data/lib/ddtrace/configuration.rb +1 -23
  249. data/lib/ddtrace/configuration/agent_settings_resolver.rb +8 -19
  250. data/lib/ddtrace/configuration/base.rb +6 -9
  251. data/lib/ddtrace/configuration/components.rb +33 -10
  252. data/lib/ddtrace/configuration/options.rb +2 -2
  253. data/lib/ddtrace/configuration/settings.rb +49 -1
  254. data/lib/ddtrace/context.rb +17 -14
  255. data/lib/ddtrace/context_flush.rb +14 -2
  256. data/lib/ddtrace/contrib/action_cable/event.rb +4 -4
  257. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +1 -1
  258. data/lib/ddtrace/contrib/action_view/event.rb +2 -2
  259. data/lib/ddtrace/contrib/action_view/patcher.rb +4 -4
  260. data/lib/ddtrace/contrib/active_model_serializers/event.rb +2 -2
  261. data/lib/ddtrace/contrib/active_record/event.rb +2 -2
  262. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +7 -7
  263. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -5
  264. data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -2
  265. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -1
  266. data/lib/ddtrace/contrib/auto_instrument.rb +1 -1
  267. data/lib/ddtrace/contrib/aws/instrumentation.rb +29 -0
  268. data/lib/ddtrace/contrib/aws/patcher.rb +4 -0
  269. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -1
  270. data/lib/ddtrace/contrib/configurable.rb +1 -1
  271. data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -1
  272. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -1
  273. data/lib/ddtrace/contrib/ethon/easy_patch.rb +1 -1
  274. data/lib/ddtrace/contrib/ethon/multi_patch.rb +1 -1
  275. data/lib/ddtrace/contrib/ethon/patcher.rb +2 -2
  276. data/lib/ddtrace/contrib/extensions.rb +3 -3
  277. data/lib/ddtrace/contrib/faraday/patcher.rb +2 -2
  278. data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -2
  279. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  280. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -1
  281. data/lib/ddtrace/contrib/http/instrumentation.rb +1 -1
  282. data/lib/ddtrace/contrib/http/patcher.rb +1 -1
  283. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +1 -1
  284. data/lib/ddtrace/contrib/httpclient/patcher.rb +1 -1
  285. data/lib/ddtrace/contrib/httprb/instrumentation.rb +1 -1
  286. data/lib/ddtrace/contrib/httprb/patcher.rb +1 -1
  287. data/lib/ddtrace/contrib/integration.rb +3 -3
  288. data/lib/ddtrace/contrib/kafka/event.rb +2 -2
  289. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -2
  290. data/lib/ddtrace/contrib/mongodb/patcher.rb +2 -2
  291. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  292. data/lib/ddtrace/contrib/mysql2/patcher.rb +1 -1
  293. data/lib/ddtrace/contrib/patchable.rb +2 -2
  294. data/lib/ddtrace/contrib/patcher.rb +2 -2
  295. data/lib/ddtrace/contrib/presto/instrumentation.rb +1 -1
  296. data/lib/ddtrace/contrib/presto/patcher.rb +1 -1
  297. data/lib/ddtrace/contrib/qless/patcher.rb +3 -5
  298. data/lib/ddtrace/contrib/racecar/event.rb +2 -2
  299. data/lib/ddtrace/contrib/rake/instrumentation.rb +1 -1
  300. data/lib/ddtrace/contrib/rake/patcher.rb +1 -1
  301. data/lib/ddtrace/contrib/registerable.rb +2 -2
  302. data/lib/ddtrace/contrib/resque/patcher.rb +1 -1
  303. data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
  304. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -1
  305. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  306. data/lib/ddtrace/contrib/sequel/dataset.rb +1 -1
  307. data/lib/ddtrace/contrib/sequel/patcher.rb +2 -2
  308. data/lib/ddtrace/contrib/sinatra/patcher.rb +1 -1
  309. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +4 -6
  310. data/lib/ddtrace/diagnostics/environment_logger.rb +2 -2
  311. data/lib/ddtrace/error.rb +52 -61
  312. data/lib/ddtrace/ext/app_types.rb +0 -1
  313. data/lib/ddtrace/ext/test.rb +2 -18
  314. data/lib/ddtrace/metrics.rb +28 -3
  315. data/lib/ddtrace/opentelemetry/extensions.rb +1 -1
  316. data/lib/ddtrace/opentracer.rb +20 -39
  317. data/lib/ddtrace/patcher.rb +2 -2
  318. data/lib/ddtrace/profiling.rb +11 -9
  319. data/lib/ddtrace/profiling/collectors/stack.rb +5 -2
  320. data/lib/ddtrace/profiling/encoding/profile.rb +6 -0
  321. data/lib/ddtrace/profiling/ext/cpu.rb +2 -2
  322. data/lib/ddtrace/profiling/ext/cthread.rb +9 -11
  323. data/lib/ddtrace/profiling/ext/forking.rb +7 -7
  324. data/lib/ddtrace/profiling/flush.rb +3 -1
  325. data/lib/ddtrace/profiling/pprof/builder.rb +26 -28
  326. data/lib/ddtrace/profiling/pprof/converter.rb +4 -0
  327. data/lib/ddtrace/profiling/pprof/stack_sample.rb +17 -1
  328. data/lib/ddtrace/profiling/pprof/template.rb +4 -0
  329. data/lib/ddtrace/profiling/scheduler.rb +12 -1
  330. data/lib/ddtrace/profiling/tasks/setup.rb +13 -13
  331. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +11 -2
  332. data/lib/ddtrace/runtime/metrics.rb +3 -5
  333. data/lib/ddtrace/sync_writer.rb +2 -1
  334. data/lib/ddtrace/tracer.rb +8 -4
  335. data/lib/ddtrace/transport/http/statistics.rb +2 -2
  336. data/lib/ddtrace/transport/http/traces.rb +3 -3
  337. data/lib/ddtrace/transport/io/traces.rb +1 -1
  338. data/lib/ddtrace/utils/forking.rb +1 -1
  339. data/lib/ddtrace/utils/object_set.rb +3 -5
  340. data/lib/ddtrace/utils/time.rb +1 -3
  341. data/lib/ddtrace/version.rb +2 -4
  342. data/lib/ddtrace/workers.rb +1 -1
  343. data/lib/ddtrace/workers/async.rb +3 -2
  344. data/lib/ddtrace/workers/loop.rb +1 -1
  345. data/lib/ddtrace/workers/polling.rb +11 -5
  346. data/lib/ddtrace/workers/queue.rb +1 -1
  347. metadata +48 -34
  348. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -83
  349. data/gemfiles/ruby_2.0.0_contrib_old.gemfile +0 -64
  350. data/gemfiles/ruby_2.0.0_contrib_old.gemfile.lock +0 -290
  351. data/gemfiles/ruby_2.0.0_core_old.gemfile +0 -33
  352. data/gemfiles/ruby_2.0.0_core_old.gemfile.lock +0 -118
  353. data/gemfiles/ruby_2.0.0_rails30_postgres.gemfile +0 -39
  354. data/gemfiles/ruby_2.0.0_rails30_postgres.gemfile.lock +0 -196
  355. data/gemfiles/ruby_2.0.0_rails30_postgres_sidekiq.gemfile +0 -40
  356. data/gemfiles/ruby_2.0.0_rails30_postgres_sidekiq.gemfile.lock +0 -205
  357. data/gemfiles/ruby_2.0.0_rails32_mysql2.gemfile +0 -43
  358. data/gemfiles/ruby_2.0.0_rails32_mysql2.gemfile.lock +0 -217
  359. data/gemfiles/ruby_2.0.0_rails32_postgres.gemfile +0 -39
  360. data/gemfiles/ruby_2.0.0_rails32_postgres.gemfile.lock +0 -204
  361. data/gemfiles/ruby_2.0.0_rails32_postgres_redis.gemfile +0 -41
  362. data/gemfiles/ruby_2.0.0_rails32_postgres_redis.gemfile.lock +0 -223
  363. data/gemfiles/ruby_2.0.0_rails32_postgres_sidekiq.gemfile +0 -40
  364. data/gemfiles/ruby_2.0.0_rails32_postgres_sidekiq.gemfile.lock +0 -213
  365. data/integration/images/ruby/2.0/Dockerfile +0 -54
  366. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -28
  367. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -17
  368. data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -98
  369. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
  370. data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
  371. data/lib/ddtrace/contrib/cucumber/patcher.rb +0 -23
  372. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -28
  373. data/lib/ddtrace/contrib/rspec/example.rb +0 -75
  374. data/lib/ddtrace/contrib/rspec/ext.rb +0 -16
  375. data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
  376. data/lib/ddtrace/contrib/rspec/patcher.rb +0 -23
  377. data/lib/ddtrace/ext/ci.rb +0 -297
@@ -6,7 +6,6 @@ module Datadog
6
6
  CACHE = 'cache'.freeze
7
7
  WORKER = 'worker'.freeze
8
8
  CUSTOM = 'custom'.freeze
9
- TEST = 'test'.freeze
10
9
  end
11
10
  end
12
11
  end
@@ -1,24 +1,8 @@
1
1
  module Datadog
2
2
  module Ext
3
- # Defines constants for test tags
3
+ # Defines constants for test behavior
4
4
  module Test
5
- TAG_ARGUMENTS = 'test.arguments'.freeze
6
- TAG_FRAMEWORK = 'test.framework'.freeze
7
- TAG_NAME = 'test.name'.freeze
8
- TAG_SKIP_REASON = 'test.skip_reason'.freeze
9
- TAG_STATUS = 'test.status'.freeze
10
- TAG_SUITE = 'test.suite'.freeze
11
- TAG_TRAITS = 'test.traits'.freeze
12
- TAG_TYPE = 'test.type'.freeze
13
-
14
- # TODO: is there a better place for SPAN_KIND?
15
- TAG_SPAN_KIND = 'span.kind'.freeze
16
-
17
- module Status
18
- PASS = 'pass'.freeze
19
- FAIL = 'fail'.freeze
20
- SKIP = 'skip'.freeze
21
- end
5
+ ENV_MODE_ENABLED = 'DD_TRACE_TEST_MODE_ENABLED'.freeze
22
6
  end
23
7
  end
24
8
  end
@@ -3,8 +3,9 @@ require 'ddtrace/ext/metrics'
3
3
  require 'set'
4
4
  require 'logger'
5
5
  require 'ddtrace/environment'
6
- require 'ddtrace/utils/time'
7
6
  require 'ddtrace/runtime/identity'
7
+ require 'ddtrace/utils/only_once'
8
+ require 'ddtrace/utils/time'
8
9
 
9
10
  module Datadog
10
11
  # Acts as client for sending metrics (via Statsd)
@@ -18,8 +19,14 @@ module Datadog
18
19
  end
19
20
 
20
21
  def supported?
21
- version = Gem.loaded_specs['dogstatsd-ruby'] \
22
- && Gem.loaded_specs['dogstatsd-ruby'].version
22
+ version = (
23
+ defined?(Datadog::Statsd::VERSION) &&
24
+ Datadog::Statsd::VERSION &&
25
+ Gem::Version.new(Datadog::Statsd::VERSION)
26
+ ) || (
27
+ Gem.loaded_specs['dogstatsd-ruby'] &&
28
+ Gem.loaded_specs['dogstatsd-ruby'].version
29
+ )
23
30
 
24
31
  !version.nil? && (version >= Gem::Version.new('3.3.0'))
25
32
  end
@@ -43,6 +50,8 @@ module Datadog
43
50
  def default_statsd_client
44
51
  require 'datadog/statsd'
45
52
 
53
+ incompatible_statsd_warning
54
+
46
55
  # Create a StatsD client that points to the agent.
47
56
  Datadog::Statsd.new(default_hostname, default_port)
48
57
  end
@@ -226,5 +235,21 @@ module Datadog
226
235
  include Options
227
236
  extend Options
228
237
  extend Helpers
238
+
239
+ private
240
+
241
+ INCOMPATIBLE_STATSD_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
242
+ private_constant :INCOMPATIBLE_STATSD_ONLY_ONCE
243
+
244
+ def incompatible_statsd_warning
245
+ return if Gem.loaded_specs['dogstatsd-ruby'].version < Gem::Version.new('5.0')
246
+
247
+ INCOMPATIBLE_STATSD_ONLY_ONCE.run do
248
+ Datadog.logger.warn(
249
+ 'This version of `ddtrace` is incompatible with `dogstastd-ruby` version >= 5.0 and can ' \
250
+ 'cause unbounded memory usage. Please use `dogstastd-ruby` version < 5.0 instead.'
251
+ )
252
+ end
253
+ end
229
254
  end
230
255
  end
@@ -6,7 +6,7 @@ module Datadog
6
6
  # Defines extensions to ddtrace for OpenTelemetry support
7
7
  module Extensions
8
8
  def self.extended(base)
9
- Datadog::Span.send(:prepend, OpenTelemetry::Span)
9
+ Datadog::Span.prepend(OpenTelemetry::Span)
10
10
  end
11
11
  end
12
12
  end
@@ -1,40 +1,21 @@
1
- module Datadog
2
- # Namespace for ddtrace OpenTracing implementation
3
- module OpenTracer
4
- module_function
1
+ require 'opentracing'
2
+ require 'opentracing/carrier'
3
+ require 'ddtrace'
4
+ require 'ddtrace/opentracer/carrier'
5
+ require 'ddtrace/opentracer/tracer'
6
+ require 'ddtrace/opentracer/span'
7
+ require 'ddtrace/opentracer/span_context'
8
+ require 'ddtrace/opentracer/span_context_factory'
9
+ require 'ddtrace/opentracer/scope'
10
+ require 'ddtrace/opentracer/scope_manager'
11
+ require 'ddtrace/opentracer/thread_local_scope'
12
+ require 'ddtrace/opentracer/thread_local_scope_manager'
13
+ require 'ddtrace/opentracer/distributed_headers'
14
+ require 'ddtrace/opentracer/propagator'
15
+ require 'ddtrace/opentracer/text_map_propagator'
16
+ require 'ddtrace/opentracer/binary_propagator'
17
+ require 'ddtrace/opentracer/rack_propagator'
18
+ require 'ddtrace/opentracer/global_tracer'
5
19
 
6
- def supported?
7
- Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.1')
8
- end
9
-
10
- def load_opentracer
11
- require 'opentracing'
12
- require 'opentracing/carrier'
13
- require 'ddtrace'
14
- require 'ddtrace/opentracer/carrier'
15
- require 'ddtrace/opentracer/tracer'
16
- require 'ddtrace/opentracer/span'
17
- require 'ddtrace/opentracer/span_context'
18
- require 'ddtrace/opentracer/span_context_factory'
19
- require 'ddtrace/opentracer/scope'
20
- require 'ddtrace/opentracer/scope_manager'
21
- require 'ddtrace/opentracer/thread_local_scope'
22
- require 'ddtrace/opentracer/thread_local_scope_manager'
23
- require 'ddtrace/opentracer/distributed_headers'
24
- require 'ddtrace/opentracer/propagator'
25
- require 'ddtrace/opentracer/text_map_propagator'
26
- require 'ddtrace/opentracer/binary_propagator'
27
- require 'ddtrace/opentracer/rack_propagator'
28
- require 'ddtrace/opentracer/global_tracer'
29
-
30
- # Modify the OpenTracing module functions
31
- OpenTracing.module_eval do
32
- class << self
33
- prepend Datadog::OpenTracer::GlobalTracer
34
- end
35
- end
36
- end
37
-
38
- load_opentracer if supported?
39
- end
40
- end
20
+ # Modify the OpenTracing module functions
21
+ ::OpenTracing.singleton_class.prepend(Datadog::OpenTracer::GlobalTracer)
@@ -16,8 +16,8 @@ module Datadog
16
16
  )
17
17
  end
18
18
 
19
- base.send(:extend, CommonMethods)
20
- base.send(:include, CommonMethods)
19
+ base.extend(CommonMethods)
20
+ base.include(CommonMethods)
21
21
  end
22
22
 
23
23
  # Defines some common methods for patching, that can be used
@@ -14,8 +14,7 @@ module Datadog
14
14
  # NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons -- e.g. tell users
15
15
  # first that they can't use this on JRuby before telling them that they are missing protobuf
16
16
 
17
- ruby_engine_unsupported? || ruby_version_unsupported? ||
18
- protobuf_gem_unavailable? || protobuf_version_unsupported? || protobuf_failed_to_load?
17
+ ruby_engine_unsupported? || protobuf_gem_unavailable? || protobuf_version_unsupported? || protobuf_failed_to_load?
19
18
  end
20
19
 
21
20
  def self.ruby_engine_unsupported?
@@ -23,20 +22,21 @@ module Datadog
23
22
  end
24
23
  private_class_method :ruby_engine_unsupported?
25
24
 
26
- def self.ruby_version_unsupported?
27
- 'Ruby >= 2.1 is required' if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.1')
28
- end
29
- private_class_method :ruby_version_unsupported?
30
-
31
25
  def self.protobuf_gem_unavailable?
32
- if Gem.loaded_specs['google-protobuf'].nil?
26
+ # NOTE: On environments where protobuf is already loaded, we skip the check. This allows us to support environments
27
+ # where no Gem.loaded_version is NOT available but customers are able to load protobuf; see for instance
28
+ # https://github.com/teamcapybara/capybara/commit/caf3bcd7664f4f2691d0ca9ef3be9a2a954fecfb
29
+ if !defined?(::Google::Protobuf) && Gem.loaded_specs['google-protobuf'].nil?
33
30
  "Missing google-protobuf dependency; please add `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
34
31
  end
35
32
  end
36
33
  private_class_method :protobuf_gem_unavailable?
37
34
 
38
35
  def self.protobuf_version_unsupported?
39
- if Gem.loaded_specs['google-protobuf'].version < GOOGLE_PROTOBUF_MINIMUM_VERSION
36
+ # See above for why we skip the check when protobuf is already loaded; note that when protobuf was already loaded
37
+ # we skip the version check to avoid the call to Gem.loaded_specs. Unfortunately, protobuf does not seem to
38
+ # expose the gem version constant elsewhere, so in that setup we are not able to check the version.
39
+ if !defined?(::Google::Protobuf) && Gem.loaded_specs['google-protobuf'].version < GOOGLE_PROTOBUF_MINIMUM_VERSION
40
40
  'Your google-protobuf is too old; ensure that you have google-protobuf >= 3.0 by ' \
41
41
  "adding `gem 'google-protobuf', '~> 3.0'` to your Gemfile or gems.rb file"
42
42
  end
@@ -66,6 +66,8 @@ module Datadog
66
66
  require 'google/protobuf'
67
67
  @protobuf_loaded = true
68
68
  rescue LoadError => e
69
+ # NOTE: We use Kernel#warn here because this code gets run BEFORE Datadog.logger is actually set up.
70
+ # In the future it'd be nice to shuffle the logger startup to happen first to avoid this special case.
69
71
  Kernel.warn(
70
72
  "[DDTRACE] Error while loading google-protobuf gem. Cause: '#{e.message}' Location: '#{e.backtrace.first}'. " \
71
73
  'This can happen when google-protobuf is missing its native components. ' \
@@ -122,7 +122,7 @@ module Datadog
122
122
  # Convert backtrace locations into structs
123
123
  locations = convert_backtrace_locations(locations)
124
124
 
125
- thread_id = thread.respond_to?(:native_thread_id) ? thread.native_thread_id : thread.object_id
125
+ thread_id = thread.respond_to?(:pthread_thread_id) ? thread.pthread_thread_id : thread.object_id
126
126
  trace_id, span_id = get_trace_identifiers(thread)
127
127
  cpu_time = get_cpu_time_interval!(thread)
128
128
 
@@ -224,6 +224,7 @@ module Datadog
224
224
  # In this case, the fix is to make sure ddtrace gets loaded before any other parts of the application.
225
225
  #
226
226
  # b) The thread was started using the Ruby native APIs (e.g. from a C extension such as ffi).
227
+ # Known cases right now that trigger this are the ethon/typhoeus gems.
227
228
  # We currently have no solution for this case; these threads will always be missing our CPU instrumentation.
228
229
  #
229
230
  # c) The thread was started with `Thread.start`/`Thread.fork` and hasn't yet enabled the instrumentation.
@@ -232,7 +233,9 @@ module Datadog
232
233
  # it to run and our instrumentation to be applied.
233
234
  #
234
235
  if thread_api.current.respond_to?(:cpu_time) && thread_api.current.cpu_time
235
- Datadog.logger.debug("Detected thread ('#{thread}') with missing CPU profiling instrumentation.")
236
+ Datadog.logger.debug(
237
+ "Thread ('#{thread}') is missing profiling instrumentation; other threads should be unaffected"
238
+ )
236
239
  end
237
240
  end
238
241
  end
@@ -1,4 +1,5 @@
1
1
  require 'set'
2
+ require 'time'
2
3
 
3
4
  require 'ddtrace/profiling/flush'
4
5
  require 'ddtrace/profiling/pprof/template'
@@ -21,6 +22,11 @@ module Datadog
21
22
  # Add all events to the pprof
22
23
  flush.event_groups.each { |event_group| template.add_events!(event_group.event_class, event_group.events) }
23
24
 
25
+ Datadog.logger.debug do
26
+ "Encoding profile covering #{flush.start.iso8601} to #{flush.finish.iso8601}, " \
27
+ "events: #{flush.event_count} (#{template.debug_statistics})"
28
+ end
29
+
24
30
  # Build the profile and encode it
25
31
  template.to_pprof
26
32
  end
@@ -24,8 +24,8 @@ module Datadog
24
24
  # Applying CThread to Thread will ensure any new threads
25
25
  # will provide a thread/clock ID for CPU timing.
26
26
  require 'ddtrace/profiling/ext/cthread'
27
- ::Thread.send(:prepend, Profiling::Ext::CThread)
28
- ::Thread.singleton_class.send(:prepend, Datadog::Profiling::Ext::WrapThreadStartFork)
27
+ ::Thread.prepend(Profiling::Ext::CThread)
28
+ ::Thread.singleton_class.prepend(Datadog::Profiling::Ext::WrapThreadStartFork)
29
29
  end
30
30
 
31
31
  def self.unsupported_reason
@@ -16,9 +16,9 @@ module Datadog
16
16
  attach_function :pthread_getcpuclockid, [:ulong, CClockId], :int
17
17
 
18
18
  # NOTE: Only returns thread ID for thread that evaluates this call.
19
- # a.k.a. evaluating `get_native_thread_id(thread_a)` from within
19
+ # a.k.a. evaluating `get_pthread_thread_id(thread_a)` from within
20
20
  # `thread_b` will return `thread_b`'s thread ID, not `thread_a`'s.
21
- def self.get_native_thread_id(thread)
21
+ def self.get_pthread_thread_id(thread)
22
22
  return unless ::Thread.current == thread
23
23
 
24
24
  pthread_self
@@ -65,16 +65,16 @@ module Datadog
65
65
  # it looks like there's some lazily-created structure that is missing and did not get created).
66
66
  if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.3') &&
67
67
  Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7')
68
- attr_reader :native_thread_id
68
+ attr_reader :pthread_thread_id
69
69
  else
70
- def native_thread_id
71
- defined?(@native_thread_id) && @native_thread_id
70
+ def pthread_thread_id
71
+ defined?(@pthread_thread_id) && @pthread_thread_id
72
72
  end
73
73
  end
74
74
 
75
75
  def initialize(*args)
76
76
  @pid = ::Process.pid
77
- @native_thread_id = nil
77
+ @pthread_thread_id = nil
78
78
  @clock_id = nil
79
79
 
80
80
  # Wrap the work block with our own
@@ -91,9 +91,7 @@ module Datadog
91
91
  ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
92
92
 
93
93
  def cpu_time(unit = :float_second)
94
- return unless clock_id && ::Process.respond_to?(:clock_gettime)
95
-
96
- ::Process.clock_gettime(clock_id, unit)
94
+ ::Process.clock_gettime(clock_id, unit) if clock_id
97
95
  end
98
96
 
99
97
  def cpu_time_instrumentation_installed?
@@ -122,8 +120,8 @@ module Datadog
122
120
  return unless ::Thread.current == self
123
121
 
124
122
  @pid = ::Process.pid
125
- @native_thread_id = NativePthread.get_native_thread_id(self)
126
- @clock_id = NativePthread.get_clock_id(self, @native_thread_id)
123
+ @pthread_thread_id = NativePthread.get_pthread_thread_id(self)
124
+ @clock_id = NativePthread.get_clock_id(self, @pthread_thread_id)
127
125
  end
128
126
  end
129
127
 
@@ -24,13 +24,13 @@ module Datadog
24
24
  # It could also have collisions with other libraries that patch.
25
25
  # Opt to modify the inheritance of each relevant target instead.
26
26
  modules.each do |mod|
27
- if mod.class <= Module
28
- mod.singleton_class.class_eval do
29
- prepend Kernel
30
- end
31
- else
32
- mod.class.send(:prepend, Kernel)
33
- end
27
+ clazz = if mod.class <= Module
28
+ mod.singleton_class
29
+ else
30
+ mod.class
31
+ end
32
+
33
+ clazz.prepend(Kernel)
34
34
  end
35
35
  end
36
36
 
@@ -18,7 +18,8 @@ module Datadog
18
18
  :runtime_engine,
19
19
  :runtime_platform,
20
20
  :runtime_version,
21
- :profiler_version
21
+ :profiler_version,
22
+ :tags
22
23
  ) do
23
24
  def initialize(*args)
24
25
  super
@@ -32,6 +33,7 @@ module Datadog
32
33
  self.runtime_platform = runtime_platform || Datadog::Runtime::Identity.lang_platform
33
34
  self.runtime_version = runtime_version || Datadog::Runtime::Identity.lang_version
34
35
  self.profiler_version = profiler_version || Datadog::Runtime::Identity.tracer_version
36
+ self.tags = tags || Datadog.configuration.tags
35
37
  end
36
38
  end
37
39
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ddtrace/profiling/flush'
2
4
  require 'ddtrace/profiling/pprof/message_set'
3
5
  require 'ddtrace/profiling/pprof/string_table'
@@ -7,9 +9,9 @@ module Datadog
7
9
  module Pprof
8
10
  # Accumulates profile data and produces a Perftools::Profiles::Profile
9
11
  class Builder
10
- DEFAULT_ENCODING = 'UTF-8'.freeze
11
- DESC_FRAME_OMITTED = 'frame omitted'.freeze
12
- DESC_FRAMES_OMITTED = 'frames omitted'.freeze
12
+ DEFAULT_ENCODING = 'UTF-8'
13
+ DESC_FRAME_OMITTED = 'frame omitted'
14
+ DESC_FRAMES_OMITTED = 'frames omitted'
13
15
 
14
16
  attr_reader \
15
17
  :functions,
@@ -21,11 +23,23 @@ module Datadog
21
23
 
22
24
  def initialize
23
25
  @functions = MessageSet.new(1)
24
- @locations = MessageSet.new(1)
26
+ @locations = initialize_locations_hash
25
27
  @mappings = MessageSet.new(1)
26
28
  @sample_types = MessageSet.new
27
29
  @samples = []
28
30
  @string_table = StringTable.new
31
+
32
+ # Cache this proc, since it's pretty expensive to keep recreating it
33
+ @build_function = method(:build_function).to_proc
34
+ end
35
+
36
+ # The locations hash maps unique BacktraceLocation instances to their corresponding pprof Location objects;
37
+ # there's a 1:1 correspondence, since BacktraceLocations were already deduped
38
+ def initialize_locations_hash
39
+ sequence = Utils::Sequence.new(1)
40
+ Hash.new do |locations_hash, backtrace_location|
41
+ locations_hash[backtrace_location] = build_location(sequence.next, backtrace_location)
42
+ end
29
43
  end
30
44
 
31
45
  def encode_profile(profile)
@@ -37,7 +51,7 @@ module Datadog
37
51
  sample_type: @sample_types.messages,
38
52
  sample: @samples,
39
53
  mapping: @mappings.messages,
40
- location: @locations.messages,
54
+ location: @locations.values,
41
55
  function: @functions.messages,
42
56
  string_table: @string_table.strings
43
57
  )
@@ -51,45 +65,29 @@ module Datadog
51
65
  end
52
66
 
53
67
  def build_locations(backtrace_locations, length)
54
- locations = backtrace_locations.collect do |backtrace_location|
55
- @locations.fetch(
56
- # Filename
57
- backtrace_location.path,
58
- # Line number
59
- backtrace_location.lineno,
60
- # Function name
61
- backtrace_location.base_label,
62
- # Build function
63
- &method(:build_location)
64
- )
65
- end
68
+ locations = backtrace_locations.collect { |backtrace_location| @locations[backtrace_location] }
66
69
 
67
70
  omitted = length - backtrace_locations.length
68
71
 
69
72
  # Add placeholder stack frame if frames were truncated
70
73
  if omitted > 0
71
74
  desc = omitted == 1 ? DESC_FRAME_OMITTED : DESC_FRAMES_OMITTED
72
- locations << @locations.fetch(
73
- ''.freeze,
74
- 0,
75
- "#{omitted} #{desc}",
76
- &method(:build_location)
77
- )
75
+ locations << @locations[Profiling::BacktraceLocation.new('', 0, "#{omitted} #{desc}")]
78
76
  end
79
77
 
80
78
  locations
81
79
  end
82
80
 
83
- def build_location(id, filename, line_number, function_name = nil)
81
+ def build_location(id, backtrace_location)
84
82
  Perftools::Profiles::Location.new(
85
83
  id: id,
86
84
  line: [build_line(
87
85
  @functions.fetch(
88
- filename,
89
- function_name,
90
- &method(:build_function)
86
+ backtrace_location.path,
87
+ backtrace_location.base_label,
88
+ &@build_function
91
89
  ).id,
92
- line_number
90
+ backtrace_location.lineno
93
91
  )]
94
92
  )
95
93
  end