ddtrace 0.48.0 → 0.51.1

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 (656) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +250 -68
  3. data/.circleci/images/primary/Dockerfile-2.1.10 +1 -1
  4. data/.circleci/images/primary/Dockerfile-2.2.10 +1 -1
  5. data/.circleci/images/primary/Dockerfile-2.3.8 +4 -2
  6. data/.circleci/images/primary/{Dockerfile-2.6.4 → Dockerfile-2.4.10} +5 -3
  7. data/.circleci/images/primary/{Dockerfile-2.4.6 → Dockerfile-2.5.9} +3 -3
  8. data/.circleci/images/primary/{Dockerfile-2.5.6 → Dockerfile-2.6.7} +3 -3
  9. data/.circleci/images/primary/{Dockerfile-2.7.0 → Dockerfile-2.7.3} +3 -3
  10. data/.circleci/images/primary/{Dockerfile-3.0.0 → Dockerfile-3.0.1} +3 -3
  11. data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +3 -3
  12. data/.circleci/images/primary/Dockerfile-jruby-9.2.0.0 +1 -1
  13. data/.circleci/images/primary/{Dockerfile-truffleruby-21.0.0 → Dockerfile-truffleruby-21.1.0} +2 -2
  14. data/.dd-ci/ci-app-spec.json +31 -0
  15. data/.dockerignore +0 -1
  16. data/.gitattributes +1 -0
  17. data/.github/workflows/test-head.yaml +34 -0
  18. data/.gitignore +0 -1
  19. data/.rubocop.yml +13 -9
  20. data/.rubocop_todo.yml +7 -8
  21. data/Appraisals +206 -182
  22. data/CHANGELOG.md +154 -0
  23. data/Gemfile +6 -3
  24. data/Rakefile +331 -333
  25. data/benchmarks/data/profiler-submission-marshal.gz +0 -0
  26. data/benchmarks/profiler_sample_loop.rb +69 -0
  27. data/benchmarks/profiler_submission.rb +93 -0
  28. data/ddtrace.gemspec +2 -2
  29. data/docker-compose.yml +14 -68
  30. data/docs/GettingStarted.md +59 -13
  31. data/gemfiles/jruby_9.2.0.0_contrib.gemfile +82 -0
  32. data/gemfiles/jruby_9.2.0.0_contrib.gemfile.lock +1571 -0
  33. data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile +36 -0
  34. data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile.lock +159 -0
  35. data/gemfiles/jruby_9.2.0.0_core_old.gemfile +35 -0
  36. data/gemfiles/jruby_9.2.0.0_core_old.gemfile.lock +155 -0
  37. data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile +36 -0
  38. data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile.lock +176 -0
  39. data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile +36 -0
  40. data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile.lock +208 -0
  41. data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile +36 -0
  42. data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile.lock +208 -0
  43. data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile +41 -0
  44. data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile.lock +273 -0
  45. data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile +41 -0
  46. data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile.lock +273 -0
  47. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile +42 -0
  48. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile.lock +275 -0
  49. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile +42 -0
  50. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile.lock +275 -0
  51. data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile +43 -0
  52. data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile.lock +281 -0
  53. data/gemfiles/jruby_9.2.0.0_rails5_semantic_logger.gemfile +41 -0
  54. data/gemfiles/jruby_9.2.0.0_rails5_semantic_logger.gemfile.lock +272 -0
  55. data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile +41 -0
  56. data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile.lock +292 -0
  57. data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile +41 -0
  58. data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile.lock +292 -0
  59. data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile +42 -0
  60. data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile.lock +294 -0
  61. data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile +42 -0
  62. data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile.lock +299 -0
  63. data/gemfiles/jruby_9.2.0.0_rails61_semantic_logger.gemfile +41 -0
  64. data/gemfiles/jruby_9.2.0.0_rails61_semantic_logger.gemfile.lock +291 -0
  65. data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile +41 -0
  66. data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile.lock +289 -0
  67. data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile +41 -0
  68. data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile.lock +289 -0
  69. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile +42 -0
  70. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile.lock +291 -0
  71. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile +42 -0
  72. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile.lock +291 -0
  73. data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile +43 -0
  74. data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile.lock +297 -0
  75. data/gemfiles/jruby_9.2.0.0_rails6_semantic_logger.gemfile +41 -0
  76. data/gemfiles/jruby_9.2.0.0_rails6_semantic_logger.gemfile.lock +288 -0
  77. data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile +37 -0
  78. data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile.lock +182 -0
  79. data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile +37 -0
  80. data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile.lock +182 -0
  81. data/gemfiles/jruby_9.2.18.0_contrib.gemfile +82 -0
  82. data/gemfiles/jruby_9.2.18.0_contrib.gemfile.lock +1571 -0
  83. data/gemfiles/jruby_9.2.18.0_contrib_old.gemfile +36 -0
  84. data/gemfiles/jruby_9.2.18.0_contrib_old.gemfile.lock +159 -0
  85. data/gemfiles/jruby_9.2.18.0_core_old.gemfile +35 -0
  86. data/gemfiles/jruby_9.2.18.0_core_old.gemfile.lock +155 -0
  87. data/gemfiles/jruby_9.2.18.0_cucumber3.gemfile +36 -0
  88. data/gemfiles/jruby_9.2.18.0_cucumber3.gemfile.lock +176 -0
  89. data/gemfiles/jruby_9.2.18.0_cucumber4.gemfile +36 -0
  90. data/gemfiles/jruby_9.2.18.0_cucumber4.gemfile.lock +208 -0
  91. data/gemfiles/jruby_9.2.18.0_cucumber5.gemfile +36 -0
  92. data/gemfiles/jruby_9.2.18.0_cucumber5.gemfile.lock +208 -0
  93. data/gemfiles/jruby_9.2.18.0_rails5_mysql2.gemfile +41 -0
  94. data/gemfiles/jruby_9.2.18.0_rails5_mysql2.gemfile.lock +273 -0
  95. data/gemfiles/jruby_9.2.18.0_rails5_postgres.gemfile +41 -0
  96. data/gemfiles/jruby_9.2.18.0_rails5_postgres.gemfile.lock +273 -0
  97. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis.gemfile +42 -0
  98. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis.gemfile.lock +275 -0
  99. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis_activesupport.gemfile +42 -0
  100. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis_activesupport.gemfile.lock +275 -0
  101. data/gemfiles/jruby_9.2.18.0_rails5_postgres_sidekiq.gemfile +43 -0
  102. data/gemfiles/jruby_9.2.18.0_rails5_postgres_sidekiq.gemfile.lock +281 -0
  103. data/gemfiles/jruby_9.2.18.0_rails5_semantic_logger.gemfile +41 -0
  104. data/gemfiles/jruby_9.2.18.0_rails5_semantic_logger.gemfile.lock +272 -0
  105. data/gemfiles/jruby_9.2.18.0_rails61_mysql2.gemfile +41 -0
  106. data/gemfiles/jruby_9.2.18.0_rails61_mysql2.gemfile.lock +292 -0
  107. data/gemfiles/jruby_9.2.18.0_rails61_postgres.gemfile +41 -0
  108. data/gemfiles/jruby_9.2.18.0_rails61_postgres.gemfile.lock +292 -0
  109. data/gemfiles/jruby_9.2.18.0_rails61_postgres_redis.gemfile +42 -0
  110. data/gemfiles/jruby_9.2.18.0_rails61_postgres_redis.gemfile.lock +294 -0
  111. data/gemfiles/jruby_9.2.18.0_rails61_postgres_sidekiq.gemfile +42 -0
  112. data/gemfiles/jruby_9.2.18.0_rails61_postgres_sidekiq.gemfile.lock +299 -0
  113. data/gemfiles/jruby_9.2.18.0_rails61_semantic_logger.gemfile +41 -0
  114. data/gemfiles/jruby_9.2.18.0_rails61_semantic_logger.gemfile.lock +291 -0
  115. data/gemfiles/jruby_9.2.18.0_rails6_mysql2.gemfile +41 -0
  116. data/gemfiles/jruby_9.2.18.0_rails6_mysql2.gemfile.lock +289 -0
  117. data/gemfiles/jruby_9.2.18.0_rails6_postgres.gemfile +41 -0
  118. data/gemfiles/jruby_9.2.18.0_rails6_postgres.gemfile.lock +289 -0
  119. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis.gemfile +42 -0
  120. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis.gemfile.lock +291 -0
  121. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis_activesupport.gemfile +42 -0
  122. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis_activesupport.gemfile.lock +291 -0
  123. data/gemfiles/jruby_9.2.18.0_rails6_postgres_sidekiq.gemfile +43 -0
  124. data/gemfiles/jruby_9.2.18.0_rails6_postgres_sidekiq.gemfile.lock +297 -0
  125. data/gemfiles/jruby_9.2.18.0_rails6_semantic_logger.gemfile +41 -0
  126. data/gemfiles/jruby_9.2.18.0_rails6_semantic_logger.gemfile.lock +288 -0
  127. data/gemfiles/jruby_9.2.18.0_resque2_redis3.gemfile +37 -0
  128. data/gemfiles/jruby_9.2.18.0_resque2_redis3.gemfile.lock +182 -0
  129. data/gemfiles/jruby_9.2.18.0_resque2_redis4.gemfile +37 -0
  130. data/gemfiles/jruby_9.2.18.0_resque2_redis4.gemfile.lock +182 -0
  131. data/gemfiles/ruby_2.1.10_contrib_old.gemfile +68 -0
  132. data/gemfiles/ruby_2.1.10_contrib_old.gemfile.lock +310 -0
  133. data/gemfiles/ruby_2.1.10_core_old.gemfile +34 -0
  134. data/gemfiles/ruby_2.1.10_core_old.gemfile.lock +120 -0
  135. data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile +39 -0
  136. data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile.lock +193 -0
  137. data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile +40 -0
  138. data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile.lock +202 -0
  139. data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile +42 -0
  140. data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock +212 -0
  141. data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile +39 -0
  142. data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock +201 -0
  143. data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile +41 -0
  144. data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock +220 -0
  145. data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile +40 -0
  146. data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock +210 -0
  147. data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile +39 -0
  148. data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock +220 -0
  149. data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile +39 -0
  150. data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock +220 -0
  151. data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile +41 -0
  152. data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock +239 -0
  153. data/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile +39 -0
  154. data/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock +218 -0
  155. data/gemfiles/ruby_2.2.10_contrib.gemfile +76 -0
  156. data/gemfiles/ruby_2.2.10_contrib.gemfile.lock +1499 -0
  157. data/gemfiles/ruby_2.2.10_core_old.gemfile +34 -0
  158. data/gemfiles/ruby_2.2.10_core_old.gemfile.lock +120 -0
  159. data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile +39 -0
  160. data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile.lock +193 -0
  161. data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile +40 -0
  162. data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile.lock +202 -0
  163. data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile +41 -0
  164. data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile.lock +209 -0
  165. data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile +39 -0
  166. data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile.lock +201 -0
  167. data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile +41 -0
  168. data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile.lock +220 -0
  169. data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile +40 -0
  170. data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile.lock +210 -0
  171. data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile +39 -0
  172. data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile.lock +220 -0
  173. data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile +39 -0
  174. data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile.lock +220 -0
  175. data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile +41 -0
  176. data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile.lock +239 -0
  177. data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile +41 -0
  178. data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile.lock +231 -0
  179. data/gemfiles/ruby_2.2.10_rails4_semantic_logger.gemfile +39 -0
  180. data/gemfiles/ruby_2.2.10_rails4_semantic_logger.gemfile.lock +218 -0
  181. data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile +39 -0
  182. data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile.lock +236 -0
  183. data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile +39 -0
  184. data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile.lock +236 -0
  185. data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile +40 -0
  186. data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile.lock +238 -0
  187. data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile +40 -0
  188. data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile.lock +238 -0
  189. data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile +41 -0
  190. data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile.lock +247 -0
  191. data/gemfiles/ruby_2.2.10_rails5_semantic_logger.gemfile +39 -0
  192. data/gemfiles/ruby_2.2.10_rails5_semantic_logger.gemfile.lock +234 -0
  193. data/gemfiles/ruby_2.3.8_contrib.gemfile +75 -0
  194. data/gemfiles/ruby_2.3.8_contrib.gemfile.lock +1508 -0
  195. data/gemfiles/ruby_2.3.8_contrib_old.gemfile +34 -0
  196. data/gemfiles/ruby_2.3.8_contrib_old.gemfile.lock +123 -0
  197. data/gemfiles/ruby_2.3.8_core_old.gemfile +33 -0
  198. data/gemfiles/ruby_2.3.8_core_old.gemfile.lock +119 -0
  199. data/gemfiles/ruby_2.3.8_cucumber3.gemfile +34 -0
  200. data/gemfiles/ruby_2.3.8_cucumber3.gemfile.lock +140 -0
  201. data/gemfiles/ruby_2.3.8_cucumber4.gemfile +34 -0
  202. data/gemfiles/ruby_2.3.8_cucumber4.gemfile.lock +170 -0
  203. data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile +38 -0
  204. data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile.lock +192 -0
  205. data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile +39 -0
  206. data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile.lock +201 -0
  207. data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile +40 -0
  208. data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile.lock +208 -0
  209. data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile +38 -0
  210. data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile.lock +200 -0
  211. data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile +40 -0
  212. data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile.lock +219 -0
  213. data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile +39 -0
  214. data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile.lock +209 -0
  215. data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile +38 -0
  216. data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile.lock +219 -0
  217. data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile +38 -0
  218. data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile.lock +219 -0
  219. data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile +40 -0
  220. data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile.lock +238 -0
  221. data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile +40 -0
  222. data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile.lock +230 -0
  223. data/gemfiles/ruby_2.3.8_rails4_semantic_logger.gemfile +38 -0
  224. data/gemfiles/ruby_2.3.8_rails4_semantic_logger.gemfile.lock +218 -0
  225. data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile +37 -0
  226. data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile.lock +230 -0
  227. data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile +37 -0
  228. data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile.lock +230 -0
  229. data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile +38 -0
  230. data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile.lock +232 -0
  231. data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile +38 -0
  232. data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile.lock +232 -0
  233. data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile +39 -0
  234. data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile.lock +241 -0
  235. data/gemfiles/ruby_2.3.8_rails5_semantic_logger.gemfile +37 -0
  236. data/gemfiles/ruby_2.3.8_rails5_semantic_logger.gemfile.lock +229 -0
  237. data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile +35 -0
  238. data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile.lock +146 -0
  239. data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile +35 -0
  240. data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile.lock +146 -0
  241. data/gemfiles/ruby_2.4.10_contrib.gemfile +81 -0
  242. data/gemfiles/ruby_2.4.10_contrib.gemfile.lock +1596 -0
  243. data/gemfiles/ruby_2.4.10_contrib_old.gemfile +39 -0
  244. data/gemfiles/ruby_2.4.10_contrib_old.gemfile.lock +157 -0
  245. data/gemfiles/ruby_2.4.10_core_old.gemfile +38 -0
  246. data/gemfiles/ruby_2.4.10_core_old.gemfile.lock +153 -0
  247. data/gemfiles/ruby_2.4.10_cucumber3.gemfile +39 -0
  248. data/gemfiles/ruby_2.4.10_cucumber3.gemfile.lock +174 -0
  249. data/gemfiles/ruby_2.4.10_cucumber4.gemfile +39 -0
  250. data/gemfiles/ruby_2.4.10_cucumber4.gemfile.lock +204 -0
  251. data/gemfiles/ruby_2.4.10_rails5_mysql2.gemfile +42 -0
  252. data/gemfiles/ruby_2.4.10_rails5_mysql2.gemfile.lock +264 -0
  253. data/gemfiles/ruby_2.4.10_rails5_postgres.gemfile +42 -0
  254. data/gemfiles/ruby_2.4.10_rails5_postgres.gemfile.lock +264 -0
  255. data/gemfiles/ruby_2.4.10_rails5_postgres_redis.gemfile +43 -0
  256. data/gemfiles/ruby_2.4.10_rails5_postgres_redis.gemfile.lock +266 -0
  257. data/gemfiles/ruby_2.4.10_rails5_postgres_redis_activesupport.gemfile +43 -0
  258. data/gemfiles/ruby_2.4.10_rails5_postgres_redis_activesupport.gemfile.lock +266 -0
  259. data/gemfiles/ruby_2.4.10_rails5_postgres_sidekiq.gemfile +44 -0
  260. data/gemfiles/ruby_2.4.10_rails5_postgres_sidekiq.gemfile.lock +275 -0
  261. data/gemfiles/ruby_2.4.10_rails5_semantic_logger.gemfile +42 -0
  262. data/gemfiles/ruby_2.4.10_rails5_semantic_logger.gemfile.lock +263 -0
  263. data/gemfiles/ruby_2.4.10_resque2_redis3.gemfile +40 -0
  264. data/gemfiles/ruby_2.4.10_resque2_redis3.gemfile.lock +180 -0
  265. data/gemfiles/ruby_2.4.10_resque2_redis4.gemfile +40 -0
  266. data/gemfiles/ruby_2.4.10_resque2_redis4.gemfile.lock +180 -0
  267. data/gemfiles/ruby_2.5.9_contrib.gemfile +86 -0
  268. data/gemfiles/ruby_2.5.9_contrib.gemfile.lock +1608 -0
  269. data/gemfiles/ruby_2.5.9_contrib_old.gemfile +40 -0
  270. data/gemfiles/ruby_2.5.9_contrib_old.gemfile.lock +167 -0
  271. data/gemfiles/ruby_2.5.9_core_old.gemfile +39 -0
  272. data/gemfiles/ruby_2.5.9_core_old.gemfile.lock +163 -0
  273. data/gemfiles/ruby_2.5.9_cucumber3.gemfile +40 -0
  274. data/gemfiles/ruby_2.5.9_cucumber3.gemfile.lock +184 -0
  275. data/gemfiles/ruby_2.5.9_cucumber4.gemfile +40 -0
  276. data/gemfiles/ruby_2.5.9_cucumber4.gemfile.lock +216 -0
  277. data/gemfiles/ruby_2.5.9_cucumber5.gemfile +40 -0
  278. data/gemfiles/ruby_2.5.9_cucumber5.gemfile.lock +216 -0
  279. data/gemfiles/ruby_2.5.9_rails5_mysql2.gemfile +45 -0
  280. data/gemfiles/ruby_2.5.9_rails5_mysql2.gemfile.lock +276 -0
  281. data/gemfiles/ruby_2.5.9_rails5_postgres.gemfile +45 -0
  282. data/gemfiles/ruby_2.5.9_rails5_postgres.gemfile.lock +276 -0
  283. data/gemfiles/ruby_2.5.9_rails5_postgres_redis.gemfile +46 -0
  284. data/gemfiles/ruby_2.5.9_rails5_postgres_redis.gemfile.lock +278 -0
  285. data/gemfiles/ruby_2.5.9_rails5_postgres_redis_activesupport.gemfile +46 -0
  286. data/gemfiles/ruby_2.5.9_rails5_postgres_redis_activesupport.gemfile.lock +278 -0
  287. data/gemfiles/ruby_2.5.9_rails5_postgres_sidekiq.gemfile +47 -0
  288. data/gemfiles/ruby_2.5.9_rails5_postgres_sidekiq.gemfile.lock +284 -0
  289. data/gemfiles/ruby_2.5.9_rails5_semantic_logger.gemfile +45 -0
  290. data/gemfiles/ruby_2.5.9_rails5_semantic_logger.gemfile.lock +275 -0
  291. data/gemfiles/ruby_2.5.9_rails61_mysql2.gemfile +45 -0
  292. data/gemfiles/ruby_2.5.9_rails61_mysql2.gemfile.lock +295 -0
  293. data/gemfiles/ruby_2.5.9_rails61_postgres.gemfile +45 -0
  294. data/gemfiles/ruby_2.5.9_rails61_postgres.gemfile.lock +295 -0
  295. data/gemfiles/ruby_2.5.9_rails61_postgres_redis.gemfile +46 -0
  296. data/gemfiles/ruby_2.5.9_rails61_postgres_redis.gemfile.lock +297 -0
  297. data/gemfiles/ruby_2.5.9_rails61_postgres_sidekiq.gemfile +46 -0
  298. data/gemfiles/ruby_2.5.9_rails61_postgres_sidekiq.gemfile.lock +302 -0
  299. data/gemfiles/ruby_2.5.9_rails61_semantic_logger.gemfile +45 -0
  300. data/gemfiles/ruby_2.5.9_rails61_semantic_logger.gemfile.lock +294 -0
  301. data/gemfiles/ruby_2.5.9_rails6_mysql2.gemfile +45 -0
  302. data/gemfiles/ruby_2.5.9_rails6_mysql2.gemfile.lock +292 -0
  303. data/gemfiles/ruby_2.5.9_rails6_postgres.gemfile +45 -0
  304. data/gemfiles/ruby_2.5.9_rails6_postgres.gemfile.lock +292 -0
  305. data/gemfiles/ruby_2.5.9_rails6_postgres_redis.gemfile +46 -0
  306. data/gemfiles/ruby_2.5.9_rails6_postgres_redis.gemfile.lock +294 -0
  307. data/gemfiles/ruby_2.5.9_rails6_postgres_redis_activesupport.gemfile +46 -0
  308. data/gemfiles/ruby_2.5.9_rails6_postgres_redis_activesupport.gemfile.lock +294 -0
  309. data/gemfiles/ruby_2.5.9_rails6_postgres_sidekiq.gemfile +47 -0
  310. data/gemfiles/ruby_2.5.9_rails6_postgres_sidekiq.gemfile.lock +300 -0
  311. data/gemfiles/ruby_2.5.9_rails6_semantic_logger.gemfile +45 -0
  312. data/gemfiles/ruby_2.5.9_rails6_semantic_logger.gemfile.lock +291 -0
  313. data/gemfiles/ruby_2.5.9_resque2_redis3.gemfile +41 -0
  314. data/gemfiles/ruby_2.5.9_resque2_redis3.gemfile.lock +190 -0
  315. data/gemfiles/ruby_2.5.9_resque2_redis4.gemfile +41 -0
  316. data/gemfiles/ruby_2.5.9_resque2_redis4.gemfile.lock +190 -0
  317. data/gemfiles/ruby_2.6.7_contrib.gemfile +82 -0
  318. data/gemfiles/ruby_2.6.7_contrib.gemfile.lock +1606 -0
  319. data/gemfiles/ruby_2.6.7_contrib_old.gemfile +40 -0
  320. data/gemfiles/ruby_2.6.7_contrib_old.gemfile.lock +169 -0
  321. data/gemfiles/ruby_2.6.7_core_old.gemfile +39 -0
  322. data/gemfiles/ruby_2.6.7_core_old.gemfile.lock +165 -0
  323. data/gemfiles/ruby_2.6.7_cucumber3.gemfile +40 -0
  324. data/gemfiles/ruby_2.6.7_cucumber3.gemfile.lock +186 -0
  325. data/gemfiles/ruby_2.6.7_cucumber4.gemfile +40 -0
  326. data/gemfiles/ruby_2.6.7_cucumber4.gemfile.lock +218 -0
  327. data/gemfiles/ruby_2.6.7_cucumber5.gemfile +40 -0
  328. data/gemfiles/ruby_2.6.7_cucumber5.gemfile.lock +218 -0
  329. data/gemfiles/ruby_2.6.7_rails5_mysql2.gemfile +43 -0
  330. data/gemfiles/ruby_2.6.7_rails5_mysql2.gemfile.lock +276 -0
  331. data/gemfiles/ruby_2.6.7_rails5_postgres.gemfile +43 -0
  332. data/gemfiles/ruby_2.6.7_rails5_postgres.gemfile.lock +276 -0
  333. data/gemfiles/ruby_2.6.7_rails5_postgres_redis.gemfile +44 -0
  334. data/gemfiles/ruby_2.6.7_rails5_postgres_redis.gemfile.lock +278 -0
  335. data/gemfiles/ruby_2.6.7_rails5_postgres_redis_activesupport.gemfile +44 -0
  336. data/gemfiles/ruby_2.6.7_rails5_postgres_redis_activesupport.gemfile.lock +278 -0
  337. data/gemfiles/ruby_2.6.7_rails5_postgres_sidekiq.gemfile +45 -0
  338. data/gemfiles/ruby_2.6.7_rails5_postgres_sidekiq.gemfile.lock +284 -0
  339. data/gemfiles/ruby_2.6.7_rails5_semantic_logger.gemfile +43 -0
  340. data/gemfiles/ruby_2.6.7_rails5_semantic_logger.gemfile.lock +275 -0
  341. data/gemfiles/ruby_2.6.7_rails61_mysql2.gemfile +43 -0
  342. data/gemfiles/ruby_2.6.7_rails61_mysql2.gemfile.lock +295 -0
  343. data/gemfiles/ruby_2.6.7_rails61_postgres.gemfile +43 -0
  344. data/gemfiles/ruby_2.6.7_rails61_postgres.gemfile.lock +295 -0
  345. data/gemfiles/ruby_2.6.7_rails61_postgres_redis.gemfile +44 -0
  346. data/gemfiles/ruby_2.6.7_rails61_postgres_redis.gemfile.lock +297 -0
  347. data/gemfiles/ruby_2.6.7_rails61_postgres_sidekiq.gemfile +44 -0
  348. data/gemfiles/ruby_2.6.7_rails61_postgres_sidekiq.gemfile.lock +302 -0
  349. data/gemfiles/ruby_2.6.7_rails61_semantic_logger.gemfile +43 -0
  350. data/gemfiles/ruby_2.6.7_rails61_semantic_logger.gemfile.lock +294 -0
  351. data/gemfiles/ruby_2.6.7_rails6_mysql2.gemfile +43 -0
  352. data/gemfiles/ruby_2.6.7_rails6_mysql2.gemfile.lock +292 -0
  353. data/gemfiles/ruby_2.6.7_rails6_postgres.gemfile +43 -0
  354. data/gemfiles/ruby_2.6.7_rails6_postgres.gemfile.lock +292 -0
  355. data/gemfiles/ruby_2.6.7_rails6_postgres_redis.gemfile +44 -0
  356. data/gemfiles/ruby_2.6.7_rails6_postgres_redis.gemfile.lock +294 -0
  357. data/gemfiles/ruby_2.6.7_rails6_postgres_redis_activesupport.gemfile +44 -0
  358. data/gemfiles/ruby_2.6.7_rails6_postgres_redis_activesupport.gemfile.lock +294 -0
  359. data/gemfiles/ruby_2.6.7_rails6_postgres_sidekiq.gemfile +45 -0
  360. data/gemfiles/ruby_2.6.7_rails6_postgres_sidekiq.gemfile.lock +300 -0
  361. data/gemfiles/ruby_2.6.7_rails6_semantic_logger.gemfile +43 -0
  362. data/gemfiles/ruby_2.6.7_rails6_semantic_logger.gemfile.lock +291 -0
  363. data/gemfiles/ruby_2.6.7_resque2_redis3.gemfile +41 -0
  364. data/gemfiles/ruby_2.6.7_resque2_redis3.gemfile.lock +192 -0
  365. data/gemfiles/ruby_2.6.7_resque2_redis4.gemfile +41 -0
  366. data/gemfiles/ruby_2.6.7_resque2_redis4.gemfile.lock +192 -0
  367. data/gemfiles/ruby_2.7.3_contrib.gemfile +81 -0
  368. data/gemfiles/ruby_2.7.3_contrib.gemfile.lock +1580 -0
  369. data/gemfiles/ruby_2.7.3_contrib_old.gemfile +40 -0
  370. data/gemfiles/ruby_2.7.3_contrib_old.gemfile.lock +169 -0
  371. data/gemfiles/ruby_2.7.3_core_old.gemfile +39 -0
  372. data/gemfiles/ruby_2.7.3_core_old.gemfile.lock +165 -0
  373. data/gemfiles/ruby_2.7.3_cucumber3.gemfile +40 -0
  374. data/gemfiles/ruby_2.7.3_cucumber3.gemfile.lock +186 -0
  375. data/gemfiles/ruby_2.7.3_cucumber4.gemfile +40 -0
  376. data/gemfiles/ruby_2.7.3_cucumber4.gemfile.lock +218 -0
  377. data/gemfiles/ruby_2.7.3_cucumber5.gemfile +40 -0
  378. data/gemfiles/ruby_2.7.3_cucumber5.gemfile.lock +218 -0
  379. data/gemfiles/ruby_2.7.3_rails5_mysql2.gemfile +43 -0
  380. data/gemfiles/ruby_2.7.3_rails5_mysql2.gemfile.lock +278 -0
  381. data/gemfiles/ruby_2.7.3_rails5_postgres.gemfile +43 -0
  382. data/gemfiles/ruby_2.7.3_rails5_postgres.gemfile.lock +278 -0
  383. data/gemfiles/ruby_2.7.3_rails5_postgres_redis.gemfile +45 -0
  384. data/gemfiles/ruby_2.7.3_rails5_postgres_redis.gemfile.lock +297 -0
  385. data/gemfiles/ruby_2.7.3_rails5_postgres_redis_activesupport.gemfile +45 -0
  386. data/gemfiles/ruby_2.7.3_rails5_postgres_redis_activesupport.gemfile.lock +297 -0
  387. data/gemfiles/ruby_2.7.3_rails5_postgres_sidekiq.gemfile +45 -0
  388. data/gemfiles/ruby_2.7.3_rails5_postgres_sidekiq.gemfile.lock +286 -0
  389. data/gemfiles/ruby_2.7.3_rails5_semantic_logger.gemfile +43 -0
  390. data/gemfiles/ruby_2.7.3_rails5_semantic_logger.gemfile.lock +277 -0
  391. data/gemfiles/ruby_2.7.3_rails61_mysql2.gemfile +43 -0
  392. data/gemfiles/ruby_2.7.3_rails61_mysql2.gemfile.lock +297 -0
  393. data/gemfiles/ruby_2.7.3_rails61_postgres.gemfile +43 -0
  394. data/gemfiles/ruby_2.7.3_rails61_postgres.gemfile.lock +297 -0
  395. data/gemfiles/ruby_2.7.3_rails61_postgres_redis.gemfile +44 -0
  396. data/gemfiles/ruby_2.7.3_rails61_postgres_redis.gemfile.lock +299 -0
  397. data/gemfiles/ruby_2.7.3_rails61_postgres_sidekiq.gemfile +44 -0
  398. data/gemfiles/ruby_2.7.3_rails61_postgres_sidekiq.gemfile.lock +304 -0
  399. data/gemfiles/ruby_2.7.3_rails61_semantic_logger.gemfile +43 -0
  400. data/gemfiles/ruby_2.7.3_rails61_semantic_logger.gemfile.lock +296 -0
  401. data/gemfiles/ruby_2.7.3_rails6_mysql2.gemfile +43 -0
  402. data/gemfiles/ruby_2.7.3_rails6_mysql2.gemfile.lock +294 -0
  403. data/gemfiles/ruby_2.7.3_rails6_postgres.gemfile +43 -0
  404. data/gemfiles/ruby_2.7.3_rails6_postgres.gemfile.lock +294 -0
  405. data/gemfiles/ruby_2.7.3_rails6_postgres_redis.gemfile +45 -0
  406. data/gemfiles/ruby_2.7.3_rails6_postgres_redis.gemfile.lock +313 -0
  407. data/gemfiles/ruby_2.7.3_rails6_postgres_redis_activesupport.gemfile +45 -0
  408. data/gemfiles/ruby_2.7.3_rails6_postgres_redis_activesupport.gemfile.lock +313 -0
  409. data/gemfiles/ruby_2.7.3_rails6_postgres_sidekiq.gemfile +45 -0
  410. data/gemfiles/ruby_2.7.3_rails6_postgres_sidekiq.gemfile.lock +302 -0
  411. data/gemfiles/ruby_2.7.3_rails6_semantic_logger.gemfile +43 -0
  412. data/gemfiles/ruby_2.7.3_rails6_semantic_logger.gemfile.lock +293 -0
  413. data/gemfiles/ruby_2.7.3_resque2_redis3.gemfile +41 -0
  414. data/gemfiles/ruby_2.7.3_resque2_redis3.gemfile.lock +192 -0
  415. data/gemfiles/ruby_2.7.3_resque2_redis4.gemfile +41 -0
  416. data/gemfiles/ruby_2.7.3_resque2_redis4.gemfile.lock +192 -0
  417. data/gemfiles/ruby_3.0.1_contrib.gemfile +80 -0
  418. data/gemfiles/ruby_3.0.1_contrib.gemfile.lock +1583 -0
  419. data/gemfiles/ruby_3.0.1_core_old.gemfile +40 -0
  420. data/gemfiles/ruby_3.0.1_core_old.gemfile.lock +167 -0
  421. data/gemfiles/ruby_3.0.1_cucumber3.gemfile +41 -0
  422. data/gemfiles/ruby_3.0.1_cucumber3.gemfile.lock +188 -0
  423. data/gemfiles/ruby_3.0.1_cucumber4.gemfile +41 -0
  424. data/gemfiles/ruby_3.0.1_cucumber4.gemfile.lock +220 -0
  425. data/gemfiles/ruby_3.0.1_cucumber5.gemfile +41 -0
  426. data/gemfiles/ruby_3.0.1_cucumber5.gemfile.lock +220 -0
  427. data/gemfiles/ruby_3.0.1_rails61_mysql2.gemfile +44 -0
  428. data/gemfiles/ruby_3.0.1_rails61_mysql2.gemfile.lock +297 -0
  429. data/gemfiles/ruby_3.0.1_rails61_postgres.gemfile +44 -0
  430. data/gemfiles/ruby_3.0.1_rails61_postgres.gemfile.lock +297 -0
  431. data/gemfiles/ruby_3.0.1_rails61_postgres_redis.gemfile +45 -0
  432. data/gemfiles/ruby_3.0.1_rails61_postgres_redis.gemfile.lock +299 -0
  433. data/gemfiles/ruby_3.0.1_rails61_postgres_sidekiq.gemfile +46 -0
  434. data/gemfiles/ruby_3.0.1_rails61_postgres_sidekiq.gemfile.lock +311 -0
  435. data/gemfiles/ruby_3.0.1_rails61_semantic_logger.gemfile +44 -0
  436. data/gemfiles/ruby_3.0.1_rails61_semantic_logger.gemfile.lock +296 -0
  437. data/gemfiles/ruby_3.0.1_resque2_redis3.gemfile +42 -0
  438. data/gemfiles/ruby_3.0.1_resque2_redis3.gemfile.lock +194 -0
  439. data/gemfiles/ruby_3.0.1_resque2_redis4.gemfile +42 -0
  440. data/gemfiles/ruby_3.0.1_resque2_redis4.gemfile.lock +194 -0
  441. data/integration/apps/rack/README.md +2 -2
  442. data/integration/apps/rack/script/ci +2 -1
  443. data/integration/apps/rails-five/README.md +2 -2
  444. data/integration/apps/rails-five/script/ci +2 -1
  445. data/integration/apps/rspec/.dockerignore +1 -0
  446. data/integration/apps/rspec/.envrc.sample +1 -0
  447. data/integration/apps/rspec/.gitignore +2 -0
  448. data/integration/apps/rspec/.rspec +1 -0
  449. data/integration/apps/rspec/Dockerfile +25 -0
  450. data/integration/apps/rspec/Dockerfile-ci +11 -0
  451. data/integration/apps/rspec/Gemfile +14 -0
  452. data/integration/apps/rspec/README.md +70 -0
  453. data/integration/apps/rspec/agent.yaml +3 -0
  454. data/integration/apps/rspec/app/datadog.rb +13 -0
  455. data/integration/apps/rspec/app/fibonacci.rb +30 -0
  456. data/integration/apps/rspec/bin/run +20 -0
  457. data/integration/apps/rspec/bin/setup +23 -0
  458. data/integration/apps/rspec/bin/test +21 -0
  459. data/integration/apps/rspec/docker-compose.ci.yml +51 -0
  460. data/integration/apps/rspec/docker-compose.yml +64 -0
  461. data/integration/apps/rspec/script/build-images +37 -0
  462. data/integration/apps/rspec/script/ci +53 -0
  463. data/integration/apps/rspec/spec/fibonacci_spec.rb +16 -0
  464. data/integration/apps/rspec/spec/rspec_spec.rb +58 -0
  465. data/integration/apps/rspec/spec/spec_helper.rb +24 -0
  466. data/integration/apps/ruby/README.md +2 -2
  467. data/integration/apps/ruby/script/ci +2 -1
  468. data/integration/images/include/datadog/demo_env.rb +15 -14
  469. data/lib/datadog/ci.rb +16 -0
  470. data/lib/datadog/ci/configuration/components.rb +30 -0
  471. data/lib/datadog/ci/configuration/settings.rb +36 -0
  472. data/lib/datadog/ci/context_flush.rb +28 -0
  473. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +30 -0
  474. data/lib/datadog/ci/contrib/cucumber/ext.rb +19 -0
  475. data/lib/datadog/ci/contrib/cucumber/formatter.rb +97 -0
  476. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +26 -0
  477. data/lib/datadog/ci/contrib/cucumber/integration.rb +47 -0
  478. data/lib/datadog/ci/contrib/cucumber/patcher.rb +25 -0
  479. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +30 -0
  480. data/lib/datadog/ci/contrib/rspec/example.rb +73 -0
  481. data/lib/datadog/ci/contrib/rspec/ext.rb +18 -0
  482. data/lib/datadog/ci/contrib/rspec/integration.rb +48 -0
  483. data/lib/datadog/ci/contrib/rspec/patcher.rb +25 -0
  484. data/lib/datadog/ci/ext/app_types.rb +9 -0
  485. data/lib/datadog/ci/ext/environment.rb +438 -0
  486. data/lib/datadog/ci/ext/settings.rb +10 -0
  487. data/lib/datadog/ci/ext/test.rb +34 -0
  488. data/lib/datadog/ci/extensions.rb +17 -0
  489. data/lib/datadog/ci/test.rb +76 -0
  490. data/lib/datadog/core/environment/cgroup.rb +49 -0
  491. data/lib/datadog/core/environment/class_count.rb +19 -0
  492. data/lib/datadog/core/environment/container.rb +88 -0
  493. data/lib/datadog/core/environment/ext.rb +26 -0
  494. data/lib/datadog/core/environment/gc.rb +18 -0
  495. data/lib/datadog/core/environment/identity.rb +50 -0
  496. data/lib/datadog/core/environment/object_space.rb +22 -0
  497. data/lib/datadog/core/environment/socket.rb +16 -0
  498. data/lib/datadog/core/environment/thread_count.rb +18 -0
  499. data/lib/datadog/core/environment/variable_helpers.rb +39 -0
  500. data/lib/ddtrace.rb +2 -2
  501. data/lib/ddtrace/auto_instrument.rb +1 -0
  502. data/lib/ddtrace/buffer.rb +2 -2
  503. data/lib/ddtrace/configuration.rb +1 -23
  504. data/lib/ddtrace/configuration/agent_settings_resolver.rb +230 -0
  505. data/lib/ddtrace/configuration/base.rb +7 -10
  506. data/lib/ddtrace/configuration/components.rb +88 -43
  507. data/lib/ddtrace/configuration/options.rb +2 -2
  508. data/lib/ddtrace/configuration/settings.rb +76 -10
  509. data/lib/ddtrace/context.rb +17 -14
  510. data/lib/ddtrace/context_flush.rb +14 -2
  511. data/lib/ddtrace/contrib/action_cable/event.rb +4 -4
  512. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -1
  513. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +1 -1
  514. data/lib/ddtrace/contrib/action_pack/utils.rb +1 -1
  515. data/lib/ddtrace/contrib/action_view/event.rb +2 -2
  516. data/lib/ddtrace/contrib/action_view/patcher.rb +4 -4
  517. data/lib/ddtrace/contrib/active_model_serializers/event.rb +2 -2
  518. data/lib/ddtrace/contrib/active_record/event.rb +2 -2
  519. data/lib/ddtrace/contrib/active_record/utils.rb +2 -2
  520. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +7 -7
  521. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -5
  522. data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -2
  523. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -1
  524. data/lib/ddtrace/contrib/auto_instrument.rb +1 -2
  525. data/lib/ddtrace/contrib/aws/instrumentation.rb +29 -0
  526. data/lib/ddtrace/contrib/aws/patcher.rb +4 -0
  527. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -1
  528. data/lib/ddtrace/contrib/configurable.rb +1 -1
  529. data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -1
  530. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -1
  531. data/lib/ddtrace/contrib/ethon/easy_patch.rb +1 -1
  532. data/lib/ddtrace/contrib/ethon/multi_patch.rb +1 -1
  533. data/lib/ddtrace/contrib/ethon/patcher.rb +2 -2
  534. data/lib/ddtrace/contrib/extensions.rb +3 -3
  535. data/lib/ddtrace/contrib/faraday/patcher.rb +2 -2
  536. data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -2
  537. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  538. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -1
  539. data/lib/ddtrace/contrib/http/instrumentation.rb +1 -1
  540. data/lib/ddtrace/contrib/http/patcher.rb +1 -1
  541. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +1 -1
  542. data/lib/ddtrace/contrib/httpclient/patcher.rb +1 -1
  543. data/lib/ddtrace/contrib/httprb/instrumentation.rb +1 -1
  544. data/lib/ddtrace/contrib/httprb/patcher.rb +1 -1
  545. data/lib/ddtrace/contrib/integration.rb +3 -3
  546. data/lib/ddtrace/contrib/kafka/event.rb +2 -2
  547. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +18 -0
  548. data/lib/ddtrace/contrib/lograge/ext.rb +10 -0
  549. data/lib/ddtrace/contrib/lograge/instrumentation.rb +38 -0
  550. data/lib/ddtrace/contrib/lograge/integration.rb +45 -0
  551. data/lib/ddtrace/contrib/{rspec → lograge}/patcher.rb +6 -4
  552. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -2
  553. data/lib/ddtrace/contrib/mongodb/patcher.rb +2 -2
  554. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  555. data/lib/ddtrace/contrib/mysql2/patcher.rb +1 -1
  556. data/lib/ddtrace/contrib/patchable.rb +2 -2
  557. data/lib/ddtrace/contrib/patcher.rb +2 -2
  558. data/lib/ddtrace/contrib/presto/instrumentation.rb +1 -1
  559. data/lib/ddtrace/contrib/presto/patcher.rb +1 -1
  560. data/lib/ddtrace/contrib/qless/patcher.rb +3 -5
  561. data/lib/ddtrace/contrib/racecar/event.rb +2 -2
  562. data/lib/ddtrace/contrib/rack/middlewares.rb +1 -1
  563. data/lib/ddtrace/contrib/rails/framework.rb +25 -1
  564. data/lib/ddtrace/contrib/rails/log_injection.rb +0 -40
  565. data/lib/ddtrace/contrib/rails/patcher.rb +11 -9
  566. data/lib/ddtrace/contrib/rake/instrumentation.rb +1 -1
  567. data/lib/ddtrace/contrib/rake/patcher.rb +1 -1
  568. data/lib/ddtrace/contrib/registerable.rb +2 -2
  569. data/lib/ddtrace/contrib/resque/patcher.rb +1 -1
  570. data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
  571. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -1
  572. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +18 -0
  573. data/lib/ddtrace/contrib/semantic_logger/ext.rb +10 -0
  574. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +42 -0
  575. data/lib/ddtrace/contrib/semantic_logger/integration.rb +47 -0
  576. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +25 -0
  577. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  578. data/lib/ddtrace/contrib/sequel/dataset.rb +1 -1
  579. data/lib/ddtrace/contrib/sequel/patcher.rb +2 -2
  580. data/lib/ddtrace/contrib/sinatra/patcher.rb +1 -1
  581. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +4 -6
  582. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +4 -0
  583. data/lib/ddtrace/correlation.rb +1 -1
  584. data/lib/ddtrace/diagnostics/environment_logger.rb +4 -4
  585. data/lib/ddtrace/error.rb +76 -9
  586. data/lib/ddtrace/ext/app_types.rb +0 -1
  587. data/lib/ddtrace/ext/environment.rb +7 -0
  588. data/lib/ddtrace/ext/git.rb +9 -1
  589. data/lib/ddtrace/ext/profiling.rb +1 -0
  590. data/lib/ddtrace/ext/runtime.rb +0 -9
  591. data/lib/ddtrace/ext/test.rb +2 -18
  592. data/lib/ddtrace/ext/transport.rb +1 -0
  593. data/lib/ddtrace/metrics.rb +64 -13
  594. data/lib/ddtrace/opentelemetry/extensions.rb +1 -1
  595. data/lib/ddtrace/opentracer.rb +20 -39
  596. data/lib/ddtrace/patcher.rb +2 -2
  597. data/lib/ddtrace/profiling.rb +75 -22
  598. data/lib/ddtrace/profiling/collectors/stack.rb +17 -8
  599. data/lib/ddtrace/profiling/encoding/profile.rb +6 -0
  600. data/lib/ddtrace/profiling/ext/cpu.rb +18 -5
  601. data/lib/ddtrace/profiling/ext/cthread.rb +56 -35
  602. data/lib/ddtrace/profiling/ext/forking.rb +7 -7
  603. data/lib/ddtrace/profiling/flush.rb +12 -10
  604. data/lib/ddtrace/profiling/pprof/builder.rb +26 -28
  605. data/lib/ddtrace/profiling/pprof/converter.rb +4 -0
  606. data/lib/ddtrace/profiling/pprof/stack_sample.rb +17 -1
  607. data/lib/ddtrace/profiling/pprof/template.rb +4 -0
  608. data/lib/ddtrace/profiling/profiler.rb +2 -0
  609. data/lib/ddtrace/profiling/recorder.rb +8 -0
  610. data/lib/ddtrace/profiling/scheduler.rb +44 -12
  611. data/lib/ddtrace/profiling/tasks/setup.rb +13 -13
  612. data/lib/ddtrace/profiling/transport/http.rb +58 -62
  613. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +12 -2
  614. data/lib/ddtrace/runtime/metrics.rb +20 -14
  615. data/lib/ddtrace/span.rb +17 -6
  616. data/lib/ddtrace/sync_writer.rb +4 -3
  617. data/lib/ddtrace/tracer.rb +19 -44
  618. data/lib/ddtrace/transport/http.rb +43 -40
  619. data/lib/ddtrace/transport/http/statistics.rb +2 -2
  620. data/lib/ddtrace/transport/http/traces.rb +3 -3
  621. data/lib/ddtrace/transport/io/traces.rb +1 -1
  622. data/lib/ddtrace/utils/forking.rb +1 -1
  623. data/lib/ddtrace/utils/object_set.rb +3 -5
  624. data/lib/ddtrace/utils/time.rb +1 -3
  625. data/lib/ddtrace/version.rb +15 -5
  626. data/lib/ddtrace/workers.rb +1 -1
  627. data/lib/ddtrace/workers/async.rb +3 -2
  628. data/lib/ddtrace/workers/loop.rb +14 -2
  629. data/lib/ddtrace/workers/polling.rb +11 -5
  630. data/lib/ddtrace/workers/queue.rb +1 -1
  631. data/lib/ddtrace/workers/trace_writer.rb +3 -6
  632. data/lib/ddtrace/writer.rb +6 -3
  633. data/tasks/update_appraisal_gemfiles.rake +36 -0
  634. metadata +493 -33
  635. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -83
  636. data/integration/images/ruby/2.0/Dockerfile +0 -54
  637. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -28
  638. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -17
  639. data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -98
  640. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
  641. data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
  642. data/lib/ddtrace/contrib/cucumber/patcher.rb +0 -23
  643. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -28
  644. data/lib/ddtrace/contrib/rspec/example.rb +0 -75
  645. data/lib/ddtrace/contrib/rspec/ext.rb +0 -16
  646. data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
  647. data/lib/ddtrace/environment.rb +0 -41
  648. data/lib/ddtrace/ext/ci.rb +0 -297
  649. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  650. data/lib/ddtrace/runtime/class_count.rb +0 -17
  651. data/lib/ddtrace/runtime/container.rb +0 -79
  652. data/lib/ddtrace/runtime/gc.rb +0 -16
  653. data/lib/ddtrace/runtime/identity.rb +0 -48
  654. data/lib/ddtrace/runtime/object_space.rb +0 -19
  655. data/lib/ddtrace/runtime/socket.rb +0 -14
  656. data/lib/ddtrace/runtime/thread_count.rb +0 -16
