ddtrace 0.49.0 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
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