ddtrace 0.42.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 (356) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +274 -137
  3. data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
  4. data/.circleci/images/primary/{Dockerfile-jruby-9.2 → Dockerfile-jruby-9.2-latest} +2 -1
  5. data/.circleci/images/primary/Dockerfile-jruby-9.2.0.0 +73 -0
  6. data/.circleci/images/primary/Dockerfile-truffleruby-21.0.0 +73 -0
  7. data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
  8. data/.github/workflows/create-next-milestone.yml +20 -0
  9. data/.rubocop.yml +250 -7
  10. data/.rubocop_todo.yml +397 -0
  11. data/.simplecov +9 -0
  12. data/Appraisals +386 -142
  13. data/CHANGELOG.md +1218 -362
  14. data/CONTRIBUTING.md +1 -1
  15. data/Gemfile +55 -3
  16. data/LICENSE-3rdparty.csv +2 -0
  17. data/README.md +1 -0
  18. data/Rakefile +216 -29
  19. data/ddtrace.gemspec +4 -36
  20. data/docker-compose.yml +105 -7
  21. data/docs/DevelopmentGuide.md +30 -2
  22. data/docs/GettingStarted.md +242 -22
  23. data/integration/README.md +68 -0
  24. data/integration/apps/rack/.dockerignore +1 -0
  25. data/integration/apps/rack/.envrc.sample +1 -0
  26. data/integration/apps/rack/.gitignore +4 -0
  27. data/integration/apps/rack/.rspec +1 -0
  28. data/integration/apps/rack/Dockerfile +25 -0
  29. data/integration/apps/rack/Dockerfile-ci +11 -0
  30. data/integration/apps/rack/Gemfile +24 -0
  31. data/integration/apps/rack/README.md +93 -0
  32. data/integration/apps/rack/app/acme.rb +80 -0
  33. data/integration/apps/rack/app/datadog.rb +17 -0
  34. data/integration/apps/rack/bin/run +22 -0
  35. data/integration/apps/rack/bin/setup +17 -0
  36. data/integration/apps/rack/bin/test +24 -0
  37. data/integration/apps/rack/config.ru +6 -0
  38. data/integration/apps/rack/config/puma.rb +14 -0
  39. data/integration/apps/rack/config/unicorn.rb +23 -0
  40. data/integration/apps/rack/docker-compose.ci.yml +62 -0
  41. data/integration/apps/rack/docker-compose.yml +78 -0
  42. data/integration/apps/rack/script/build-images +38 -0
  43. data/integration/apps/rack/script/ci +50 -0
  44. data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
  45. data/integration/apps/rack/spec/spec_helper.rb +16 -0
  46. data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
  47. data/integration/apps/rails-five/.dockerignore +1 -0
  48. data/integration/apps/rails-five/.env +3 -0
  49. data/integration/apps/rails-five/.envrc.sample +1 -0
  50. data/integration/apps/rails-five/.gitignore +30 -0
  51. data/integration/apps/rails-five/Dockerfile +25 -0
  52. data/integration/apps/rails-five/Dockerfile-ci +11 -0
  53. data/integration/apps/rails-five/Gemfile +104 -0
  54. data/integration/apps/rails-five/README.md +94 -0
  55. data/integration/apps/rails-five/Rakefile +6 -0
  56. data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
  57. data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
  58. data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
  59. data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
  60. data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
  61. data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
  62. data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
  63. data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
  64. data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
  65. data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
  66. data/integration/apps/rails-five/app/models/application_record.rb +3 -0
  67. data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
  68. data/integration/apps/rails-five/app/models/test.rb +2 -0
  69. data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
  70. data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
  71. data/integration/apps/rails-five/bin/bundle +3 -0
  72. data/integration/apps/rails-five/bin/rails +9 -0
  73. data/integration/apps/rails-five/bin/rake +9 -0
  74. data/integration/apps/rails-five/bin/run +24 -0
  75. data/integration/apps/rails-five/bin/setup +27 -0
  76. data/integration/apps/rails-five/bin/spring +17 -0
  77. data/integration/apps/rails-five/bin/test +21 -0
  78. data/integration/apps/rails-five/bin/update +28 -0
  79. data/integration/apps/rails-five/config.ru +5 -0
  80. data/integration/apps/rails-five/config/application.rb +97 -0
  81. data/integration/apps/rails-five/config/boot.rb +4 -0
  82. data/integration/apps/rails-five/config/cable.yml +10 -0
  83. data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
  84. data/integration/apps/rails-five/config/database.yml +28 -0
  85. data/integration/apps/rails-five/config/environment.rb +5 -0
  86. data/integration/apps/rails-five/config/environments/development.rb +51 -0
  87. data/integration/apps/rails-five/config/environments/production.rb +82 -0
  88. data/integration/apps/rails-five/config/environments/test.rb +43 -0
  89. data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
  90. data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
  91. data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
  92. data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
  93. data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
  94. data/integration/apps/rails-five/config/locales/en.yml +33 -0
  95. data/integration/apps/rails-five/config/puma.rb +24 -0
  96. data/integration/apps/rails-five/config/routes.rb +11 -0
  97. data/integration/apps/rails-five/config/spring.rb +6 -0
  98. data/integration/apps/rails-five/config/unicorn.rb +29 -0
  99. data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
  100. data/integration/apps/rails-five/db/schema.rb +23 -0
  101. data/integration/apps/rails-five/db/seeds.rb +7 -0
  102. data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
  103. data/integration/apps/rails-five/docker-compose.yml +100 -0
  104. data/integration/apps/rails-five/lib/tasks/.keep +0 -0
  105. data/integration/apps/rails-five/log/.keep +0 -0
  106. data/integration/apps/rails-five/public/robots.txt +1 -0
  107. data/integration/apps/rails-five/script/build-images +35 -0
  108. data/integration/apps/rails-five/script/ci +50 -0
  109. data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
  110. data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
  111. data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
  112. data/integration/apps/rails-five/storage/.keep +0 -0
  113. data/integration/apps/rails-five/tmp/.keep +0 -0
  114. data/integration/apps/rails-five/vendor/.keep +0 -0
  115. data/integration/apps/ruby/.dockerignore +1 -0
  116. data/integration/apps/ruby/.envrc.sample +1 -0
  117. data/integration/apps/ruby/.gitignore +2 -0
  118. data/integration/apps/ruby/Dockerfile +25 -0
  119. data/integration/apps/ruby/Dockerfile-ci +11 -0
  120. data/integration/apps/ruby/Gemfile +11 -0
  121. data/integration/apps/ruby/README.md +70 -0
  122. data/integration/apps/ruby/agent.yaml +3 -0
  123. data/integration/apps/ruby/app/datadog.rb +13 -0
  124. data/integration/apps/ruby/app/fibonacci.rb +58 -0
  125. data/integration/apps/ruby/bin/run +20 -0
  126. data/integration/apps/ruby/bin/setup +17 -0
  127. data/integration/apps/ruby/bin/test +21 -0
  128. data/integration/apps/ruby/docker-compose.ci.yml +51 -0
  129. data/integration/apps/ruby/docker-compose.yml +63 -0
  130. data/integration/apps/ruby/script/build-images +38 -0
  131. data/integration/apps/ruby/script/ci +50 -0
  132. data/integration/images/agent/Dockerfile +2 -0
  133. data/integration/images/agent/agent.yaml +3 -0
  134. data/integration/images/include/datadog/analyzer.rb +71 -0
  135. data/integration/images/include/datadog/demo_env.rb +101 -0
  136. data/integration/images/include/http-health-check +33 -0
  137. data/integration/images/ruby/2.0/Dockerfile +54 -0
  138. data/integration/images/ruby/2.1/Dockerfile +54 -0
  139. data/integration/images/ruby/2.2/Dockerfile +54 -0
  140. data/integration/images/ruby/2.3/Dockerfile +70 -0
  141. data/integration/images/ruby/2.4/Dockerfile +54 -0
  142. data/integration/images/ruby/2.5/Dockerfile +54 -0
  143. data/integration/images/ruby/2.6/Dockerfile +54 -0
  144. data/integration/images/ruby/2.7/Dockerfile +54 -0
  145. data/integration/images/ruby/3.0/Dockerfile +54 -0
  146. data/integration/images/wrk/Dockerfile +33 -0
  147. data/integration/images/wrk/scripts/entrypoint.sh +17 -0
  148. data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
  149. data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
  150. data/integration/script/build-images +43 -0
  151. data/lib/ddtrace.rb +10 -5
  152. data/lib/ddtrace/analytics.rb +2 -0
  153. data/lib/ddtrace/auto_instrument.rb +3 -0
  154. data/lib/ddtrace/auto_instrument_base.rb +6 -0
  155. data/lib/ddtrace/buffer.rb +4 -4
  156. data/lib/ddtrace/configuration.rb +108 -23
  157. data/lib/ddtrace/configuration/base.rb +1 -1
  158. data/lib/ddtrace/configuration/components.rb +2 -2
  159. data/lib/ddtrace/configuration/option_definition.rb +1 -3
  160. data/lib/ddtrace/configuration/options.rb +4 -7
  161. data/lib/ddtrace/configuration/settings.rb +21 -5
  162. data/lib/ddtrace/context.rb +23 -6
  163. data/lib/ddtrace/context_provider.rb +12 -2
  164. data/lib/ddtrace/contrib/action_cable/event.rb +1 -0
  165. data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
  166. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -3
  167. data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
  168. data/lib/ddtrace/contrib/action_view/event.rb +1 -5
  169. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
  170. data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
  171. data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
  172. data/lib/ddtrace/contrib/action_view/utils.rb +1 -1
  173. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +101 -18
  174. data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
  175. data/lib/ddtrace/contrib/active_record/utils.rb +68 -21
  176. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
  177. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
  178. data/lib/ddtrace/contrib/active_support/ext.rb +3 -0
  179. data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
  180. data/lib/ddtrace/contrib/active_support/notifications/event.rb +12 -1
  181. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -0
  182. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +9 -5
  183. data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
  184. data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -1
  185. data/lib/ddtrace/contrib/aws/patcher.rb +1 -1
  186. data/lib/ddtrace/contrib/aws/services.rb +3 -0
  187. data/lib/ddtrace/contrib/configurable.rb +63 -37
  188. data/lib/ddtrace/contrib/configuration/resolver.rb +70 -5
  189. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +20 -20
  190. data/lib/ddtrace/contrib/configuration/settings.rb +7 -6
  191. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +28 -0
  192. data/lib/ddtrace/contrib/cucumber/ext.rb +17 -0
  193. data/lib/ddtrace/contrib/cucumber/formatter.rb +98 -0
  194. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
  195. data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
  196. data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
  197. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -38
  198. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +1 -0
  199. data/lib/ddtrace/contrib/delayed_job/plugin.rb +2 -1
  200. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -0
  201. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
  202. data/lib/ddtrace/contrib/ethon/easy_patch.rb +11 -10
  203. data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
  204. data/lib/ddtrace/contrib/excon/middleware.rb +9 -7
  205. data/lib/ddtrace/contrib/extensions.rb +53 -3
  206. data/lib/ddtrace/contrib/faraday/middleware.rb +1 -3
  207. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -36
  208. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -0
  209. data/lib/ddtrace/contrib/grape/endpoint.rb +47 -21
  210. data/lib/ddtrace/contrib/grape/ext.rb +1 -0
  211. data/lib/ddtrace/contrib/grape/patcher.rb +0 -42
  212. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +8 -8
  213. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +1 -0
  214. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -36
  215. data/lib/ddtrace/contrib/http/circuit_breaker.rb +1 -3
  216. data/lib/ddtrace/contrib/http/instrumentation.rb +7 -7
  217. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
  218. data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
  219. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
  220. data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
  221. data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
  222. data/lib/ddtrace/contrib/httprb/instrumentation.rb +15 -21
  223. data/lib/ddtrace/contrib/httprb/patcher.rb +5 -2
  224. data/lib/ddtrace/contrib/kafka/event.rb +1 -1
  225. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -0
  226. data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -3
  227. data/lib/ddtrace/contrib/patchable.rb +18 -7
  228. data/lib/ddtrace/contrib/patcher.rb +9 -6
  229. data/lib/ddtrace/contrib/presto/patcher.rb +5 -2
  230. data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
  231. data/lib/ddtrace/contrib/qless/ext.rb +20 -0
  232. data/lib/ddtrace/contrib/qless/integration.rb +38 -0
  233. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  234. data/lib/ddtrace/contrib/qless/qless_job.rb +73 -0
  235. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +33 -0
  236. data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
  237. data/lib/ddtrace/contrib/que/ext.rb +19 -19
  238. data/lib/ddtrace/contrib/que/tracer.rb +3 -2
  239. data/lib/ddtrace/contrib/racecar/event.rb +1 -0
  240. data/lib/ddtrace/contrib/rack/configuration/settings.rb +3 -3
  241. data/lib/ddtrace/contrib/rack/integration.rb +7 -0
  242. data/lib/ddtrace/contrib/rack/middlewares.rb +6 -11
  243. data/lib/ddtrace/contrib/rack/patcher.rb +1 -3
  244. data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
  245. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  246. data/lib/ddtrace/contrib/rails/patcher.rb +11 -4
  247. data/lib/ddtrace/contrib/rails/utils.rb +4 -0
  248. data/lib/ddtrace/contrib/rake/instrumentation.rb +4 -2
  249. data/lib/ddtrace/contrib/rake/integration.rb +1 -1
  250. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +14 -5
  251. data/lib/ddtrace/contrib/redis/configuration/settings.rb +5 -0
  252. data/lib/ddtrace/contrib/redis/ext.rb +1 -0
  253. data/lib/ddtrace/contrib/redis/patcher.rb +20 -3
  254. data/lib/ddtrace/contrib/redis/quantize.rb +28 -0
  255. data/lib/ddtrace/contrib/redis/tags.rb +5 -1
  256. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  257. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +6 -7
  258. data/lib/ddtrace/contrib/registry.rb +2 -2
  259. data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -0
  260. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  261. data/lib/ddtrace/contrib/resque/resque_job.rb +3 -1
  262. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -3
  263. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +28 -0
  264. data/lib/ddtrace/contrib/rspec/example.rb +75 -0
  265. data/lib/ddtrace/contrib/rspec/ext.rb +16 -0
  266. data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
  267. data/lib/ddtrace/contrib/rspec/patcher.rb +23 -0
  268. data/lib/ddtrace/contrib/sequel/utils.rb +5 -6
  269. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  270. data/lib/ddtrace/contrib/shoryuken/tracer.rb +3 -1
  271. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  272. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +5 -7
  273. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -1
  274. data/lib/ddtrace/contrib/sinatra/env.rb +1 -3
  275. data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
  276. data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -3
  277. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +5 -5
  278. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
  279. data/lib/ddtrace/contrib/sneakers/ext.rb +11 -11
  280. data/lib/ddtrace/contrib/sneakers/tracer.rb +16 -21
  281. data/lib/ddtrace/contrib/status_code_matcher.rb +69 -0
  282. data/lib/ddtrace/correlation.rb +1 -0
  283. data/lib/ddtrace/diagnostics/environment_logger.rb +2 -1
  284. data/lib/ddtrace/distributed_tracing/headers/headers.rb +1 -0
  285. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +1 -3
  286. data/lib/ddtrace/ext/app_types.rb +1 -0
  287. data/lib/ddtrace/ext/ci.rb +297 -0
  288. data/lib/ddtrace/ext/distributed.rb +8 -2
  289. data/lib/ddtrace/ext/git.rb +11 -0
  290. data/lib/ddtrace/ext/http.rb +1 -1
  291. data/lib/ddtrace/ext/runtime.rb +4 -1
  292. data/lib/ddtrace/ext/test.rb +24 -0
  293. data/lib/ddtrace/forced_tracing.rb +2 -0
  294. data/lib/ddtrace/logger.rb +1 -1
  295. data/lib/ddtrace/metrics.rb +10 -6
  296. data/lib/ddtrace/opentracer/distributed_headers.rb +3 -0
  297. data/lib/ddtrace/opentracer/span.rb +2 -6
  298. data/lib/ddtrace/opentracer/thread_local_scope.rb +1 -0
  299. data/lib/ddtrace/patcher.rb +25 -4
  300. data/lib/ddtrace/pin.rb +8 -61
  301. data/lib/ddtrace/pipeline/span_filter.rb +1 -1
  302. data/lib/ddtrace/propagation/grpc_propagator.rb +1 -0
  303. data/lib/ddtrace/propagation/http_propagator.rb +17 -2
  304. data/lib/ddtrace/quantization/http.rb +1 -0
  305. data/lib/ddtrace/runtime/cgroup.rb +2 -2
  306. data/lib/ddtrace/runtime/container.rb +27 -29
  307. data/lib/ddtrace/runtime/identity.rb +12 -5
  308. data/lib/ddtrace/sampler.rb +1 -1
  309. data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
  310. data/lib/ddtrace/sampling/rule_sampler.rb +1 -0
  311. data/lib/ddtrace/span.rb +7 -7
  312. data/lib/ddtrace/sync_writer.rb +12 -12
  313. data/lib/ddtrace/tracer.rb +21 -6
  314. data/lib/ddtrace/transport/http.rb +15 -8
  315. data/lib/ddtrace/transport/http/adapters/net.rb +27 -8
  316. data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
  317. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
  318. data/lib/ddtrace/transport/http/builder.rb +7 -1
  319. data/lib/ddtrace/transport/http/env.rb +8 -0
  320. data/lib/ddtrace/transport/http/traces.rb +2 -3
  321. data/lib/ddtrace/transport/io.rb +1 -1
  322. data/lib/ddtrace/transport/io/response.rb +1 -3
  323. data/lib/ddtrace/transport/io/traces.rb +6 -0
  324. data/lib/ddtrace/transport/traces.rb +18 -1
  325. data/lib/ddtrace/utils.rb +10 -11
  326. data/lib/ddtrace/utils/compression.rb +27 -0
  327. data/lib/ddtrace/utils/forking.rb +52 -0
  328. data/lib/ddtrace/utils/object_set.rb +41 -0
  329. data/lib/ddtrace/utils/only_once.rb +40 -0
  330. data/lib/ddtrace/utils/sequence.rb +17 -0
  331. data/lib/ddtrace/utils/string_table.rb +45 -0
  332. data/lib/ddtrace/utils/time.rb +32 -1
  333. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  334. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  335. data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
  336. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
  337. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
  338. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
  339. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
  340. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
  341. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
  342. data/lib/ddtrace/version.rb +1 -1
  343. data/lib/ddtrace/workers.rb +5 -0
  344. data/lib/ddtrace/workers/async.rb +11 -3
  345. data/lib/ddtrace/workers/loop.rb +17 -3
  346. data/lib/ddtrace/workers/polling.rb +1 -0
  347. data/lib/ddtrace/workers/queue.rb +1 -0
  348. data/lib/ddtrace/workers/runtime_metrics.rb +7 -3
  349. data/lib/ddtrace/workers/trace_writer.rb +10 -10
  350. data/lib/ddtrace/writer.rb +26 -5
  351. metadata +186 -373
  352. data/lib/ddtrace/augmentation.rb +0 -13
  353. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  354. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  355. data/lib/ddtrace/augmentation/shim.rb +0 -102
  356. data/lib/ddtrace/monkey.rb +0 -58
