ddtrace 0.46.0 → 0.51.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 (732) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +303 -79
  3. data/.circleci/images/primary/Dockerfile-2.1.10 +12 -2
  4. data/.circleci/images/primary/Dockerfile-2.2.10 +12 -2
  5. data/.circleci/images/primary/Dockerfile-2.3.8 +14 -2
  6. data/.circleci/images/primary/Dockerfile-2.4.10 +85 -0
  7. data/.circleci/images/primary/{Dockerfile-2.5.6 → Dockerfile-2.5.9} +13 -3
  8. data/.circleci/images/primary/{Dockerfile-2.6.4 → Dockerfile-2.6.7} +13 -3
  9. data/.circleci/images/primary/{Dockerfile-2.7.0 → Dockerfile-2.7.3} +13 -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 +88 -0
  12. data/.circleci/images/primary/{Dockerfile-jruby-9.2 → Dockerfile-jruby-9.2.0.0} +2 -6
  13. data/.circleci/images/primary/{Dockerfile-2.4.6 → Dockerfile-truffleruby-21.1.0} +4 -4
  14. data/.dd-ci/ci-app-spec.json +31 -0
  15. data/.dockerignore +0 -1
  16. data/.gitattributes +1 -0
  17. data/.github/workflows/create-next-milestone.yml +2 -2
  18. data/.github/workflows/test-head.yaml +34 -0
  19. data/.gitignore +0 -1
  20. data/.gitlab-ci.yml +18 -18
  21. data/.rubocop.yml +32 -9
  22. data/.rubocop_todo.yml +53 -12
  23. data/.simplecov +6 -0
  24. data/Appraisals +254 -176
  25. data/CHANGELOG.md +271 -1
  26. data/Gemfile +35 -7
  27. data/LICENSE-3rdparty.csv +2 -0
  28. data/Rakefile +339 -332
  29. data/benchmarks/data/profiler-submission-marshal.gz +0 -0
  30. data/benchmarks/profiler_sample_loop.rb +69 -0
  31. data/benchmarks/profiler_submission.rb +93 -0
  32. data/bin/ddtracerb +15 -0
  33. data/ddtrace.gemspec +6 -4
  34. data/docker-compose.yml +68 -54
  35. data/docs/GettingStarted.md +149 -67
  36. data/docs/ProfilingDevelopment.md +88 -0
  37. data/gemfiles/jruby_9.2.0.0_contrib.gemfile +82 -0
  38. data/gemfiles/jruby_9.2.0.0_contrib.gemfile.lock +1571 -0
  39. data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile +36 -0
  40. data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile.lock +159 -0
  41. data/gemfiles/jruby_9.2.0.0_core_old.gemfile +35 -0
  42. data/gemfiles/jruby_9.2.0.0_core_old.gemfile.lock +155 -0
  43. data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile +36 -0
  44. data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile.lock +176 -0
  45. data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile +36 -0
  46. data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile.lock +208 -0
  47. data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile +36 -0
  48. data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile.lock +208 -0
  49. data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile +41 -0
  50. data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile.lock +273 -0
  51. data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile +41 -0
  52. data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile.lock +273 -0
  53. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile +42 -0
  54. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile.lock +275 -0
  55. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile +42 -0
  56. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile.lock +275 -0
  57. data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile +43 -0
  58. data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile.lock +281 -0
  59. data/gemfiles/jruby_9.2.0.0_rails5_semantic_logger.gemfile +41 -0
  60. data/gemfiles/jruby_9.2.0.0_rails5_semantic_logger.gemfile.lock +272 -0
  61. data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile +41 -0
  62. data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile.lock +292 -0
  63. data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile +41 -0
  64. data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile.lock +292 -0
  65. data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile +42 -0
  66. data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile.lock +294 -0
  67. data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile +42 -0
  68. data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile.lock +299 -0
  69. data/gemfiles/jruby_9.2.0.0_rails61_semantic_logger.gemfile +41 -0
  70. data/gemfiles/jruby_9.2.0.0_rails61_semantic_logger.gemfile.lock +291 -0
  71. data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile +41 -0
  72. data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile.lock +289 -0
  73. data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile +41 -0
  74. data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile.lock +289 -0
  75. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile +42 -0
  76. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile.lock +291 -0
  77. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile +42 -0
  78. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile.lock +291 -0
  79. data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile +43 -0
  80. data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile.lock +297 -0
  81. data/gemfiles/jruby_9.2.0.0_rails6_semantic_logger.gemfile +41 -0
  82. data/gemfiles/jruby_9.2.0.0_rails6_semantic_logger.gemfile.lock +288 -0
  83. data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile +37 -0
  84. data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile.lock +182 -0
  85. data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile +37 -0
  86. data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile.lock +182 -0
  87. data/gemfiles/jruby_9.2.18.0_contrib.gemfile +82 -0
  88. data/gemfiles/jruby_9.2.18.0_contrib.gemfile.lock +1571 -0
  89. data/gemfiles/jruby_9.2.18.0_contrib_old.gemfile +36 -0
  90. data/gemfiles/jruby_9.2.18.0_contrib_old.gemfile.lock +159 -0
  91. data/gemfiles/jruby_9.2.18.0_core_old.gemfile +35 -0
  92. data/gemfiles/jruby_9.2.18.0_core_old.gemfile.lock +155 -0
  93. data/gemfiles/jruby_9.2.18.0_cucumber3.gemfile +36 -0
  94. data/gemfiles/jruby_9.2.18.0_cucumber3.gemfile.lock +176 -0
  95. data/gemfiles/jruby_9.2.18.0_cucumber4.gemfile +36 -0
  96. data/gemfiles/jruby_9.2.18.0_cucumber4.gemfile.lock +208 -0
  97. data/gemfiles/jruby_9.2.18.0_cucumber5.gemfile +36 -0
  98. data/gemfiles/jruby_9.2.18.0_cucumber5.gemfile.lock +208 -0
  99. data/gemfiles/jruby_9.2.18.0_rails5_mysql2.gemfile +41 -0
  100. data/gemfiles/jruby_9.2.18.0_rails5_mysql2.gemfile.lock +273 -0
  101. data/gemfiles/jruby_9.2.18.0_rails5_postgres.gemfile +41 -0
  102. data/gemfiles/jruby_9.2.18.0_rails5_postgres.gemfile.lock +273 -0
  103. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis.gemfile +42 -0
  104. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis.gemfile.lock +275 -0
  105. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis_activesupport.gemfile +42 -0
  106. data/gemfiles/jruby_9.2.18.0_rails5_postgres_redis_activesupport.gemfile.lock +275 -0
  107. data/gemfiles/jruby_9.2.18.0_rails5_postgres_sidekiq.gemfile +43 -0
  108. data/gemfiles/jruby_9.2.18.0_rails5_postgres_sidekiq.gemfile.lock +281 -0
  109. data/gemfiles/jruby_9.2.18.0_rails5_semantic_logger.gemfile +41 -0
  110. data/gemfiles/jruby_9.2.18.0_rails5_semantic_logger.gemfile.lock +272 -0
  111. data/gemfiles/jruby_9.2.18.0_rails61_mysql2.gemfile +41 -0
  112. data/gemfiles/jruby_9.2.18.0_rails61_mysql2.gemfile.lock +292 -0
  113. data/gemfiles/jruby_9.2.18.0_rails61_postgres.gemfile +41 -0
  114. data/gemfiles/jruby_9.2.18.0_rails61_postgres.gemfile.lock +292 -0
  115. data/gemfiles/jruby_9.2.18.0_rails61_postgres_redis.gemfile +42 -0
  116. data/gemfiles/jruby_9.2.18.0_rails61_postgres_redis.gemfile.lock +294 -0
  117. data/gemfiles/jruby_9.2.18.0_rails61_postgres_sidekiq.gemfile +42 -0
  118. data/gemfiles/jruby_9.2.18.0_rails61_postgres_sidekiq.gemfile.lock +299 -0
  119. data/gemfiles/jruby_9.2.18.0_rails61_semantic_logger.gemfile +41 -0
  120. data/gemfiles/jruby_9.2.18.0_rails61_semantic_logger.gemfile.lock +291 -0
  121. data/gemfiles/jruby_9.2.18.0_rails6_mysql2.gemfile +41 -0
  122. data/gemfiles/jruby_9.2.18.0_rails6_mysql2.gemfile.lock +289 -0
  123. data/gemfiles/jruby_9.2.18.0_rails6_postgres.gemfile +41 -0
  124. data/gemfiles/jruby_9.2.18.0_rails6_postgres.gemfile.lock +289 -0
  125. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis.gemfile +42 -0
  126. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis.gemfile.lock +291 -0
  127. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis_activesupport.gemfile +42 -0
  128. data/gemfiles/jruby_9.2.18.0_rails6_postgres_redis_activesupport.gemfile.lock +291 -0
  129. data/gemfiles/jruby_9.2.18.0_rails6_postgres_sidekiq.gemfile +43 -0
  130. data/gemfiles/jruby_9.2.18.0_rails6_postgres_sidekiq.gemfile.lock +297 -0
  131. data/gemfiles/jruby_9.2.18.0_rails6_semantic_logger.gemfile +41 -0
  132. data/gemfiles/jruby_9.2.18.0_rails6_semantic_logger.gemfile.lock +288 -0
  133. data/gemfiles/jruby_9.2.18.0_resque2_redis3.gemfile +37 -0
  134. data/gemfiles/jruby_9.2.18.0_resque2_redis3.gemfile.lock +182 -0
  135. data/gemfiles/jruby_9.2.18.0_resque2_redis4.gemfile +37 -0
  136. data/gemfiles/jruby_9.2.18.0_resque2_redis4.gemfile.lock +182 -0
  137. data/gemfiles/ruby_2.1.10_contrib_old.gemfile +68 -0
  138. data/gemfiles/ruby_2.1.10_contrib_old.gemfile.lock +310 -0
  139. data/gemfiles/ruby_2.1.10_core_old.gemfile +34 -0
  140. data/gemfiles/ruby_2.1.10_core_old.gemfile.lock +120 -0
  141. data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile +39 -0
  142. data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile.lock +193 -0
  143. data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile +40 -0
  144. data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile.lock +202 -0
  145. data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile +42 -0
  146. data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock +212 -0
  147. data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile +39 -0
  148. data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock +201 -0
  149. data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile +41 -0
  150. data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock +220 -0
  151. data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile +40 -0
  152. data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock +210 -0
  153. data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile +39 -0
  154. data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock +220 -0
  155. data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile +39 -0
  156. data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock +220 -0
  157. data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile +41 -0
  158. data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock +239 -0
  159. data/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile +39 -0
  160. data/gemfiles/ruby_2.1.10_rails4_semantic_logger.gemfile.lock +218 -0
  161. data/gemfiles/ruby_2.2.10_contrib.gemfile +76 -0
  162. data/gemfiles/ruby_2.2.10_contrib.gemfile.lock +1499 -0
  163. data/gemfiles/ruby_2.2.10_core_old.gemfile +34 -0
  164. data/gemfiles/ruby_2.2.10_core_old.gemfile.lock +120 -0
  165. data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile +39 -0
  166. data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile.lock +193 -0
  167. data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile +40 -0
  168. data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile.lock +202 -0
  169. data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile +41 -0
  170. data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile.lock +209 -0
  171. data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile +39 -0
  172. data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile.lock +201 -0
  173. data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile +41 -0
  174. data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile.lock +220 -0
  175. data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile +40 -0
  176. data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile.lock +210 -0
  177. data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile +39 -0
  178. data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile.lock +220 -0
  179. data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile +39 -0
  180. data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile.lock +220 -0
  181. data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile +41 -0
  182. data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile.lock +239 -0
  183. data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile +41 -0
  184. data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile.lock +231 -0
  185. data/gemfiles/ruby_2.2.10_rails4_semantic_logger.gemfile +39 -0
  186. data/gemfiles/ruby_2.2.10_rails4_semantic_logger.gemfile.lock +218 -0
  187. data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile +39 -0
  188. data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile.lock +236 -0
  189. data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile +39 -0
  190. data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile.lock +236 -0
  191. data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile +40 -0
  192. data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile.lock +238 -0
  193. data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile +40 -0
  194. data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile.lock +238 -0
  195. data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile +41 -0
  196. data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile.lock +247 -0
  197. data/gemfiles/ruby_2.2.10_rails5_semantic_logger.gemfile +39 -0
  198. data/gemfiles/ruby_2.2.10_rails5_semantic_logger.gemfile.lock +234 -0
  199. data/gemfiles/ruby_2.3.8_contrib.gemfile +75 -0
  200. data/gemfiles/ruby_2.3.8_contrib.gemfile.lock +1508 -0
  201. data/gemfiles/ruby_2.3.8_contrib_old.gemfile +34 -0
  202. data/gemfiles/ruby_2.3.8_contrib_old.gemfile.lock +123 -0
  203. data/gemfiles/ruby_2.3.8_core_old.gemfile +33 -0
  204. data/gemfiles/ruby_2.3.8_core_old.gemfile.lock +119 -0
  205. data/gemfiles/ruby_2.3.8_cucumber3.gemfile +34 -0
  206. data/gemfiles/ruby_2.3.8_cucumber3.gemfile.lock +140 -0
  207. data/gemfiles/ruby_2.3.8_cucumber4.gemfile +34 -0
  208. data/gemfiles/ruby_2.3.8_cucumber4.gemfile.lock +170 -0
  209. data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile +38 -0
  210. data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile.lock +192 -0
  211. data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile +39 -0
  212. data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile.lock +201 -0
  213. data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile +40 -0
  214. data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile.lock +208 -0
  215. data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile +38 -0
  216. data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile.lock +200 -0
  217. data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile +40 -0
  218. data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile.lock +219 -0
  219. data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile +39 -0
  220. data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile.lock +209 -0
  221. data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile +38 -0
  222. data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile.lock +219 -0
  223. data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile +38 -0
  224. data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile.lock +219 -0
  225. data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile +40 -0
  226. data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile.lock +238 -0
  227. data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile +40 -0
  228. data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile.lock +230 -0
  229. data/gemfiles/ruby_2.3.8_rails4_semantic_logger.gemfile +38 -0
  230. data/gemfiles/ruby_2.3.8_rails4_semantic_logger.gemfile.lock +218 -0
  231. data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile +37 -0
  232. data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile.lock +230 -0
  233. data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile +37 -0
  234. data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile.lock +230 -0
  235. data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile +38 -0
  236. data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile.lock +232 -0
  237. data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile +38 -0
  238. data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile.lock +232 -0
  239. data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile +39 -0
  240. data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile.lock +241 -0
  241. data/gemfiles/ruby_2.3.8_rails5_semantic_logger.gemfile +37 -0
  242. data/gemfiles/ruby_2.3.8_rails5_semantic_logger.gemfile.lock +229 -0
  243. data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile +35 -0
  244. data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile.lock +146 -0
  245. data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile +35 -0
  246. data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile.lock +146 -0
  247. data/gemfiles/ruby_2.4.10_contrib.gemfile +81 -0
  248. data/gemfiles/ruby_2.4.10_contrib.gemfile.lock +1596 -0
  249. data/gemfiles/ruby_2.4.10_contrib_old.gemfile +39 -0
  250. data/gemfiles/ruby_2.4.10_contrib_old.gemfile.lock +157 -0
  251. data/gemfiles/ruby_2.4.10_core_old.gemfile +38 -0
  252. data/gemfiles/ruby_2.4.10_core_old.gemfile.lock +153 -0
  253. data/gemfiles/ruby_2.4.10_cucumber3.gemfile +39 -0
  254. data/gemfiles/ruby_2.4.10_cucumber3.gemfile.lock +174 -0
  255. data/gemfiles/ruby_2.4.10_cucumber4.gemfile +39 -0
  256. data/gemfiles/ruby_2.4.10_cucumber4.gemfile.lock +204 -0
  257. data/gemfiles/ruby_2.4.10_rails5_mysql2.gemfile +42 -0
  258. data/gemfiles/ruby_2.4.10_rails5_mysql2.gemfile.lock +264 -0
  259. data/gemfiles/ruby_2.4.10_rails5_postgres.gemfile +42 -0
  260. data/gemfiles/ruby_2.4.10_rails5_postgres.gemfile.lock +264 -0
  261. data/gemfiles/ruby_2.4.10_rails5_postgres_redis.gemfile +43 -0
  262. data/gemfiles/ruby_2.4.10_rails5_postgres_redis.gemfile.lock +266 -0
  263. data/gemfiles/ruby_2.4.10_rails5_postgres_redis_activesupport.gemfile +43 -0
  264. data/gemfiles/ruby_2.4.10_rails5_postgres_redis_activesupport.gemfile.lock +266 -0
  265. data/gemfiles/ruby_2.4.10_rails5_postgres_sidekiq.gemfile +44 -0
  266. data/gemfiles/ruby_2.4.10_rails5_postgres_sidekiq.gemfile.lock +275 -0
  267. data/gemfiles/ruby_2.4.10_rails5_semantic_logger.gemfile +42 -0
  268. data/gemfiles/ruby_2.4.10_rails5_semantic_logger.gemfile.lock +263 -0
  269. data/gemfiles/ruby_2.4.10_resque2_redis3.gemfile +40 -0
  270. data/gemfiles/ruby_2.4.10_resque2_redis3.gemfile.lock +180 -0
  271. data/gemfiles/ruby_2.4.10_resque2_redis4.gemfile +40 -0
  272. data/gemfiles/ruby_2.4.10_resque2_redis4.gemfile.lock +180 -0
  273. data/gemfiles/ruby_2.5.9_contrib.gemfile +86 -0
  274. data/gemfiles/ruby_2.5.9_contrib.gemfile.lock +1608 -0
  275. data/gemfiles/ruby_2.5.9_contrib_old.gemfile +40 -0
  276. data/gemfiles/ruby_2.5.9_contrib_old.gemfile.lock +167 -0
  277. data/gemfiles/ruby_2.5.9_core_old.gemfile +39 -0
  278. data/gemfiles/ruby_2.5.9_core_old.gemfile.lock +163 -0
  279. data/gemfiles/ruby_2.5.9_cucumber3.gemfile +40 -0
  280. data/gemfiles/ruby_2.5.9_cucumber3.gemfile.lock +184 -0
  281. data/gemfiles/ruby_2.5.9_cucumber4.gemfile +40 -0
  282. data/gemfiles/ruby_2.5.9_cucumber4.gemfile.lock +216 -0
  283. data/gemfiles/ruby_2.5.9_cucumber5.gemfile +40 -0
  284. data/gemfiles/ruby_2.5.9_cucumber5.gemfile.lock +216 -0
  285. data/gemfiles/ruby_2.5.9_rails5_mysql2.gemfile +45 -0
  286. data/gemfiles/ruby_2.5.9_rails5_mysql2.gemfile.lock +276 -0
  287. data/gemfiles/ruby_2.5.9_rails5_postgres.gemfile +45 -0
  288. data/gemfiles/ruby_2.5.9_rails5_postgres.gemfile.lock +276 -0
  289. data/gemfiles/ruby_2.5.9_rails5_postgres_redis.gemfile +46 -0
  290. data/gemfiles/ruby_2.5.9_rails5_postgres_redis.gemfile.lock +278 -0
  291. data/gemfiles/ruby_2.5.9_rails5_postgres_redis_activesupport.gemfile +46 -0
  292. data/gemfiles/ruby_2.5.9_rails5_postgres_redis_activesupport.gemfile.lock +278 -0
  293. data/gemfiles/ruby_2.5.9_rails5_postgres_sidekiq.gemfile +47 -0
  294. data/gemfiles/ruby_2.5.9_rails5_postgres_sidekiq.gemfile.lock +284 -0
  295. data/gemfiles/ruby_2.5.9_rails5_semantic_logger.gemfile +45 -0
  296. data/gemfiles/ruby_2.5.9_rails5_semantic_logger.gemfile.lock +275 -0
  297. data/gemfiles/ruby_2.5.9_rails61_mysql2.gemfile +45 -0
  298. data/gemfiles/ruby_2.5.9_rails61_mysql2.gemfile.lock +295 -0
  299. data/gemfiles/ruby_2.5.9_rails61_postgres.gemfile +45 -0
  300. data/gemfiles/ruby_2.5.9_rails61_postgres.gemfile.lock +295 -0
  301. data/gemfiles/ruby_2.5.9_rails61_postgres_redis.gemfile +46 -0
  302. data/gemfiles/ruby_2.5.9_rails61_postgres_redis.gemfile.lock +297 -0
  303. data/gemfiles/ruby_2.5.9_rails61_postgres_sidekiq.gemfile +46 -0
  304. data/gemfiles/ruby_2.5.9_rails61_postgres_sidekiq.gemfile.lock +302 -0
  305. data/gemfiles/ruby_2.5.9_rails61_semantic_logger.gemfile +45 -0
  306. data/gemfiles/ruby_2.5.9_rails61_semantic_logger.gemfile.lock +294 -0
  307. data/gemfiles/ruby_2.5.9_rails6_mysql2.gemfile +45 -0
  308. data/gemfiles/ruby_2.5.9_rails6_mysql2.gemfile.lock +292 -0
  309. data/gemfiles/ruby_2.5.9_rails6_postgres.gemfile +45 -0
  310. data/gemfiles/ruby_2.5.9_rails6_postgres.gemfile.lock +292 -0
  311. data/gemfiles/ruby_2.5.9_rails6_postgres_redis.gemfile +46 -0
  312. data/gemfiles/ruby_2.5.9_rails6_postgres_redis.gemfile.lock +294 -0
  313. data/gemfiles/ruby_2.5.9_rails6_postgres_redis_activesupport.gemfile +46 -0
  314. data/gemfiles/ruby_2.5.9_rails6_postgres_redis_activesupport.gemfile.lock +294 -0
  315. data/gemfiles/ruby_2.5.9_rails6_postgres_sidekiq.gemfile +47 -0
  316. data/gemfiles/ruby_2.5.9_rails6_postgres_sidekiq.gemfile.lock +300 -0
  317. data/gemfiles/ruby_2.5.9_rails6_semantic_logger.gemfile +45 -0
  318. data/gemfiles/ruby_2.5.9_rails6_semantic_logger.gemfile.lock +291 -0
  319. data/gemfiles/ruby_2.5.9_resque2_redis3.gemfile +41 -0
  320. data/gemfiles/ruby_2.5.9_resque2_redis3.gemfile.lock +190 -0
  321. data/gemfiles/ruby_2.5.9_resque2_redis4.gemfile +41 -0
  322. data/gemfiles/ruby_2.5.9_resque2_redis4.gemfile.lock +190 -0
  323. data/gemfiles/ruby_2.6.7_contrib.gemfile +82 -0
  324. data/gemfiles/ruby_2.6.7_contrib.gemfile.lock +1606 -0
  325. data/gemfiles/ruby_2.6.7_contrib_old.gemfile +40 -0
  326. data/gemfiles/ruby_2.6.7_contrib_old.gemfile.lock +169 -0
  327. data/gemfiles/ruby_2.6.7_core_old.gemfile +39 -0
  328. data/gemfiles/ruby_2.6.7_core_old.gemfile.lock +165 -0
  329. data/gemfiles/ruby_2.6.7_cucumber3.gemfile +40 -0
  330. data/gemfiles/ruby_2.6.7_cucumber3.gemfile.lock +186 -0
  331. data/gemfiles/ruby_2.6.7_cucumber4.gemfile +40 -0
  332. data/gemfiles/ruby_2.6.7_cucumber4.gemfile.lock +218 -0
  333. data/gemfiles/ruby_2.6.7_cucumber5.gemfile +40 -0
  334. data/gemfiles/ruby_2.6.7_cucumber5.gemfile.lock +218 -0
  335. data/gemfiles/ruby_2.6.7_rails5_mysql2.gemfile +43 -0
  336. data/gemfiles/ruby_2.6.7_rails5_mysql2.gemfile.lock +276 -0
  337. data/gemfiles/ruby_2.6.7_rails5_postgres.gemfile +43 -0
  338. data/gemfiles/ruby_2.6.7_rails5_postgres.gemfile.lock +276 -0
  339. data/gemfiles/ruby_2.6.7_rails5_postgres_redis.gemfile +44 -0
  340. data/gemfiles/ruby_2.6.7_rails5_postgres_redis.gemfile.lock +278 -0
  341. data/gemfiles/ruby_2.6.7_rails5_postgres_redis_activesupport.gemfile +44 -0
  342. data/gemfiles/ruby_2.6.7_rails5_postgres_redis_activesupport.gemfile.lock +278 -0
  343. data/gemfiles/ruby_2.6.7_rails5_postgres_sidekiq.gemfile +45 -0
  344. data/gemfiles/ruby_2.6.7_rails5_postgres_sidekiq.gemfile.lock +284 -0
  345. data/gemfiles/ruby_2.6.7_rails5_semantic_logger.gemfile +43 -0
  346. data/gemfiles/ruby_2.6.7_rails5_semantic_logger.gemfile.lock +275 -0
  347. data/gemfiles/ruby_2.6.7_rails61_mysql2.gemfile +43 -0
  348. data/gemfiles/ruby_2.6.7_rails61_mysql2.gemfile.lock +295 -0
  349. data/gemfiles/ruby_2.6.7_rails61_postgres.gemfile +43 -0
  350. data/gemfiles/ruby_2.6.7_rails61_postgres.gemfile.lock +295 -0
  351. data/gemfiles/ruby_2.6.7_rails61_postgres_redis.gemfile +44 -0
  352. data/gemfiles/ruby_2.6.7_rails61_postgres_redis.gemfile.lock +297 -0
  353. data/gemfiles/ruby_2.6.7_rails61_postgres_sidekiq.gemfile +44 -0
  354. data/gemfiles/ruby_2.6.7_rails61_postgres_sidekiq.gemfile.lock +302 -0
  355. data/gemfiles/ruby_2.6.7_rails61_semantic_logger.gemfile +43 -0
  356. data/gemfiles/ruby_2.6.7_rails61_semantic_logger.gemfile.lock +294 -0
  357. data/gemfiles/ruby_2.6.7_rails6_mysql2.gemfile +43 -0
  358. data/gemfiles/ruby_2.6.7_rails6_mysql2.gemfile.lock +292 -0
  359. data/gemfiles/ruby_2.6.7_rails6_postgres.gemfile +43 -0
  360. data/gemfiles/ruby_2.6.7_rails6_postgres.gemfile.lock +292 -0
  361. data/gemfiles/ruby_2.6.7_rails6_postgres_redis.gemfile +44 -0
  362. data/gemfiles/ruby_2.6.7_rails6_postgres_redis.gemfile.lock +294 -0
  363. data/gemfiles/ruby_2.6.7_rails6_postgres_redis_activesupport.gemfile +44 -0
  364. data/gemfiles/ruby_2.6.7_rails6_postgres_redis_activesupport.gemfile.lock +294 -0
  365. data/gemfiles/ruby_2.6.7_rails6_postgres_sidekiq.gemfile +45 -0
  366. data/gemfiles/ruby_2.6.7_rails6_postgres_sidekiq.gemfile.lock +300 -0
  367. data/gemfiles/ruby_2.6.7_rails6_semantic_logger.gemfile +43 -0
  368. data/gemfiles/ruby_2.6.7_rails6_semantic_logger.gemfile.lock +291 -0
  369. data/gemfiles/ruby_2.6.7_resque2_redis3.gemfile +41 -0
  370. data/gemfiles/ruby_2.6.7_resque2_redis3.gemfile.lock +192 -0
  371. data/gemfiles/ruby_2.6.7_resque2_redis4.gemfile +41 -0
  372. data/gemfiles/ruby_2.6.7_resque2_redis4.gemfile.lock +192 -0
  373. data/gemfiles/ruby_2.7.3_contrib.gemfile +81 -0
  374. data/gemfiles/ruby_2.7.3_contrib.gemfile.lock +1580 -0
  375. data/gemfiles/ruby_2.7.3_contrib_old.gemfile +40 -0
  376. data/gemfiles/ruby_2.7.3_contrib_old.gemfile.lock +169 -0
  377. data/gemfiles/ruby_2.7.3_core_old.gemfile +39 -0
  378. data/gemfiles/ruby_2.7.3_core_old.gemfile.lock +165 -0
  379. data/gemfiles/ruby_2.7.3_cucumber3.gemfile +40 -0
  380. data/gemfiles/ruby_2.7.3_cucumber3.gemfile.lock +186 -0
  381. data/gemfiles/ruby_2.7.3_cucumber4.gemfile +40 -0
  382. data/gemfiles/ruby_2.7.3_cucumber4.gemfile.lock +218 -0
  383. data/gemfiles/ruby_2.7.3_cucumber5.gemfile +40 -0
  384. data/gemfiles/ruby_2.7.3_cucumber5.gemfile.lock +218 -0
  385. data/gemfiles/ruby_2.7.3_rails5_mysql2.gemfile +43 -0
  386. data/gemfiles/ruby_2.7.3_rails5_mysql2.gemfile.lock +278 -0
  387. data/gemfiles/ruby_2.7.3_rails5_postgres.gemfile +43 -0
  388. data/gemfiles/ruby_2.7.3_rails5_postgres.gemfile.lock +278 -0
  389. data/gemfiles/ruby_2.7.3_rails5_postgres_redis.gemfile +45 -0
  390. data/gemfiles/ruby_2.7.3_rails5_postgres_redis.gemfile.lock +297 -0
  391. data/gemfiles/ruby_2.7.3_rails5_postgres_redis_activesupport.gemfile +45 -0
  392. data/gemfiles/ruby_2.7.3_rails5_postgres_redis_activesupport.gemfile.lock +297 -0
  393. data/gemfiles/ruby_2.7.3_rails5_postgres_sidekiq.gemfile +45 -0
  394. data/gemfiles/ruby_2.7.3_rails5_postgres_sidekiq.gemfile.lock +286 -0
  395. data/gemfiles/ruby_2.7.3_rails5_semantic_logger.gemfile +43 -0
  396. data/gemfiles/ruby_2.7.3_rails5_semantic_logger.gemfile.lock +277 -0
  397. data/gemfiles/ruby_2.7.3_rails61_mysql2.gemfile +43 -0
  398. data/gemfiles/ruby_2.7.3_rails61_mysql2.gemfile.lock +297 -0
  399. data/gemfiles/ruby_2.7.3_rails61_postgres.gemfile +43 -0
  400. data/gemfiles/ruby_2.7.3_rails61_postgres.gemfile.lock +297 -0
  401. data/gemfiles/ruby_2.7.3_rails61_postgres_redis.gemfile +44 -0
  402. data/gemfiles/ruby_2.7.3_rails61_postgres_redis.gemfile.lock +299 -0
  403. data/gemfiles/ruby_2.7.3_rails61_postgres_sidekiq.gemfile +44 -0
  404. data/gemfiles/ruby_2.7.3_rails61_postgres_sidekiq.gemfile.lock +304 -0
  405. data/gemfiles/ruby_2.7.3_rails61_semantic_logger.gemfile +43 -0
  406. data/gemfiles/ruby_2.7.3_rails61_semantic_logger.gemfile.lock +296 -0
  407. data/gemfiles/ruby_2.7.3_rails6_mysql2.gemfile +43 -0
  408. data/gemfiles/ruby_2.7.3_rails6_mysql2.gemfile.lock +294 -0
  409. data/gemfiles/ruby_2.7.3_rails6_postgres.gemfile +43 -0
  410. data/gemfiles/ruby_2.7.3_rails6_postgres.gemfile.lock +294 -0
  411. data/gemfiles/ruby_2.7.3_rails6_postgres_redis.gemfile +45 -0
  412. data/gemfiles/ruby_2.7.3_rails6_postgres_redis.gemfile.lock +313 -0
  413. data/gemfiles/ruby_2.7.3_rails6_postgres_redis_activesupport.gemfile +45 -0
  414. data/gemfiles/ruby_2.7.3_rails6_postgres_redis_activesupport.gemfile.lock +313 -0
  415. data/gemfiles/ruby_2.7.3_rails6_postgres_sidekiq.gemfile +45 -0
  416. data/gemfiles/ruby_2.7.3_rails6_postgres_sidekiq.gemfile.lock +302 -0
  417. data/gemfiles/ruby_2.7.3_rails6_semantic_logger.gemfile +43 -0
  418. data/gemfiles/ruby_2.7.3_rails6_semantic_logger.gemfile.lock +293 -0
  419. data/gemfiles/ruby_2.7.3_resque2_redis3.gemfile +41 -0
  420. data/gemfiles/ruby_2.7.3_resque2_redis3.gemfile.lock +192 -0
  421. data/gemfiles/ruby_2.7.3_resque2_redis4.gemfile +41 -0
  422. data/gemfiles/ruby_2.7.3_resque2_redis4.gemfile.lock +192 -0
  423. data/gemfiles/ruby_3.0.1_contrib.gemfile +80 -0
  424. data/gemfiles/ruby_3.0.1_contrib.gemfile.lock +1583 -0
  425. data/gemfiles/ruby_3.0.1_core_old.gemfile +40 -0
  426. data/gemfiles/ruby_3.0.1_core_old.gemfile.lock +167 -0
  427. data/gemfiles/ruby_3.0.1_cucumber3.gemfile +41 -0
  428. data/gemfiles/ruby_3.0.1_cucumber3.gemfile.lock +188 -0
  429. data/gemfiles/ruby_3.0.1_cucumber4.gemfile +41 -0
  430. data/gemfiles/ruby_3.0.1_cucumber4.gemfile.lock +220 -0
  431. data/gemfiles/ruby_3.0.1_cucumber5.gemfile +41 -0
  432. data/gemfiles/ruby_3.0.1_cucumber5.gemfile.lock +220 -0
  433. data/gemfiles/ruby_3.0.1_rails61_mysql2.gemfile +44 -0
  434. data/gemfiles/ruby_3.0.1_rails61_mysql2.gemfile.lock +297 -0
  435. data/gemfiles/ruby_3.0.1_rails61_postgres.gemfile +44 -0
  436. data/gemfiles/ruby_3.0.1_rails61_postgres.gemfile.lock +297 -0
  437. data/gemfiles/ruby_3.0.1_rails61_postgres_redis.gemfile +45 -0
  438. data/gemfiles/ruby_3.0.1_rails61_postgres_redis.gemfile.lock +299 -0
  439. data/gemfiles/ruby_3.0.1_rails61_postgres_sidekiq.gemfile +46 -0
  440. data/gemfiles/ruby_3.0.1_rails61_postgres_sidekiq.gemfile.lock +311 -0
  441. data/gemfiles/ruby_3.0.1_rails61_semantic_logger.gemfile +44 -0
  442. data/gemfiles/ruby_3.0.1_rails61_semantic_logger.gemfile.lock +296 -0
  443. data/gemfiles/ruby_3.0.1_resque2_redis3.gemfile +42 -0
  444. data/gemfiles/ruby_3.0.1_resque2_redis3.gemfile.lock +194 -0
  445. data/gemfiles/ruby_3.0.1_resque2_redis4.gemfile +42 -0
  446. data/gemfiles/ruby_3.0.1_resque2_redis4.gemfile.lock +194 -0
  447. data/integration/README.md +1 -2
  448. data/integration/apps/rack/Dockerfile +3 -0
  449. data/integration/apps/rack/README.md +2 -2
  450. data/integration/apps/rack/script/build-images +1 -1
  451. data/integration/apps/rack/script/ci +3 -2
  452. data/integration/apps/rails-five/README.md +2 -2
  453. data/integration/apps/rails-five/script/build-images +1 -1
  454. data/integration/apps/rails-five/script/ci +3 -2
  455. data/integration/apps/rspec/.dockerignore +1 -0
  456. data/integration/apps/rspec/.envrc.sample +1 -0
  457. data/integration/apps/rspec/.gitignore +2 -0
  458. data/integration/apps/rspec/.rspec +1 -0
  459. data/integration/apps/rspec/Dockerfile +25 -0
  460. data/integration/apps/rspec/Dockerfile-ci +11 -0
  461. data/integration/apps/rspec/Gemfile +14 -0
  462. data/integration/apps/rspec/README.md +70 -0
  463. data/integration/apps/rspec/agent.yaml +3 -0
  464. data/integration/apps/rspec/app/datadog.rb +13 -0
  465. data/integration/apps/rspec/app/fibonacci.rb +30 -0
  466. data/integration/apps/rspec/bin/run +20 -0
  467. data/integration/apps/rspec/bin/setup +23 -0
  468. data/integration/apps/rspec/bin/test +21 -0
  469. data/integration/apps/rspec/docker-compose.ci.yml +51 -0
  470. data/integration/apps/rspec/docker-compose.yml +64 -0
  471. data/integration/apps/rspec/script/build-images +37 -0
  472. data/integration/apps/rspec/script/ci +53 -0
  473. data/integration/apps/rspec/spec/fibonacci_spec.rb +16 -0
  474. data/integration/apps/rspec/spec/rspec_spec.rb +58 -0
  475. data/integration/apps/rspec/spec/spec_helper.rb +24 -0
  476. data/integration/apps/ruby/README.md +2 -2
  477. data/integration/apps/ruby/script/build-images +1 -1
  478. data/integration/apps/ruby/script/ci +3 -2
  479. data/integration/images/include/datadog/demo_env.rb +15 -14
  480. data/integration/images/include/http-health-check +1 -1
  481. data/integration/images/wrk/scripts/entrypoint.sh +1 -1
  482. data/integration/script/build-images +1 -1
  483. data/lib/datadog/ci.rb +16 -0
  484. data/lib/datadog/ci/configuration/components.rb +30 -0
  485. data/lib/datadog/ci/configuration/settings.rb +36 -0
  486. data/lib/datadog/ci/context_flush.rb +28 -0
  487. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +30 -0
  488. data/lib/datadog/ci/contrib/cucumber/ext.rb +19 -0
  489. data/lib/datadog/ci/contrib/cucumber/formatter.rb +97 -0
  490. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +26 -0
  491. data/lib/datadog/ci/contrib/cucumber/integration.rb +47 -0
  492. data/lib/datadog/ci/contrib/cucumber/patcher.rb +25 -0
  493. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +30 -0
  494. data/lib/datadog/ci/contrib/rspec/example.rb +73 -0
  495. data/lib/datadog/ci/contrib/rspec/ext.rb +18 -0
  496. data/lib/datadog/ci/contrib/rspec/integration.rb +48 -0
  497. data/lib/datadog/ci/contrib/rspec/patcher.rb +25 -0
  498. data/lib/datadog/ci/ext/app_types.rb +9 -0
  499. data/lib/datadog/ci/ext/environment.rb +438 -0
  500. data/lib/datadog/ci/ext/settings.rb +10 -0
  501. data/lib/datadog/ci/ext/test.rb +34 -0
  502. data/lib/datadog/ci/extensions.rb +17 -0
  503. data/lib/datadog/ci/test.rb +76 -0
  504. data/lib/datadog/core/environment/cgroup.rb +49 -0
  505. data/lib/datadog/core/environment/class_count.rb +19 -0
  506. data/lib/datadog/core/environment/container.rb +88 -0
  507. data/lib/datadog/core/environment/ext.rb +26 -0
  508. data/lib/datadog/core/environment/gc.rb +18 -0
  509. data/lib/datadog/core/environment/identity.rb +50 -0
  510. data/lib/datadog/core/environment/object_space.rb +22 -0
  511. data/lib/datadog/core/environment/socket.rb +16 -0
  512. data/lib/datadog/core/environment/thread_count.rb +18 -0
  513. data/lib/datadog/core/environment/variable_helpers.rb +39 -0
  514. data/lib/ddtrace.rb +3 -2
  515. data/lib/ddtrace/auto_instrument.rb +1 -0
  516. data/lib/ddtrace/buffer.rb +2 -2
  517. data/lib/ddtrace/configuration.rb +98 -25
  518. data/lib/ddtrace/configuration/agent_settings_resolver.rb +230 -0
  519. data/lib/ddtrace/configuration/base.rb +7 -10
  520. data/lib/ddtrace/configuration/components.rb +150 -23
  521. data/lib/ddtrace/configuration/options.rb +4 -6
  522. data/lib/ddtrace/configuration/settings.rb +104 -7
  523. data/lib/ddtrace/context.rb +17 -14
  524. data/lib/ddtrace/context_flush.rb +14 -2
  525. data/lib/ddtrace/context_provider.rb +0 -2
  526. data/lib/ddtrace/contrib/action_cable/event.rb +4 -4
  527. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -1
  528. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +1 -1
  529. data/lib/ddtrace/contrib/action_pack/utils.rb +1 -1
  530. data/lib/ddtrace/contrib/action_view/event.rb +2 -2
  531. data/lib/ddtrace/contrib/action_view/patcher.rb +4 -4
  532. data/lib/ddtrace/contrib/active_model_serializers/event.rb +2 -2
  533. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +30 -0
  534. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +103 -26
  535. data/lib/ddtrace/contrib/active_record/event.rb +2 -2
  536. data/lib/ddtrace/contrib/active_record/utils.rb +2 -2
  537. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +7 -7
  538. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -5
  539. data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -2
  540. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -1
  541. data/lib/ddtrace/contrib/auto_instrument.rb +1 -2
  542. data/lib/ddtrace/contrib/aws/instrumentation.rb +29 -0
  543. data/lib/ddtrace/contrib/aws/patcher.rb +4 -0
  544. data/lib/ddtrace/contrib/aws/services.rb +1 -0
  545. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -1
  546. data/lib/ddtrace/contrib/configurable.rb +64 -40
  547. data/lib/ddtrace/contrib/configuration/resolver.rb +70 -5
  548. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +19 -17
  549. data/lib/ddtrace/contrib/configuration/settings.rb +7 -6
  550. data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -1
  551. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -1
  552. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -0
  553. data/lib/ddtrace/contrib/ethon/easy_patch.rb +1 -1
  554. data/lib/ddtrace/contrib/ethon/multi_patch.rb +1 -1
  555. data/lib/ddtrace/contrib/ethon/patcher.rb +2 -2
  556. data/lib/ddtrace/contrib/extensions.rb +29 -6
  557. data/lib/ddtrace/contrib/faraday/patcher.rb +2 -2
  558. data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -2
  559. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  560. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -1
  561. data/lib/ddtrace/contrib/http/instrumentation.rb +1 -1
  562. data/lib/ddtrace/contrib/http/patcher.rb +1 -1
  563. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +13 -17
  564. data/lib/ddtrace/contrib/httpclient/patcher.rb +6 -3
  565. data/lib/ddtrace/contrib/httprb/instrumentation.rb +13 -18
  566. data/lib/ddtrace/contrib/httprb/patcher.rb +6 -3
  567. data/lib/ddtrace/contrib/integration.rb +3 -3
  568. data/lib/ddtrace/contrib/kafka/event.rb +2 -2
  569. data/lib/ddtrace/contrib/lograge/configuration/settings.rb +18 -0
  570. data/lib/ddtrace/contrib/lograge/ext.rb +10 -0
  571. data/lib/ddtrace/contrib/lograge/instrumentation.rb +38 -0
  572. data/lib/ddtrace/contrib/lograge/integration.rb +45 -0
  573. data/lib/ddtrace/contrib/{rspec → lograge}/patcher.rb +6 -4
  574. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -2
  575. data/lib/ddtrace/contrib/mongodb/patcher.rb +2 -2
  576. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  577. data/lib/ddtrace/contrib/mysql2/patcher.rb +1 -1
  578. data/lib/ddtrace/contrib/patchable.rb +2 -2
  579. data/lib/ddtrace/contrib/patcher.rb +10 -7
  580. data/lib/ddtrace/contrib/presto/instrumentation.rb +1 -1
  581. data/lib/ddtrace/contrib/presto/patcher.rb +6 -3
  582. data/lib/ddtrace/contrib/qless/patcher.rb +3 -5
  583. data/lib/ddtrace/contrib/racecar/event.rb +2 -2
  584. data/lib/ddtrace/contrib/rack/middlewares.rb +1 -1
  585. data/lib/ddtrace/contrib/rails/framework.rb +25 -1
  586. data/lib/ddtrace/contrib/rails/log_injection.rb +0 -40
  587. data/lib/ddtrace/contrib/rails/patcher.rb +17 -11
  588. data/lib/ddtrace/contrib/rake/instrumentation.rb +1 -1
  589. data/lib/ddtrace/contrib/rake/patcher.rb +1 -1
  590. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +11 -4
  591. data/lib/ddtrace/contrib/registerable.rb +2 -2
  592. data/lib/ddtrace/contrib/resque/configuration/settings.rb +17 -1
  593. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  594. data/lib/ddtrace/contrib/resque/patcher.rb +4 -4
  595. data/lib/ddtrace/contrib/resque/resque_job.rb +22 -1
  596. data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
  597. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -1
  598. data/lib/ddtrace/contrib/semantic_logger/configuration/settings.rb +18 -0
  599. data/lib/ddtrace/contrib/semantic_logger/ext.rb +10 -0
  600. data/lib/ddtrace/contrib/semantic_logger/instrumentation.rb +42 -0
  601. data/lib/ddtrace/contrib/semantic_logger/integration.rb +47 -0
  602. data/lib/ddtrace/contrib/semantic_logger/patcher.rb +25 -0
  603. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  604. data/lib/ddtrace/contrib/sequel/dataset.rb +1 -1
  605. data/lib/ddtrace/contrib/sequel/patcher.rb +2 -2
  606. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  607. data/lib/ddtrace/contrib/shoryuken/tracer.rb +7 -3
  608. data/lib/ddtrace/contrib/sinatra/patcher.rb +1 -1
  609. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +4 -6
  610. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +4 -0
  611. data/lib/ddtrace/correlation.rb +1 -1
  612. data/lib/ddtrace/diagnostics/environment_logger.rb +5 -5
  613. data/lib/ddtrace/error.rb +77 -8
  614. data/lib/ddtrace/ext/app_types.rb +0 -1
  615. data/lib/ddtrace/ext/environment.rb +7 -0
  616. data/lib/ddtrace/ext/git.rb +9 -1
  617. data/lib/ddtrace/ext/profiling.rb +53 -0
  618. data/lib/ddtrace/ext/runtime.rb +0 -7
  619. data/lib/ddtrace/ext/test.rb +2 -18
  620. data/lib/ddtrace/ext/transport.rb +2 -0
  621. data/lib/ddtrace/metrics.rb +68 -13
  622. data/lib/ddtrace/opentelemetry/extensions.rb +1 -1
  623. data/lib/ddtrace/opentracer.rb +20 -39
  624. data/lib/ddtrace/patcher.rb +25 -3
  625. data/lib/ddtrace/pin.rb +5 -9
  626. data/lib/ddtrace/profiling.rb +107 -0
  627. data/lib/ddtrace/profiling/backtrace_location.rb +32 -0
  628. data/lib/ddtrace/profiling/buffer.rb +41 -0
  629. data/lib/ddtrace/profiling/collectors/stack.rb +262 -0
  630. data/lib/ddtrace/profiling/encoding/profile.rb +37 -0
  631. data/lib/ddtrace/profiling/event.rb +13 -0
  632. data/lib/ddtrace/profiling/events/stack.rb +102 -0
  633. data/lib/ddtrace/profiling/exporter.rb +23 -0
  634. data/lib/ddtrace/profiling/ext/cpu.rb +67 -0
  635. data/lib/ddtrace/profiling/ext/cthread.rb +155 -0
  636. data/lib/ddtrace/profiling/ext/forking.rb +97 -0
  637. data/lib/ddtrace/profiling/flush.rb +43 -0
  638. data/lib/ddtrace/profiling/pprof/builder.rb +119 -0
  639. data/lib/ddtrace/profiling/pprof/converter.rb +89 -0
  640. data/lib/ddtrace/profiling/pprof/message_set.rb +12 -0
  641. data/lib/ddtrace/profiling/pprof/payload.rb +18 -0
  642. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  643. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +81 -0
  644. data/lib/ddtrace/profiling/pprof/stack_sample.rb +106 -0
  645. data/lib/ddtrace/profiling/pprof/string_table.rb +10 -0
  646. data/lib/ddtrace/profiling/pprof/template.rb +118 -0
  647. data/lib/ddtrace/profiling/preload.rb +3 -0
  648. data/lib/ddtrace/profiling/profiler.rb +30 -0
  649. data/lib/ddtrace/profiling/recorder.rb +95 -0
  650. data/lib/ddtrace/profiling/scheduler.rb +116 -0
  651. data/lib/ddtrace/profiling/tasks/setup.rb +77 -0
  652. data/lib/ddtrace/profiling/transport/client.rb +12 -0
  653. data/lib/ddtrace/profiling/transport/http.rb +118 -0
  654. data/lib/ddtrace/profiling/transport/http/api.rb +43 -0
  655. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +100 -0
  656. data/lib/ddtrace/profiling/transport/http/api/instance.rb +36 -0
  657. data/lib/ddtrace/profiling/transport/http/api/spec.rb +40 -0
  658. data/lib/ddtrace/profiling/transport/http/builder.rb +28 -0
  659. data/lib/ddtrace/profiling/transport/http/client.rb +33 -0
  660. data/lib/ddtrace/profiling/transport/http/response.rb +21 -0
  661. data/lib/ddtrace/profiling/transport/io.rb +30 -0
  662. data/lib/ddtrace/profiling/transport/io/client.rb +27 -0
  663. data/lib/ddtrace/profiling/transport/io/response.rb +16 -0
  664. data/lib/ddtrace/profiling/transport/parcel.rb +17 -0
  665. data/lib/ddtrace/profiling/transport/request.rb +15 -0
  666. data/lib/ddtrace/profiling/transport/response.rb +8 -0
  667. data/lib/ddtrace/runtime/metrics.rb +20 -14
  668. data/lib/ddtrace/sampling/rule_sampler.rb +3 -9
  669. data/lib/ddtrace/span.rb +17 -6
  670. data/lib/ddtrace/sync_writer.rb +9 -5
  671. data/lib/ddtrace/tasks/exec.rb +48 -0
  672. data/lib/ddtrace/tasks/help.rb +14 -0
  673. data/lib/ddtrace/tracer.rb +46 -48
  674. data/lib/ddtrace/transport/http.rb +47 -35
  675. data/lib/ddtrace/transport/http/adapters/net.rb +18 -4
  676. data/lib/ddtrace/transport/http/builder.rb +5 -1
  677. data/lib/ddtrace/transport/http/env.rb +8 -0
  678. data/lib/ddtrace/transport/http/statistics.rb +2 -2
  679. data/lib/ddtrace/transport/http/traces.rb +3 -3
  680. data/lib/ddtrace/transport/io/client.rb +15 -8
  681. data/lib/ddtrace/transport/io/response.rb +1 -3
  682. data/lib/ddtrace/transport/io/traces.rb +7 -1
  683. data/lib/ddtrace/transport/parcel.rb +4 -0
  684. data/lib/ddtrace/transport/traces.rb +15 -1
  685. data/lib/ddtrace/utils/compression.rb +27 -0
  686. data/lib/ddtrace/utils/forking.rb +1 -1
  687. data/lib/ddtrace/utils/object_set.rb +39 -0
  688. data/lib/ddtrace/utils/only_once.rb +40 -0
  689. data/lib/ddtrace/utils/sequence.rb +17 -0
  690. data/lib/ddtrace/utils/string_table.rb +45 -0
  691. data/lib/ddtrace/utils/time.rb +8 -3
  692. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  693. data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
  694. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
  695. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
  696. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
  697. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
  698. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
  699. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
  700. data/lib/ddtrace/version.rb +14 -2
  701. data/lib/ddtrace/workers.rb +1 -1
  702. data/lib/ddtrace/workers/async.rb +5 -4
  703. data/lib/ddtrace/workers/loop.rb +28 -5
  704. data/lib/ddtrace/workers/polling.rb +11 -5
  705. data/lib/ddtrace/workers/queue.rb +2 -1
  706. data/lib/ddtrace/workers/runtime_metrics.rb +14 -1
  707. data/lib/ddtrace/workers/trace_writer.rb +4 -6
  708. data/lib/ddtrace/writer.rb +10 -4
  709. data/tasks/update_appraisal_gemfiles.rake +36 -0
  710. metadata +576 -38
  711. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -73
  712. data/integration/images/ruby/2.0/Dockerfile +0 -54
  713. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -28
  714. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -17
  715. data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -98
  716. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
  717. data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
  718. data/lib/ddtrace/contrib/cucumber/patcher.rb +0 -23
  719. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -28
  720. data/lib/ddtrace/contrib/rspec/example.rb +0 -75
  721. data/lib/ddtrace/contrib/rspec/ext.rb +0 -16
  722. data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
  723. data/lib/ddtrace/environment.rb +0 -41
  724. data/lib/ddtrace/ext/ci.rb +0 -297
  725. data/lib/ddtrace/runtime/cgroup.rb +0 -44
  726. data/lib/ddtrace/runtime/class_count.rb +0 -17
  727. data/lib/ddtrace/runtime/container.rb +0 -73
  728. data/lib/ddtrace/runtime/gc.rb +0 -16
  729. data/lib/ddtrace/runtime/identity.rb +0 -40
  730. data/lib/ddtrace/runtime/object_space.rb +0 -19
  731. data/lib/ddtrace/runtime/socket.rb +0 -14
  732. data/lib/ddtrace/runtime/thread_count.rb +0 -16
