ddtrace 0.13.0 → 0.47.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (628) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +598 -381
  3. data/.circleci/images/primary/Dockerfile-2.0.0 +6 -2
  4. data/.circleci/images/primary/Dockerfile-2.1.10 +6 -2
  5. data/.circleci/images/primary/Dockerfile-2.2.10 +6 -2
  6. data/.circleci/images/primary/Dockerfile-2.3.8 +75 -0
  7. data/.circleci/images/primary/Dockerfile-2.4.6 +73 -0
  8. data/.circleci/images/primary/{Dockerfile-2.3.7 → Dockerfile-2.5.6} +2 -2
  9. data/.circleci/images/primary/{Dockerfile-2.4.4 → Dockerfile-2.6.4} +2 -2
  10. data/.circleci/images/primary/Dockerfile-2.7.0 +73 -0
  11. data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
  12. data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +78 -0
  13. data/.circleci/images/primary/Dockerfile-jruby-9.2.0.0 +73 -0
  14. data/.circleci/images/primary/{Dockerfile-1.9.3 → Dockerfile-truffleruby-21.0.0} +6 -2
  15. data/.env +5 -2
  16. data/.github/CODEOWNERS +1 -0
  17. data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
  18. data/.github/workflows/create-next-milestone.yml +20 -0
  19. data/.gitignore +2 -0
  20. data/.gitlab-ci.yml +27 -0
  21. data/.rubocop.yml +270 -6
  22. data/.rubocop_todo.yml +397 -0
  23. data/.simplecov +47 -0
  24. data/Appraisals +933 -127
  25. data/CHANGELOG.md +2106 -97
  26. data/CONTRIBUTING.md +85 -0
  27. data/Gemfile +55 -2
  28. data/LICENSE +4 -22
  29. data/LICENSE-3rdparty.csv +2 -0
  30. data/LICENSE.Apache +200 -0
  31. data/LICENSE.BSD3 +24 -0
  32. data/NOTICE +4 -0
  33. data/README.md +5 -34
  34. data/Rakefile +825 -351
  35. data/benchmarks/postgres_database.yml +9 -0
  36. data/benchmarks/sidekiq_test.rb +154 -0
  37. data/ddtrace.gemspec +8 -17
  38. data/docker-compose.yml +260 -47
  39. data/docs/DevelopmentGuide.md +249 -0
  40. data/docs/GettingStarted.md +1435 -290
  41. data/integration/README.md +68 -0
  42. data/integration/apps/rack/.dockerignore +1 -0
  43. data/integration/apps/rack/.envrc.sample +1 -0
  44. data/integration/apps/rack/.gitignore +4 -0
  45. data/integration/apps/rack/.rspec +1 -0
  46. data/integration/apps/rack/Dockerfile +25 -0
  47. data/integration/apps/rack/Dockerfile-ci +11 -0
  48. data/integration/apps/rack/Gemfile +24 -0
  49. data/integration/apps/rack/README.md +93 -0
  50. data/integration/apps/rack/app/acme.rb +80 -0
  51. data/integration/apps/rack/app/datadog.rb +17 -0
  52. data/integration/apps/rack/bin/run +22 -0
  53. data/integration/apps/rack/bin/setup +17 -0
  54. data/integration/apps/rack/bin/test +24 -0
  55. data/integration/apps/rack/config.ru +6 -0
  56. data/integration/apps/rack/config/puma.rb +14 -0
  57. data/integration/apps/rack/config/unicorn.rb +23 -0
  58. data/integration/apps/rack/docker-compose.ci.yml +62 -0
  59. data/integration/apps/rack/docker-compose.yml +78 -0
  60. data/integration/apps/rack/script/build-images +38 -0
  61. data/integration/apps/rack/script/ci +50 -0
  62. data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
  63. data/integration/apps/rack/spec/spec_helper.rb +16 -0
  64. data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
  65. data/integration/apps/rails-five/.dockerignore +1 -0
  66. data/integration/apps/rails-five/.env +3 -0
  67. data/integration/apps/rails-five/.envrc.sample +1 -0
  68. data/integration/apps/rails-five/.gitignore +30 -0
  69. data/integration/apps/rails-five/Dockerfile +25 -0
  70. data/integration/apps/rails-five/Dockerfile-ci +11 -0
  71. data/integration/apps/rails-five/Gemfile +104 -0
  72. data/integration/apps/rails-five/README.md +94 -0
  73. data/integration/apps/rails-five/Rakefile +6 -0
  74. data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
  75. data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
  76. data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
  77. data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
  78. data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
  79. data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
  80. data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
  81. data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
  82. data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
  83. data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
  84. data/integration/apps/rails-five/app/models/application_record.rb +3 -0
  85. data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
  86. data/integration/apps/rails-five/app/models/test.rb +2 -0
  87. data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
  88. data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
  89. data/integration/apps/rails-five/bin/bundle +3 -0
  90. data/integration/apps/rails-five/bin/rails +9 -0
  91. data/integration/apps/rails-five/bin/rake +9 -0
  92. data/integration/apps/rails-five/bin/run +24 -0
  93. data/integration/apps/rails-five/bin/setup +27 -0
  94. data/integration/apps/rails-five/bin/spring +17 -0
  95. data/integration/apps/rails-five/bin/test +21 -0
  96. data/integration/apps/rails-five/bin/update +28 -0
  97. data/integration/apps/rails-five/config.ru +5 -0
  98. data/integration/apps/rails-five/config/application.rb +97 -0
  99. data/integration/apps/rails-five/config/boot.rb +4 -0
  100. data/integration/apps/rails-five/config/cable.yml +10 -0
  101. data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
  102. data/integration/apps/rails-five/config/database.yml +28 -0
  103. data/integration/apps/rails-five/config/environment.rb +5 -0
  104. data/integration/apps/rails-five/config/environments/development.rb +51 -0
  105. data/integration/apps/rails-five/config/environments/production.rb +82 -0
  106. data/integration/apps/rails-five/config/environments/test.rb +43 -0
  107. data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
  108. data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
  109. data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
  110. data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
  111. data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
  112. data/integration/apps/rails-five/config/locales/en.yml +33 -0
  113. data/integration/apps/rails-five/config/puma.rb +24 -0
  114. data/integration/apps/rails-five/config/routes.rb +11 -0
  115. data/integration/apps/rails-five/config/spring.rb +6 -0
  116. data/integration/apps/rails-five/config/unicorn.rb +29 -0
  117. data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
  118. data/integration/apps/rails-five/db/schema.rb +23 -0
  119. data/integration/apps/rails-five/db/seeds.rb +7 -0
  120. data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
  121. data/integration/apps/rails-five/docker-compose.yml +100 -0
  122. data/integration/apps/rails-five/lib/tasks/.keep +0 -0
  123. data/integration/apps/rails-five/log/.keep +0 -0
  124. data/integration/apps/rails-five/public/robots.txt +1 -0
  125. data/integration/apps/rails-five/script/build-images +35 -0
  126. data/integration/apps/rails-five/script/ci +50 -0
  127. data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
  128. data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
  129. data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
  130. data/integration/apps/rails-five/storage/.keep +0 -0
  131. data/integration/apps/rails-five/tmp/.keep +0 -0
  132. data/integration/apps/rails-five/vendor/.keep +0 -0
  133. data/integration/apps/ruby/.dockerignore +1 -0
  134. data/integration/apps/ruby/.envrc.sample +1 -0
  135. data/integration/apps/ruby/.gitignore +2 -0
  136. data/integration/apps/ruby/Dockerfile +25 -0
  137. data/integration/apps/ruby/Dockerfile-ci +11 -0
  138. data/integration/apps/ruby/Gemfile +11 -0
  139. data/integration/apps/ruby/README.md +70 -0
  140. data/integration/apps/ruby/agent.yaml +3 -0
  141. data/integration/apps/ruby/app/datadog.rb +13 -0
  142. data/integration/apps/ruby/app/fibonacci.rb +58 -0
  143. data/integration/apps/ruby/bin/run +20 -0
  144. data/integration/apps/ruby/bin/setup +17 -0
  145. data/integration/apps/ruby/bin/test +21 -0
  146. data/integration/apps/ruby/docker-compose.ci.yml +51 -0
  147. data/integration/apps/ruby/docker-compose.yml +63 -0
  148. data/integration/apps/ruby/script/build-images +38 -0
  149. data/integration/apps/ruby/script/ci +50 -0
  150. data/integration/images/agent/Dockerfile +2 -0
  151. data/integration/images/agent/agent.yaml +3 -0
  152. data/integration/images/include/datadog/analyzer.rb +71 -0
  153. data/integration/images/include/datadog/demo_env.rb +101 -0
  154. data/integration/images/include/http-health-check +33 -0
  155. data/integration/images/ruby/2.0/Dockerfile +54 -0
  156. data/integration/images/ruby/2.1/Dockerfile +54 -0
  157. data/integration/images/ruby/2.2/Dockerfile +54 -0
  158. data/integration/images/ruby/2.3/Dockerfile +70 -0
  159. data/integration/images/ruby/2.4/Dockerfile +54 -0
  160. data/integration/images/ruby/2.5/Dockerfile +54 -0
  161. data/integration/images/ruby/2.6/Dockerfile +54 -0
  162. data/integration/images/ruby/2.7/Dockerfile +54 -0
  163. data/integration/images/ruby/3.0/Dockerfile +54 -0
  164. data/integration/images/wrk/Dockerfile +33 -0
  165. data/integration/images/wrk/scripts/entrypoint.sh +17 -0
  166. data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
  167. data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
  168. data/integration/script/build-images +43 -0
  169. data/lib/ddtrace.rb +65 -62
  170. data/lib/ddtrace/analytics.rb +38 -0
  171. data/lib/ddtrace/auto_instrument.rb +3 -0
  172. data/lib/ddtrace/auto_instrument_base.rb +6 -0
  173. data/lib/ddtrace/buffer.rb +298 -32
  174. data/lib/ddtrace/chunker.rb +34 -0
  175. data/lib/ddtrace/configuration.rb +151 -26
  176. data/lib/ddtrace/configuration/base.rb +84 -0
  177. data/lib/ddtrace/configuration/components.rb +151 -0
  178. data/lib/ddtrace/configuration/{resolver.rb → dependency_resolver.rb} +2 -2
  179. data/lib/ddtrace/configuration/option.rb +64 -0
  180. data/lib/ddtrace/configuration/option_definition.rb +121 -0
  181. data/lib/ddtrace/configuration/option_definition_set.rb +18 -0
  182. data/lib/ddtrace/configuration/option_set.rb +6 -0
  183. data/lib/ddtrace/configuration/options.rb +111 -0
  184. data/lib/ddtrace/configuration/pin_setup.rb +4 -3
  185. data/lib/ddtrace/configuration/settings.rb +299 -0
  186. data/lib/ddtrace/context.rb +133 -66
  187. data/lib/ddtrace/context_flush.rb +51 -114
  188. data/lib/ddtrace/context_provider.rb +61 -0
  189. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +30 -0
  190. data/lib/ddtrace/contrib/action_cable/event.rb +66 -0
  191. data/lib/ddtrace/contrib/action_cable/events.rb +33 -0
  192. data/lib/ddtrace/contrib/action_cable/events/broadcast.rb +49 -0
  193. data/lib/ddtrace/contrib/action_cable/events/perform_action.rb +55 -0
  194. data/lib/ddtrace/contrib/action_cable/events/transmit.rb +50 -0
  195. data/lib/ddtrace/contrib/action_cable/ext.rb +26 -0
  196. data/lib/ddtrace/contrib/action_cable/instrumentation.rb +31 -0
  197. data/lib/ddtrace/contrib/action_cable/integration.rb +45 -0
  198. data/lib/ddtrace/contrib/action_cable/patcher.rb +27 -0
  199. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +146 -0
  200. data/lib/ddtrace/contrib/action_pack/action_controller/patcher.rb +25 -0
  201. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +32 -0
  202. data/lib/ddtrace/contrib/action_pack/ext.rb +19 -0
  203. data/lib/ddtrace/contrib/action_pack/integration.rb +45 -0
  204. data/lib/ddtrace/contrib/action_pack/patcher.rb +23 -0
  205. data/lib/ddtrace/contrib/action_pack/utils.rb +36 -0
  206. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +31 -0
  207. data/lib/ddtrace/contrib/action_view/event.rb +35 -0
  208. data/lib/ddtrace/contrib/action_view/events.rb +30 -0
  209. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +46 -0
  210. data/lib/ddtrace/contrib/action_view/events/render_template.rb +49 -0
  211. data/lib/ddtrace/contrib/action_view/ext.rb +20 -0
  212. data/lib/ddtrace/contrib/action_view/instrumentation/partial_renderer.rb +74 -0
  213. data/lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb +167 -0
  214. data/lib/ddtrace/contrib/action_view/integration.rb +52 -0
  215. data/lib/ddtrace/contrib/action_view/patcher.rb +47 -0
  216. data/lib/ddtrace/contrib/action_view/utils.rb +32 -0
  217. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +30 -0
  218. data/lib/ddtrace/contrib/active_model_serializers/event.rb +14 -3
  219. data/lib/ddtrace/contrib/active_model_serializers/events/render.rb +2 -2
  220. data/lib/ddtrace/contrib/active_model_serializers/events/serialize.rb +2 -2
  221. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +20 -0
  222. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +40 -0
  223. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +12 -45
  224. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +128 -0
  225. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +35 -0
  226. data/lib/ddtrace/contrib/active_record/event.rb +1 -1
  227. data/lib/ddtrace/contrib/active_record/events/instantiation.rb +17 -8
  228. data/lib/ddtrace/contrib/active_record/events/sql.rb +32 -12
  229. data/lib/ddtrace/contrib/active_record/ext.rb +24 -0
  230. data/lib/ddtrace/contrib/active_record/integration.rb +53 -0
  231. data/lib/ddtrace/contrib/active_record/patcher.rb +5 -35
  232. data/lib/ddtrace/contrib/active_record/utils.rb +85 -31
  233. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +258 -0
  234. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +69 -0
  235. data/lib/ddtrace/contrib/active_support/cache/redis.rb +47 -0
  236. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +30 -0
  237. data/lib/ddtrace/contrib/active_support/ext.rb +27 -0
  238. data/lib/ddtrace/contrib/active_support/integration.rb +46 -0
  239. data/lib/ddtrace/contrib/active_support/notifications/event.rb +15 -2
  240. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +3 -2
  241. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +20 -12
  242. data/lib/ddtrace/contrib/active_support/patcher.rb +23 -0
  243. data/lib/ddtrace/contrib/analytics.rb +24 -0
  244. data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
  245. data/lib/ddtrace/contrib/aws/configuration/settings.rb +30 -0
  246. data/lib/ddtrace/contrib/aws/ext.rb +23 -0
  247. data/lib/ddtrace/contrib/aws/instrumentation.rb +37 -19
  248. data/lib/ddtrace/contrib/aws/integration.rb +42 -0
  249. data/lib/ddtrace/contrib/aws/patcher.rb +30 -40
  250. data/lib/ddtrace/contrib/aws/services.rb +3 -0
  251. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +20 -0
  252. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +41 -0
  253. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +12 -0
  254. data/lib/ddtrace/contrib/concurrent_ruby/future_patch.rb +23 -0
  255. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +38 -0
  256. data/lib/ddtrace/contrib/concurrent_ruby/patcher.rb +28 -0
  257. data/lib/ddtrace/contrib/configurable.rb +102 -0
  258. data/lib/ddtrace/contrib/configuration/resolver.rb +81 -0
  259. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +39 -0
  260. data/lib/ddtrace/contrib/configuration/settings.rb +55 -0
  261. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +28 -0
  262. data/lib/ddtrace/contrib/cucumber/ext.rb +17 -0
  263. data/lib/ddtrace/contrib/cucumber/formatter.rb +98 -0
  264. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
  265. data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
  266. data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
  267. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +30 -0
  268. data/lib/ddtrace/contrib/dalli/ext.rb +20 -0
  269. data/lib/ddtrace/contrib/dalli/instrumentation.rb +36 -17
  270. data/lib/ddtrace/contrib/dalli/integration.rb +38 -0
  271. data/lib/ddtrace/contrib/dalli/patcher.rb +13 -41
  272. data/lib/ddtrace/contrib/dalli/quantize.rb +4 -4
  273. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +32 -0
  274. data/lib/ddtrace/contrib/delayed_job/ext.rb +23 -0
  275. data/lib/ddtrace/contrib/delayed_job/integration.rb +38 -0
  276. data/lib/ddtrace/contrib/delayed_job/patcher.rb +28 -0
  277. data/lib/ddtrace/contrib/delayed_job/plugin.rb +84 -0
  278. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +31 -0
  279. data/lib/ddtrace/contrib/elasticsearch/ext.rb +22 -0
  280. data/lib/ddtrace/contrib/elasticsearch/integration.rb +39 -0
  281. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +49 -50
  282. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
  283. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +32 -0
  284. data/lib/ddtrace/contrib/ethon/easy_patch.rb +151 -0
  285. data/lib/ddtrace/contrib/ethon/ext.rb +19 -0
  286. data/lib/ddtrace/contrib/ethon/integration.rb +43 -0
  287. data/lib/ddtrace/contrib/ethon/multi_patch.rb +84 -0
  288. data/lib/ddtrace/contrib/ethon/patcher.rb +25 -0
  289. data/lib/ddtrace/contrib/excon/configuration/settings.rb +33 -0
  290. data/lib/ddtrace/contrib/excon/ext.rb +17 -0
  291. data/lib/ddtrace/contrib/excon/integration.rb +43 -0
  292. data/lib/ddtrace/contrib/excon/middleware.rb +47 -23
  293. data/lib/ddtrace/contrib/excon/patcher.rb +7 -30
  294. data/lib/ddtrace/contrib/extensions.rb +143 -0
  295. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +38 -0
  296. data/lib/ddtrace/contrib/faraday/connection.rb +18 -0
  297. data/lib/ddtrace/contrib/faraday/ext.rb +17 -0
  298. data/lib/ddtrace/contrib/faraday/integration.rb +43 -0
  299. data/lib/ddtrace/contrib/faraday/middleware.rb +46 -29
  300. data/lib/ddtrace/contrib/faraday/patcher.rb +36 -56
  301. data/lib/ddtrace/contrib/faraday/rack_builder.rb +18 -0
  302. data/lib/ddtrace/contrib/grape/configuration/settings.rb +38 -0
  303. data/lib/ddtrace/contrib/grape/endpoint.rb +192 -120
  304. data/lib/ddtrace/contrib/grape/ext.rb +23 -0
  305. data/lib/ddtrace/contrib/grape/instrumentation.rb +33 -0
  306. data/lib/ddtrace/contrib/grape/integration.rb +39 -0
  307. data/lib/ddtrace/contrib/grape/patcher.rb +15 -59
  308. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +32 -0
  309. data/lib/ddtrace/contrib/graphql/ext.rb +16 -0
  310. data/lib/ddtrace/contrib/graphql/integration.rb +39 -0
  311. data/lib/ddtrace/contrib/graphql/patcher.rb +37 -34
  312. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +30 -0
  313. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +36 -27
  314. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +17 -8
  315. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +20 -5
  316. data/lib/ddtrace/contrib/grpc/ext.rb +18 -0
  317. data/lib/ddtrace/contrib/grpc/integration.rb +38 -0
  318. data/lib/ddtrace/contrib/grpc/patcher.rb +8 -38
  319. data/lib/ddtrace/contrib/http/circuit_breaker.rb +37 -0
  320. data/lib/ddtrace/contrib/http/configuration/settings.rb +32 -0
  321. data/lib/ddtrace/contrib/http/ext.rb +17 -0
  322. data/lib/ddtrace/contrib/http/instrumentation.rb +179 -0
  323. data/lib/ddtrace/contrib/http/integration.rb +45 -0
  324. data/lib/ddtrace/contrib/http/patcher.rb +9 -144
  325. data/lib/ddtrace/contrib/http_annotation_helper.rb +10 -0
  326. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
  327. data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
  328. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
  329. data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
  330. data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
  331. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  332. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  333. data/lib/ddtrace/contrib/httprb/instrumentation.rb +157 -0
  334. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  335. data/lib/ddtrace/contrib/httprb/patcher.rb +38 -0
  336. data/lib/ddtrace/contrib/integration.rb +16 -0
  337. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  338. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  339. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  340. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  341. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  342. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  343. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  344. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  345. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  346. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  347. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  348. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  349. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  350. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  351. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  352. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  353. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  354. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +33 -0
  355. data/lib/ddtrace/contrib/mongodb/ext.rb +23 -0
  356. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +69 -0
  357. data/lib/ddtrace/contrib/mongodb/integration.rb +38 -0
  358. data/lib/ddtrace/contrib/mongodb/patcher.rb +11 -74
  359. data/lib/ddtrace/contrib/mongodb/subscribers.rb +57 -18
  360. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +30 -0
  361. data/lib/ddtrace/contrib/mysql2/ext.rb +18 -0
  362. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +64 -0
  363. data/lib/ddtrace/contrib/mysql2/integration.rb +38 -0
  364. data/lib/ddtrace/contrib/mysql2/patcher.rb +9 -25
  365. data/lib/ddtrace/contrib/patchable.rb +70 -0
  366. data/lib/ddtrace/contrib/patcher.rb +65 -0
  367. data/lib/ddtrace/contrib/presto/configuration/settings.rb +30 -0
  368. data/lib/ddtrace/contrib/presto/ext.rb +28 -0
  369. data/lib/ddtrace/contrib/presto/instrumentation.rb +110 -0
  370. data/lib/ddtrace/contrib/presto/integration.rb +38 -0
  371. data/lib/ddtrace/contrib/presto/patcher.rb +33 -0
  372. data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
  373. data/lib/ddtrace/contrib/qless/ext.rb +20 -0
  374. data/lib/ddtrace/contrib/qless/integration.rb +38 -0
  375. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  376. data/lib/ddtrace/contrib/qless/qless_job.rb +73 -0
  377. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +33 -0
  378. data/lib/ddtrace/contrib/que/configuration/settings.rb +43 -0
  379. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  380. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  381. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  382. data/lib/ddtrace/contrib/que/tracer.rb +57 -0
  383. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +30 -0
  384. data/lib/ddtrace/contrib/racecar/event.rb +22 -7
  385. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  386. data/lib/ddtrace/contrib/racecar/events/batch.rb +2 -2
  387. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  388. data/lib/ddtrace/contrib/racecar/events/message.rb +2 -2
  389. data/lib/ddtrace/contrib/racecar/ext.rb +25 -0
  390. data/lib/ddtrace/contrib/racecar/integration.rb +39 -0
  391. data/lib/ddtrace/contrib/racecar/patcher.rb +11 -42
  392. data/lib/ddtrace/contrib/rack/configuration/settings.rb +46 -0
  393. data/lib/ddtrace/contrib/rack/ext.rb +21 -0
  394. data/lib/ddtrace/contrib/rack/integration.rb +45 -0
  395. data/lib/ddtrace/contrib/rack/middlewares.rb +105 -54
  396. data/lib/ddtrace/contrib/rack/patcher.rb +65 -49
  397. data/lib/ddtrace/contrib/rack/request_queue.rb +17 -7
  398. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  399. data/lib/ddtrace/contrib/rails/configuration/settings.rb +93 -0
  400. data/lib/ddtrace/contrib/rails/ext.rb +17 -0
  401. data/lib/ddtrace/contrib/rails/framework.rb +82 -33
  402. data/lib/ddtrace/contrib/rails/integration.rb +44 -0
  403. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  404. data/lib/ddtrace/contrib/rails/middlewares.rb +8 -2
  405. data/lib/ddtrace/contrib/rails/patcher.rb +88 -34
  406. data/lib/ddtrace/contrib/rails/railtie.rb +5 -9
  407. data/lib/ddtrace/contrib/rails/utils.rb +7 -31
  408. data/lib/ddtrace/contrib/rake/configuration/settings.rb +31 -0
  409. data/lib/ddtrace/contrib/rake/ext.rb +21 -0
  410. data/lib/ddtrace/contrib/rake/instrumentation.rb +33 -13
  411. data/lib/ddtrace/contrib/rake/integration.rb +38 -0
  412. data/lib/ddtrace/contrib/rake/patcher.rb +10 -33
  413. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +45 -0
  414. data/lib/ddtrace/contrib/redis/configuration/settings.rb +35 -0
  415. data/lib/ddtrace/contrib/redis/ext.rb +22 -0
  416. data/lib/ddtrace/contrib/redis/integration.rb +42 -0
  417. data/lib/ddtrace/contrib/redis/patcher.rb +58 -53
  418. data/lib/ddtrace/contrib/redis/quantize.rb +47 -1
  419. data/lib/ddtrace/contrib/redis/tags.rb +33 -7
  420. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  421. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +158 -0
  422. data/lib/ddtrace/contrib/registerable.rb +33 -0
  423. data/lib/ddtrace/contrib/registry.rb +42 -0
  424. data/lib/ddtrace/contrib/resque/configuration/settings.rb +32 -0
  425. data/lib/ddtrace/contrib/resque/ext.rb +17 -0
  426. data/lib/ddtrace/contrib/resque/integration.rb +47 -0
  427. data/lib/ddtrace/contrib/resque/patcher.rb +16 -38
  428. data/lib/ddtrace/contrib/resque/resque_job.rb +61 -20
  429. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +31 -0
  430. data/lib/ddtrace/contrib/rest_client/ext.rb +17 -0
  431. data/lib/ddtrace/contrib/rest_client/integration.rb +38 -0
  432. data/lib/ddtrace/contrib/rest_client/patcher.rb +23 -0
  433. data/lib/ddtrace/contrib/rest_client/request_patch.rb +91 -0
  434. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +28 -0
  435. data/lib/ddtrace/contrib/rspec/example.rb +75 -0
  436. data/lib/ddtrace/contrib/rspec/ext.rb +16 -0
  437. data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
  438. data/lib/ddtrace/contrib/rspec/patcher.rb +23 -0
  439. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +28 -0
  440. data/lib/ddtrace/contrib/sequel/database.rb +9 -4
  441. data/lib/ddtrace/contrib/sequel/dataset.rb +7 -3
  442. data/lib/ddtrace/contrib/sequel/ext.rb +19 -0
  443. data/lib/ddtrace/contrib/sequel/integration.rb +38 -0
  444. data/lib/ddtrace/contrib/sequel/patcher.rb +6 -29
  445. data/lib/ddtrace/contrib/sequel/utils.rb +60 -14
  446. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +30 -0
  447. data/lib/ddtrace/contrib/shoryuken/ext.rb +21 -0
  448. data/lib/ddtrace/contrib/shoryuken/integration.rb +39 -0
  449. data/lib/ddtrace/contrib/shoryuken/patcher.rb +24 -0
  450. data/lib/ddtrace/contrib/shoryuken/tracer.rb +51 -0
  451. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +43 -0
  452. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +37 -0
  453. data/lib/ddtrace/contrib/sidekiq/ext.rb +27 -0
  454. data/lib/ddtrace/contrib/sidekiq/integration.rb +38 -0
  455. data/lib/ddtrace/contrib/sidekiq/patcher.rb +22 -14
  456. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +65 -0
  457. data/lib/ddtrace/contrib/sidekiq/tracing.rb +44 -0
  458. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +39 -0
  459. data/lib/ddtrace/contrib/sinatra/env.rb +27 -9
  460. data/lib/ddtrace/contrib/sinatra/ext.rb +27 -0
  461. data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
  462. data/lib/ddtrace/contrib/sinatra/integration.rb +38 -0
  463. data/lib/ddtrace/contrib/sinatra/patcher.rb +28 -0
  464. data/lib/ddtrace/contrib/sinatra/tracer.rb +79 -65
  465. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +60 -16
  466. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +33 -0
  467. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  468. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  469. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  470. data/lib/ddtrace/contrib/sneakers/tracer.rb +53 -0
  471. data/lib/ddtrace/contrib/status_code_matcher.rb +69 -0
  472. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +30 -0
  473. data/lib/ddtrace/contrib/sucker_punch/ext.rb +21 -0
  474. data/lib/ddtrace/contrib/sucker_punch/instrumentation.rb +29 -5
  475. data/lib/ddtrace/contrib/sucker_punch/integration.rb +38 -0
  476. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +21 -33
  477. data/lib/ddtrace/correlation.rb +39 -0
  478. data/lib/ddtrace/diagnostics/environment_logger.rb +279 -0
  479. data/lib/ddtrace/diagnostics/health.rb +33 -0
  480. data/lib/ddtrace/distributed_tracing/headers/b3.rb +44 -0
  481. data/lib/ddtrace/distributed_tracing/headers/b3_single.rb +56 -0
  482. data/lib/ddtrace/distributed_tracing/headers/datadog.rb +42 -0
  483. data/lib/ddtrace/distributed_tracing/headers/headers.rb +71 -0
  484. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +43 -0
  485. data/lib/ddtrace/encoding.rb +36 -32
  486. data/lib/ddtrace/environment.rb +41 -0
  487. data/lib/ddtrace/event.rb +52 -0
  488. data/lib/ddtrace/ext/analytics.rb +12 -0
  489. data/lib/ddtrace/ext/app_types.rb +1 -0
  490. data/lib/ddtrace/ext/ci.rb +297 -0
  491. data/lib/ddtrace/ext/correlation.rb +11 -0
  492. data/lib/ddtrace/ext/diagnostics.rb +36 -0
  493. data/lib/ddtrace/ext/distributed.rb +22 -0
  494. data/lib/ddtrace/ext/environment.rb +16 -0
  495. data/lib/ddtrace/ext/forced_tracing.rb +25 -0
  496. data/lib/ddtrace/ext/git.rb +11 -0
  497. data/lib/ddtrace/ext/http.rb +4 -2
  498. data/lib/ddtrace/ext/integration.rb +8 -0
  499. data/lib/ddtrace/ext/manual_tracing.rb +9 -0
  500. data/lib/ddtrace/ext/metrics.rb +15 -0
  501. data/lib/ddtrace/ext/net.rb +2 -0
  502. data/lib/ddtrace/ext/runtime.rb +30 -0
  503. data/lib/ddtrace/ext/sampling.rb +16 -0
  504. data/lib/ddtrace/ext/test.rb +24 -0
  505. data/lib/ddtrace/ext/transport.rb +18 -0
  506. data/lib/ddtrace/forced_tracing.rb +38 -0
  507. data/lib/ddtrace/logger.rb +5 -4
  508. data/lib/ddtrace/metrics.rb +226 -0
  509. data/lib/ddtrace/opentelemetry/extensions.rb +13 -0
  510. data/lib/ddtrace/opentelemetry/span.rb +33 -0
  511. data/lib/ddtrace/opentracer.rb +40 -0
  512. data/lib/ddtrace/opentracer/binary_propagator.rb +24 -0
  513. data/lib/ddtrace/opentracer/carrier.rb +6 -0
  514. data/lib/ddtrace/opentracer/distributed_headers.rb +55 -0
  515. data/lib/ddtrace/opentracer/global_tracer.rb +15 -0
  516. data/lib/ddtrace/opentracer/propagator.rb +22 -0
  517. data/lib/ddtrace/opentracer/rack_propagator.rb +60 -0
  518. data/lib/ddtrace/opentracer/scope.rb +15 -0
  519. data/lib/ddtrace/opentracer/scope_manager.rb +6 -0
  520. data/lib/ddtrace/opentracer/span.rb +94 -0
  521. data/lib/ddtrace/opentracer/span_context.rb +14 -0
  522. data/lib/ddtrace/opentracer/span_context_factory.rb +23 -0
  523. data/lib/ddtrace/opentracer/text_map_propagator.rb +75 -0
  524. data/lib/ddtrace/opentracer/thread_local_scope.rb +31 -0
  525. data/lib/ddtrace/opentracer/thread_local_scope_manager.rb +40 -0
  526. data/lib/ddtrace/opentracer/tracer.rb +208 -0
  527. data/lib/ddtrace/patcher.rb +33 -5
  528. data/lib/ddtrace/pin.rb +35 -20
  529. data/lib/ddtrace/pipeline.rb +1 -1
  530. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  531. data/lib/ddtrace/propagation/grpc_propagator.rb +26 -6
  532. data/lib/ddtrace/propagation/http_propagator.rb +72 -10
  533. data/lib/ddtrace/quantization/http.rb +1 -0
  534. data/lib/ddtrace/runtime/cgroup.rb +44 -0
  535. data/lib/ddtrace/runtime/class_count.rb +17 -0
  536. data/lib/ddtrace/runtime/container.rb +71 -0
  537. data/lib/ddtrace/runtime/gc.rb +16 -0
  538. data/lib/ddtrace/runtime/identity.rb +48 -0
  539. data/lib/ddtrace/runtime/metrics.rb +114 -0
  540. data/lib/ddtrace/runtime/object_space.rb +19 -0
  541. data/lib/ddtrace/runtime/socket.rb +14 -0
  542. data/lib/ddtrace/runtime/thread_count.rb +16 -0
  543. data/lib/ddtrace/sampler.rb +218 -37
  544. data/lib/ddtrace/sampling.rb +2 -0
  545. data/lib/ddtrace/sampling/matcher.rb +57 -0
  546. data/lib/ddtrace/sampling/rate_limiter.rb +176 -0
  547. data/lib/ddtrace/sampling/rule.rb +61 -0
  548. data/lib/ddtrace/sampling/rule_sampler.rb +126 -0
  549. data/lib/ddtrace/span.rb +244 -34
  550. data/lib/ddtrace/sync_writer.rb +47 -16
  551. data/lib/ddtrace/tracer.rb +215 -117
  552. data/lib/ddtrace/transport/http.rb +113 -0
  553. data/lib/ddtrace/transport/http/adapters/net.rb +145 -0
  554. data/lib/ddtrace/transport/http/adapters/registry.rb +25 -0
  555. data/lib/ddtrace/transport/http/adapters/test.rb +83 -0
  556. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +66 -0
  557. data/lib/ddtrace/transport/http/api.rb +46 -0
  558. data/lib/ddtrace/transport/http/api/endpoint.rb +27 -0
  559. data/lib/ddtrace/transport/http/api/fallbacks.rb +22 -0
  560. data/lib/ddtrace/transport/http/api/instance.rb +33 -0
  561. data/lib/ddtrace/transport/http/api/map.rb +14 -0
  562. data/lib/ddtrace/transport/http/api/spec.rb +15 -0
  563. data/lib/ddtrace/transport/http/builder.rb +169 -0
  564. data/lib/ddtrace/transport/http/client.rb +50 -0
  565. data/lib/ddtrace/transport/http/env.rb +56 -0
  566. data/lib/ddtrace/transport/http/response.rb +26 -0
  567. data/lib/ddtrace/transport/http/statistics.rb +43 -0
  568. data/lib/ddtrace/transport/http/traces.rb +142 -0
  569. data/lib/ddtrace/transport/io.rb +26 -0
  570. data/lib/ddtrace/transport/io/client.rb +76 -0
  571. data/lib/ddtrace/transport/io/response.rb +23 -0
  572. data/lib/ddtrace/transport/io/traces.rb +97 -0
  573. data/lib/ddtrace/transport/parcel.rb +13 -0
  574. data/lib/ddtrace/transport/request.rb +13 -0
  575. data/lib/ddtrace/transport/response.rb +60 -0
  576. data/lib/ddtrace/transport/statistics.rb +72 -0
  577. data/lib/ddtrace/transport/traces.rb +205 -0
  578. data/lib/ddtrace/utils.rb +17 -14
  579. data/lib/ddtrace/utils/compression.rb +27 -0
  580. data/lib/ddtrace/utils/database.rb +7 -3
  581. data/lib/ddtrace/utils/forking.rb +52 -0
  582. data/lib/ddtrace/utils/object_set.rb +41 -0
  583. data/lib/ddtrace/utils/only_once.rb +40 -0
  584. data/lib/ddtrace/utils/sequence.rb +17 -0
  585. data/lib/ddtrace/utils/string_table.rb +45 -0
  586. data/lib/ddtrace/utils/time.rb +45 -0
  587. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  588. data/lib/ddtrace/vendor/active_record/connection_specification.rb +301 -0
  589. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  590. data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
  591. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
  592. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
  593. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
  594. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
  595. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
  596. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
  597. data/lib/ddtrace/version.rb +3 -1
  598. data/lib/ddtrace/worker.rb +20 -0
  599. data/lib/ddtrace/workers.rb +39 -40
  600. data/lib/ddtrace/workers/async.rb +173 -0
  601. data/lib/ddtrace/workers/loop.rb +119 -0
  602. data/lib/ddtrace/workers/polling.rb +49 -0
  603. data/lib/ddtrace/workers/queue.rb +40 -0
  604. data/lib/ddtrace/workers/runtime_metrics.rb +51 -0
  605. data/lib/ddtrace/workers/trace_writer.rb +202 -0
  606. data/lib/ddtrace/writer.rb +121 -57
  607. data/tasks/release_gem.rake +28 -0
  608. metadata +501 -211
  609. data/lib/ddtrace/configurable.rb +0 -83
  610. data/lib/ddtrace/configuration/proxy.rb +0 -25
  611. data/lib/ddtrace/contrib/base.rb +0 -15
  612. data/lib/ddtrace/contrib/mysql2/client.rb +0 -60
  613. data/lib/ddtrace/contrib/rails/action_controller.rb +0 -91
  614. data/lib/ddtrace/contrib/rails/action_controller_patch.rb +0 -77
  615. data/lib/ddtrace/contrib/rails/action_view.rb +0 -19
  616. data/lib/ddtrace/contrib/rails/active_support.rb +0 -65
  617. data/lib/ddtrace/contrib/rails/core_extensions.rb +0 -356
  618. data/lib/ddtrace/contrib/sidekiq/tracer.rb +0 -72
  619. data/lib/ddtrace/ext/cache.rb +0 -8
  620. data/lib/ddtrace/ext/grpc.rb +0 -7
  621. data/lib/ddtrace/ext/mongo.rb +0 -12
  622. data/lib/ddtrace/ext/redis.rb +0 -17
  623. data/lib/ddtrace/monkey.rb +0 -65
  624. data/lib/ddtrace/propagation/distributed_headers.rb +0 -48
  625. data/lib/ddtrace/provider.rb +0 -21
  626. data/lib/ddtrace/registry.rb +0 -42
  627. data/lib/ddtrace/registry/registerable.rb +0 -20
  628. data/lib/ddtrace/transport.rb +0 -212