@@ -0,0 +1,17 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Httpclient
4
+ # Httpclient integration constants
5
+ module Ext
6
+ APP = 'httpclient'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_HTTPCLIENT_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTPCLIENT_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTPCLIENT_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_HTTPCLIENT_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTPCLIENT_ANALYTICS_SAMPLE_RATE'.freeze
12
+ SERVICE_NAME = 'httpclient'.freeze
13
+ SPAN_REQUEST = 'httpclient.request'.freeze
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,147 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/ext/http'
3
+ require 'ddtrace/ext/net'
4
+ require 'ddtrace/ext/distributed'
5
+ require 'ddtrace/contrib/analytics'
6
+ require 'ddtrace/propagation/http_propagator'
7
+ require 'ddtrace/contrib/http_annotation_helper'
8
+
9
+ module Datadog
10
+ module Contrib
11
+ module Httpclient
12
+ # Instrumentation for Httpclient
13
+ module Instrumentation
14
+ def self.included(base)
15
+ base.send(:prepend, InstanceMethods)
16
+ end
17
+
18
+ # Instance methods for configuration
19
+ module InstanceMethods
20
+ include Datadog::Contrib::HttpAnnotationHelper
21
+
22
+ def do_get_block(req, proxy, conn, &block)
23
+ host = req.header.request_uri.host
24
+ request_options = datadog_configuration(host)
25
+ pin = datadog_pin(request_options)
26
+
27
+ return super unless pin && pin.tracer
28
+
29
+ pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
30
+ begin
31
+ request_options[:service_name] = pin.service_name
32
+ span.service = service_name(host, request_options)
33
+ span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
34
+
35
+ if pin.tracer.enabled && !should_skip_distributed_tracing?(pin)
36
+ Datadog::HTTPPropagator.inject!(span.context, req.header)
37
+ end
38
+
39
+ # Add additional request specific tags to the span.
40
+ annotate_span_with_request!(span, req, request_options)
41
+ rescue StandardError => e
42
+ logger.error("error preparing span for httpclient request: #{e}, Source: #{e.backtrace}")
43
+ ensure
44
+ res = super
45
+ end
46
+
47
+ # Add additional response specific tags to the span.
48
+ annotate_span_with_response!(span, res)
49
+
50
+ res
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def annotate_span_with_request!(span, req, req_options)
57
+ http_method = req.header.request_method.upcase
58
+ uri = req.header.request_uri
59
+
60
+ span.resource = http_method
61
+ span.set_tag(Datadog::Ext::HTTP::METHOD, http_method)
62
+ span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
63
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
64
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
65
+
66
+ # Tag as an external peer service
67
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
68
+
69
+ set_analytics_sample_rate(span, req_options)
70
+ end
71
+
72
+ def annotate_span_with_response!(span, response)
73
+ return unless response && response.status
74
+
75
+ span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.status)
76
+
77
+ case response.status.to_i
78
+ when 400...599
79
+ span.set_error(["Error #{response.status}", response.body])
80
+ end
81
+ end
82
+
83
+ def annotate_span_with_error!(span, error)
84
+ span.set_error(error)
85
+ end
86
+
87
+ def datadog_pin(config = Datadog.configuration[:httprb])
88
+ service = config[:service_name]
89
+ tracer = config[:tracer]
90
+
91
+ @datadog_pin ||= Datadog::Pin.new(
92
+ service,
93
+ app: Ext::APP,
94
+ app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
95
+ tracer: -> { config[:tracer] }
96
+ )
97
+
98
+ if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
99
+ @datadog_pin.service = service
100
+ end
101
+ if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
102
+ @datadog_pin.tracer = tracer
103
+ end
104
+
105
+ @datadog_pin
106
+ end
107
+
108
+ def default_datadog_pin
109
+ config = Datadog.configuration[:httpclient]
110
+ service = config[:service_name]
111
+
112
+ @default_datadog_pin ||= Datadog::Pin.new(
113
+ service,
114
+ app: Ext::APP,
115
+ app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
116
+ tracer: -> { config[:tracer] }
117
+ )
118
+ end
119
+
120
+ def datadog_configuration(host = :default)
121
+ Datadog.configuration[:httpclient, host]
122
+ end
123
+
124
+ def analytics_enabled?(request_options)
125
+ Contrib::Analytics.enabled?(request_options[:analytics_enabled])
126
+ end
127
+
128
+ def logger
129
+ Datadog.logger
130
+ end
131
+
132
+ def should_skip_distributed_tracing?(pin)
133
+ return !pin.config[:distributed_tracing] if pin.config && pin.config.key?(:distributed_tracing)
134
+
135
+ !Datadog.configuration[:httpclient][:distributed_tracing]
136
+ end
137
+
138
+ def set_analytics_sample_rate(span, request_options)
139
+ return unless analytics_enabled?(request_options)
140
+
141
+ Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,43 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/httpclient/configuration/settings'
3
+ require 'ddtrace/contrib/configuration/resolvers/pattern_resolver'
4
+ require 'ddtrace/contrib/httpclient/patcher'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module Httpclient
9
+ # Description of Httpclient integration
10
+ class Integration
11
+ include Contrib::Integration
12
+
13
+ MINIMUM_VERSION = Gem::Version.new('2.2.0')
14
+
15
+ register_as :httpclient
16
+
17
+ def self.version
18
+ Gem.loaded_specs['httpclient'] && Gem.loaded_specs['httpclient'].version
19
+ end
20
+
21
+ def self.loaded?
22
+ !defined?(::HTTPClient).nil?
23
+ end
24
+
25
+ def self.compatible?
26
+ super && version >= MINIMUM_VERSION
27
+ end
28
+
29
+ def default_configuration
30
+ Configuration::Settings.new
31
+ end
32
+
33
+ def patcher
34
+ Patcher
35
+ end
36
+
37
+ def resolver
38
+ @resolver ||= Contrib::Configuration::Resolvers::PatternResolver.new
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,38 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/httpclient/instrumentation'
3
+ require 'ddtrace/utils/only_once'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ # Datadog Httpclient integration.
8
+ module Httpclient
9
+ # Patcher enables patching of 'httpclient' module.
10
+ module Patcher
11
+ include Contrib::Patcher
12
+
13
+ PATCH_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
14
+
15
+ module_function
16
+
17
+ def patched?
18
+ PATCH_ONLY_ONCE.ran?
19
+ end
20
+
21
+ def target_version
22
+ Integration.version
23
+ end
24
+
25
+ # patch applies our patch
26
+ def patch
27
+ PATCH_ONLY_ONCE.run do
28
+ begin
29
+ ::HTTPClient.send(:include, Instrumentation)
30
+ rescue StandardError => e
31
+ Datadog::Logger.error("Unable to apply httpclient integration: #{e}")
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -16,7 +16,6 @@ module Datadog
16
16
  end