@@ -0,0 +1,27 @@
1
+ require 'ddtrace/transport/io/client'
2
+ require 'ddtrace/profiling/transport/client'
3
+ require 'ddtrace/profiling/transport/request'
4
+ require 'ddtrace/profiling/transport/io/response'
5
+
6
+ module Datadog
7
+ module Profiling
8
+ module Transport
9
+ module IO
10
+ # IO transport for profiling
11
+ class Client < Datadog::Transport::IO::Client
12
+ include Transport::Client
13
+
14
+ def send_profiling_flush(flush)
15
+ # Build a request
16
+ request = Profiling::Transport::Request.new(flush)
17
+ send_request(request)
18
+ end
19
+
20
+ def build_response(_request, _data, result)
21
+ Profiling::Transport::IO::Response.new(result)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ require 'ddtrace/transport/io/response'
2
+ require 'ddtrace/profiling/transport/response'
3
+
4
+ module Datadog
5
+ module Profiling
6
+ module Transport
7
+ # IO transport behavior for profiling
8
+ module IO
9
+ # Response from IO transport for profiling
10
+ class Response < Datadog::Transport::IO::Response
11
+ include Profiling::Transport::Response
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ require 'ddtrace/transport/parcel'
2
+
3
+ module Datadog
4
+ module Profiling
5
+ module Transport
6
+ # Data transfer object for profiling data
7
+ class Parcel
8
+ include Datadog::Transport::Parcel
9
+
10
+ def encode_with(encoder)
11
+ # TODO: Determine encoding behavior
12
+ encoder.encode(data)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,15 @@
1
+ require 'ddtrace/transport/request'
2
+ require 'ddtrace/profiling/transport/parcel'
3
+
4
+ module Datadog
5
+ module Profiling
6
+ module Transport
7
+ # Profiling request
8
+ class Request < Datadog::Transport::Request
9
+ def initialize(flush)
10
+ super(Parcel.new(flush))
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,8 @@
1
+ module Datadog
2
+ module Profiling
3
+ module Transport
4
+ # Profiling response
5
+ module Response; end
6
+ end
7
+ end
8
+ end
@@ -2,16 +2,16 @@ require 'ddtrace/ext/integration'
2
2
  require 'ddtrace/ext/runtime'
