ddtrace 0.13.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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