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
@@ -0,0 +1,10 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ # Defines constants for test tags
5
+ module Settings
6
+ ENV_MODE_ENABLED = 'DD_TRACE_CI_MODE_ENABLED'.freeze
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ # Defines constants for test tags
5
+ module Test
6
+ CONTEXT_ORIGIN = 'ciapp-test'.freeze
7
+
8
+ TAG_ARGUMENTS = 'test.arguments'.freeze
9
+ TAG_FRAMEWORK = 'test.framework'.freeze
10
+ TAG_NAME = 'test.name'.freeze
11
+ TAG_SKIP_REASON = 'test.skip_reason'.freeze
12
+ TAG_STATUS = 'test.status'.freeze
13
+ TAG_SUITE = 'test.suite'.freeze
14
+ TAG_TRAITS = 'test.traits'.freeze
15
+ TAG_TYPE = 'test.type'.freeze
16
+
17
+ # TODO: is there a better place for SPAN_KIND?
18
+ TAG_SPAN_KIND = 'span.kind'.freeze
19
+
20
+ module Status
21
+ PASS = 'pass'.freeze
22
+ FAIL = 'fail'.freeze
23
+ SKIP = 'skip'.freeze
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ require 'ddtrace/configuration/settings'
2
+ require 'ddtrace/configuration/components'
3
+
4
+ require 'datadog/ci/configuration/settings'
5
+ require 'datadog/ci/configuration/components'
6
+
7
+ module Datadog
8
+ module CI
9
+ # Extends Datadog tracing with CI features
10
+ module Extensions
11
+ def self.activate!
12
+ Datadog::Configuration::Settings.extend(CI::Configuration::Settings)
13
+ Datadog::Configuration::Components.prepend(CI::Configuration::Components)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,63 @@
1
+ require 'ddtrace/contrib/analytics'
2
+
3
+ require 'datadog/ci/ext/app_types'
4
+ require 'datadog/ci/ext/test'
5
+
6
+ module Datadog
7
+ module CI
8
+ # Common behavior for CI tests
9
+ module Test
10
+ # Creates a new span for a CI test
11
+ def self.trace(tracer, span_name, options = {})
12
+ span_options = {
13
+ span_type: Ext::AppTypes::TEST
14
+ }.merge(options[:span_options] || {})
15
+
16
+ if block_given?
17
+ tracer.trace(span_name, span_options) do |span|
18
+ set_tags!(span, options)
19
+ yield(span)
20
+ end
21
+ else
22
+ span = tracer.trace(span_name, span_options)
23
+ set_tags!(span, options)
24
+ span
25
+ end
26
+ end
27
+
28
+ # Adds tags to a CI test span.
29
+ def self.set_tags!(span, tags = {})
30
+ tags ||= {}
31
+
32
+ # Set default tags
33
+ span.context.origin = Ext::Test::CONTEXT_ORIGIN if span.context
34
+ Datadog::Contrib::Analytics.set_measured(span)
35
+ span.set_tag(Ext::Test::TAG_SPAN_KIND, Ext::AppTypes::TEST)
36
+ Ext::Environment.tags(ENV).each { |k, v| span.set_tag(k, v) }
37
+
38
+ # Set contextual tags
39
+ span.set_tag(Ext::Test::TAG_FRAMEWORK, tags[:framework]) if tags[:framework]
40
+ span.set_tag(Ext::Test::TAG_NAME, tags[:test_name]) if tags[:test_name]
41
+ span.set_tag(Ext::Test::TAG_SUITE, tags[:test_suite]) if tags[:test_suite]
42
+ span.set_tag(Ext::Test::TAG_TYPE, tags[:test_type]) if tags[:test_type]
43
+
44
+ span
45
+ end
46
+
47
+ def self.passed!(span)
48
+ span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::PASS)
49
+ end
50
+
51
+ def self.failed!(span, exception = nil)
52
+ span.status = 1
53
+ span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::FAIL)
54
+ span.set_error(exception) unless exception.nil?
55
+ end
56
+
57
+ def self.skipped!(span, exception = nil)
58
+ span.set_tag(Ext::Test::TAG_STATUS, Ext::Test::Status::SKIP)
59
+ span.set_error(exception) unless exception.nil?
60
+ end
61
+ end
62
+ end
63
+ end
data/lib/ddtrace.rb CHANGED
@@ -48,7 +48,6 @@ require 'ddtrace/contrib/active_record/integration'
48
48
  require 'ddtrace/contrib/active_support/integration'