3
3
 
4
4
  require 'ddtrace/metrics'
5
- require 'ddtrace/runtime/class_count'
6
- require 'ddtrace/runtime/gc'
7
- require 'ddtrace/runtime/identity'
8
- require 'ddtrace/runtime/thread_count'
5
+ require 'datadog/core/environment/class_count'
6
+ require 'datadog/core/environment/gc'
7
+ require 'datadog/core/environment/identity'
8
+ require 'datadog/core/environment/thread_count'
9
9
 
10
10
  module Datadog
11
11
  module Runtime
12
12
  # For generating runtime metrics
13
13
  class Metrics < Datadog::Metrics
14
- def initialize(options = {})
14
+ def initialize(**options)
15
15
  super
16
16
 
17
17
  # Initialize service list
@@ -29,7 +29,7 @@ module Datadog
29
29
  # Tag span with language and runtime ID for association with metrics.
30
30
  # We only tag spans that performed internal application work.
31
31
  unless span.get_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE)
32
- span.set_tag(Ext::Runtime::TAG_LANG, Runtime::Identity.lang)
32
+ span.set_tag(Ext::Runtime::TAG_LANG, Core::Environment::Identity.lang)
33
33
  end
34
34
  end
35
35
 
@@ -52,17 +52,23 @@ module Datadog
52
52
  def flush
