ddtrace 0.49.0 → 0.50.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (377) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +49 -73
  3. data/.circleci/images/primary/{Dockerfile-truffleruby-21.0.0 → Dockerfile-truffleruby-21.1.0} +1 -1
  4. data/.gitignore +0 -2
  5. data/.rubocop.yml +0 -8
  6. data/.rubocop_todo.yml +7 -7
  7. data/Appraisals +1 -107
  8. data/CHANGELOG.md +47 -0
  9. data/Rakefile +278 -333
  10. data/benchmarks/data/profiler-submission-marshal.gz +0 -0
  11. data/benchmarks/profiler_submission.rb +93 -0
  12. data/ddtrace.gemspec +1 -1
  13. data/docker-compose.yml +4 -34
  14. data/docs/GettingStarted.md +24 -9
  15. data/gemfiles/jruby_9.2.0.0_contrib.gemfile.lock +1 -1
  16. data/gemfiles/jruby_9.2.0.0_contrib_old.gemfile.lock +1 -1
  17. data/gemfiles/jruby_9.2.0.0_core_old.gemfile.lock +1 -1
  18. data/gemfiles/jruby_9.2.0.0_cucumber3.gemfile.lock +1 -1
  19. data/gemfiles/jruby_9.2.0.0_cucumber4.gemfile.lock +1 -1
  20. data/gemfiles/jruby_9.2.0.0_cucumber5.gemfile.lock +1 -1
  21. data/gemfiles/jruby_9.2.0.0_rails5_mysql2.gemfile.lock +1 -1
  22. data/gemfiles/jruby_9.2.0.0_rails5_postgres.gemfile.lock +1 -1
  23. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis.gemfile.lock +1 -1
  24. data/gemfiles/jruby_9.2.0.0_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  25. data/gemfiles/jruby_9.2.0.0_rails5_postgres_sidekiq.gemfile.lock +1 -1
  26. data/gemfiles/jruby_9.2.0.0_rails61_mysql2.gemfile.lock +1 -1
  27. data/gemfiles/jruby_9.2.0.0_rails61_postgres.gemfile.lock +1 -1
  28. data/gemfiles/jruby_9.2.0.0_rails61_postgres_redis.gemfile.lock +1 -1
  29. data/gemfiles/jruby_9.2.0.0_rails61_postgres_sidekiq.gemfile.lock +1 -1
  30. data/gemfiles/jruby_9.2.0.0_rails6_mysql2.gemfile.lock +1 -1
  31. data/gemfiles/jruby_9.2.0.0_rails6_postgres.gemfile.lock +1 -1
  32. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis.gemfile.lock +1 -1
  33. data/gemfiles/jruby_9.2.0.0_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  34. data/gemfiles/jruby_9.2.0.0_rails6_postgres_sidekiq.gemfile.lock +1 -1
  35. data/gemfiles/jruby_9.2.0.0_resque2_redis3.gemfile.lock +1 -1
  36. data/gemfiles/jruby_9.2.0.0_resque2_redis4.gemfile.lock +1 -1
  37. data/gemfiles/jruby_9.2.11.1_contrib.gemfile.lock +1 -1
  38. data/gemfiles/jruby_9.2.11.1_contrib_old.gemfile.lock +1 -1
  39. data/gemfiles/jruby_9.2.11.1_core_old.gemfile.lock +1 -1
  40. data/gemfiles/jruby_9.2.11.1_cucumber3.gemfile.lock +1 -1
  41. data/gemfiles/jruby_9.2.11.1_cucumber4.gemfile.lock +1 -1
  42. data/gemfiles/jruby_9.2.11.1_cucumber5.gemfile.lock +1 -1
  43. data/gemfiles/jruby_9.2.11.1_rails5_mysql2.gemfile.lock +1 -1
  44. data/gemfiles/jruby_9.2.11.1_rails5_postgres.gemfile.lock +1 -1
  45. data/gemfiles/jruby_9.2.11.1_rails5_postgres_redis.gemfile.lock +1 -1
  46. data/gemfiles/jruby_9.2.11.1_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  47. data/gemfiles/jruby_9.2.11.1_rails5_postgres_sidekiq.gemfile.lock +1 -1
  48. data/gemfiles/jruby_9.2.11.1_rails61_mysql2.gemfile.lock +1 -1
  49. data/gemfiles/jruby_9.2.11.1_rails61_postgres.gemfile.lock +1 -1
  50. data/gemfiles/jruby_9.2.11.1_rails61_postgres_redis.gemfile.lock +1 -1
  51. data/gemfiles/jruby_9.2.11.1_rails61_postgres_sidekiq.gemfile.lock +1 -1
  52. data/gemfiles/jruby_9.2.11.1_rails6_mysql2.gemfile.lock +1 -1
  53. data/gemfiles/jruby_9.2.11.1_rails6_postgres.gemfile.lock +1 -1
  54. data/gemfiles/jruby_9.2.11.1_rails6_postgres_redis.gemfile.lock +1 -1
  55. data/gemfiles/jruby_9.2.11.1_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  56. data/gemfiles/jruby_9.2.11.1_rails6_postgres_sidekiq.gemfile.lock +1 -1
  57. data/gemfiles/jruby_9.2.11.1_resque2_redis3.gemfile.lock +1 -1
  58. data/gemfiles/jruby_9.2.11.1_resque2_redis4.gemfile.lock +1 -1
  59. data/gemfiles/ruby_2.1.10_contrib_old.gemfile.lock +1 -1
  60. data/gemfiles/ruby_2.1.10_core_old.gemfile.lock +1 -1
  61. data/gemfiles/ruby_2.1.10_rails30_postgres.gemfile.lock +1 -1
  62. data/gemfiles/ruby_2.1.10_rails30_postgres_sidekiq.gemfile.lock +1 -1
  63. data/gemfiles/ruby_2.1.10_rails32_mysql2.gemfile.lock +1 -1
  64. data/gemfiles/ruby_2.1.10_rails32_postgres.gemfile.lock +1 -1
  65. data/gemfiles/ruby_2.1.10_rails32_postgres_redis.gemfile.lock +1 -1
  66. data/gemfiles/ruby_2.1.10_rails32_postgres_sidekiq.gemfile.lock +1 -1
  67. data/gemfiles/ruby_2.1.10_rails4_mysql2.gemfile.lock +1 -1
  68. data/gemfiles/ruby_2.1.10_rails4_postgres.gemfile.lock +1 -1
  69. data/gemfiles/ruby_2.1.10_rails4_postgres_redis.gemfile.lock +1 -1
  70. data/gemfiles/ruby_2.2.10_contrib.gemfile.lock +1 -1
  71. data/gemfiles/ruby_2.2.10_core_old.gemfile.lock +1 -1
  72. data/gemfiles/ruby_2.2.10_rails30_postgres.gemfile.lock +1 -1
  73. data/gemfiles/ruby_2.2.10_rails30_postgres_sidekiq.gemfile.lock +1 -1
  74. data/gemfiles/ruby_2.2.10_rails32_mysql2.gemfile.lock +1 -1
  75. data/gemfiles/ruby_2.2.10_rails32_postgres.gemfile.lock +1 -1
  76. data/gemfiles/ruby_2.2.10_rails32_postgres_redis.gemfile.lock +1 -1
  77. data/gemfiles/ruby_2.2.10_rails32_postgres_sidekiq.gemfile.lock +1 -1
  78. data/gemfiles/ruby_2.2.10_rails4_mysql2.gemfile.lock +1 -1
  79. data/gemfiles/ruby_2.2.10_rails4_postgres.gemfile.lock +1 -1
  80. data/gemfiles/ruby_2.2.10_rails4_postgres_redis.gemfile.lock +1 -1
  81. data/gemfiles/ruby_2.2.10_rails4_postgres_sidekiq.gemfile.lock +1 -1
  82. data/gemfiles/ruby_2.2.10_rails5_mysql2.gemfile.lock +1 -1
  83. data/gemfiles/ruby_2.2.10_rails5_postgres.gemfile.lock +1 -1
  84. data/gemfiles/ruby_2.2.10_rails5_postgres_redis.gemfile.lock +1 -1
  85. data/gemfiles/ruby_2.2.10_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  86. data/gemfiles/ruby_2.2.10_rails5_postgres_sidekiq.gemfile.lock +1 -1
  87. data/gemfiles/ruby_2.3.8_contrib.gemfile.lock +1 -1
  88. data/gemfiles/ruby_2.3.8_contrib_old.gemfile.lock +1 -1
  89. data/gemfiles/ruby_2.3.8_core_old.gemfile.lock +1 -1
  90. data/gemfiles/ruby_2.3.8_cucumber3.gemfile.lock +1 -1
  91. data/gemfiles/ruby_2.3.8_cucumber4.gemfile.lock +1 -1
  92. data/gemfiles/ruby_2.3.8_rails30_postgres.gemfile.lock +1 -1
  93. data/gemfiles/ruby_2.3.8_rails30_postgres_sidekiq.gemfile.lock +1 -1
  94. data/gemfiles/ruby_2.3.8_rails32_mysql2.gemfile.lock +1 -1
  95. data/gemfiles/ruby_2.3.8_rails32_postgres.gemfile.lock +1 -1
  96. data/gemfiles/ruby_2.3.8_rails32_postgres_redis.gemfile.lock +1 -1
  97. data/gemfiles/ruby_2.3.8_rails32_postgres_sidekiq.gemfile.lock +1 -1
  98. data/gemfiles/ruby_2.3.8_rails4_mysql2.gemfile.lock +1 -1
  99. data/gemfiles/ruby_2.3.8_rails4_postgres.gemfile.lock +1 -1
  100. data/gemfiles/ruby_2.3.8_rails4_postgres_redis.gemfile.lock +1 -1
  101. data/gemfiles/ruby_2.3.8_rails4_postgres_sidekiq.gemfile.lock +1 -1
  102. data/gemfiles/ruby_2.3.8_rails5_mysql2.gemfile.lock +1 -1
  103. data/gemfiles/ruby_2.3.8_rails5_postgres.gemfile.lock +1 -1
  104. data/gemfiles/ruby_2.3.8_rails5_postgres_redis.gemfile.lock +1 -1
  105. data/gemfiles/ruby_2.3.8_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  106. data/gemfiles/ruby_2.3.8_rails5_postgres_sidekiq.gemfile.lock +1 -1
  107. data/gemfiles/ruby_2.3.8_resque2_redis3.gemfile.lock +1 -1
  108. data/gemfiles/ruby_2.3.8_resque2_redis4.gemfile.lock +1 -1
  109. data/gemfiles/ruby_2.4.6_contrib.gemfile.lock +1 -1
  110. data/gemfiles/ruby_2.4.6_contrib_old.gemfile.lock +1 -1
  111. data/gemfiles/ruby_2.4.6_core_old.gemfile.lock +1 -1
  112. data/gemfiles/ruby_2.4.6_cucumber3.gemfile.lock +1 -1
  113. data/gemfiles/ruby_2.4.6_cucumber4.gemfile.lock +1 -1
  114. data/gemfiles/ruby_2.4.6_rails5_mysql2.gemfile.lock +1 -1
  115. data/gemfiles/ruby_2.4.6_rails5_postgres.gemfile.lock +1 -1
  116. data/gemfiles/ruby_2.4.6_rails5_postgres_redis.gemfile.lock +1 -1
  117. data/gemfiles/ruby_2.4.6_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  118. data/gemfiles/ruby_2.4.6_rails5_postgres_sidekiq.gemfile.lock +1 -1
  119. data/gemfiles/ruby_2.4.6_resque2_redis3.gemfile.lock +1 -1
  120. data/gemfiles/ruby_2.4.6_resque2_redis4.gemfile.lock +1 -1
  121. data/gemfiles/ruby_2.5.6_contrib.gemfile.lock +1 -1
  122. data/gemfiles/ruby_2.5.6_contrib_old.gemfile.lock +1 -1
  123. data/gemfiles/ruby_2.5.6_core_old.gemfile.lock +1 -1
  124. data/gemfiles/ruby_2.5.6_cucumber3.gemfile.lock +1 -1
  125. data/gemfiles/ruby_2.5.6_cucumber4.gemfile.lock +1 -1
  126. data/gemfiles/ruby_2.5.6_cucumber5.gemfile.lock +1 -1
  127. data/gemfiles/ruby_2.5.6_rails5_mysql2.gemfile.lock +1 -1
  128. data/gemfiles/ruby_2.5.6_rails5_postgres.gemfile.lock +1 -1
  129. data/gemfiles/ruby_2.5.6_rails5_postgres_redis.gemfile.lock +1 -1
  130. data/gemfiles/ruby_2.5.6_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  131. data/gemfiles/ruby_2.5.6_rails5_postgres_sidekiq.gemfile.lock +1 -1
  132. data/gemfiles/ruby_2.5.6_rails61_mysql2.gemfile.lock +1 -1
  133. data/gemfiles/ruby_2.5.6_rails61_postgres.gemfile.lock +1 -1
  134. data/gemfiles/ruby_2.5.6_rails61_postgres_redis.gemfile.lock +1 -1
  135. data/gemfiles/ruby_2.5.6_rails61_postgres_sidekiq.gemfile.lock +1 -1
  136. data/gemfiles/ruby_2.5.6_rails6_mysql2.gemfile.lock +1 -1
  137. data/gemfiles/ruby_2.5.6_rails6_postgres.gemfile.lock +1 -1
  138. data/gemfiles/ruby_2.5.6_rails6_postgres_redis.gemfile.lock +1 -1
  139. data/gemfiles/ruby_2.5.6_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  140. data/gemfiles/ruby_2.5.6_rails6_postgres_sidekiq.gemfile.lock +1 -1
  141. data/gemfiles/ruby_2.5.6_resque2_redis3.gemfile.lock +1 -1
  142. data/gemfiles/ruby_2.5.6_resque2_redis4.gemfile.lock +1 -1
  143. data/gemfiles/ruby_2.6.4_contrib.gemfile.lock +1 -1
  144. data/gemfiles/ruby_2.6.4_contrib_old.gemfile.lock +1 -1
  145. data/gemfiles/ruby_2.6.4_core_old.gemfile.lock +1 -1
  146. data/gemfiles/ruby_2.6.4_cucumber3.gemfile.lock +1 -1
  147. data/gemfiles/ruby_2.6.4_cucumber4.gemfile.lock +1 -1
  148. data/gemfiles/ruby_2.6.4_cucumber5.gemfile.lock +1 -1
  149. data/gemfiles/ruby_2.6.4_rails5_mysql2.gemfile.lock +1 -1
  150. data/gemfiles/ruby_2.6.4_rails5_postgres.gemfile.lock +1 -1
  151. data/gemfiles/ruby_2.6.4_rails5_postgres_redis.gemfile.lock +1 -1
  152. data/gemfiles/ruby_2.6.4_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  153. data/gemfiles/ruby_2.6.4_rails5_postgres_sidekiq.gemfile.lock +1 -1
  154. data/gemfiles/ruby_2.6.4_rails61_mysql2.gemfile.lock +1 -1
  155. data/gemfiles/ruby_2.6.4_rails61_postgres.gemfile.lock +1 -1
  156. data/gemfiles/ruby_2.6.4_rails61_postgres_redis.gemfile.lock +1 -1
  157. data/gemfiles/ruby_2.6.4_rails61_postgres_sidekiq.gemfile.lock +1 -1
  158. data/gemfiles/ruby_2.6.4_rails6_mysql2.gemfile.lock +1 -1
  159. data/gemfiles/ruby_2.6.4_rails6_postgres.gemfile.lock +1 -1
  160. data/gemfiles/ruby_2.6.4_rails6_postgres_redis.gemfile.lock +1 -1
  161. data/gemfiles/ruby_2.6.4_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  162. data/gemfiles/ruby_2.6.4_rails6_postgres_sidekiq.gemfile.lock +1 -1
  163. data/gemfiles/ruby_2.6.4_resque2_redis3.gemfile.lock +1 -1
  164. data/gemfiles/ruby_2.6.4_resque2_redis4.gemfile.lock +1 -1
  165. data/gemfiles/ruby_2.7.0_contrib.gemfile.lock +1 -1
  166. data/gemfiles/ruby_2.7.0_contrib_old.gemfile.lock +1 -1
  167. data/gemfiles/ruby_2.7.0_core_old.gemfile.lock +1 -1
  168. data/gemfiles/ruby_2.7.0_cucumber3.gemfile.lock +1 -1
  169. data/gemfiles/ruby_2.7.0_cucumber4.gemfile.lock +1 -1
  170. data/gemfiles/ruby_2.7.0_cucumber5.gemfile.lock +1 -1
  171. data/gemfiles/ruby_2.7.0_rails5_mysql2.gemfile.lock +1 -1
  172. data/gemfiles/ruby_2.7.0_rails5_postgres.gemfile.lock +1 -1
  173. data/gemfiles/ruby_2.7.0_rails5_postgres_redis.gemfile.lock +1 -1
  174. data/gemfiles/ruby_2.7.0_rails5_postgres_redis_activesupport.gemfile.lock +1 -1
  175. data/gemfiles/ruby_2.7.0_rails5_postgres_sidekiq.gemfile.lock +1 -1
  176. data/gemfiles/ruby_2.7.0_rails61_mysql2.gemfile.lock +1 -1
  177. data/gemfiles/ruby_2.7.0_rails61_postgres.gemfile.lock +1 -1
  178. data/gemfiles/ruby_2.7.0_rails61_postgres_redis.gemfile.lock +1 -1
  179. data/gemfiles/ruby_2.7.0_rails61_postgres_sidekiq.gemfile.lock +1 -1
  180. data/gemfiles/ruby_2.7.0_rails6_mysql2.gemfile.lock +1 -1
  181. data/gemfiles/ruby_2.7.0_rails6_postgres.gemfile.lock +1 -1
  182. data/gemfiles/ruby_2.7.0_rails6_postgres_redis.gemfile.lock +1 -1
  183. data/gemfiles/ruby_2.7.0_rails6_postgres_redis_activesupport.gemfile.lock +1 -1
  184. data/gemfiles/ruby_2.7.0_rails6_postgres_sidekiq.gemfile.lock +1 -1
  185. data/gemfiles/ruby_2.7.0_resque2_redis3.gemfile.lock +1 -1
  186. data/gemfiles/ruby_2.7.0_resque2_redis4.gemfile.lock +1 -1
  187. data/gemfiles/ruby_3.0.0_contrib.gemfile +1 -0
  188. data/gemfiles/ruby_3.0.0_contrib.gemfile.lock +7 -1
  189. data/gemfiles/ruby_3.0.0_core_old.gemfile.lock +1 -1
  190. data/gemfiles/ruby_3.0.0_cucumber3.gemfile.lock +1 -1
  191. data/gemfiles/ruby_3.0.0_cucumber4.gemfile.lock +1 -1
  192. data/gemfiles/ruby_3.0.0_cucumber5.gemfile.lock +1 -1
  193. data/gemfiles/ruby_3.0.0_rails61_mysql2.gemfile.lock +1 -1
  194. data/gemfiles/ruby_3.0.0_rails61_postgres.gemfile.lock +1 -1
  195. data/gemfiles/ruby_3.0.0_rails61_postgres_redis.gemfile.lock +1 -1
  196. data/gemfiles/ruby_3.0.0_rails61_postgres_sidekiq.gemfile.lock +1 -1
  197. data/gemfiles/ruby_3.0.0_resque2_redis3.gemfile.lock +1 -1
  198. data/gemfiles/ruby_3.0.0_resque2_redis4.gemfile.lock +1 -1
  199. data/integration/apps/rack/README.md +2 -2
  200. data/integration/apps/rack/script/ci +2 -1
  201. data/integration/apps/rails-five/README.md +2 -2
  202. data/integration/apps/rails-five/script/ci +2 -1
  203. data/integration/apps/rspec/.dockerignore +1 -0
  204. data/integration/apps/rspec/.envrc.sample +1 -0
  205. data/integration/apps/rspec/.gitignore +2 -0
  206. data/integration/apps/rspec/.rspec +1 -0
  207. data/integration/apps/rspec/Dockerfile +25 -0
  208. data/integration/apps/rspec/Dockerfile-ci +11 -0
  209. data/integration/apps/rspec/Gemfile +14 -0
  210. data/integration/apps/rspec/README.md +70 -0
  211. data/integration/apps/rspec/agent.yaml +3 -0
  212. data/integration/apps/rspec/app/datadog.rb +13 -0
  213. data/integration/apps/rspec/app/fibonacci.rb +30 -0
  214. data/integration/apps/rspec/bin/run +20 -0
  215. data/integration/apps/rspec/bin/setup +17 -0
  216. data/integration/apps/rspec/bin/test +21 -0
  217. data/integration/apps/rspec/docker-compose.ci.yml +51 -0
  218. data/integration/apps/rspec/docker-compose.yml +63 -0
  219. data/integration/apps/rspec/script/build-images +37 -0
  220. data/integration/apps/rspec/script/ci +53 -0
  221. data/integration/apps/rspec/spec/fibonacci_spec.rb +16 -0
  222. data/integration/apps/rspec/spec/rspec_spec.rb +58 -0
  223. data/integration/apps/rspec/spec/spec_helper.rb +24 -0
  224. data/integration/apps/ruby/README.md +2 -2
  225. data/integration/apps/ruby/script/ci +2 -1
  226. data/lib/datadog/ci.rb +16 -0
  227. data/lib/datadog/ci/configuration/components.rb +30 -0
  228. data/lib/datadog/ci/configuration/settings.rb +36 -0
  229. data/lib/datadog/ci/context_flush.rb +28 -0
  230. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +30 -0
  231. data/lib/datadog/ci/contrib/cucumber/ext.rb +19 -0
  232. data/lib/datadog/ci/contrib/cucumber/formatter.rb +97 -0
  233. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +26 -0
  234. data/lib/datadog/ci/contrib/cucumber/integration.rb +47 -0
  235. data/lib/datadog/ci/contrib/cucumber/patcher.rb +25 -0
  236. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +30 -0
  237. data/lib/datadog/ci/contrib/rspec/example.rb +73 -0
  238. data/lib/datadog/ci/contrib/rspec/ext.rb +18 -0
  239. data/lib/datadog/ci/contrib/rspec/integration.rb +48 -0
  240. data/lib/datadog/ci/contrib/rspec/patcher.rb +25 -0
  241. data/lib/datadog/ci/ext/app_types.rb +9 -0
  242. data/lib/datadog/ci/ext/environment.rb +303 -0
  243. data/lib/datadog/ci/ext/settings.rb +10 -0
  244. data/lib/datadog/ci/ext/test.rb +28 -0
  245. data/lib/datadog/ci/extensions.rb +17 -0
  246. data/lib/datadog/ci/test.rb +63 -0
  247. data/lib/ddtrace.rb +0 -2
  248. data/lib/ddtrace/configuration.rb +1 -23
  249. data/lib/ddtrace/configuration/agent_settings_resolver.rb +8 -19
  250. data/lib/ddtrace/configuration/base.rb +6 -9
  251. data/lib/ddtrace/configuration/components.rb +33 -10
  252. data/lib/ddtrace/configuration/options.rb +2 -2
  253. data/lib/ddtrace/configuration/settings.rb +49 -1
  254. data/lib/ddtrace/context.rb +17 -14
  255. data/lib/ddtrace/context_flush.rb +14 -2
  256. data/lib/ddtrace/contrib/action_cable/event.rb +4 -4
  257. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +1 -1
  258. data/lib/ddtrace/contrib/action_view/event.rb +2 -2
  259. data/lib/ddtrace/contrib/action_view/patcher.rb +4 -4
  260. data/lib/ddtrace/contrib/active_model_serializers/event.rb +2 -2
  261. data/lib/ddtrace/contrib/active_record/event.rb +2 -2
  262. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +7 -7
  263. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -5
  264. data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -2
  265. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -1
  266. data/lib/ddtrace/contrib/auto_instrument.rb +1 -1
  267. data/lib/ddtrace/contrib/aws/instrumentation.rb +29 -0
  268. data/lib/ddtrace/contrib/aws/patcher.rb +4 -0
  269. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +1 -1
  270. data/lib/ddtrace/contrib/configurable.rb +1 -1
  271. data/lib/ddtrace/contrib/dalli/instrumentation.rb +1 -1
  272. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -1
  273. data/lib/ddtrace/contrib/ethon/easy_patch.rb +1 -1
  274. data/lib/ddtrace/contrib/ethon/multi_patch.rb +1 -1
  275. data/lib/ddtrace/contrib/ethon/patcher.rb +2 -2
  276. data/lib/ddtrace/contrib/extensions.rb +3 -3
  277. data/lib/ddtrace/contrib/faraday/patcher.rb +2 -2
  278. data/lib/ddtrace/contrib/grape/instrumentation.rb +2 -2
  279. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  280. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -1
  281. data/lib/ddtrace/contrib/http/instrumentation.rb +1 -1
  282. data/lib/ddtrace/contrib/http/patcher.rb +1 -1
  283. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +1 -1
  284. data/lib/ddtrace/contrib/httpclient/patcher.rb +1 -1
  285. data/lib/ddtrace/contrib/httprb/instrumentation.rb +1 -1
  286. data/lib/ddtrace/contrib/httprb/patcher.rb +1 -1
  287. data/lib/ddtrace/contrib/integration.rb +3 -3
  288. data/lib/ddtrace/contrib/kafka/event.rb +2 -2
  289. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -2
  290. data/lib/ddtrace/contrib/mongodb/patcher.rb +2 -2
  291. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +1 -1
  292. data/lib/ddtrace/contrib/mysql2/patcher.rb +1 -1
  293. data/lib/ddtrace/contrib/patchable.rb +2 -2
  294. data/lib/ddtrace/contrib/patcher.rb +2 -2
  295. data/lib/ddtrace/contrib/presto/instrumentation.rb +1 -1
  296. data/lib/ddtrace/contrib/presto/patcher.rb +1 -1
  297. data/lib/ddtrace/contrib/qless/patcher.rb +3 -5
  298. data/lib/ddtrace/contrib/racecar/event.rb +2 -2
  299. data/lib/ddtrace/contrib/rake/instrumentation.rb +1 -1
  300. data/lib/ddtrace/contrib/rake/patcher.rb +1 -1
  301. data/lib/ddtrace/contrib/registerable.rb +2 -2
  302. data/lib/ddtrace/contrib/resque/patcher.rb +1 -1
  303. data/lib/ddtrace/contrib/rest_client/patcher.rb +1 -1
  304. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -1
  305. data/lib/ddtrace/contrib/sequel/database.rb +1 -1
  306. data/lib/ddtrace/contrib/sequel/dataset.rb +1 -1
  307. data/lib/ddtrace/contrib/sequel/patcher.rb +2 -2
  308. data/lib/ddtrace/contrib/sinatra/patcher.rb +1 -1
  309. data/lib/ddtrace/contrib/sucker_punch/exception_handler.rb +4 -6
  310. data/lib/ddtrace/diagnostics/environment_logger.rb +2 -2
  311. data/lib/ddtrace/error.rb +52 -61
  312. data/lib/ddtrace/ext/app_types.rb +0 -1
  313. data/lib/ddtrace/ext/test.rb +2 -18
  314. data/lib/ddtrace/metrics.rb +28 -3
  315. data/lib/ddtrace/opentelemetry/extensions.rb +1 -1
  316. data/lib/ddtrace/opentracer.rb +20 -39
  317. data/lib/ddtrace/patcher.rb +2 -2
  318. data/lib/ddtrace/profiling.rb +11 -9
  319. data/lib/ddtrace/profiling/collectors/stack.rb +5 -2
  320. data/lib/ddtrace/profiling/encoding/profile.rb +6 -0
  321. data/lib/ddtrace/profiling/ext/cpu.rb +2 -2
  322. data/lib/ddtrace/profiling/ext/cthread.rb +9 -11
  323. data/lib/ddtrace/profiling/ext/forking.rb +7 -7
  324. data/lib/ddtrace/profiling/flush.rb +3 -1
  325. data/lib/ddtrace/profiling/pprof/builder.rb +26 -28
  326. data/lib/ddtrace/profiling/pprof/converter.rb +4 -0
  327. data/lib/ddtrace/profiling/pprof/stack_sample.rb +17 -1
  328. data/lib/ddtrace/profiling/pprof/template.rb +4 -0
  329. data/lib/ddtrace/profiling/scheduler.rb +12 -1
  330. data/lib/ddtrace/profiling/tasks/setup.rb +13 -13
  331. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +11 -2
  332. data/lib/ddtrace/runtime/metrics.rb +3 -5
  333. data/lib/ddtrace/sync_writer.rb +2 -1
  334. data/lib/ddtrace/tracer.rb +8 -4
  335. data/lib/ddtrace/transport/http/statistics.rb +2 -2
  336. data/lib/ddtrace/transport/http/traces.rb +3 -3
  337. data/lib/ddtrace/transport/io/traces.rb +1 -1
  338. data/lib/ddtrace/utils/forking.rb +1 -1
  339. data/lib/ddtrace/utils/object_set.rb +3 -5
  340. data/lib/ddtrace/utils/time.rb +1 -3
  341. data/lib/ddtrace/version.rb +2 -4
  342. data/lib/ddtrace/workers.rb +1 -1
  343. data/lib/ddtrace/workers/async.rb +3 -2
  344. data/lib/ddtrace/workers/loop.rb +1 -1
  345. data/lib/ddtrace/workers/polling.rb +11 -5
  346. data/lib/ddtrace/workers/queue.rb +1 -1
  347. metadata +48 -34
  348. data/.circleci/images/primary/Dockerfile-2.0.0 +0 -83
  349. data/gemfiles/ruby_2.0.0_contrib_old.gemfile +0 -64
  350. data/gemfiles/ruby_2.0.0_contrib_old.gemfile.lock +0 -290
  351. data/gemfiles/ruby_2.0.0_core_old.gemfile +0 -33
  352. data/gemfiles/ruby_2.0.0_core_old.gemfile.lock +0 -118
  353. data/gemfiles/ruby_2.0.0_rails30_postgres.gemfile +0 -39
  354. data/gemfiles/ruby_2.0.0_rails30_postgres.gemfile.lock +0 -196
  355. data/gemfiles/ruby_2.0.0_rails30_postgres_sidekiq.gemfile +0 -40
  356. data/gemfiles/ruby_2.0.0_rails30_postgres_sidekiq.gemfile.lock +0 -205
  357. data/gemfiles/ruby_2.0.0_rails32_mysql2.gemfile +0 -43
  358. data/gemfiles/ruby_2.0.0_rails32_mysql2.gemfile.lock +0 -217
  359. data/gemfiles/ruby_2.0.0_rails32_postgres.gemfile +0 -39
  360. data/gemfiles/ruby_2.0.0_rails32_postgres.gemfile.lock +0 -204
  361. data/gemfiles/ruby_2.0.0_rails32_postgres_redis.gemfile +0 -41
  362. data/gemfiles/ruby_2.0.0_rails32_postgres_redis.gemfile.lock +0 -223
  363. data/gemfiles/ruby_2.0.0_rails32_postgres_sidekiq.gemfile +0 -40
  364. data/gemfiles/ruby_2.0.0_rails32_postgres_sidekiq.gemfile.lock +0 -213
  365. data/integration/images/ruby/2.0/Dockerfile +0 -54
  366. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -28
  367. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -17
  368. data/lib/ddtrace/contrib/cucumber/formatter.rb +0 -98
  369. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +0 -24
  370. data/lib/ddtrace/contrib/cucumber/integration.rb +0 -45
  371. data/lib/ddtrace/contrib/cucumber/patcher.rb +0 -23
  372. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -28
  373. data/lib/ddtrace/contrib/rspec/example.rb +0 -75
  374. data/lib/ddtrace/contrib/rspec/ext.rb +0 -16
  375. data/lib/ddtrace/contrib/rspec/integration.rb +0 -46
  376. data/lib/ddtrace/contrib/rspec/patcher.rb +0 -23
  377. data/lib/ddtrace/ext/ci.rb +0 -297