@@ -1,36 +1,67 @@
1
+ require 'ddtrace/ext/net'
2
+ require 'ddtrace/runtime/socket'
3
+ require 'ddtrace/runtime/metrics'
4
+ require 'ddtrace/utils/only_once'
5
+
1
6
  module Datadog
2
7
  # SyncWriter flushes both services and traces synchronously
8
+ # DEV: To be replaced by Datadog::Workers::TraceWriter.
9
+ #
10
+ # Note: If you're wondering if this class is used at all, since there are no other references to it on the codebase,
11
+ # the separate `datadog-lambda` uses it as of February 2021:
12
+ # <https://github.com/DataDog/datadog-lambda-rb/blob/c15f0f0916c90123416dc44e7d6800ef4a7cfdbf/lib/datadog/lambda.rb#L38>
3
13
  class SyncWriter
4
- attr_reader :transport
14
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
15
+
16
+ attr_reader \
17
+ :priority_sampler,
18
+ :transport
5
19
 
6
20
  def initialize(options = {})
7
21
  @transport = options.fetch(:transport) do
8
- HTTPTransport.new(Writer::HOSTNAME, Writer::PORT)
22
+ transport_options = options.fetch(:transport_options, {})
23
+ Transport::HTTP.default(transport_options)
9
24
  end
