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
@@ -0,0 +1,19 @@
1
+ require 'objspace'
2
+
3
+ module Datadog
4
+ module Runtime
5
+ # Retrieves garbage collection statistics
6
+ module ObjectSpace
7
+ module_function
8
+
9
+ def estimate_bytesize(object)
10
+ return 0 unless ::ObjectSpace.respond_to?(:memsize_of)
11
+
12
+ # Rough calculation of bytesize; not very accurate.
13
+ object.instance_variables.inject(::ObjectSpace.memsize_of(object)) do |sum, var|
14
+ sum + ::ObjectSpace.memsize_of(object.instance_variable_get(var))
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,14 @@
1
+ require 'socket'
2
+
3
+ module Datadog
4
+ module Runtime
5
+ # For runtime identity
6
+ module Socket
7
+ module_function
8
+
9
+ def hostname
10
+ ::Socket.gethostname
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Runtime
3
+ # Retrieves number of threads from runtime
4
+ module ThreadCount
5
+ module_function
6
+
7
+ def value
8
+ Thread.list.count
9
+ end
10
+
11
+ def available?
12
+ Thread.respond_to?(:list)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,28 +1,43 @@
1
1
  require 'forwardable'
2
2
 
3
3
  require 'ddtrace/ext/priority'
4
+ require 'ddtrace/diagnostics/health'
4
5
 
5
6
  module Datadog
6
7
  # \Sampler performs client-side trace sampling.
7
8
  class Sampler
8
- def sample(_span)
9
- raise NotImplementedError, 'samplers have to implement the sample() method'
9
+ def sample?(_span)
10
+ raise NotImplementedError, 'Samplers must implement the #sample? method'
11
+ end
12
+
13
+ def sample!(_span)
14
+ raise NotImplementedError, 'Samplers must implement the #sample! method'
15
+ end
16
+
17
+ def sample_rate(span)
18
+ raise NotImplementedError, 'Samplers must implement the #sample_rate method'
10
19
  end
11
20
  end
12
21
 
13
22
  # \AllSampler samples all the traces.
14
23
  class AllSampler < Sampler
15
- def sample(span)
24
+ def sample?(span)
25
+ true
26
+ end
27
+
28
+ def sample!(span)
16
29
  span.sampled = true
17
30
  end
31
+
32
+ def sample_rate(*_)
33
+ 1.0
34
+ end
18
35
  end
19
36
 
20
37
  # \RateSampler is based on a sample rate.
21
38
  class RateSampler < Sampler
22
39
  KNUTH_FACTOR = 1111111111111111111
23
- SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze()
24
-
25
- attr_reader :sample_rate
40
+ SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
26
41
 
27
42
  # Initialize a \RateSampler.
28
43
  # This sampler keeps a random subset of the traces. Its main purpose is to
@@ -33,58 +48,144 @@ module Datadog
33
48
  # sampled.
34
49
  def initialize(sample_rate = 1.0)
35
50
  unless sample_rate > 0.0 && sample_rate <= 1.0
36
- Datadog::Tracer.log.error('sample rate is not between 0 and 1, disabling the sampler')
51
+ Datadog.logger.error('sample rate is not between 0 and 1, disabling the sampler')
37
52
  sample_rate = 1.0
38
53
  end
39
54
 
40
55
  self.sample_rate = sample_rate
41
56
  end
42
57
 
58
+ def sample_rate(*_)
59
+ @sample_rate
60
+ end
61
+
43
62
  def sample_rate=(sample_rate)
44
63
  @sample_rate = sample_rate
45
- @sampling_id_threshold = sample_rate * Span::MAX_ID
64
+ @sampling_id_threshold = sample_rate * Span::EXTERNAL_MAX_ID
46
65
  end
47
66
 
48
- def sample(span)
49
- span.set_metric(SAMPLE_RATE_METRIC_KEY, @sample_rate)
50
- span.sampled = ((span.trace_id * KNUTH_FACTOR) % Datadog::Span::MAX_ID) <= @sampling_id_threshold
67
+ def sample?(span)
68
+ ((span.trace_id * KNUTH_FACTOR) % Datadog::Span::EXTERNAL_MAX_ID) <= @sampling_id_threshold
69
+ end
70
+
71
+ def sample!(span)
72
+ (span.sampled = sample?(span)).tap do |sampled|
73
+ span.set_metric(SAMPLE_RATE_METRIC_KEY, @sample_rate) if sampled
74
+ end
51
75
  end