@@ -0,0 +1,39 @@
1
+ module Datadog
2
+ module Core
3
+ # Namespace for handling application environment
4
+ module Environment
5
+ # Defines helper methods for environment
6
+ module VariableHelpers
7
+ def env_to_bool(var, default = nil)
8
+ var = decode_array(var)
9
+ var && ENV.key?(var) ? ENV[var].to_s.strip.downcase == 'true' : default
10
+ end
11
+
12
+ def env_to_int(var, default = nil)
13
+ var = decode_array(var)
14
+ var && ENV.key?(var) ? ENV[var].to_i : default
15
+ end
16
+
17
+ def env_to_float(var, default = nil)
18
+ var = decode_array(var)
19
+ var && ENV.key?(var) ? ENV[var].to_f : default
20
+ end
21
+
22
+ def env_to_list(var, default = [])
23
+ var = decode_array(var)
24
+ if var && ENV.key?(var)
25
+ ENV[var].split(',').map(&:strip)
26
+ else
27
+ default
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def decode_array(var)
34
+ var.is_a?(Array) ? var.find { |env_var| ENV.key?(env_var) } : var
35
+ end
36
+ end
37
+ end
38
+ end
39
+ 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'
@@ -63,6 +62,7 @@ require 'ddtrace/contrib/httpclient/integration'
63
62
  require 'ddtrace/contrib/httprb/integration'