53
53
  return unless enabled?
54
54
 
55
- try_flush { gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, ClassCount.value) if ClassCount.available? }
56
- try_flush { gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, ThreadCount.value) if ThreadCount.available? }
57
- try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if GC.available? }
55
+ try_flush do
56
+ if Core::Environment::ClassCount.available?
57
+ gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, Core::Environment::ClassCount.value)
58
+ end
59
+ end
60
+ try_flush do
61
+ if Core::Environment::ThreadCount.available?
62
+ gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, Core::Environment::ThreadCount.value)
63
+ end
64
+ end
65
+ try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if Core::Environment::GC.available? }
58
66
  end
59
67
 
60
68
  def gc_metrics
61
- Hash[
62
- GC.stat.flat_map do |k, v|
63
- nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
64
- end
65
- ]
69
+ Core::Environment::GC.stat.flat_map do |k, v|
70
+ nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
71
+ end.to_h
66
72
  end
67
73
 
68
74
  def try_flush
@@ -5,6 +5,7 @@ require 'ddtrace/ext/priority'
5
5
  require 'ddtrace/ext/sampling'
6
6
  require 'ddtrace/sampler'
7
7
  require 'ddtrace/sampling/rate_limiter'
8
+ require 'ddtrace/sampling/rule'
8
9
 