52
76
  end
53
77
 
54
- # \RateByServiceSampler samples different services at different rates
55
- class RateByServiceSampler < Sampler
56
- DEFAULT_KEY = 'service:,env:'.freeze
78
+ # Samples at different rates by key.
79
+ class RateByKeySampler < Sampler
80
+ attr_reader \
81
+ :default_key
82
+
83
+ def initialize(default_key, default_rate = 1.0, &block)
84
+ raise ArgumentError, 'No resolver given!' unless block
57
85
 
58
- def initialize(rate = 1.0, opts = {})
59
- @env = opts.fetch(:env, Datadog.tracer.tags[:env])
86
+ @default_key = default_key
87
+ @resolver = block
60
88
  @mutex = Mutex.new
61
- @fallback = RateSampler.new(rate)
62
- @sampler = { DEFAULT_KEY => @fallback }
89
+ @samplers = {}
90
+
91
+ set_rate(default_key, default_rate)
92
+ end
93
+
94
+ def resolve(span)
95
+ @resolver.call(span)
96
+ end
97
+
98
+ def default_sampler
99
+ @samplers[default_key]
63
100
  end
64
101
 
65
- def sample(span)
66
- key = key_for(span)
102
+ def sample?(span)
103
+ key = resolve(span)
67
104
 
68
105
  @mutex.synchronize do
69
- @sampler.fetch(key, @fallback).sample(span)
106
+ @samplers.fetch(key, default_sampler).sample?(span)
70
107
  end
71
108
  end
72
109
 
73
- def update(rate_by_service)
110
+ def sample!(span)
111
+ key = resolve(span)
112
+
74
113
  @mutex.synchronize do
75
- @sampler.delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
114
+ @samplers.fetch(key, default_sampler).sample!(span)
115
+ end
116
+ end
76
117
 
77
- rate_by_service.each do |key, rate|
78
- @sampler[key] ||= RateSampler.new(rate)
79
- @sampler[key].sample_rate = rate
80
- end
118
+ def sample_rate(span)
119
+ key = resolve(span)
120
+
121
+ @mutex.synchronize do
122
+ @samplers.fetch(key, default_sampler).sample_rate
123
+ end
124
+ end
125
+
126
+ def update(key, rate)
127
+ @mutex.synchronize do
128
+ set_rate(key, rate)
129
+ end
130
+ end
131
+
132
+ def update_all(rate_by_key)
133
+ @mutex.synchronize do
134
+ rate_by_key.each { |key, rate| set_rate(key, rate) }
135
+ end
136
+ end
137
+
138
+ def delete(key)
139
+ @mutex.synchronize do
140
+ @samplers.delete(key)
141
+ end
142
+ end
143
+
144
+ def delete_if(&block)
145
+ @mutex.synchronize do
146
+ @samplers.delete_if(&block)
81
147
  end
82
148
  end
83
149
 
150
+ def length
151
+ @samplers.length
152
+ end
153
+
154
+ private
155
+
156
+ def set_rate(key, rate)
157
+ @samplers[key] ||= RateSampler.new(rate)
158
+ @samplers[key].sample_rate = rate
159
+ end
160
+ end
161
+
162
+ # \RateByServiceSampler samples different services at different rates
163
+ class RateByServiceSampler < RateByKeySampler
164
+ DEFAULT_KEY = 'service:,env:'.freeze
165
+
166
+ def initialize(default_rate = 1.0, options = {})
167
+ super(DEFAULT_KEY, default_rate, &method(:key_for))
168
+ @env = options[:env]
169
+ end
170
+
171
+ def update(rate_by_service)
172
+ # Remove any old services
173
+ delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
174
+
175
+ # Update each service rate
176
+ update_all(rate_by_service)
177
+
178
+ # Emit metric for service cache size
179
+ Datadog.health_metrics.sampling_service_cache_length(length)
180
+ end
181
+
84
182
  private
85
183
 
86
184
  def key_for(span)