64
63
  require 'ddtrace/contrib/integration'
65
64
  require 'ddtrace/contrib/kafka/integration'
65
+ require 'ddtrace/contrib/lograge/integration'
66
66
  require 'ddtrace/contrib/presto/integration'
67
67
  require 'ddtrace/contrib/que/integration'
68
68
  require 'ddtrace/contrib/mysql2/integration'
@@ -75,7 +75,7 @@ require 'ddtrace/contrib/rake/integration'
75
75
  require 'ddtrace/contrib/redis/integration'
76
76
  require 'ddtrace/contrib/resque/integration'
77
77
  require 'ddtrace/contrib/rest_client/integration'
78
- require 'ddtrace/contrib/rspec/integration'
78
+ require 'ddtrace/contrib/semantic_logger/integration'
79
79
  require 'ddtrace/contrib/sequel/integration'
80
80
  require 'ddtrace/contrib/shoryuken/integration'
81
81
  require 'ddtrace/contrib/sidekiq/integration'
@@ -1,3 +1,4 @@
1
1
  require 'ddtrace'
2
2
 
3
3
  Datadog.add_auto_instrument
4
+ Datadog.profiler.start if Datadog.profiler
@@ -1,5 +1,5 @@
1
1
  require 'ddtrace/diagnostics/health'