49
49
  require 'ddtrace/contrib/aws/integration'
50
50
  require 'ddtrace/contrib/concurrent_ruby/integration'
51
- require 'ddtrace/contrib/cucumber/integration'
52
51
  require 'ddtrace/contrib/dalli/integration'
53
52
  require 'ddtrace/contrib/delayed_job/integration'
54
53
  require 'ddtrace/contrib/elasticsearch/integration'
@@ -75,7 +74,6 @@ require 'ddtrace/contrib/rake/integration'
75
74
  require 'ddtrace/contrib/redis/integration'
76
75
  require 'ddtrace/contrib/resque/integration'
77
76
  require 'ddtrace/contrib/rest_client/integration'
78
- require 'ddtrace/contrib/rspec/integration'
79
77
  require 'ddtrace/contrib/sequel/integration'
80
78
  require 'ddtrace/contrib/shoryuken/integration'
81
79
  require 'ddtrace/contrib/sidekiq/integration'
@@ -2,11 +2,10 @@ require 'forwardable'
2
2
  require 'ddtrace/configuration/pin_setup'
3
3
  require 'ddtrace/configuration/settings'
4
4
  require 'ddtrace/configuration/components'
5
- require 'ddtrace/utils/only_once'
6
5
 
7
6
  module Datadog
8
7
  # Configuration provides a unique access point for configurations
9
- module Configuration # rubocop:disable Metrics/ModuleLength
8
+ module Configuration
10
9
  extend Forwardable
11
10
 
12
11
  # Used to ensure that @components initialization/reconfiguration is performed one-at-a-time, by a single thread.
@@ -43,8 +42,6 @@ module Datadog
43
42
  end
44
43
 
45
44
  def configure(target = configuration, opts = {})
46
- ruby_version_deprecation_warning
47
-
48
45
  if target.is_a?(Settings)
49
46
  yield(target) if block_given?
50
47
 
@@ -175,24 +172,5 @@ module Datadog
175
172
  logger
176
173
  end
177
174
  end
178
-
179
- # Perform version check only once
180
- DEPRECATED_RUBY_VERSION = Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.1')
181
- private_constant :DEPRECATED_RUBY_VERSION
182
-
183
- RUBY_VERSION_DEPRECATION_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
184
- private_constant :RUBY_VERSION_DEPRECATION_ONLY_ONCE
185
-
186
- def ruby_version_deprecation_warning
187
- return unless DEPRECATED_RUBY_VERSION
188
-
189
- RUBY_VERSION_DEPRECATION_ONLY_ONCE.run do
190
- Datadog.logger.warn(
191
- "Support for Ruby versions < 2.1 in dd-trace-rb is DEPRECATED.\n" \
192
- "Last version to support Ruby < 2.1 will be 0.49.x, which will only receive critical bugfixes.\n" \
193
- 'Support for Ruby versions < 2.1 will be REMOVED in version 0.50.0.'
194
- )
195
- end
196
- end
197
175
  end
198
176
  end
@@ -27,15 +27,12 @@ module Datadog
27
27
  :deprecated_for_removal_transport_configuration_options
28
28
  ) do