10
- end
11
25
 
12
- def write(trace, services)
13
- perform_concurrently(
14
- proc { flush_services(services) },
15
- proc { flush_trace(trace) }
16
- )
17
- rescue => e
18
- Tracer.log.debug(e)
26
+ @priority_sampler = options.fetch(:priority_sampler, nil)
19
27
  end
20
28
 
21
- private
29
+ def write(trace, services = nil)
30
+ unless services.nil?
31
+ DEPRECATION_WARN_ONLY_ONCE.run do
32
+ Datadog.logger.warn(%(
33
+ write: Writing services has been deprecated and no longer need to be provided.
34
+ write(traces, services) can be updated to write(traces)
35
+ ))
36
+ end
37
+ end
22
38
 
23
- def perform_concurrently(*tasks)
24
- tasks.map { |task| Thread.new(&task) }.each(&:join)
39
+ flush_trace(trace)
40
+ rescue => e
41
+ Datadog.logger.debug(e)
25
42
  end
26
43
 
27
- def flush_services(services)
28
- transport.send(:services, services)
44
+ # Added for interface completeness
45
+ def stop
46
+ # No cleanup to do for the SyncWriter
47
+ true
29
48
  end
30
49
 
50
+ private
51
+
31
52
  def flush_trace(trace)
32
53
  processed_traces = Pipeline.process!([trace])