87
- "service:#{span.service},env:#{@env}"
185
+ # Resolve env dynamically, if Proc is given.
186
+ env = @env.is_a?(Proc) ? @env.call : @env
187
+
188
+ "service:#{span.service},env:#{env}"
88
189
  end
89
190
  end
90
191
 
@@ -92,20 +193,100 @@ module Datadog
92
193
  class PrioritySampler
93
194
  extend Forwardable
94
195
 
196
+ attr_reader :pre_sampler, :priority_sampler
197
+
198
+ SAMPLE_RATE_METRIC_KEY = '_sample_rate'.freeze
199
+
95
200
  def initialize(opts = {})
96
- @base_sampler = opts[:base_sampler] || RateSampler.new
97
- @post_sampler = opts[:post_sampler] || RateByServiceSampler.new
201
+ @pre_sampler = opts[:base_sampler] || AllSampler.new
202
+ @priority_sampler = opts[:post_sampler] || RateByServiceSampler.new
98
203
  end
99
204
 
100
- def sample(span)
101
- span.context.sampling_priority = Datadog::Ext::Priority::AUTO_REJECT if span.context
102
- return unless @base_sampler.sample(span)
103
- return unless @post_sampler.sample(span)
104
- span.context.sampling_priority = Datadog::Ext::Priority::AUTO_KEEP if span.context
205
+ def sample?(span)
206
+ @pre_sampler.sample?(span)
207
+ end
105
208
 
106
- true
209
+ def sample!(span)
210
+ # If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
211
+ # NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
212
+ span.sampled = pre_sample?(span) ? @pre_sampler.sample!(span) : true
213
+
214
+ if span.sampled
215
+ # If priority sampling has already been applied upstream, use that, otherwise...
216
+ unless priority_assigned_upstream?(span)
217
+ # Roll the dice and determine whether how we set the priority.
218
+ priority = priority_sample!(span) ? Datadog::Ext::Priority::AUTO_KEEP : Datadog::Ext::Priority::AUTO_REJECT
219
+
220
+ assign_priority!(span, priority)
221
+ end
222
+ else
223
+ # If discarded by pre-sampling, set "reject" priority, so other
224
+ # services for the same trace don't sample needlessly.
225
+ assign_priority!(span, Datadog::Ext::Priority::AUTO_REJECT)
226
+ end
227
+
228
+ span.sampled
229
+ end
230
+
231
+ def_delegators :@priority_sampler, :update
232
+
233
+ private
234
+
235
+ def pre_sample?(span)
236
+ case @pre_sampler
237
+ when RateSampler
238
+ @pre_sampler.sample_rate < 1.0
239
+ when RateByServiceSampler
240
+ @pre_sampler.sample_rate(span) < 1.0
241
+ else
242
+ true
243
+ end
244
+ end
245
+
246
+ def priority_assigned_upstream?(span)
247
+ span.context && !span.context.sampling_priority.nil?
248
+ end
249
+
250
+ def priority_sample!(span)
251
+ preserving_sampling(span) do
252
+ @priority_sampler.sample!(span)
253
+ end
107
254
  end
108
255
 
109
- def_delegators :@post_sampler, :update
256
+ # Ensures the span is always propagated to the writer and that
257
+ # the sample rate metric represents the true client-side sampling.
258
+ def preserving_sampling(span)
259
+ pre_sample_rate_metric = span.get_metric(SAMPLE_RATE_METRIC_KEY)
260
+
261
+ yield.tap do
262
+ # NOTE: We'll want to leave `span.sampled = true` here; all spans for priority sampling must
263
+ # be sent to the agent. Otherwise metrics for traces will not be accurate, since the
264
+ # agent will have an incomplete dataset.
265
+ #
266
+ # We also ensure that the agent knows we that our `post_sampler` is not performing true sampling,
267
+ # to avoid erroneous metric upscaling.
268
+ span.sampled = true
269
+ if pre_sample_rate_metric
270
+ # Restore true sampling metric, as only the @pre_sampler can reject traces
271
+ span.set_metric(SAMPLE_RATE_METRIC_KEY, pre_sample_rate_metric)
272
+ else
273
+ # If @pre_sampler is not enable, sending this metric would be misleading
274
+ span.clear_metric(SAMPLE_RATE_METRIC_KEY)
275
+ end
276
+ end
277
+ end
278
+
279
+ def assign_priority!(span, priority)
280
+ if span.context
281
+ span.context.sampling_priority = priority
282
+ else
283
+ # Set the priority directly on the span instead, since otherwise
284
+ # it won't receive the appropriate tag.
285
+ span.set_metric(
286
+ Ext::DistributedTracing::SAMPLING_PRIORITY_KEY,
287
+ priority
288
+ )
289
+ end
290
+ end
110
291
  end