9
10
  module Datadog
10
11
  module Sampling
@@ -45,15 +46,8 @@ module Datadog
45
46
  @default_sampler = if default_sampler
46
47
  default_sampler
47
48
  elsif default_sample_rate
48
- # We want to allow 0.0 to drop all traces, but \RateSampler
49
- # considers 0.0 an invalid rate and falls back to 100% sampling.
50
- #
51
- # We address that here by not setting the rate in the constructor,
52
- # but using the setter method.
53
- #
54
- # We don't want to make this change directly to \RateSampler
55
- # because it breaks its current contract to existing users.
56
- Datadog::RateSampler.new.tap { |s| s.sample_rate = default_sample_rate }
49
+ # Add to the end of the rule list a rule always matches any span
50
+ @rules << SimpleRule.new(sample_rate: default_sample_rate)
57
51
  else
58
52
  RateByServiceSampler.new(1.0, env: -> { Datadog.tracer.tags[:env] })
59
53
  end
data/lib/ddtrace/span.rb CHANGED
@@ -2,9 +2,12 @@
2
2
 
3
3
  require 'time'
4
4
  require 'ddtrace/utils'
5
+ require 'ddtrace/ext/distributed'
6
+ require 'ddtrace/ext/environment'
5
7
  require 'ddtrace/ext/errors'