17
17
 
18
18
  # Instance methods for configuration
19
- # rubocop:disable Metrics/ModuleLength
20
19
  module InstanceMethods
21
20
  include Datadog::Contrib::HttpAnnotationHelper
22
21
 
@@ -40,7 +39,7 @@ module Datadog
40
39
  # Add additional request specific tags to the span.
41
40
  annotate_span_with_request!(span, req, request_options)
42
41
  rescue StandardError => e
43
- logger.error("error preparing span for http.rb request: #{e}, Soure: #{e.backtrace}")
42
+ logger.error("error preparing span for http.rb request: #{e}, Source: #{e.backtrace}")
44
43
  ensure
45
44
  res = super(req, options)
46
45
  end
@@ -99,14 +98,12 @@ module Datadog
99
98
  service = config[:service_name]
100
99
  tracer = config[:tracer]
101
100
 
102
- @datadog_pin ||= begin
103
- Datadog::Pin.new(
104
- service,
105
- app: Ext::APP,
106
- app_type: Datadog::Ext::AppTypes::WEB,
107
- tracer: -> { config[:tracer] }
108
- )
109
- end
101
+ @datadog_pin ||= Datadog::Pin.new(
102
+ service,
103
+ app: Ext::APP,
104
+ app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
105
+ tracer: -> { config[:tracer] }
106
+ )
110
107
 