111
292
  end
@@ -0,0 +1,2 @@
1
+ require 'ddtrace/sampling/rule'
2
+ require 'ddtrace/sampling/rule_sampler'
@@ -0,0 +1,57 @@
1
+ module Datadog
2
+ module Sampling
3
+ # Checks if a span conforms to a matching criteria.
4
+ class Matcher
5
+ # Returns `true` if the span should conforms to this rule, `false` otherwise
6
+ #
7
+ # @abstract
8
+ # @param [Span] span
9
+ # @return [Boolean]
10
+ def match?(span)
11
+ raise NotImplementedError
12
+ end
13
+ end
14
+
15
+ # A \Matcher that supports matching a span by
16
+ # operation name and/or service name.
17
+ class SimpleMatcher < Matcher
18
+ # Returns `true` for case equality (===) with any object
19
+ MATCH_ALL = Class.new do
20
+ # DEV: A class that implements `#===` is ~20% faster than
21
+ # DEV: a `Proc` that always returns `true`.
22
+ def ===(other)
23
+ true
24
+ end
25
+ end.new
26
+
27
+ attr_reader :name, :service
28
+
29
+ # @param name [String,Regexp,Proc] Matcher for case equality (===) with the span name, defaults to always match
30
+ # @param service [String,Regexp,Proc] Matcher for case equality (===) with the service name, defaults to always match
31
+ def initialize(name: MATCH_ALL, service: MATCH_ALL)
32
+ @name = name
33
+ @service = service
34
+ end
35
+
36
+ def match?(span)
37
+ name === span.name && service === span.service
38
+ end
39
+ end
40
+
41
+ # A \Matcher that allows for arbitrary span matching
42
+ # based on the return value of a provided block.
43
+ class ProcMatcher < Matcher
44
+ attr_reader :block
45
+
46
+ # @yield [name, service] Provides span name and service to the block
47
+ # @yieldreturn [Boolean] Whether the span conforms to this matcher
48
+ def initialize(&block)
49
+ @block = block
50
+ end
51
+
52
+ def match?(span)
53
+ block.call(span.name, span.service)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,176 @@
1
+ require 'ddtrace/utils/time'
2
+
3
+ module Datadog
4
+ module Sampling
5
+ # Checks for rate limiting on a resource.
6
+ class RateLimiter
7
+ # Checks if resource of specified size can be
8
+ # conforms with the current limit.
9
+ #
10
+ # Implementations of this method are not guaranteed
11
+ # to be side-effect free.
12
+ #
13
+ # @return [Boolean] whether a resource conforms with the current limit
14
+ def allow?(size); end
15
+
16
+ # The effective rate limiting ratio based on
17
+ # recent calls to `allow?`.
18
+ #
19
+ # @return [Float] recent allowance ratio
20
+ def effective_rate; end
21
+ end
22
+
23
+ # Implementation of the Token Bucket metering algorithm
24
+ # for rate limiting.
25
+ #
26
+ # @see https://en.wikipedia.org/wiki/Token_bucket Token bucket
27
+ class TokenBucket < RateLimiter
28
+ attr_reader :rate, :max_tokens
29
+
30
+ # @param rate [Numeric] Allowance rate, in units per second
31
+ # if rate is negative, always allow
32
+ # if rate is zero, never allow
33
+ # @param max_tokens [Numeric] Limit of available tokens
34
+ def initialize(rate, max_tokens = rate)
35
+ @rate = rate
36
+ @max_tokens = max_tokens
37
+
38
+ @tokens = max_tokens
39
+ @total_messages = 0
40
+ @conforming_messages = 0
41
+ @prev_conforming_messages = nil
42
+ @prev_total_messages = nil
43
+ @current_window = nil
44
+
45
+ @last_refill = Utils::Time.get_time
46
+ end
47
+
48
+ # Checks if a message of provided +size+
49
+ # conforms with the current bucket limit.
50
+ #
51
+ # If it does, return +true+ and remove +size+
52
+ # tokens from the bucket.
53
+ # If it does not, return +false+ without affecting
54
+ # the tokens from the bucket.
55
+ #
56
+ # @return [Boolean] +true+ if message conforms with current bucket limit
57
+ def allow?(size)
58
+ allowed = should_allow?(size)
59
+ update_rate_counts(allowed)
60
+ allowed
61
+ end
62
+
63
+ # Ratio of 'conformance' per 'total messages' checked
64
+ # averaged for the past 2 buckets
65
+ #
66
+ # Returns +1.0+ when no messages have been checked yet.
67
+ #
68
+ # @return [Float] Conformance ratio, between +[0,1]+
69
+ def effective_rate
70
+ return 0.0 if @rate.zero?
71
+ return 1.0 if @rate < 0 || @total_messages.zero?
72
+
73
+ return current_window_rate if @prev_conforming_messages.nil? || @prev_total_messages.nil?
74
+
75
+ (@conforming_messages.to_f + @prev_conforming_messages.to_f) / (@total_messages + @prev_total_messages)
76
+ end
77
+
78
+ # Ratio of 'conformance' per 'total messages' checked
79
+ # on this bucket
80
+ #
81
+ # Returns +1.0+ when no messages have been checked yet.
82
+ #
83
+ # @return [Float] Conformance ratio, between +[0,1]+
84
+ def current_window_rate
85
+ return 1.0 if @total_messages.zero?
86
+
87
+ @conforming_messages.to_f / @total_messages
88
+ end
89
+
90
+ # @return [Numeric] number of tokens currently available
91
+ def available_tokens
92
+ @tokens
93
+ end
94
+
95
+ private
96
+
97
+ def refill_since_last_message
98
+ now = Utils::Time.get_time
99
+ elapsed = now - @last_refill
100
+
101
+ # Update the number of available tokens, but ensure we do not exceed the max
102
+ # we return the min of tokens + rate*elapsed, or max tokens
103
+ refill_tokens(@rate * elapsed)
104
+
105
+ @last_refill = now
106
+ end
107
+
108
+ def refill_tokens(size)
109
+ @tokens += size
110
+ @tokens = @max_tokens if @tokens > @max_tokens
111
+ end
112
+
113
+ def increment_total_count
114
+ @total_messages += 1
115
+ end
116
+
117
+ def increment_conforming_count
118
+ @conforming_messages += 1
119
+ end
120
+
121
+ def should_allow?(size)
122
+ # rate limit of 0 blocks everything
123
+ return false if @rate.zero?
124
+
125
+ # negative rate limit disables rate limiting
126
+ return true if @rate < 0
127
+
128
+ refill_since_last_message
129
+
130
+ # if tokens < 1 we don't allow?
131
+ return false if @tokens < size
132
+
133
+ @tokens -= size
134
+
135
+ true
136
+ end
137
+
138
+ # Sets and Updates the past two 1 second windows for which
139
+ # the rate limiter must compute it's rate over and updates
140
+ # the total count, and conforming message count if +allowed+
141
+ def update_rate_counts(allowed)
142
+ now = Utils::Time.get_time
143
+
144
+ # No tokens have been seen yet, start a new window
145
+ if @current_window.nil?
146
+ @current_window = now
147
+ # If more than 1 second has past since last window, reset
148
+ elsif now - @current_window >= 1
149
+ @prev_conforming_messages = @conforming_messages
150
+ @prev_total_messages = @total_messages
151
+ @conforming_messages = 0
152
+ @total_messages = 0
153
+ @current_window = now
154
+ end
155
+
156
+ increment_conforming_count if allowed
157
+
158
+ increment_total_count
159
+ end
160
+ end
161
+
162
+ # \RateLimiter that accepts all resources,
163
+ # with no limits.
164
+ class UnlimitedLimiter < RateLimiter
165
+ # @return [Boolean] always +true+
166
+ def allow?(_)
167
+ true
168
+ end
169
+
170
+ # @return [Float] always 100%
171
+ def effective_rate
172
+ 1.0
173
+ end
174
+ end
175
+ end
176
+ end