33
- transport.send(:traces, processed_traces)
54
+ return if processed_traces.empty?
55
+
56
+ inject_hostname!(processed_traces.first) if Datadog.configuration.report_hostname
57
+ transport.send_traces(processed_traces)
58
+ end
59
+
60
+ def inject_hostname!(trace)
61
+ unless trace.first.nil?
62
+ hostname = Datadog::Runtime::Socket.hostname
63
+ trace.first.set_tag(Ext::NET::TAG_HOSTNAME, hostname) unless hostname.nil? || hostname.empty?
64
+ end
34
65
  end
35
66
  end
36
67
  end
@@ -1,15 +1,16 @@
1
- require 'pp'
2
- require 'thread'
3
1
  require 'logger'
4
2
  require 'pathname'
5
3
 
4
+ require 'ddtrace/environment'
6
5
  require 'ddtrace/span'
7
6
  require 'ddtrace/context'
8
- require 'ddtrace/context_flush'
9
- require 'ddtrace/provider'
10
7
  require 'ddtrace/logger'
11
8
  require 'ddtrace/writer'
9
+ require 'ddtrace/runtime/identity'
12
10
  require 'ddtrace/sampler'
11
+ require 'ddtrace/sampling'
12
+ require 'ddtrace/correlation'
13
+ require 'ddtrace/utils/only_once'
13
14
 