29
29
  def initialize(
30
- # Hacky required kw args, we can get rid of this when we drop Ruby 2.0
31
- ssl: raise(ArgumentError, 'missing keyword :ssl'),
32
- hostname: raise(ArgumentError, 'missing keyword :hostname'),
33
- port: raise(ArgumentError, 'missing keyword :port'),
34
- timeout_seconds: raise(ArgumentError, 'missing keyword :timeout_seconds'),
35
- deprecated_for_removal_transport_configuration_proc: \
36
- raise(ArgumentError, 'missing keyword :deprecated_for_removal_transport_configuration_proc'),
37
- deprecated_for_removal_transport_configuration_options: \
38
- raise(ArgumentError, 'missing keyword :deprecated_for_removal_transport_configuration_options')
30
+ ssl:,
31
+ hostname:,
32
+ port:,
33
+ timeout_seconds:,
34
+ deprecated_for_removal_transport_configuration_proc:,
35
+ deprecated_for_removal_transport_configuration_options:
39
36
  )
40
37
  super(ssl, hostname, port, timeout_seconds, deprecated_for_removal_transport_configuration_proc, \
41
38
  deprecated_for_removal_transport_configuration_options)
@@ -179,11 +176,7 @@ module Datadog
179
176
  @unparsed_url_from_env ||= ENV[Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL]
180
177
  end
181
178
 
182
- def pick_from(
183
- # Hacky required kw args, we can get rid of this when we drop Ruby 2.0
184
- configurations_in_priority_order: raise(ArgumentError, 'missing keyword :configurations'),
185
- or_use_default: raise(ArgumentError, 'missing keyword :or_use_default')
186
- )
179
+ def pick_from(configurations_in_priority_order:, or_use_default:)
187
180
  detected_configurations_in_priority_order = configurations_in_priority_order.select(&:value?)
188
181
 
189
182
  if detected_configurations_in_priority_order.any?
@@ -213,11 +206,7 @@ module Datadog
213
206
  end
214
207
 
215
208
  DetectedConfiguration = Struct.new(:friendly_name, :value) do
216
- def initialize(
217
- # Hacky required kw args, we can get rid of this when we drop Ruby 2.0
218
- friendly_name: raise(ArgumentError, 'missing keyword :friendly_name'),
219
- value: raise(ArgumentError, 'missing keyword :value')
220
- )
209
+ def initialize(friendly_name:, value:)
221
210
  super(friendly_name, value)
222
211
  freeze
223
212
  end
@@ -6,12 +6,12 @@ module Datadog
6
6
  # Basic configuration behavior
7
7
  module Base
8
8
  def self.included(base)
9
- base.send(:extend, Datadog::Environment::Helpers)
10
- base.send(:include, Datadog::Environment::Helpers)
11
- base.send(:include, Options)
9
+ base.extend(Datadog::Environment::Helpers)
10
+ base.include(Datadog::Environment::Helpers)
11
+ base.include(Options)
12
12
 
13
- base.send(:extend, ClassMethods)
14
- base.send(:include, InstanceMethods)
13
+ base.extend(ClassMethods)
14
+ base.include(InstanceMethods)
15
15
  end
16
16
 
17
17
  # Class methods for configuration
@@ -53,10 +53,7 @@ module Datadog
53
53
  ordering = self.class.options.dependency_order
54
54
  sorted_opts = opts.sort_by do |name, _value|
55
55
  ordering.index(name) || (ordering.length + 1)
56
- end
57
-
58
- # Ruby 2.0 doesn't support Array#to_h
59
- sorted_opts = Hash[*sorted_opts.flatten]
56
+ end.to_h
60
57
 
61
58
  # Apply options in sort order
62
59
  sorted_opts.each do |name, value|
@@ -4,11 +4,13 @@ require 'ddtrace/logger'
4
4
  require 'ddtrace/profiling'
5
5
  require 'ddtrace/runtime/metrics'
6
6
  require 'ddtrace/tracer'
7
+ require 'ddtrace/sync_writer'
7
8
  require 'ddtrace/workers/runtime_metrics'
8
9
 
9
10
  module Datadog
10
11
  module Configuration
11
12
  # Global components for the trace library.