2
- require 'ddtrace/runtime/object_space'
2
+ require 'datadog/core/environment/object_space'
3
3
 
4
4
  # Trace buffer that accumulates traces for a consumer.
5
5
  # Consumption can happen from a different thread.
@@ -318,7 +318,7 @@ module Datadog
318
318
  #
319
319
  # TODO We should restructure this module, so that classes are not declared at top-level ::Datadog.
320
320
  # TODO Making such a change is potentially breaking for users manually configuring the tracer.
321
- TraceBuffer = if Datadog::Ext::Runtime::RUBY_ENGINE == 'ruby'
321
+ TraceBuffer = if Datadog::Core::Environment::Ext::RUBY_ENGINE == 'ruby'
322
322
  CRubyTraceBuffer
323
323
  else
324
324
  ThreadSafeTraceBuffer
@@ -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
@@ -0,0 +1,230 @@
1
+ require 'uri'
2
+
3
+ require 'ddtrace/ext/transport'
4
+ require 'ddtrace/configuration/settings'
5
+
6
+ module Datadog
7
+ module Configuration
8
+ # This class unifies all the different ways that users can configure how we talk to the agent.
9
+ #
10
+ # It has quite a lot of complexity, but this complexity just reflects the actual complexity we have around our
11
+ # configuration today. E.g., this is just all of the complexity regarding agent settings gathered together in a
12
+ # single place. As we deprecate more and more of the different ways that these things can be configured,
13
+ # this class will reflect that simplification as well.
14
+ #
15
+ # Whenever there is a conflict (different configurations are provided in different orders), it MUST warn the users
16
+ # about it and pick a value based on the following priority: code > environment variable > defaults.
17
+ #
18
+ # rubocop:disable Metrics/ClassLength
19
+ class AgentSettingsResolver
20
+ AgentSettings = \
21
+ Struct.new(
22
+ :ssl,
23
+ :hostname,
24
+ :port,
25
+ :timeout_seconds,
26
+ :deprecated_for_removal_transport_configuration_proc,
27
+ :deprecated_for_removal_transport_configuration_options
28
+ ) do
29
+ def initialize(
30
+ ssl:,
31
+ hostname:,
32
+ port:,
33
+ timeout_seconds:,
34
+ deprecated_for_removal_transport_configuration_proc:,
35
+ deprecated_for_removal_transport_configuration_options:
36
+ )
37
+ super(ssl, hostname, port, timeout_seconds, deprecated_for_removal_transport_configuration_proc, \
38
+ deprecated_for_removal_transport_configuration_options)
39
+ freeze
40
+ end
41
+ end
42
+
43
+ def self.call(settings, logger: Datadog.logger)
44
+ new(settings, logger: logger).send(:call)
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader \
50
+ :logger,
51
+ :settings
52
+
53
+ def initialize(settings, logger: Datadog.logger)
54
+ @settings = settings
55
+ @logger = logger
56
+ end
57
+
58
+ def call
59
+ AgentSettings.new(
60
+ ssl: ssl?,
61
+ hostname: hostname,
62
+ port: port,
63
+ timeout_seconds: timeout_seconds,
64
+ # NOTE: When provided, the deprecated_for_removal_transport_configuration_proc can override all
65
+ # values above (ssl, hostname, port, timeout), or even make them irrelevant (by using an unix socket or
66
+ # enabling test mode instead).
67
+ # That is the main reason why it is deprecated -- it's an opaque function that may set a bunch of settings
68
+ # that we know nothing of until we actually call it.
69
+ deprecated_for_removal_transport_configuration_proc: deprecated_for_removal_transport_configuration_proc,
70
+ deprecated_for_removal_transport_configuration_options: deprecated_for_removal_transport_configuration_options
71
+ )
72
+ end
73
+
74
+ def hostname
75
+ pick_from(
76
+ configurations_in_priority_order: [
77
+ DetectedConfiguration.new(
78
+ friendly_name: "'c.tracer.hostname'",
79
+ value: settings.tracer.hostname
80
+ ),
81
+ DetectedConfiguration.new(
82
+ friendly_name: "#{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL} environment variable",
83
+ value: parsed_url && parsed_url.hostname
84
+ ),
85
+ DetectedConfiguration.new(
86
+ friendly_name: "#{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_HOST} environment variable",
87
+ value: ENV[Datadog::Ext::Transport::HTTP::ENV_DEFAULT_HOST]
88
+ )
89
+ ],
90
+ or_use_default: Datadog::Ext::Transport::HTTP::DEFAULT_HOST
91
+ )
92
+ end
93
+
94
+ def port
95
+ port_from_env = ENV[Datadog::Ext::Transport::HTTP::ENV_DEFAULT_PORT]
96
+ parsed_port_from_env =
97
+ if port_from_env
98
+ begin
99
+ Integer(port_from_env)
100
+ rescue ArgumentError
101
+ log_warning(
102
+ "Invalid value for #{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_PORT} environment variable " \
103
+ "('#{port_from_env}'). Ignoring this configuration."
104
+ )
105
+ end
106
+ end
107
+
108
+ pick_from(
109
+ configurations_in_priority_order: [
110
+ DetectedConfiguration.new(
111
+ friendly_name: '"c.tracer.port"',
112
+ value: settings.tracer.port
113
+ ),
114
+ DetectedConfiguration.new(
115
+ friendly_name: "#{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL} environment variable",
116
+ value: parsed_url && parsed_url.port
117
+ ),
118
+ DetectedConfiguration.new(
119
+ friendly_name: "#{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_PORT} environment variable",
120
+ value: parsed_port_from_env
121
+ )
122
+ ],
123
+ or_use_default: Datadog::Ext::Transport::HTTP::DEFAULT_PORT
124
+ )
125
+ end
126
+
127
+ def ssl?
128
+ !parsed_url.nil? && parsed_url.scheme == 'https'
129
+ end
130
+
131
+ def timeout_seconds
132
+ Datadog::Ext::Transport::HTTP::DEFAULT_TIMEOUT_SECONDS
133
+ end
134
+
135
+ def deprecated_for_removal_transport_configuration_proc
136
+ settings.tracer.transport_options if settings.tracer.transport_options.is_a?(Proc)
137
+ end
138
+
139
+ def deprecated_for_removal_transport_configuration_options
140
+ options = settings.tracer.transport_options
141
+
142
+ if options.is_a?(Hash) && !options.empty?
143
+ log_warning(
144
+ 'Configuring the tracer via a c.tracer.transport_options hash is deprecated for removal in a future ' \
145
+ "ddtrace version (c.tracer.transport_options contained '#{options.inspect}')."
146
+ )
147
+
148
+ options
149
+ end
150
+ end
151
+
152
+ def parsed_url
153
+ return @parsed_url if defined?(@parsed_url)
154
+
155
+ @parsed_url =
156
+ if unparsed_url_from_env
157
+ parsed = URI.parse(unparsed_url_from_env)
158
+
159
+ if %w[http https].include?(parsed.scheme)
160
+ parsed
161
+ else
162
+ log_warning(
163
+ "Invalid URI scheme '#{parsed.scheme}' for #{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL} " \
164
+ "environment variable ('#{unparsed_url_from_env}'). " \
165
+ "Ignoring the contents of #{Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL}."
166
+ )
167
+
168
+ nil
169
+ end
170
+ end
171
+ end
172
+
173
+ # NOTE: This should only be used AFTER parsing, via `#parsed_url`. The only other use-case where this can be used
174
+ # directly without parsing, is when displaying in warning messages, to show users what it actually contains.
175
+ def unparsed_url_from_env
176
+ @unparsed_url_from_env ||= ENV[Datadog::Ext::Transport::HTTP::ENV_DEFAULT_URL]
177
+ end
178
+
179
+ def pick_from(configurations_in_priority_order:, or_use_default:)
180
+ detected_configurations_in_priority_order = configurations_in_priority_order.select(&:value?)
181
+
182
+ if detected_configurations_in_priority_order.any?
183
+ warn_if_configuration_mismatch(detected_configurations_in_priority_order)
184
+
185
+ # The configurations are listed in priority, so we only need to look at the first; if there's more than
186
+ # one, we emit a warning above
187
+ detected_configurations_in_priority_order.first.value
188
+ else
189
+ or_use_default
190
+ end
191
+ end
192
+
193
+ def warn_if_configuration_mismatch(detected_configurations_in_priority_order)
194
+ return unless detected_configurations_in_priority_order.map(&:value).uniq.size > 1
195
+
196
+ log_warning(
197
+ 'Configuration mismatch: values differ between ' \
198
+ "#{detected_configurations_in_priority_order
199
+ .map { |config| "#{config.friendly_name} ('#{config.value}')" }.join(' and ')}" \
200
+ ". Using '#{detected_configurations_in_priority_order.first.value}'."
201
+ )
202
+ end
203
+
204
+ def log_warning(message)
205
+ logger.warn(message) if logger
206
+ end
207
+
208
+ DetectedConfiguration = Struct.new(:friendly_name, :value) do
209
+ def initialize(friendly_name:, value:)
210
+ super(friendly_name, value)
211
+ freeze
212
+ end
213
+
214
+ def value?
215
+ !value.nil?
216
+ end
217
+ end
218
+ private_constant :DetectedConfiguration
219
+
220
+ # NOTE: Due to... legacy reasons... Some classes like having an `AgentSettings` instance to fall back to.
221
+ # Because we generate this instance with an empty instance of `Settings`, the resulting `AgentSettings` below
222
+ # represents only settings specified via environment variables + the usual defaults.
223
+ #
224
+ # YOU DO NOT WANT TO USE THE BELOW INSTANCE ON ANY NEWLY WRITTEN CODE, as it ignores any settings specified
225
+ # by users via `Datadog.configure`.
226
+ ENVIRONMENT_AGENT_SETTINGS = call(Settings.new, logger: nil)
227
+ end
228
+ # rubocop:enable Metrics/ClassLength
229
+ end
230
+ end
@@ -1,4 +1,4 @@
1
- require 'ddtrace/environment'
1
+ require 'datadog/core/environment/variable_helpers'
2
2
  require 'ddtrace/configuration/options'