111
108
  if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
112
109
  @datadog_pin.service = service
@@ -122,14 +119,12 @@ module Datadog
122
119
  config = Datadog.configuration[:httprb]
123
120
  service = config[:service_name]
124
121
 
125
- @default_datadog_pin ||= begin
126
- Datadog::Pin.new(
127
- service,
128
- app: Ext::APP,
129
- app_type: Datadog::Ext::AppTypes::WEB,
130
- tracer: -> { config[:tracer] }
131
- )
132
- end
122
+ @default_datadog_pin ||= Datadog::Pin.new(
123
+ service,
124
+ app: Ext::APP,
125
+ app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
126
+ tracer: -> { config[:tracer] }
127
+ )
133
128
  end
134
129
 
135
130
  def datadog_configuration(host = :default)
@@ -145,15 +140,14 @@ module Datadog
145
140
  end
146
141
 
147
142
  def should_skip_distributed_tracing?(pin)
148
- if pin.config && pin.config.key?(:distributed_tracing)
149
- return !pin.config[:distributed_tracing]
150
- end
143
+ return !pin.config[:distributed_tracing] if pin.config && pin.config.key?(:distributed_tracing)
151
144
 
152
145
  !Datadog.configuration[:httprb][:distributed_tracing]
153
146
  end
154
147
 