13
+ # rubocop:disable Metrics/ClassLength
12
14
  # rubocop:disable Layout/LineLength
13
15
  class Components
14
16
  class << self
@@ -63,7 +65,7 @@ module Datadog
63
65
  # tracer initialization for now. Just reconfigure using the
64
66
  # existing mutable #configure function. Remove when these components
65
67
  # are extracted.
66
- tracer.configure(agent_settings: agent_settings, **build_tracer_options(settings))
68
+ tracer.configure(agent_settings: agent_settings, **build_tracer_options(settings, agent_settings))
67
69
 
68
70
  tracer
69
71
  end
@@ -93,16 +95,37 @@ module Datadog
93
95
  end
94
96
  end
95
97
 
96
- def build_tracer_options(settings)
97
- settings = settings.tracer
98
+ def build_tracer_options(settings, agent_settings)
99
+ tracer_options = {}.tap do |opts|
100
+ tset = settings.tracer
101
+ opts[:min_spans_before_partial_flush] = tset.partial_flush.min_spans_threshold unless tset.partial_flush.min_spans_threshold.nil?
102
+ opts[:partial_flush] = tset.partial_flush.enabled unless tset.partial_flush.enabled.nil?
103
+ opts[:priority_sampling] = tset.priority_sampling unless tset.priority_sampling.nil?
104
+ opts[:sampler] = tset.sampler unless tset.sampler.nil?
105
+ opts[:writer] = tset.writer unless tset.writer.nil?
106
+ opts[:writer_options] = tset.writer_options if tset.writer.nil?
107
+ end
108
+
109
+ # Apply test mode settings if test mode is activated
110
+ if settings.test_mode.enabled
111
+ build_tracer_test_mode_options(tracer_options, settings, agent_settings)
112
+ else
113
+ tracer_options
114
+ end
115
+ end
116
+
117
+ def build_tracer_test_mode_options(tracer_options, settings, agent_settings)
118
+ tracer_options.tap do |opts|
119
+ # Do not sample any spans for tests; all must be preserved.
120
+ opts[:sampler] = Datadog::AllSampler.new
121
+
122
+ # If context flush behavior is provided, use it instead.
123
+ opts[:context_flush] = settings.test_mode.context_flush if settings.test_mode.context_flush
98
124
 
99
- {}.tap do |opts|
100
- opts[:min_spans_before_partial_flush] = settings.partial_flush.min_spans_threshold unless settings.partial_flush.min_spans_threshold.nil?
101
- opts[:partial_flush] = settings.partial_flush.enabled unless settings.partial_flush.enabled.nil?
102
- opts[:priority_sampling] = settings.priority_sampling unless settings.priority_sampling.nil?
103
- opts[:sampler] = settings.sampler unless settings.sampler.nil?
104
- opts[:writer] = settings.writer unless settings.writer.nil?
105
- opts[:writer_options] = settings.writer_options if settings.writer.nil?
125
+ # Flush traces synchronously, to guarantee they are written.
126
+ writer_options = settings.test_mode.writer_options || {}
127
+ writer_options[:agent_settings] = agent_settings if agent_settings
128
+ opts[:writer] = Datadog::SyncWriter.new(writer_options)
106
129
  end
107
130
  end
108
131
 
@@ -7,8 +7,8 @@ module Datadog
7
7
  # Behavior for a configuration object that has options
8
8
  module Options
9
9
  def self.included(base)
10
- base.send(:extend, ClassMethods)
11
- base.send(:include, InstanceMethods)
10
+ base.extend(ClassMethods)
11
+ base.include(InstanceMethods)
12
12
  end
13
13
 
14
14
  # Class behavior for a configuration object with options
@@ -6,6 +6,7 @@ require 'ddtrace/ext/distributed'
6
6
  require 'ddtrace/ext/profiling'
7
7
  require 'ddtrace/ext/runtime'
8
8
  require 'ddtrace/ext/sampling'
9
+ require 'ddtrace/ext/test'
9
10
 