@@ -0,0 +1,25 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'datadog/ci/contrib/cucumber/instrumentation'
3
+
4
+ module Datadog
5
+ module CI
6
+ module Contrib
7
+ module Cucumber
8
+ # Patcher enables patching of 'cucumber' module.
9
+ module Patcher
10
+ include Datadog::Contrib::Patcher
11
+
12
+ module_function
13
+
14
+ def target_version
15
+ Integration.version
16
+ end
17
+
18
+ def patch
19
+ ::Cucumber::Runtime.include(Instrumentation)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'datadog/ci/contrib/rspec/ext'
3
+
4
+ module Datadog
5
+ module CI
6
+ module Contrib
7
+ module RSpec
8
+ module Configuration
9
+ # Custom settings for the RSpec integration
10
+ class Settings < Datadog::Contrib::Configuration::Settings
11
+ option :enabled do |o|
12
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
13
+ o.lazy
14
+ end
15
+
16
+ option :service_name do |o|
17
+ o.default { Datadog.configuration.service || Ext::SERVICE_NAME }
18
+ o.lazy
19
+ end
20
+
21
+ option :operation_name do |o|
22
+ o.default { ENV.key?(Ext::ENV_OPERATION_NAME) ? ENV[Ext::ENV_OPERATION_NAME] : Ext::OPERATION_NAME }
23
+ o.lazy
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,73 @@
1
+ require 'datadog/ci/test'
2
+
3
+ require 'datadog/ci/ext/app_types'
4
+ require 'datadog/ci/ext/environment'
5
+ require 'datadog/ci/ext/test'
6
+ require 'datadog/ci/contrib/rspec/ext'
7
+
8
+ module Datadog
9
+ module CI
10
+ module Contrib
11
+ module RSpec
12
+ # Instrument RSpec::Core::Example
13
+ module Example
14
+ def self.included(base)
15
+ base.prepend(InstanceMethods)
16
+ end
17
+
18
+ # Instance methods for configuration
19
+ module InstanceMethods
20
+ def run(example_group_instance, reporter)
21
+ return super unless configuration[:enabled]
22
+
23
+ test_name = full_description.strip
24
+ if metadata[:description].empty?
25
+ # for unnamed it blocks this appends something like "example at ./spec/some_spec.rb:10"
26
+ test_name += " #{description}"
27
+ end
28
+
29
+ CI::Test.trace(
30
+ tracer,
31
+ configuration[:operation_name],
32
+ {
33
+ span_options: {
34
+ app: Ext::APP,
35
+ resource: test_name,
36
+ service: configuration[:service_name]
37
+ },
38
+ framework: Ext::FRAMEWORK,
39
+ test_name: test_name,
40
+ test_suite: file_path,
41
+ test_type: Ext::TEST_TYPE
42
+ }
43
+ ) do |span|
44
+ result = super
45
+
46
+ case execution_result.status
47
+ when :passed
48
+ CI::Test.passed!(span)
49
+ when :failed
50
+ CI::Test.failed!(span, execution_result.exception)
51
+ else
52
+ CI::Test.skipped!(span, execution_result.exception) if execution_result.example_skipped?
53
+ end
54
+
55
+ result
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def configuration
62
+ Datadog.configuration[:rspec]
63
+ end
64
+
65
+ def tracer
66
+ configuration[:tracer]
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,18 @@
1
+ module Datadog
2
+ module CI
3
+ module Contrib
4
+ module RSpec
5
+ # RSpec integration constants
6
+ module Ext
7
+ APP = 'rspec'.freeze
8
+ ENV_ENABLED = 'DD_TRACE_RSPEC_ENABLED'.freeze
9
+ ENV_OPERATION_NAME = 'DD_TRACE_RSPEC_OPERATION_NAME'.freeze
10
+ FRAMEWORK = 'rspec'.freeze
11
+ OPERATION_NAME = 'rspec.example'.freeze
12
+ SERVICE_NAME = 'rspec'.freeze
13
+ TEST_TYPE = 'test'.freeze
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,48 @@
1
+ require 'ddtrace/contrib/integration'
2
+
3
+ require 'datadog/ci/contrib/rspec/configuration/settings'
4
+ require 'datadog/ci/contrib/rspec/patcher'
5
+
6
+ module Datadog
7
+ module CI
8
+ module Contrib
9
+ module RSpec
10
+ # Description of RSpec integration
11
+ class Integration
12
+ include Datadog::Contrib::Integration
13
+
14
+ MINIMUM_VERSION = Gem::Version.new('3.0.0')
15
+
16
+ register_as :rspec, auto_patch: true
17
+
18
+ def self.version
19
+ Gem.loaded_specs['rspec'] \
20
+ && Gem.loaded_specs['rspec'].version
21
+ end
22
+
23
+ def self.loaded?
24
+ !defined?(::RSpec).nil? && !defined?(::RSpec::Core).nil? && \
25
+ !defined?(::RSpec::Core::Example).nil?
26
+ end
27
+
28
+ def self.compatible?
29
+ super && version >= MINIMUM_VERSION
30
+ end
31
+
32
+ # test environments should not auto instrument test libraries
33
+ def auto_instrument?
34
+ false
35
+ end
36
+
37
+ def default_configuration
38
+ Configuration::Settings.new
39
+ end
40
+
41
+ def patcher
42
+ Patcher
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,25 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'datadog/ci/contrib/rspec/example'
3
+
4
+ module Datadog
5
+ module CI
6
+ module Contrib
7
+ module RSpec
8
+ # Patcher enables patching of 'rspec' module.
9
+ module Patcher
10
+ include Datadog::Contrib::Patcher
11
+
12
+ module_function
13
+
14
+ def target_version
15
+ Integration.version
16
+ end
17
+
18
+ def patch
19
+ ::RSpec::Core::Example.include(Example)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module CI
3
+ module Ext
4
+ module AppTypes
5
+ TEST = 'test'.freeze
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,303 @@
1
+ require 'ddtrace/ext/git'
2
+
3
+ module Datadog
4
+ module CI
5
+ module Ext
6
+ # Defines constants for CI tags
7
+ # rubocop:disable Metrics/ModuleLength:
8
+ module Environment
9
+ TAG_STAGE_NAME = 'ci.stage.name'.freeze
10
+ TAG_JOB_NAME = 'ci.job.name'.freeze
11
+ TAG_JOB_URL = 'ci.job.url'.freeze
12
+ TAG_PIPELINE_ID = 'ci.pipeline.id'.freeze
13
+ TAG_PIPELINE_NAME = 'ci.pipeline.name'.freeze
14
+ TAG_PIPELINE_NUMBER = 'ci.pipeline.number'.freeze
15
+ TAG_PIPELINE_URL = 'ci.pipeline.url'.freeze
16
+ TAG_PROVIDER_NAME = 'ci.provider.name'.freeze
17
+ TAG_WORKSPACE_PATH = 'ci.workspace_path'.freeze
18
+
19
+ PROVIDERS = [
20
+ ['APPVEYOR'.freeze, :extract_appveyor],
21
+ ['TF_BUILD'.freeze, :extract_azure_pipelines],
22
+ ['BITBUCKET_COMMIT'.freeze, :extract_bitbucket],
23
+ ['BUILDKITE'.freeze, :extract_buildkite],
24
+ ['CIRCLECI'.freeze, :extract_circle_ci],
25
+ ['GITHUB_SHA'.freeze, :extract_github_actions],
26
+ ['GITLAB_CI'.freeze, :extract_gitlab],
27
+ ['JENKINS_URL'.freeze, :extract_jenkins],
28
+ ['TEAMCITY_VERSION'.freeze, :extract_teamcity],
29
+ ['TRAVIS'.freeze, :extract_travis],
30
+ ['BITRISE_BUILD_SLUG'.freeze, :extract_bitrise]
31
+ ].freeze
32
+
33
+ module_function
34
+
35
+ def tags(env)
36
+ provider = PROVIDERS.find { |c| env.key? c[0] }
37
+ return {} if provider.nil?
38
+
39
+ tags = send(provider[1], env)
40
+
41
+ tags[Datadog::Ext::Git::TAG_TAG] = normalize_ref(tags[Datadog::Ext::Git::TAG_TAG])
42
+ tags.delete(Datadog::Ext::Git::TAG_BRANCH) unless tags[Datadog::Ext::Git::TAG_TAG].nil?
43
+ tags[Datadog::Ext::Git::TAG_BRANCH] = normalize_ref(tags[Datadog::Ext::Git::TAG_BRANCH])
44
+ tags[Datadog::Ext::Git::TAG_REPOSITORY_URL] = filter_sensitive_info(tags[Datadog::Ext::Git::TAG_REPOSITORY_URL])
45
+
46
+ # Expand ~
47
+ workspace_path = tags[TAG_WORKSPACE_PATH]
48
+ if !workspace_path.nil? && (workspace_path == '~' || workspace_path.start_with?('~/'))
49
+ tags[TAG_WORKSPACE_PATH] = File.expand_path(workspace_path)
50
+ end
51
+ tags.reject { |_, v| v.nil? }
52
+ end
53
+
54
+ def normalize_ref(name)
55
+ refs = %r{^refs/(heads/)?}
56
+ origin = %r{^origin/}
57
+ tags = %r{^tags/}
58
+ name.gsub(refs, '').gsub(origin, '').gsub(tags, '') unless name.nil?
59
+ end
60
+
61
+ def filter_sensitive_info(url)
62
+ url.gsub(%r{(https?://)[^/]*@}, '\1') unless url.nil?
63
+ end
64
+
65
+ # CI providers
66
+
67
+ def extract_appveyor(env)
68
+ url = "https://ci.appveyor.com/project/#{env['APPVEYOR_REPO_NAME']}/builds/#{env['APPVEYOR_BUILD_ID']}"
69
+
70
+ if env['APPVEYOR_REPO_PROVIDER'] == 'github'
71
+ repository = "https://github.com/#{env['APPVEYOR_REPO_NAME']}.git"
72
+ commit = env['APPVEYOR_REPO_COMMIT']
73
+ branch = (env['APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH'] || env['APPVEYOR_REPO_BRANCH'])
74
+ tag = env['APPVEYOR_REPO_TAG_NAME']
75
+ end
76
+
77
+ {
78
+ TAG_PROVIDER_NAME => 'appveyor',
79
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => repository,
80
+ Datadog::Ext::Git::TAG_COMMIT_SHA => commit,
81
+ TAG_WORKSPACE_PATH => env['APPVEYOR_BUILD_FOLDER'],
82
+ TAG_PIPELINE_ID => env['APPVEYOR_BUILD_ID'],
83
+ TAG_PIPELINE_NAME => env['APPVEYOR_REPO_NAME'],
84
+ TAG_PIPELINE_NUMBER => env['APPVEYOR_BUILD_NUMBER'],
85
+ TAG_PIPELINE_URL => url,
86
+ TAG_JOB_URL => url,
87
+ Datadog::Ext::Git::TAG_BRANCH => branch,
88
+ Datadog::Ext::Git::TAG_TAG => tag
89
+ }
90
+ end
91
+
92
+ def extract_azure_pipelines(env)
93
+ if env['SYSTEM_TEAMFOUNDATIONSERVERURI'] && env['SYSTEM_TEAMPROJECTID'] && env['BUILD_BUILDID']
94
+ base_url = "#{env['SYSTEM_TEAMFOUNDATIONSERVERURI']}#{env['SYSTEM_TEAMPROJECTID']}" \
95
+ "/_build/results?buildId=#{env['BUILD_BUILDID']}"
96
+ pipeline_url = base_url
97
+ job_url = base_url + "&view=logs&j=#{env['SYSTEM_JOBID']}&t=#{env['SYSTEM_TASKINSTANCEID']}"
98
+ else
99
+ pipeline_url = job_url = nil
100
+ end
101
+ branch_or_tag = (
102
+ env['SYSTEM_PULLREQUEST_SOURCEBRANCH'] || env['BUILD_SOURCEBRANCH'] || env['BUILD_SOURCEBRANCHNAME']
103
+ )
104
+ if branch_or_tag.include? 'tags/'
105
+ branch = nil
106
+ tag = branch_or_tag
107
+ else
108
+ branch = branch_or_tag
109
+ tag = nil
110
+ end
111
+ {
112
+ TAG_PROVIDER_NAME => 'azurepipelines',
113
+ TAG_WORKSPACE_PATH => env['BUILD_SOURCESDIRECTORY'],
114
+ TAG_PIPELINE_ID => env['BUILD_BUILDID'],
115
+ TAG_PIPELINE_NAME => env['BUILD_DEFINITIONNAME'],
116
+ TAG_PIPELINE_NUMBER => env['BUILD_BUILDID'],
117
+ TAG_PIPELINE_URL => pipeline_url,
118
+ TAG_JOB_URL => job_url,
119
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => (
120
+ env['SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI'] \
121
+ || env['BUILD_REPOSITORY_URI']
122
+ ),
123
+ Datadog::Ext::Git::TAG_COMMIT_SHA => (env['SYSTEM_PULLREQUEST_SOURCECOMMITID'] || env['BUILD_SOURCEVERSION']),
124
+ Datadog::Ext::Git::TAG_BRANCH => branch,
125
+ Datadog::Ext::Git::TAG_TAG => tag
126
+ }
127
+ end
128
+
129
+ def extract_bitbucket(env)
130
+ url = "https://bitbucket.org/#{env['BITBUCKET_REPO_FULL_NAME']}/addon/pipelines/home#" \
131
+ "!/results/#{env['BITBUCKET_BUILD_NUMBER']}"
132
+ {
133
+ Datadog::Ext::Git::TAG_BRANCH => env['BITBUCKET_BRANCH'],
134
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['BITBUCKET_COMMIT'],
135
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['BITBUCKET_GIT_SSH_ORIGIN'],
136
+ Datadog::Ext::Git::TAG_TAG => env['BITBUCKET_TAG'],
137
+ TAG_JOB_URL => url,
138
+ TAG_PIPELINE_ID => env['BITBUCKET_PIPELINE_UUID'] ? env['BITBUCKET_PIPELINE_UUID'].tr('{}', '') : None,
139
+ TAG_PIPELINE_NAME => env['BITBUCKET_REPO_FULL_NAME'],
140
+ TAG_PIPELINE_NUMBER => env['BITBUCKET_BUILD_NUMBER'],
141
+ TAG_PIPELINE_URL => url,
142
+ TAG_PROVIDER_NAME => 'bitbucket',
143
+ TAG_WORKSPACE_PATH => env['BITBUCKET_CLONE_DIR']
144
+ }
145
+ end
146
+
147
+ def extract_buildkite(env)
148
+ {
149
+ Datadog::Ext::Git::TAG_BRANCH => env['BUILDKITE_BRANCH'],
150
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['BUILDKITE_COMMIT'],
151
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['BUILDKITE_REPO'],
152
+ Datadog::Ext::Git::TAG_TAG => env['BUILDKITE_TAG'],
153
+ TAG_PIPELINE_ID => env['BUILDKITE_BUILD_ID'],
154
+ TAG_PIPELINE_NAME => env['BUILDKITE_PIPELINE_SLUG'],
155
+ TAG_PIPELINE_NUMBER => env['BUILDKITE_BUILD_NUMBER'],
156
+ TAG_PIPELINE_URL => env['BUILDKITE_BUILD_URL'],
157
+ TAG_JOB_URL => "#{env['BUILDKITE_BUILD_URL']}##{env['BUILDKITE_JOB_ID']}",
158
+ TAG_PROVIDER_NAME => 'buildkite',
159
+ TAG_WORKSPACE_PATH => env['BUILDKITE_BUILD_CHECKOUT_PATH']
160
+ }
161
+ end
162
+
163
+ def extract_circle_ci(env)
164
+ {
165
+ Datadog::Ext::Git::TAG_BRANCH => env['CIRCLE_BRANCH'],
166
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['CIRCLE_SHA1'],
167
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['CIRCLE_REPOSITORY_URL'],
168
+ Datadog::Ext::Git::TAG_TAG => env['CIRCLE_TAG'],
169
+ TAG_PIPELINE_ID => env['CIRCLE_WORKFLOW_ID'],
170
+ TAG_PIPELINE_NAME => env['CIRCLE_PROJECT_REPONAME'],
171
+ TAG_PIPELINE_NUMBER => env['CIRCLE_BUILD_NUM'],
172
+ TAG_PIPELINE_URL => env['CIRCLE_BUILD_URL'],
173
+ TAG_JOB_URL => env['CIRCLE_BUILD_URL'],
174
+ TAG_PROVIDER_NAME => 'circleci',
175
+ TAG_WORKSPACE_PATH => env['CIRCLE_WORKING_DIRECTORY']
176
+ }
177
+ end
178
+
179
+ def extract_github_actions(env)
180
+ branch_or_tag = (env['GITHUB_HEAD_REF'] || env['GITHUB_REF'])
181
+ if branch_or_tag.include? 'tags/'
182
+ branch = nil
183
+ tag = branch_or_tag
184
+ else
185
+ branch = branch_or_tag
186
+ tag = nil
187
+ end
188
+ {
189
+ Datadog::Ext::Git::TAG_BRANCH => branch,
190
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['GITHUB_SHA'],
191
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => "https://github.com/#{env['GITHUB_REPOSITORY']}.git",
192
+ Datadog::Ext::Git::TAG_TAG => tag,
193
+ TAG_JOB_URL => "https://github.com/#{env['GITHUB_REPOSITORY']}/commit/#{env['GITHUB_SHA']}/checks",
194
+ TAG_PIPELINE_ID => env['GITHUB_RUN_ID'],
195
+ TAG_PIPELINE_NAME => env['GITHUB_WORKFLOW'],
196
+ TAG_PIPELINE_NUMBER => env['GITHUB_RUN_NUMBER'],
197
+ TAG_PIPELINE_URL => "https://github.com/#{env['GITHUB_REPOSITORY']}/commit/#{env['GITHUB_SHA']}/checks",
198
+ TAG_PROVIDER_NAME => 'github',
199
+ TAG_WORKSPACE_PATH => env['GITHUB_WORKSPACE']
200
+ }
201
+ end
202
+
203
+ def extract_gitlab(env)
204
+ url = env['CI_PIPELINE_URL']
205
+ url = url.gsub(%r{/-/pipelines/}, '/pipelines/') unless url.nil?
206
+ {
207
+ Datadog::Ext::Git::TAG_BRANCH => env['CI_COMMIT_BRANCH'],
208
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['CI_COMMIT_SHA'],
209
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['CI_REPOSITORY_URL'],
210
+ Datadog::Ext::Git::TAG_TAG => env['CI_COMMIT_TAG'],
211
+ TAG_STAGE_NAME => env['CI_JOB_STAGE'],
212
+ TAG_JOB_NAME => env['CI_JOB_NAME'],
213
+ TAG_JOB_URL => env['CI_JOB_URL'],
214
+ TAG_PIPELINE_ID => env['CI_PIPELINE_ID'],
215
+ TAG_PIPELINE_NAME => env['CI_PROJECT_PATH'],
216
+ TAG_PIPELINE_NUMBER => env['CI_PIPELINE_IID'],
217
+ TAG_PIPELINE_URL => url,
218
+ TAG_PROVIDER_NAME => 'gitlab',
219
+ TAG_WORKSPACE_PATH => env['CI_PROJECT_DIR']
220
+ }
221
+ end
222
+
223
+ def extract_jenkins(env)
224
+ branch_or_tag = env['GIT_BRANCH']
225
+ if branch_or_tag.include? 'tags/'
226
+ branch = nil
227
+ tag = branch_or_tag
228
+ else
229
+ branch = branch_or_tag
230
+ tag = nil
231
+ end
232
+ name = env['JOB_NAME']
233
+ name = name.gsub("/#{normalize_ref(branch)}", '') unless name.nil? || branch.nil?
234
+ name = name.split('/').reject { |v| v.nil? || v.include?('=') }.join('/') unless name.nil?
235
+ {
236
+ Datadog::Ext::Git::TAG_BRANCH => branch,
237
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['GIT_COMMIT'],
238
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['GIT_URL'],
239
+ Datadog::Ext::Git::TAG_TAG => tag,
240
+ TAG_PIPELINE_ID => env['BUILD_TAG'],
241
+ TAG_PIPELINE_NAME => name,
242
+ TAG_PIPELINE_NUMBER => env['BUILD_NUMBER'],
243
+ TAG_PIPELINE_URL => env['BUILD_URL'],
244
+ TAG_PROVIDER_NAME => 'jenkins',
245
+ TAG_WORKSPACE_PATH => env['WORKSPACE']
246
+ }
247
+ end
248
+
249
+ def extract_teamcity(env)
250
+ {
251
+ TAG_PROVIDER_NAME => 'teamcity',
252
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['BUILD_VCS_URL'],
253
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['BUILD_VCS_NUMBER'],
254
+ TAG_WORKSPACE_PATH => env['BUILD_CHECKOUTDIR'],
255
+ TAG_PIPELINE_ID => env['BUILD_ID'],
256
+ TAG_PIPELINE_NUMBER => env['BUILD_NUMBER'],
257
+ TAG_PIPELINE_URL => (
258
+ env['SERVER_URL'] && env['BUILD_ID'] ? "#{env['SERVER_URL']}/viewLog.html?buildId=#{env['SERVER_URL']}" : nil
259
+ )
260
+ }
261
+ end
262
+
263
+ def extract_travis(env)
264
+ {
265
+ Datadog::Ext::Git::TAG_BRANCH => (env['TRAVIS_PULL_REQUEST_BRANCH'] || env['TRAVIS_BRANCH']),
266
+ Datadog::Ext::Git::TAG_COMMIT_SHA => env['TRAVIS_COMMIT'],
267
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => "https://github.com/#{env['TRAVIS_REPO_SLUG']}.git",
268
+ Datadog::Ext::Git::TAG_TAG => env['TRAVIS_TAG'],
269
+ TAG_JOB_URL => env['TRAVIS_JOB_WEB_URL'],
270
+ TAG_PIPELINE_ID => env['TRAVIS_BUILD_ID'],
271
+ TAG_PIPELINE_NAME => env['TRAVIS_REPO_SLUG'],
272
+ TAG_PIPELINE_NUMBER => env['TRAVIS_BUILD_NUMBER'],
273
+ TAG_PIPELINE_URL => env['TRAVIS_BUILD_WEB_URL'],
274
+ TAG_PROVIDER_NAME => 'travisci',
275
+ TAG_WORKSPACE_PATH => env['TRAVIS_BUILD_DIR']
276
+ }
277
+ end
278
+
279
+ def extract_bitrise(env)
280
+ commit = (
281
+ env['BITRISE_GIT_COMMIT'] || env['GIT_CLONE_COMMIT_HASH']
282
+ )
283
+ branch = (
284
+ env['BITRISEIO_GIT_BRANCH_DEST'] || env['BITRISE_GIT_BRANCH']
285
+ )
286
+ {
287
+ TAG_PROVIDER_NAME => 'bitrise',
288
+ TAG_PIPELINE_ID => env['BITRISE_BUILD_SLUG'],
289
+ TAG_PIPELINE_NAME => env['BITRISE_APP_TITLE'],
290
+ TAG_PIPELINE_NUMBER => env['BITRISE_BUILD_NUMBER'],
291
+ TAG_PIPELINE_URL => env['BITRISE_BUILD_URL'],
292
+ TAG_WORKSPACE_PATH => env['BITRISE_SOURCE_DIR'],
293
+ Datadog::Ext::Git::TAG_REPOSITORY_URL => env['GIT_REPOSITORY_URL'],
294
+ Datadog::Ext::Git::TAG_COMMIT_SHA => commit,
295
+ Datadog::Ext::Git::TAG_BRANCH => branch,
296
+ Datadog::Ext::Git::TAG_TAG => env['BITRISE_GIT_TAG']
297
+ }
298
+ end
299
+ end
300
+ # rubocop:enable Metrics/ModuleLength:
301
+ end
302
+ end
303
+ end