8
+ require 'ddtrace/ext/http'
9
+ require 'ddtrace/ext/net'
6
10
  require 'ddtrace/ext/priority'
7
- require 'ddtrace/environment'
8
11
  require 'ddtrace/analytics'
9
12
  require 'ddtrace/forced_tracing'
10
13
  require 'ddtrace/diagnostics/health'
@@ -38,6 +41,17 @@ module Datadog
38
41
  # This limit is for numeric tags because uint64 could end up rounded.
39
42
  NUMERIC_TAG_SIZE_RANGE = (-1 << 53..1 << 53).freeze
40
43
 
44
+ # Some associated values should always be sent as Tags, never as Metrics, regardless
45
+ # if their value is numeric or not.
46
+ # The Datadog agent will look for these values only as Tags, not Metrics.
47
+ # @see https://github.com/DataDog/datadog-agent/blob/2ae2cdd315bcda53166dd8fa0dedcfc448087b9d/pkg/trace/stats/aggregation.go#L13-L17
48
+ ENSURE_AGENT_TAGS = {
49
+ Ext::DistributedTracing::ORIGIN_KEY => true,
50
+ Ext::Environment::TAG_VERSION => true,
51
+ Ext::HTTP::STATUS_CODE => true,
52
+ Ext::NET::TAG_HOSTNAME => true
53
+ }.freeze
54
+
41
55
  attr_accessor :name, :service, :resource, :span_type,