14
15
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
15
16
  module Datadog
@@ -19,45 +20,22 @@ module Datadog
19
20
  # of these function calls and sub-requests would be encapsulated within a single trace.
20
21
  # rubocop:disable Metrics/ClassLength
21
22
  class Tracer
22
- attr_reader :sampler, :services, :tags, :provider
23
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
24
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
25
+
26
+ attr_reader :sampler, :tags, :provider, :context_flush
23
27
  attr_accessor :enabled, :writer
24
28
  attr_writer :default_service
25
29
 
26
30
  ALLOWED_SPAN_OPTIONS = [:service, :resource, :span_type].freeze
31
+ DEFAULT_ON_ERROR = proc { |span, error| span.set_error(error) unless span.nil? }
27
32
 
28
- # Global, memoized, lazy initialized instance of a logger that is used within the the Datadog
29
- # namespace. This logger outputs to +STDOUT+ by default, and is considered thread-safe.
30
- def self.log
31
- unless defined? @logger
32
- @logger = Datadog::Logger.new(STDOUT)
33
- @logger.level = Logger::WARN
33
+ def services
34
+ SERVICES_DEPRECATION_WARN_ONLY_ONCE.run do
35
+ Datadog.logger.warn('services: Usage of Tracer.services has been deprecated')
34
36
  end