10
11
  module Datadog
11
12
  module Configuration
@@ -14,6 +15,32 @@ module Datadog
14
15
  class Settings
15
16
  include Base
16
17
 
18
+ def initialize(*_)
19
+ super
20
+
21
+ # WORKAROUND: The values for services, version, and env can get set either directly OR as a side effect of
22
+ # accessing tags (reading or writing). This is of course really confusing and error-prone, e.g. in an app
23
+ # WITHOUT this workaround where you define `DD_TAGS=env:envenvtag,service:envservicetag,version:envversiontag`
24
+ # and do:
25
+ #
26
+ # puts Datadog.configuration.instance_exec { "#{service} #{env} #{version}" }
27
+ # Datadog.configuration.tags
28
+ # puts Datadog.configuration.instance_exec { "#{service} #{env} #{version}" }
29
+ #
30
+ # the output will be:
31
+ #
32
+ # [empty]
33
+ # envservicetag envenvtag envversiontag
34
+ #
35
+ # That is -- the proper values for service/env/version are only set AFTER something accidentally or not triggers
36
+ # the resolution of the tags.
37
+ # This is really confusing, error prone, etc, so calling tags here is a really hacky but effective way to
38
+ # avoid this. I could not think of a better way of fixing this issue without massive refactoring of tags parsing
39
+ # (so that the individual service/env/version get correctly set even from their tags values, not as a side
40
+ # effect). Sorry :(
41
+ tags
42
+ end
43
+
17
44
  settings :analytics do
18
45
  option :enabled do |o|
19
46
  o.default { env_to_bool(Ext::Analytics::ENV_TRACE_ANALYTICS_ENABLED, nil) }
@@ -90,6 +117,7 @@ module Datadog
90
117
  end
91
118
 
92
119
  option :env do |o|
120
+ # NOTE: env also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
93
121
  o.default { ENV.fetch(Ext::Environment::ENV_ENVIRONMENT, nil) }
94
122
  o.lazy
95
123
  end
@@ -197,6 +225,7 @@ module Datadog
197
225
  end
198
226
 
199
227
  option :service do |o|
228
+ # NOTE: service also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
200
229
  o.default { ENV.fetch(Ext::Environment::ENV_SERVICE, nil) }
201
230
  o.lazy
202
231
  end
@@ -225,9 +254,10 @@ module Datadog
225
254
 
226
255
  o.setter do |new_value, old_value|
227
256
  # Coerce keys to strings
228
- string_tags = Hash[new_value.collect { |k, v| [k.to_s, v] }]
257
+ string_tags = new_value.collect { |k, v| [k.to_s, v] }.to_h
229
258
 
230
259
  # Cross-populate tag values with other settings
260
+
231
261
  self.env = string_tags[Ext::Environment::TAG_ENV] if env.nil? && string_tags.key?(Ext::Environment::TAG_ENV)
232
262
 
233
263
  if version.nil? && string_tags.key?(Ext::Environment::TAG_VERSION)
@@ -245,6 +275,23 @@ module Datadog
245
275
  o.lazy
246
276
  end
247
277
 
278
+ settings :test_mode do
279
+ option :enabled do |o|
280
+ o.default { env_to_bool(Ext::Test::ENV_MODE_ENABLED, false) }
281
+ o.lazy
282
+ end
283
+
284
+ option :context_flush do |o|
285
+ o.default { nil }
286
+ o.lazy
287
+ end
288
+
289
+ option :writer_options do |o|
290
+ o.default { {} }
291
+ o.lazy
292
+ end
293
+ end
294
+
248
295
  option :time_now_provider do |o|
249
296
  o.default { ::Time.now }
250
297
 
@@ -332,6 +379,7 @@ module Datadog
332
379
  end
333
380
 
334
381
  option :version do |o|
382
+ # NOTE: version also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
335
383
  o.default { ENV.fetch(Ext::Environment::ENV_VERSION, nil) }
336
384
  o.lazy
337
385
  end