155
148
  def set_analytics_sample_rate(span, request_options)
156
149
  return unless analytics_enabled?(request_options)
150
+
157
151
  Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
158
152
  end
159
153
  end
@@ -1,5 +1,6 @@
1
1
  require 'ddtrace/contrib/patcher'
2
2
  require 'ddtrace/contrib/httprb/instrumentation'
3
+ require 'ddtrace/utils/only_once'
3
4
 
4
5
  module Datadog
5
6
  module Contrib
@@ -9,10 +10,12 @@ module Datadog
9
10
  module Patcher
10
11
  include Contrib::Patcher
11
12
 
13
+ PATCH_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
14
+
12
15
  module_function
13
16
 
14
17
  def patched?
15
- done?(:httprb)
18
+ PATCH_ONLY_ONCE.ran?
16
19
  end
17
20
 
18
21
  def target_version
@@ -21,7 +24,7 @@ module Datadog
21
24
 
22
25
  # patch applies our patch
23
26
  def patch
24
- do_once(:httprb) do
27
+ PATCH_ONLY_ONCE.run do
25
28
  begin
26
29
  ::HTTP::Client.send(:include, Instrumentation)
27
30
  rescue StandardError => e
@@ -42,7 +42,7 @@ module Datadog
42
42
  # Measure service stats