35
- @logger
36
- end
37
37
 
38
- # Override the default logger with a custom one.
39
- def self.log=(logger)
40
- return unless logger
41
- return unless logger.respond_to? :methods
42
- return unless logger.respond_to? :error
43
- if logger.respond_to? :methods
44
- unimplemented = Logger.new(STDOUT).methods - logger.methods
45
- unless unimplemented.empty?
46
- logger.error("logger #{logger} does not implement #{unimplemented}")
47
- return
48
- end
49
- end
50
- @logger = logger
51
- end
52
-
53
- # Activate the debug mode providing more information related to tracer usage
54
- def self.debug_logging=(value)
55
- log.level = value ? Logger::DEBUG : Logger::WARN
56
- end
57
-
58
- # Return if the debug mode is activated or not
59
- def self.debug_logging
60
- log.level == Logger::DEBUG
38
+ {}
61
39
  end
62
40
 
63
41
  # Shorthand that calls the `shutdown!` method of a registered worker.
@@ -73,8 +51,9 @@ module Datadog
73
51
  # tracer.shutdown!
74
52
  #
75
53
  def shutdown!
76
- return if !@enabled || @writer.worker.nil?
77
- @writer.worker.stop
54
+ return unless @enabled
55
+
56
+ @writer.stop unless @writer.nil?
78
57
  end
79
58
 
80
59
  # Return the current active \Context for this traced execution. This method is
@@ -83,8 +62,8 @@ module Datadog
83
62
  #
84
63
  # This method makes use of a \ContextProvider that is automatically set during the tracer
85
64
  # initialization, or while using a library instrumentation.
86
- def call_context
87
- @provider.context
65
+ def call_context(key = nil)
66
+ @provider.context(key)
88
67
  end
89
68
 
90
69
  # Initialize a new \Tracer used to create, sample and submit spans that measure the
@@ -93,18 +72,26 @@ module Datadog
93
72
  # * +enabled+: set if the tracer submits or not spans to the local agent. It's enabled
94
73
  # by default.
95
74
  def initialize(options = {})
75
+ # Configurable options
76
+ @context_flush = if options[:partial_flush]
77
+ Datadog::ContextFlush::Partial.new(options)
78
+ else
79
+ Datadog::ContextFlush::Finished.new
80
+ end
81
+
82
+ @default_service = options[:default_service]
96
83
  @enabled = options.fetch(:enabled, true)
97
- @writer = options.fetch(:writer, Datadog::Writer.new)
84
+ @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
98
85
  @sampler = options.fetch(:sampler, Datadog::AllSampler.new)
86
+ @tags = options.fetch(:tags, {})
87
+ @writer = options.fetch(:writer, Datadog::Writer.new)
99
88
 
100
- @provider = options.fetch(:context_provider, Datadog::DefaultContextProvider.new)
89
+ # Instance variables
90
+ @mutex = Mutex.new
101
91
  @provider ||= Datadog::DefaultContextProvider.new # @provider should never be nil