3
3
 
4
4
  module Datadog
@@ -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::Core::Environment::VariableHelpers)
10
+ base.include(Datadog::Core::Environment::VariableHelpers)
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|
@@ -1,15 +1,17 @@
1
+ require 'ddtrace/configuration/agent_settings_resolver'
1
2
  require 'ddtrace/diagnostics/health'
2
3
  require 'ddtrace/logger'
3
4
  require 'ddtrace/profiling'
4
5
  require 'ddtrace/runtime/metrics'
5
6
  require 'ddtrace/tracer'
7
+ require 'ddtrace/sync_writer'
6
8
  require 'ddtrace/workers/runtime_metrics'
7
9
 
8
10
  module Datadog
9
11
  module Configuration
10
12
  # Global components for the trace library.
11
- # rubocop:disable Layout/LineLength
12
13
  # rubocop:disable Metrics/ClassLength
14
+ # rubocop:disable Layout/LineLength
13
15
  class Components
14
16
  class << self
15
17
  def build_health_metrics(settings)
@@ -17,7 +19,7 @@ module Datadog
17
19
  options = { enabled: settings.enabled }
18
20
  options[:statsd] = settings.statsd unless settings.statsd.nil?
19
21
 
20
- Datadog::Diagnostics::Health::Metrics.new(options)
22
+ Datadog::Diagnostics::Health::Metrics.new(**options)
21
23
  end