43
43
  Contrib::Analytics.set_measured(span)
44
44
 
45
- span.set_error(payload[:exception_object]) if payload[:exception_object]
45
+ report_if_exception(span, payload)
46
46
  end
47
47
  end
48
48
  end
@@ -23,6 +23,7 @@ module Datadog
23
23
  return unless respond_to? :cluster
24
24
  return unless cluster.respond_to? :addresses
25
25
  return unless cluster.addresses.respond_to? :first
26
+
26
27
  Datadog::Pin.get_from(cluster.addresses.first)
27
28
  end
28
29
 
@@ -31,6 +32,7 @@ module Datadog
31
32
  return unless respond_to? :cluster
32
33
  return unless cluster.respond_to? :addresses
33
34
  return unless cluster.addresses.respond_to? :each
35
+
34
36
  # attach the PIN to all cluster addresses. One of them is used
35
37
  # when executing a Command and it is attached to the Monitoring
36
38
  # Event instance.
@@ -29,9 +29,7 @@ module Datadog
29
29
  span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
30
30
 
31
31
  # Set analytics sample rate
32
- if analytics_enabled?
33
- Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
34
- end
32
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
35
33
 
36
34
  # add operation tags; the full query is stored and used as a resource,
37
35
  # since it has been quantized and reduced