42
56
  :span_id, :trace_id, :parent_id,
43
57
  :status, :sampled,
@@ -101,11 +115,8 @@ module Datadog
101
115
  # Keys must be unique between tags and metrics
102
116
  @metrics.delete(key)
103
117
 
104
- # Ensure `http.status_code` is always a string so it is added to
105
- # @meta instead of @metrics
106
- # DEV: This is necessary because the agent looks to `meta['http.status_code']` for
107
- # tagging necessary metrics
108
- value = value.to_s if key == Ext::HTTP::STATUS_CODE
118
+ # DEV: This is necessary because the agent looks at `meta[key]`, not `metrics[key]`.
119
+ value = value.to_s if ENSURE_AGENT_TAGS[key]
109
120
 
110
121
  # NOTE: Adding numeric tags as metrics is stop-gap support
111
122
  # for numeric typed tags. Eventually they will become
@@ -1,6 +1,7 @@
1
1
  require 'ddtrace/ext/net'
2
- require 'ddtrace/runtime/socket'
2
+ require 'datadog/core/environment/socket'
3
3
  require 'ddtrace/runtime/metrics'
4
+ require 'ddtrace/utils/only_once'
4
5
 
5
6
  module Datadog
6
7
  # SyncWriter flushes both services and traces synchronously
@@ -10,6 +11,8 @@ module Datadog
10
11
  # the separate `datadog-lambda` uses it as of February 2021:
11
12
  # <https://github.com/DataDog/datadog-lambda-rb/blob/c15f0f0916c90123416dc44e7d6800ef4a7cfdbf/lib/datadog/lambda.rb#L38>
12
13
  class SyncWriter
14
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
15
+
13
16
  attr_reader \
14
17
  :priority_sampler,
15
18
  :transport
@@ -17,7 +20,8 @@ module Datadog
17
20
  def initialize(options = {})
18
21
  @transport = options.fetch(:transport) do
19
22
  transport_options = options.fetch(:transport_options, {})
20
- Transport::HTTP.default(transport_options)
23
+ transport_options[:agent_settings] = options[:agent_settings] if options.key?(:agent_settings)
24
+ Transport::HTTP.default(**transport_options)
21
25
  end
22
26
 
23
27
  @priority_sampler = options.fetch(:priority_sampler, nil)
@@ -25,10 +29,10 @@ module Datadog
25
29
 
26
30
  def write(trace, services = nil)
27
31
  unless services.nil?
28
- Datadog::Patcher.do_once('SyncWriter#write') do
32
+ DEPRECATION_WARN_ONLY_ONCE.run do
29
33
  Datadog.logger.warn(%(
30
34
  write: Writing services has been deprecated and no longer need to be provided.
31
- write(traces, services) can be updted to write(traces)
35
+ write(traces, services) can be updated to write(traces)
32
36
  ))
33
37
  end
34
38
  end
@@ -56,7 +60,7 @@ module Datadog
56
60
 
57
61
  def inject_hostname!(trace)
58
62
  unless trace.first.nil?
59
- hostname = Datadog::Runtime::Socket.hostname
63
+ hostname = Datadog::Core::Environment::Socket.hostname
60
64
  trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname) unless hostname.nil? || hostname.empty?
61
65
  end
62
66
  end
@@ -0,0 +1,48 @@
1
+ module Datadog
2
+ module Tasks
3
+ # Wraps command with Datadog tracing
4
+ class Exec
5
+ attr_reader :args
6
+
7
+ def initialize(args)
8
+ @args = args
9
+ end
10
+
11
+ def run
12
+ set_rubyopt!
13
+ exec_with_error_handling(args)
14
+ end
15
+
16
+ def rubyopts
17
+ [
18
+ '-rddtrace/profiling/preload'
19
+ ]
20
+ end
21
+
22
+ private
23
+
24
+ def set_rubyopt!
25
+ if ENV.key?('RUBYOPT')
26
+ ENV['RUBYOPT'] += " #{rubyopts.join(' ')}"
27
+ else
28
+ ENV['RUBYOPT'] = rubyopts.join(' ')
29
+ end
30
+ end
31
+
32
+ # If there's an error here, rather than throwing a cryptic stack trace, let's instead have clearer messages, and
33
+ # follow the same status codes as the shell uses
34
+ # See also:
35
+ # * https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html
36
+ # * https://github.com/rubygems/rubygems/blob/dd93966cac224532035deda533cba2685dfa30cc/bundler/lib/bundler/cli/exec.rb#L45
37
+ def exec_with_error_handling(args)
38
+ Kernel.exec(*args)
39
+ rescue Errno::ENOENT => e
40
+ Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
41
+ Kernel.exit 127
42
+ rescue Errno::EACCES, Errno::ENOEXEC => e
43
+ Kernel.warn "ddtracerb exec failed: #{e.message} (command was '#{args.join(' ')}')"
44
+ Kernel.exit 126
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ module Datadog
2
+ module Tasks
3
+ # Prints help message for usage of `ddtrace`
4
+ class Help
5
+ def run
6
+ puts %(
7
+ Usage: ddtrace [command] [arguments]
8
+ exec [command]: Executes command with tracing & profiling preloaded.
9
+ help: Prints this help message.
10
+ )
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,15 +1,17 @@
1
1
  require 'logger'