22
24
 
23
25
  def build_logger(settings)
@@ -32,7 +34,7 @@ module Datadog
32
34
  options[:statsd] = settings.runtime_metrics.statsd unless settings.runtime_metrics.statsd.nil?
33
35
  options[:services] = [settings.service] unless settings.service.nil?
34
36
 
35
- Datadog::Runtime::Metrics.new(options)
37
+ Datadog::Runtime::Metrics.new(**options)
36
38
  end
37
39
 
38
40
  def build_runtime_metrics_worker(settings)
@@ -45,7 +47,7 @@ module Datadog
45
47
  Datadog::Workers::RuntimeMetrics.new(options)
46
48
  end
47
49
 
48
- def build_tracer(settings)
50
+ def build_tracer(settings, agent_settings)
49
51
  # If a custom tracer has been provided, use it instead.
50
52
  # Ignore all other options (they should already be configured.)
51
53
  tracer = settings.tracer.instance
@@ -63,14 +65,43 @@ 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(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
70
72
 
71
- def build_profiler(settings)
73
+ def build_profiler(settings, agent_settings)
72
74
  return unless Datadog::Profiling.supported? && settings.profiling.enabled
73
75
 
76
+ unless defined?(Datadog::Profiling::Tasks::Setup)
77
+ # In #1545 a user reported a NameError due to this constant being uninitialized
78
+ # I've documented my suspicion on why that happened in
79
+ # https://github.com/DataDog/dd-trace-rb/issues/1545#issuecomment-856049025
80
+ #
81
+ # > Thanks for the info! It seems to feed into my theory: there's two moments in the code where we check if
82
+ # > profiler is "supported": 1) when loading ddtrace (inside preload) and 2) when starting the profile
83
+ # > after Datadog.configure gets run.
84
+ # > The problem is that the code assumes that both checks 1) and 2) will always reach the same conclusion:
85
+ # > either profiler is supported, or profiler is not supported.
86
+ # > In the problematic case, it looks like in your case check 1 decides that profiler is not
87
+ # > supported => doesn't load it, and then check 2 decides that it is => assumes it is loaded and tries to
88
+ # > start it.
89
+ #
90
+ # I was never able to validate if this was the issue or why exactly .supported? would change its mind BUT
91
+ # just in case it happens again, I've left this check which avoids breaking the user's application AND
92
+ # would instead direct them to report it to us instead, so that we can investigate what's wrong.
93
+ #
94
+ # TODO: As of June 2021, most checks in .supported? are related to the google-protobuf gem; so it's
95
+ # very likely that it was the origin of the issue we saw. Thus, if, as planned we end up moving away from
96
+ # protobuf OR enough time has passed and no users saw the issue again, we can remove this check altogether.
97
+ Datadog.logger.error(
98
+ 'Profiling was marked as supported and enabled, but setup task was not loaded properly. ' \
99
+ 'Please report this at https://github.com/DataDog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug'
100
+ )
101
+
102
+ return
103
+ end
104
+
74
105
  # Load extensions needed to support some of the Profiling features
75
106
  Datadog::Profiling::Tasks::Setup.new.run
76
107
 
@@ -78,7 +109,7 @@ module Datadog
78
109
 
79
110
  recorder = build_profiler_recorder(settings)
80
111
  collectors = build_profiler_collectors(settings, recorder)
81
- exporters = build_profiler_exporters(settings)
112
+ exporters = build_profiler_exporters(settings, agent_settings)
82
113
  scheduler = build_profiler_scheduler(settings, recorder, exporters)
83
114
 
84
115
  Datadog::Profiler.new(collectors, scheduler)
@@ -88,24 +119,42 @@ module Datadog
88
119
 
89
120
  def build_tracer_tags(settings)
90
121
  settings.tags.dup.tap do |tags|
91
- tags['env'] = settings.env unless settings.env.nil?
92
- tags['version'] = settings.version unless settings.version.nil?
122
+ tags[Ext::Environment::TAG_ENV] = settings.env unless settings.env.nil?
123
+ tags[Ext::Environment::TAG_VERSION] = settings.version unless settings.version.nil?
93
124
  end
94
125
  end
95
126
 
96
- def build_tracer_options(settings)
97
- settings = settings.tracer
98
-
99
- {}.tap do |opts|
100
- opts[:hostname] = settings.hostname unless settings.hostname.nil?
101
- opts[:min_spans_before_partial_flush] = settings.partial_flush.min_spans_threshold unless settings.partial_flush.min_spans_threshold.nil?
102
- opts[:partial_flush] = settings.partial_flush.enabled unless settings.partial_flush.enabled.nil?
103
- opts[:port] = settings.port unless settings.port.nil?
104
- opts[:priority_sampling] = settings.priority_sampling unless settings.priority_sampling.nil?
105
- opts[:sampler] = settings.sampler unless settings.sampler.nil?
106
- opts[:transport_options] = settings.transport_options
107
- opts[:writer] = settings.writer unless settings.writer.nil?
108
- opts[:writer_options] = settings.writer_options if settings.writer.nil?
127
+ def build_tracer_options(settings, agent_settings)
128
+ tracer_options = {}.tap do |opts|
129
+ tset = settings.tracer
130
+ opts[:min_spans_before_partial_flush] = tset.partial_flush.min_spans_threshold unless tset.partial_flush.min_spans_threshold.nil?
131
+ opts[:partial_flush] = tset.partial_flush.enabled unless tset.partial_flush.enabled.nil?
132
+ opts[:priority_sampling] = tset.priority_sampling unless tset.priority_sampling.nil?
133
+ opts[:sampler] = tset.sampler unless tset.sampler.nil?
134
+ opts[:writer] = tset.writer unless tset.writer.nil?
135
+ opts[:writer_options] = tset.writer_options if tset.writer.nil?
136
+ end
137
+
138
+ # Apply test mode settings if test mode is activated
139
+ if settings.test_mode.enabled
140
+ build_tracer_test_mode_options(tracer_options, settings, agent_settings)
141
+ else
142
+ tracer_options
143
+ end
144
+ end
145
+
146
+ def build_tracer_test_mode_options(tracer_options, settings, agent_settings)
147
+ tracer_options.tap do |opts|
148
+ # Do not sample any spans for tests; all must be preserved.
149
+ opts[:sampler] = Datadog::AllSampler.new
150
+
151
+ # If context flush behavior is provided, use it instead.
152
+ opts[:context_flush] = settings.test_mode.context_flush if settings.test_mode.context_flush
153
+
154
+ # Flush traces synchronously, to guarantee they are written.
155
+ writer_options = settings.test_mode.writer_options || {}
156
+ writer_options[:agent_settings] = agent_settings if agent_settings
157
+ opts[:writer] = Datadog::SyncWriter.new(writer_options)
109
158
  end
110
159
  end
111
160
 
@@ -126,22 +175,16 @@ module Datadog
126
175
  ]