@@ -92,6 +90,7 @@ module Datadog
92
90
 
93
91
  def clear_span(event)
94
92
  return if Thread.current[:datadog_mongo_span].nil?
93
+
95
94
  Thread.current[:datadog_mongo_span].delete(event.request_id)
96
95
  end
97
96
 
@@ -42,16 +42,27 @@ module Datadog
42
42
 
43
43
  def patch
44
44
  if !self.class.patchable? || patcher.nil?
45
- desc = "Available?: #{self.class.available?}"
46
- desc += ", Loaded? #{self.class.loaded?}"
47
- desc += ", Compatible? #{self.class.compatible?}"
48
- desc += ", Patchable? #{self.class.patchable?}"
49
-
50
- Datadog.logger.warn("Unable to patch #{self.class.name} (#{desc})")
51
- return
45
+ return {
46
+ name: self.class.name,
47
+ available: self.class.available?,
48
+ loaded: self.class.loaded?,
49
+ compatible: self.class.compatible?,
50
+ patchable: self.class.patchable?
51
+ }
52
52
  end
53
53
 
54
54
  patcher.patch
55
+ true
56
+ end
57
+
58
+ # Can the patch for this integration be applied automatically?
59
+ # For example: test integrations should only be applied
60
+ # by the user explicitly setting `c.use :rspec`
61
+ # and rails sub-modules are auto-instrumented by enabling rails
62
+ # so auto-instrumenting them on their own will cause changes in
63
+ # service naming behavior
64
+ def auto_instrument?
65
+ true
55
66
  end