102
92
 
103
- @context_flush = options[:partial_flush] ? Datadog::ContextFlush.new(options) : nil
104
-
105
- @mutex = Mutex.new
106
- @services = {}
107
- @tags = {}
93
+ # Enable priority sampling by default
94
+ activate_priority_sampling!(@sampler)
108
95
  end
109
96
 
110
97
  # Updates the current \Tracer instance, so that the tracer can be configured after the
@@ -113,6 +100,7 @@ module Datadog
113
100
  # * +enabled+: set if the tracer submits or not spans to the trace agent
114
101
  # * +hostname+: change the location of the trace agent
115
102
  # * +port+: change the port of the trace agent
103
+ # * +partial_flush+: enable partial trace flushing
116
104
  #
117
105
  # For instance, if the trace agent runs in a different location, just:
118
106
  #
@@ -120,43 +108,36 @@ module Datadog
120
108
  #
121
109
  def configure(options = {})
122
110
  enabled = options.fetch(:enabled, nil)
123
- hostname = options.fetch(:hostname, nil)
124
- port = options.fetch(:port, nil)
125
111
 
126
112
  # Those are rare "power-user" options.
127
113
  sampler = options.fetch(:sampler, nil)
128
- priority_sampling = options[:priority_sampling]
129
- max_spans_before_partial_flush = options.fetch(:max_spans_before_partial_flush, nil)
130
- min_spans_before_partial_flush = options.fetch(:min_spans_before_partial_flush, nil)
131
- partial_flush_timeout = options.fetch(:partial_flush_timeout, nil)
132
114
 
133
115
  @enabled = enabled unless enabled.nil?
134
116
  @sampler = sampler unless sampler.nil?
135
117
 
136
- if priority_sampling
137
- @sampler = PrioritySampler.new(base_sampler: @sampler)
138
- @writer = Writer.new(priority_sampler: @sampler)
139
- end
140
-
141
- @writer.transport.hostname = hostname unless hostname.nil?
142
- @writer.transport.port = port unless port.nil?
118
+ configure_writer(options)
143
119
 
144
- @context_flush = Datadog::ContextFlush.new(options) unless min_spans_before_partial_flush.nil? &&
145
- max_spans_before_partial_flush.nil? &&
146
- partial_flush_timeout.nil?
120
+ if options.key?(:partial_flush)
121
+ @context_flush = if options[:partial_flush]
122
+ Datadog::ContextFlush::Partial.new(options)
123
+ else
124
+ Datadog::ContextFlush::Finished.new
125
+ end
126
+ end
147
127
  end
148
128
 
149
129
  # Set the information about the given service. A valid example is:
150
130
  #
151
131
  # tracer.set_service_info('web-application', 'rails', 'web')
132
+ #
133
+ # set_service_info is deprecated, no service information needs to be tracked
152
134
  def set_service_info(service, app, app_type)
153
- @services[service] = {
154
- 'app' => app,
155
- 'app_type' => app_type
156
- }
157
-
158
- return unless Datadog::Tracer.debug_logging
159
- Datadog::Tracer.log.debug("set_service_info: service: #{service} app: #{app} type: #{app_type}")
135
+ SET_SERVICE_INFO_DEPRECATION_WARN_ONLY_ONCE.run do
136
+ Datadog.logger.warn(%(
137
+ set_service_info: Usage of set_service_info has been deprecated,
138
+ service information no longer needs to be reported to the trace agent.
139
+ ))
140
+ end
160
141
  end
161
142
 
162
143
  # A default value for service. One should really override this one
@@ -164,10 +145,11 @@ module Datadog
164
145
  # a service would be invalid and rejected.
165
146
  def default_service
166
147
  return @default_service if instance_variable_defined?(:@default_service) && @default_service
148
+
167
149
  begin
168
150
  @default_service = File.basename($PROGRAM_NAME, '.*')
169
151
  rescue StandardError => e
170
- Datadog::Tracer.log.error("unable to guess default service: #{e}")
152
+ Datadog.logger.error("unable to guess default service: #{e}")
171
153
  @default_service = 'ruby'.freeze
172
154
  end
173
155
  @default_service
@@ -179,7 +161,8 @@ module Datadog
179
161
  #
180
162
  # tracer.set_tags('env' => 'prod', 'component' => 'core')
181
163
  def set_tags(tags)
182
- @tags.update(tags)
164
+ string_tags = Hash[tags.collect { |k, v| [k.to_s, v] }]
165
+ @tags = @tags.merge(string_tags)
183
166
  end
184
167
 
185
168
  # Guess context and parent from child_of entry.
@@ -205,35 +188,36 @@ module Datadog
205
188
  # * +start_time+: when the span actually starts (defaults to \now)
206
189
  # * +tags+: extra tags which should be added to the span.
207
190
  def start_span(name, options = {})
208
- start_time = options.fetch(:start_time, Time.now.utc)
209
-
191
+ start_time = options[:start_time]
210
192
  tags = options.fetch(:tags, {})
211
193
 
212
- opts = options.select do |k, _v|
194
+ span_options = options.select do |k, _v|
213
195
  # Filter options, we want no side effects with unexpected args.
214
- # Plus, this documents the code (Ruby 2 named args would be better but we're Ruby 1.9 compatible)
215
196
  ALLOWED_SPAN_OPTIONS.include?(k)
216
197
  end
217
198
 
218
199
  ctx, parent = guess_context_and_parent(options[:child_of])
219
- opts[:context] = ctx unless ctx.nil?
200
+ span_options[:context] = ctx unless ctx.nil?
220
201
 
221
- span = Span.new(self, name, opts)
202
+ span = Span.new(self, name, span_options)
222
203
  if parent.nil?
223
204
  # root span
224
- @sampler.sample(span)
205
+ @sampler.sample!(span)
225
206
  span.set_tag('system.pid', Process.pid)
226
- if ctx && ctx.trace_id && ctx.span_id
207
+ span.set_tag(Datadog::Ext::Runtime::TAG_ID, Datadog::Runtime::Identity.id)
208
+
209
+ if ctx && ctx.trace_id
227
210
  span.trace_id = ctx.trace_id
228
- span.parent_id = ctx.span_id
211
+ span.parent_id = ctx.span_id unless ctx.span_id.nil?
229
212
  end
230
213
  else
231
214
  # child span
232
215
  span.parent = parent # sets service, trace_id, parent_id, sampled
233
216
  end
234
- tags.each { |k, v| span.set_tag(k, v) } unless tags.empty?
235
- @tags.each { |k, v| span.set_tag(k, v) } unless @tags.empty?
236
- span.start_time = start_time
217
+
218
+ span.set_tags(@tags) unless @tags.empty?
219
+ span.set_tags(tags) unless tags.empty?
220
+ span.start(start_time)
237
221
 
238
222
  # this could at some point be optional (start_active_span vs start_manual_span)
239
223
  ctx.add_span(span) unless ctx.nil?
@@ -274,31 +258,60 @@ module Datadog
274
258
  # * +service+: the service name for this span
275
259
  # * +resource+: the resource this span refers, or \name if it's missing
276
260
  # * +span_type+: the type of the span (such as \http, \db and so on)
261
+ # * +child_of+: a \Span or a \Context instance representing the parent for this span.
262
+ # If not set, defaults to Tracer.call_context
277
263
  # * +tags+: extra tags which should be added to the span.
278
264
  def trace(name, options = {})
279
- options[:child_of] = call_context
280
- span = start_span(name, options)
265
+ options[:child_of] ||= call_context
281
266
 
282
267
  # call the finish only if a block is given; this ensures
283
268
  # that a call to tracer.trace() without a block, returns
284
269
  # a span that should be manually finished.
285
270
  if block_given?
271
+ span = nil
272
+ return_value = nil
273
+
286
274
  begin