127
176
  end
128
177
 
129
- def build_profiler_exporters(settings)
130
- if settings.profiling.exporter.instances.is_a?(Array)
131
- settings.profiling.exporter.instances
132
- else
133
- transport = if settings.profiling.exporter.transport
134
- settings.profiling.exporter.transport
135
- else
136
- transport_options = settings.profiling.exporter.transport_options.dup
137
- transport_options[:site] ||= settings.site if settings.site
138
- transport_options[:api_key] ||= settings.api_key if settings.api_key
139
- transport_options[:timeout] ||= settings.profiling.upload.timeout
140
- Datadog::Profiling::Transport::HTTP.default(transport_options)
141
- end
142
-
143
- [Datadog::Profiling::Exporter.new(transport)]
144
- end
178
+ def build_profiler_exporters(settings, agent_settings)
179
+ transport =
180
+ settings.profiling.exporter.transport || Datadog::Profiling::Transport::HTTP.default(
181
+ agent_settings: agent_settings,
182
+ site: settings.site,
183
+ api_key: settings.api_key,
184
+ profiling_upload_timeout_seconds: settings.profiling.upload.timeout_seconds
185
+ )
186
+
187
+ [Datadog::Profiling::Exporter.new(transport)]
145
188
  end
146
189
 
147
190
  def build_profiler_scheduler(settings, recorder, exporters)