56
67
  end
57
68
  end
@@ -1,14 +1,12 @@
1
- require 'ddtrace/patcher'
1
+ require 'ddtrace/utils/only_once'
2
2
 
3
3
  module Datadog
4
4
  module Contrib
5
5
  # Common behavior for patcher modules
6
6
  module Patcher
7
7
  def self.included(base)
8
- base.send(:include, Datadog::Patcher)
9
-
10
8
  base.singleton_class.send(:prepend, CommonMethods)
11
- base.send(:prepend, CommonMethods) if base.class == Class
9
+ base.send(:prepend, CommonMethods) if base.instance_of?(Class)
12
10
  end
13
11
 
14
12
  # Prepended instance methods for all patchers
@@ -18,13 +16,13 @@ module Datadog
18
16
  end
19
17
 
20
18
  def patched?
21
- done?(:patch)
19
+ patch_only_once.ran?
22
20
  end
23
21
 
24
22
  def patch
25
23
  return unless defined?(super)
26
24
 
27
- do_once(:patch) do
25
+ patch_only_once.run do
28
26
  begin
29
27
  super.tap do
30
28
  # Emit a metric
@@ -56,6 +54,11 @@ module Datadog
56
54
  tags << "target_version:#{target_version}" if respond_to?(:target_version) && !target_version.nil?
57
55
  end
58
56
  end
57
+
58
+ def patch_only_once
59
+ # NOTE: This is not thread-safe
60
+ @patch_only_once ||= Datadog::Utils::OnlyOnce.new
61
+ end
59
62
  end
60
63
  end
61
64
  end