287
- yield(span)
275
+ begin
276
+ span = start_span(name, options)
277
+ rescue StandardError => e
278
+ Datadog.logger.debug("Failed to start span: #{e}")
279
+ ensure
280
+ # We should yield to the provided block when possible, as this
281
+ # block is application code that we don't want to hinder. We call:
282
+ # * `yield(span)` during normal execution.
283
+ # * `yield(nil)` if `start_span` fails with a runtime error.
284
+ # * We don't yield during a fatal error, as the application is likely trying to
285
+ # end its execution (either due to a system error or graceful shutdown).
286
+ return_value = yield(span) if span || e.is_a?(StandardError)
287
+ end
288
288
  # rubocop:disable Lint/RescueException
289
289
  # Here we really want to catch *any* exception, not only StandardError,
290
290
  # as we really have no clue of what is in the block,
291
291
  # and it is user code which should be executed no matter what.
292
292
  # It's not a problem since we re-raise it afterwards so for example a
293
293
  # SignalException::Interrupt would still bubble up.
294
+ # rubocop:disable Metrics/BlockNesting
294
295
  rescue Exception => e
295
- span.set_error(e)
296
+ if (on_error_handler = options[:on_error]) && on_error_handler.respond_to?(:call)
297
+ begin
298
+ on_error_handler.call(span, e)
299
+ rescue
300
+ Datadog.logger.debug('Custom on_error handler failed, falling back to default')
301
+ DEFAULT_ON_ERROR.call(span, e)
302
+ end
303
+ else
304
+ Datadog.logger.debug('Custom on_error handler must be a callable, falling back to default') if on_error_handler
305
+ DEFAULT_ON_ERROR.call(span, e)
306
+ end
296
307
  raise e
297
308
  ensure
298
- span.finish()
309
+ span.finish unless span.nil?
299
310
  end
311
+
312
+ return_value
300
313
  else
301
- span
314
+ start_span(name, options)
302
315
  end
303
316
  end
304
317
 
@@ -309,47 +322,132 @@ module Datadog
309
322
  def record(context)
310
323
  context = context.context if context.is_a?(Datadog::Span)
311
324
  return if context.nil?
312
- trace, sampled = context.get
313
-
314
- # If context flushing is configured...
315
- if @context_flush
316
- if sampled
317
- if trace.nil? || trace.empty?
318
- @context_flush.each_partial_trace(context) do |t|
319
- write(t)
320
- end
321
- else
322
- write(trace)
323
- end
324
- end
325
- # Default behavior
326
- else
327
- ready = !trace.nil? && !trace.empty? && sampled
328
- write(trace) if ready
329
- end
325
+
326
+ record_context(context)
327
+ end
328
+
329
+ # Consume trace from +context+, according to +@context_flush+
330
+ # criteria.
331
+ #
332
+ # \ContextFlush#consume! can return nil or an empty list if the
333
+ # trace is not available to flush or if the trace has not been
334
+ # chosen to be sampled.
335
+ def record_context(context)
336
+ trace = @context_flush.consume!(context)
337
+
338
+ write(trace) if @enabled && trace && !trace.empty?
330
339
  end
331
340
 
332
341
  # Return the current active span or +nil+.
333
- def active_span
334
- call_context.current_span
342
+ def active_span(key = nil)
343
+ call_context(key).current_span
344
+ end
345
+
346
+ # Return the current active root span or +nil+.
347
+ def active_root_span(key = nil)
348
+ call_context(key).current_root_span
349
+ end
350
+
351
+ # Return a CorrelationIdentifier for active span
352
+ def active_correlation(key = nil)
353
+ Datadog::Correlation.identifier_from_context(call_context(key))
335
354
  end
336
355
 
337
356
  # Send the trace to the writer to enqueue the spans list in the agent
338
357
  # sending queue.
339
358
  def write(trace)
340
- return if @writer.nil? || !@enabled
359
+ return if @writer.nil?
341
360
 
342
- if Datadog::Tracer.debug_logging
343
- Datadog::Tracer.log.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
361
+ if Datadog.configuration.diagnostics.debug
362
+ Datadog.logger.debug("Writing #{trace.length} spans (enabled: #{@enabled})")
344
363
  str = String.new('')
345
364
  PP.pp(trace, str)
346
- Datadog::Tracer.log.debug(str)
365
+ Datadog.logger.debug(str)
366
+ end
367
+
368
+ @writer.write(trace)
369
+ end
370
+
371
+ # TODO: Move this kind of configuration building out of the tracer.
372
+ # Tracer should not have this kind of knowledge of writer.
373
+ # rubocop:disable Metrics/PerceivedComplexity
374
+ # rubocop:disable Metrics/CyclomaticComplexity
375
+ # rubocop:disable Metrics/MethodLength
376
+ def configure_writer(options = {})
377
+ hostname = options.fetch(:hostname, nil)
378
+ port = options.fetch(:port, nil)
379
+ sampler = options.fetch(:sampler, nil)
380
+ priority_sampling = options.fetch(:priority_sampling, nil)
381
+ writer = options.fetch(:writer, nil)
382
+ transport_options = options.fetch(:transport_options, {}).dup
383
+
384
+ # Compile writer options
385
+ writer_options = options.fetch(:writer_options, {}).dup
386
+ rebuild_writer = !writer_options.empty?
387
+
388
+ # Re-build the sampler and writer if priority sampling is enabled,
389
+ # but neither are configured. Verify the sampler isn't already a
390
+ # priority sampler too, so we don't wrap one with another.
391
+ if options.key?(:writer)
392
+ if writer.priority_sampler.nil?
393
+ deactivate_priority_sampling!(sampler)
394
+ else
395
+ activate_priority_sampling!(writer.priority_sampler)
396
+ end
397
+ elsif priority_sampling != false && !@sampler.is_a?(PrioritySampler)
398
+ writer_options[:priority_sampler] = activate_priority_sampling!(@sampler)
399
+ rebuild_writer = true
400
+ elsif priority_sampling == false
401
+ deactivate_priority_sampling!(sampler)
402
+ rebuild_writer = true
403
+ elsif @sampler.is_a?(PrioritySampler)
404
+ # Make sure to add sampler to options if transport is rebuilt.
405
+ writer_options[:priority_sampler] = @sampler
406
+ end
407
+
408
+ # Apply options to transport
409
+ if transport_options.is_a?(Proc)
410
+ transport_options = { on_build: transport_options }
411
+ rebuild_writer = true
347
412
  end
348
413
 
349
- @writer.write(trace, @services)
350
- @services = {}
414
+ if hostname || port
415
+ transport_options[:hostname] = hostname unless hostname.nil?
416
+ transport_options[:port] = port unless port.nil?
417
+ rebuild_writer = true
418
+ end
419
+
420
+ writer_options[:transport_options] = transport_options
421
+
422
+ if rebuild_writer || writer
423
+ # Make sure old writer is shut down before throwing away.
424
+ # Don't want additional threads running...
425
+ @writer.stop unless writer.nil?
426
+ @writer = writer || Writer.new(writer_options)
427
+ end
428
+ end
429
+
430
+ def activate_priority_sampling!(base_sampler = nil)
431
+ @sampler = if base_sampler.is_a?(PrioritySampler)
432
+ base_sampler
433
+ else
434
+ PrioritySampler.new(
435
+ base_sampler: base_sampler,
436
+ post_sampler: Sampling::RuleSampler.new
437
+ )
438
+ end
439
+ end
440
+
441
+ def deactivate_priority_sampling!(base_sampler = nil)
442
+ @sampler = base_sampler || Datadog::AllSampler.new if @sampler.is_a?(PrioritySampler)
351
443
  end
352
444
 
353
- private :write, :guess_context_and_parent
445
+ private \
446
+ :activate_priority_sampling!,
447
+ :configure_writer,
448
+ :deactivate_priority_sampling!,
449
+ :guess_context_and_parent,
450
+ :record_context,
451
+ :write
354
452
  end
355
453
  end