@@ -160,11 +203,13 @@ module Datadog
160
203
  # Logger
161
204
  @logger = self.class.build_logger(settings)
162
205
 
206
+ agent_settings = AgentSettingsResolver.call(settings, logger: @logger)
207
+
163
208
  # Tracer
164
- @tracer = self.class.build_tracer(settings)
209
+ @tracer = self.class.build_tracer(settings, agent_settings)
165
210
 
166
211
  # Profiler
167
- @profiler = self.class.build_profiler(settings)
212
+ @profiler = self.class.build_profiler(settings, agent_settings)
168
213
 
169
214
  # Runtime metrics
170
215
  @runtime_metrics = self.class.build_runtime_metrics_worker(settings)
@@ -180,9 +225,9 @@ module Datadog
180
225
  @logger.debug('Profiling started')
181
226
  profiler.start
182
227
  else
183
- # Display a warning for users who expected profiling to autostart
184
- protobuf = Datadog::Profiling.google_protobuf_supported?
185
- logger.warn("Profiling was enabled but is not supported; profiling disabled. (google-protobuf?: #{protobuf})")
228
+ # Display a warning for users who expected profiling to be enabled
229
+ unsupported_reason = Datadog::Profiling.unsupported_reason
230
+ logger.warn("Profiling was requested but is not supported, profiling disabled: #{unsupported_reason}")
186
231
  end
187
232
  else
188
233
  @logger.debug('Profiling is disabled')