2
2
  require 'pathname'
3
3
 
4
- require 'ddtrace/environment'
4
+ require 'ddtrace/ext/environment'
5
5
  require 'ddtrace/span'
6
6
  require 'ddtrace/context'
7
7
  require 'ddtrace/logger'
8
8
  require 'ddtrace/writer'
9
- require 'ddtrace/runtime/identity'
9
+ require 'datadog/core/environment/identity'
10
10
  require 'ddtrace/sampler'
11
11
  require 'ddtrace/sampling'
12
12
  require 'ddtrace/correlation'
13
+ require 'ddtrace/event'
14
+ require 'ddtrace/utils/only_once'
13
15
 
14
16
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
15
17
  module Datadog
@@ -19,6 +21,9 @@ module Datadog
19
21
  # of these function calls and sub-requests would be encapsulated within a single trace.
20
22
  # rubocop:disable Metrics/ClassLength
21
23
  class Tracer
24
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
25
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
26
+
22
27
  attr_reader :sampler, :tags, :provider, :context_flush
23
28
  attr_accessor :enabled, :writer
24
29
  attr_writer :default_service
@@ -27,8 +32,7 @@ module Datadog
27
32
  DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
28
33
 
29
34
  def services
30
- # Only log each deprecation warning once (safeguard against log spam)
31
- Datadog::Patcher.do_once('Tracer#set_service_info') do
35
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE.run do
32
36
  Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
33
37
  end
34
38
 
@@ -70,7 +74,9 @@ module Datadog
70
74
  # by default.
71
75
  def initialize(options = {})
72
76
  # Configurable options
73
- @context_flush = if options[:partial_flush]
77
+ @context_flush = if options[:context_flush]
78
+ options[:context_flush]
79
+ elsif options[:partial_flush]
74
80
  Datadog::ContextFlush::Partial.new(options)
75
81
  else
76
82
  Datadog::ContextFlush::Finished.new
@@ -81,7 +87,7 @@ module Datadog
81
87
  @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
82
88
  @sampler = options.fetch(:sampler, Datadog::AllSampler.new)
83
89
  @tags = options.fetch(:tags, {})
84
- @writer = options.fetch(:writer, Datadog::Writer.new)
90
+ @writer = options.fetch(:writer) { Datadog::Writer.new }
85
91
 
86
92
  # Instance variables
87
93
  @mutex = Mutex.new
@@ -114,8 +120,10 @@ module Datadog
114
120
 
115
121
  configure_writer(options)
116
122
 
117
- if options.key?(:partial_flush)
118
- @context_flush = if options[:partial_flush]
123
+ if options.key?(:context_flush) || options.key?(:partial_flush)
124
+ @context_flush = if options[:context_flush]
125
+ options[:context_flush]
126
+ elsif options[:partial_flush]
119
127
  Datadog::ContextFlush::Partial.new(options)
120
128
  else
121
129
  Datadog::ContextFlush::Finished.new
@@ -129,8 +137,7 @@ module Datadog
129
137
  #
130
138
  # set_service_info is deprecated, no service information needs to be tracked
131
139
  def set_service_info(service, app, app_type)
132
- # Only log each deprecation warning once (safeguard against log spam)
133
- Datadog::Patcher.do_once('Tracer#set_service_info') do
140
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE.run do
134
141
  Datadog.logger.warn(%(
135
142
  set_service_info: Usage of set_service_info has been deprecated,
136
143
  service information no longer needs to be reported to the trace agent.
@@ -142,15 +149,7 @@ module Datadog
142
149
  # for non-root spans which have a parent. However, root spans without
143
150
  # a service would be invalid and rejected.
144
151
  def default_service
145
- return @default_service if instance_variable_defined?(:@default_service) && @default_service
146
-
147
- begin
148
- @default_service = File.basename($PROGRAM_NAME, '.*')
149
- rescue StandardError => e
150
- Datadog.logger.error("unable to guess default service: #{e}")
151
- @default_service = 'ruby'.freeze
152
- end
153
- @default_service
152
+ @default_service ||= Datadog::Ext::Environment::FALLBACK_SERVICE_NAME
154
153
  end
155
154
 
156
155
  # Set the given key / value tag pair at the tracer level. These tags will be
@@ -159,7 +158,7 @@ module Datadog
159
158
  #
160
159
  # tracer.set_tags('env' => 'prod', 'component' => 'core')
161
160
  def set_tags(tags)
162
- string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
161
+ string_tags = tags.collect { |k, v| [k.to_s, v] }.to_h
163
162
  @tags = @tags.merge(string_tags)
164
163
  end
165
164
 
@@ -202,7 +201,7 @@ module Datadog
202
201
  # root span
203
202
  @sampler.sample!(span)
204
203
  span.set_tag('system.pid', Process.pid)
205
- span.set_tag(Datadog::Ext::Runtime::TAG_ID, Datadog::Runtime::Identity.id)
204
+ span.set_tag(Datadog::Ext::Runtime::TAG_ID, Datadog::Core::Environment::Identity.id)
206
205
 
207
206
  if ctx && ctx.trace_id
208
207
  span.trace_id = ctx.trace_id
@@ -313,6 +312,10 @@ module Datadog
313
312
  end
314
313
  end
315
314
 
315
+ def trace_completed
316
+ @trace_completed ||= TraceCompleted.new
317
+ end
318
+
316
319
  # Record the given +context+. For compatibility with previous versions,
317
320
  # +context+ can also be a span. It is similar to the +child_of+ argument,
318
321
  # method will figure out what to do, submitting a +span+ for recording
@@ -364,24 +367,34 @@ module Datadog
364
367
  end
365
368
 
366
369
  @writer.write(trace)
370
+ trace_completed.publish(trace)
371
+ end
372
+
373
+ # Triggered whenever a trace is completed
374
+ class TraceCompleted < Datadog::Event
375
+ def initialize
376
+ super(:trace_completed)
377
+ end
378
+
379
+ # NOTE: Ignore Rubocop rule. This definition allows for
380
+ # description of and constraints on arguments.
381
+ # rubocop:disable Lint/UselessMethodDefinition
382
+ def publish(trace)
383
+ super(trace)
384
+ end
385
+ # rubocop:enable Lint/UselessMethodDefinition
367
386
  end
368
387
 
369
388
  # TODO: Move this kind of configuration building out of the tracer.
370
389
  # Tracer should not have this kind of knowledge of writer.
371
- # rubocop:disable Metrics/PerceivedComplexity
372
- # rubocop:disable Metrics/CyclomaticComplexity
373
- # rubocop:disable Metrics/MethodLength
374
390
  def configure_writer(options = {})
375
- hostname = options.fetch(:hostname, nil)
376
- port = options.fetch(:port, nil)
377
391
  sampler = options.fetch(:sampler, nil)
378
392
  priority_sampling = options.fetch(:priority_sampling, nil)
379
393
  writer = options.fetch(:writer, nil)
380
- transport_options = options.fetch(:transport_options, {}).dup
394
+ agent_settings = options.fetch(:agent_settings, nil)
381
395
 
382
396
  # Compile writer options
383
397
  writer_options = options.fetch(:writer_options, {}).dup
384
- rebuild_writer = !writer_options.empty?
385
398
 
386
399
  # Re-build the sampler and writer if priority sampling is enabled,
387
400
  # but neither are configured. Verify the sampler isn't already a
@@ -394,35 +407,20 @@ module Datadog
394
407
  end
395
408
  elsif priority_sampling != false && !@sampler.is_a?(PrioritySampler)
396
409
  writer_options[:priority_sampler] = activate_priority_sampling!(@sampler)
397
- rebuild_writer = true
398
410
  elsif priority_sampling == false
399
411
  deactivate_priority_sampling!(sampler)
400
- rebuild_writer = true
401
412
  elsif @sampler.is_a?(PrioritySampler)
402
413
  # Make sure to add sampler to options if transport is rebuilt.
403
414
  writer_options[:priority_sampler] = @sampler
404
415
  end
405
416
 
406
- # Apply options to transport
407
- if transport_options.is_a?(Proc)
408
- transport_options = { on_build: transport_options }
409
- rebuild_writer = true
410
- end
417
+ writer_options[:agent_settings] = agent_settings if agent_settings
411
418
 
412
- if hostname || port
413
- transport_options[:hostname] = hostname unless hostname.nil?
414
- transport_options[:port] = port unless port.nil?
415
- rebuild_writer = true
416
- end
417
-
418
- writer_options[:transport_options] = transport_options
419
+ # Make sure old writer is shut down before throwing away.
420
+ # Don't want additional threads running...
421
+ @writer.stop unless writer.nil?
419
422
 
420
- if rebuild_writer || writer
421
- # Make sure old writer is shut down before throwing away.
422
- # Don't want additional threads running...
423
- @writer.stop unless writer.nil?
424
- @writer = writer || Writer.new(writer_options)
425
- end
423
+ @writer = writer || Writer.new(writer_options)
426
424
  end
427
425
 
428
426
  def activate_priority_sampling!(base_sampler = nil)