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,75 @@
1
+ module Datadog
2
+ module Contrib
3
+ module RSpec
4
+ # Instrument RSpec::Core::Example
5
+ module Example
6
+ def self.included(base)
7
+ base.send(:prepend, InstanceMethods)
8
+ end
9
+
10
+ # Instance methods for configuration
11
+ module InstanceMethods
12
+ def run(example_group_instance, reporter)
13
+ return super unless configuration[:enabled]
14
+
15
+ test_name = full_description.strip
16
+ if metadata[:description].empty?
17
+ # for unnamed it blocks this appends something like "example at ./spec/some_spec.rb:10"
18
+ test_name += " #{description}"
19
+ end
20
+
21
+ trace_options = {
22
+ app: Ext::APP,
23
+ resource: test_name,
24
+ service: configuration[:service_name],
25
+ span_type: Datadog::Ext::AppTypes::TEST,
26
+ tags: tags.merge(Datadog.configuration.tags)
27
+ }
28
+
29
+ tracer.trace(configuration[:operation_name], trace_options) do |span|
30
+ span.set_tag(Datadog::Ext::Test::TAG_FRAMEWORK, Ext::FRAMEWORK)
31
+ span.set_tag(Datadog::Ext::Test::TAG_NAME, test_name)
32
+ span.set_tag(Datadog::Ext::Test::TAG_SUITE, file_path)
33
+ span.set_tag(Datadog::Ext::Test::TAG_TYPE, Ext::TEST_TYPE)
34
+ span.set_tag(Datadog::Ext::Test::TAG_SPAN_KIND, Datadog::Ext::AppTypes::TEST)
35
+
36
+ # Measure service stats
37
+ Contrib::Analytics.set_measured(span)
38
+
39
+ result = super
40
+
41
+ case execution_result.status
42
+ when :passed
43
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::PASS)
44
+ when :failed
45
+ span.status = 1
46
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::FAIL)
47
+ span.set_error(execution_result.exception)
48
+ else
49
+ if execution_result.example_skipped?
50
+ span.set_tag(Datadog::Ext::Test::TAG_STATUS, Datadog::Ext::Test::Status::SKIP)
51
+ end
52
+ end
53
+
54
+ result
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def configuration
61
+ Datadog.configuration[:rspec]
62
+ end
63
+
64
+ def tracer
65
+ configuration[:tracer]
66
+ end
67
+
68
+ def tags
69
+ @tags ||= Datadog::Ext::CI.tags(ENV)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,16 @@
1
+ module Datadog
2
+ module Contrib
3
+ module RSpec
4
+ # RSpec integration constants
5
+ module Ext
6
+ APP = 'rspec'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_RSPEC_ENABLED'.freeze
8
+ ENV_OPERATION_NAME = 'DD_TRACE_RSPEC_OPERATION_NAME'.freeze
9
+ FRAMEWORK = 'rspec'.freeze
10
+ OPERATION_NAME = 'rspec.example'.freeze
11
+ SERVICE_NAME = 'rspec'.freeze
12
+ TEST_TYPE = 'test'.freeze
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,46 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/rspec/configuration/settings'
3
+ require 'ddtrace/contrib/rspec/patcher'
4
+ require 'ddtrace/contrib/integration'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module RSpec
9
+ # Description of RSpec integration
10
+ class Integration
11
+ include Contrib::Integration
12
+
13
+ MINIMUM_VERSION = Gem::Version.new('3.0.0')
14
+
15
+ register_as :rspec, auto_patch: true
16
+
17
+ def self.version
18
+ Gem.loaded_specs['rspec'] \
19
+ && Gem.loaded_specs['rspec'].version
20
+ end
21
+
22
+ def self.loaded?
23
+ !defined?(::RSpec).nil? && !defined?(::RSpec::Core).nil? && \
24
+ !defined?(::RSpec::Core::Example).nil?
25
+ end
26
+
27
+ def self.compatible?
28
+ super && version >= MINIMUM_VERSION
29
+ end
30
+
31
+ # test environments should not auto instrument test libraries
32
+ def auto_instrument?
33
+ false
34
+ end
35
+
36
+ def default_configuration
37
+ Configuration::Settings.new
38
+ end
39
+
40
+ def patcher
41
+ Patcher
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/rspec/example'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module RSpec
7
+ # Patcher enables patching of 'rspec' module.
8
+ module Patcher
9
+ include Contrib::Patcher
10
+
11
+ module_function
12
+
13
+ def target_version
14
+ Integration.version
15
+ end
16
+
17
+ def patch
18
+ ::RSpec::Core::Example.send(:include, Example)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -30,12 +30,11 @@ module Datadog
30
30
 
31
31
  def parse_opts(sql, opts, db_opts, dataset = nil)
32
32
  # Prepared statements don't provide their sql query in the +sql+ parameter.
33
- unless sql.is_a?(String)
34
- if dataset && dataset.respond_to?(:prepared_sql) && (resolved_sql = dataset.prepared_sql)
35
- # The dataset contains the resolved SQL query and prepared statement name.
36
- prepared_name = dataset.prepared_statement_name
37
- sql = resolved_sql
38
- end
33
+ if !sql.is_a?(String) && (dataset && dataset.respond_to?(:prepared_sql) &&
34
+ (resolved_sql = dataset.prepared_sql))
35
+ # The dataset contains the resolved SQL query and prepared statement name.
36
+ prepared_name = dataset.prepared_statement_name
37
+ sql = resolved_sql
39
38
  end
40
39
 
41
40
  {
@@ -22,6 +22,7 @@ module Datadog
22
22
  end
23
23
 
24
24
  option :service_name, default: Ext::SERVICE_NAME
25
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
25
26
  end
26
27
  end
27
28
  end
@@ -8,10 +8,12 @@ module Datadog
8
8
  def initialize(options = {})
9
9
  @tracer = options[:tracer] || configuration[:tracer]
10
10
  @shoryuken_service = options[:service_name] || configuration[:service_name]
11
+ @error_handler = options[:error_handler] || configuration[:error_handler]
11
12
  end
12
13
 
13
14
  def call(worker_instance, queue, sqs_msg, body)
14
- @tracer.trace(Ext::SPAN_JOB, service: @shoryuken_service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
15
+ @tracer.trace(Ext::SPAN_JOB, service: @shoryuken_service, span_type: Datadog::Ext::AppTypes::WORKER,
16
+ on_error: @error_handler) do |span|
15
17
  # Set analytics sample rate
16
18
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
17
19
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -29,6 +29,7 @@ module Datadog
29
29
 
30
30
  option :service_name, default: Ext::SERVICE_NAME
31
31
  option :client_service_name, default: Ext::CLIENT_SERVICE_NAME
32
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
32
33
  end
33
34
  end
34
35
  end
@@ -11,6 +11,7 @@ module Datadog
11
11
  def initialize(options = {})
12
12
  super
13
13
  @sidekiq_service = options[:service_name] || configuration[:service_name]
14
+ @error_handler = options[:error_handler] || configuration[:error_handler]
14
15
  end
15
16
 
16
17
  def call(worker, job, queue)
@@ -19,7 +20,8 @@ module Datadog
19
20
  service = worker_config(resource, :service_name) || @sidekiq_service
20
21
  tag_args = worker_config(resource, :tag_args) || configuration[:tag_args]
21
22
 
22
- @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
23
+ @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER,
24
+ on_error: @error_handler) do |span|
23
25
  span.resource = resource
24
26
  # Set analytics sample rate
25
27
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
@@ -35,9 +37,7 @@ module Datadog
35
37
  span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
36
38
  span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
37
39
  span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
38
- if tag_args && !job['args'].nil? && !job['args'].empty?
39
- span.set_tag(Ext::TAG_JOB_ARGS, job['args'])
40
- end
40
+ span.set_tag(Ext::TAG_JOB_ARGS, job['args']) if tag_args && !job['args'].nil? && !job['args'].empty?
41
41
 
42
42
  yield
43
43
  end
@@ -57,9 +57,7 @@ module Datadog
57
57
  nil
58
58
  end
59
59
 
60
- if worker_klass.respond_to?(:datadog_tracer_config)
61
- worker_klass.datadog_tracer_config[key]
62
- end
60
+ worker_klass.datadog_tracer_config[key] if worker_klass.respond_to?(:datadog_tracer_config)
63
61
  end
64
62
  end
65
63
  end
@@ -31,7 +31,6 @@ module Datadog
31
31
  job['class'].to_s
32
32
  end
33
33
 
34
- #
35
34
  def delay_extension_class(job)
36
35
  clazz, method = YAML.parse(job['args'].first).children.first.children
37
36
 
@@ -23,9 +23,7 @@ module Datadog
23
23
  {}.tap do |result|
24
24
  headers.each do |header|
25
25
  rack_header = header_to_rack_header(header)
26
- if env.key?(rack_header)
27
- result[Datadog::Ext::HTTP::RequestHeaders.to_tag(header)] = env[rack_header]
28
- end
26
+ result[Datadog::Ext::HTTP::RequestHeaders.to_tag(header)] = env[rack_header] if env.key?(rack_header)
29
27
  end
30
28
  end
31
29
  end
@@ -18,9 +18,7 @@ module Datadog
18
18
  # Try a case-insensitive lookup
19
19
  uppercased_header = header.to_s.upcase
20
20
  matching_header = headers.keys.find { |h| h.upcase == uppercased_header }
21
- if matching_header
22
- result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[matching_header]
23
- end
21
+ result[Datadog::Ext::HTTP::ResponseHeaders.to_tag(header)] = headers[matching_header] if matching_header
24
22
  end
25
23
  end
26
24
  end
@@ -110,9 +110,7 @@ module Datadog
110
110
 
111
111
  span.set_tag(Ext::TAG_APP_NAME, settings.name || settings.superclass.name)
112
112
  span.set_tag(Ext::TAG_ROUTE_PATH, @datadog_route)
113
- if request.script_name && !request.script_name.empty?
114
- span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
115
- end
113
+ span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name) if request.script_name && !request.script_name.empty?
116
114
 
117
115
  rack_request_span = env[Datadog::Contrib::Rack::TraceMiddleware::RACK_REQUEST_SPAN]
118
116
  rack_request_span.resource = span.resource if rack_request_span
@@ -8,13 +8,15 @@ module Datadog
8
8
  module Sinatra
9
9
  # Middleware used for automatically tagging configured headers and handle request span
10
10
  class TracerMiddleware
11
- def initialize(app, app_instance: nil)
11
+ def initialize(app, opt = {})
12
12
  @app = app
13
- @app_instance = app_instance
13
+ @app_instance = opt[:app_instance]
14
14
  end
15
15
 
16
16
  # rubocop:disable Metrics/AbcSize
17
17
  # rubocop:disable Metrics/MethodLength
18
+ # rubocop:disable Metrics/CyclomaticComplexity
19
+ # rubocop:disable Metrics/PerceivedComplexity
18
20
  def call(env)
19
21
  # Set the trace context (e.g. distributed tracing)
20
22
  if configuration[:distributed_tracing] && tracer.provider.context.trace_id.nil?
@@ -40,9 +42,7 @@ module Datadog
40
42
  request = ::Sinatra::Request.new(env)
41
43
  span.set_tag(Datadog::Ext::HTTP::URL, request.path)
42
44
  span.set_tag(Datadog::Ext::HTTP::METHOD, request.request_method)
43
- if request.script_name && !request.script_name.empty?
44
- span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name)
45
- end
45
+ span.set_tag(Ext::TAG_SCRIPT_NAME, request.script_name) if request.script_name && !request.script_name.empty?
46
46
 
47
47
  span.set_tag(Ext::TAG_APP_NAME, @app_instance.settings.name)
48
48
 
@@ -24,6 +24,7 @@ module Datadog
24
24
  end
25
25
 
26
26
  option :service_name, default: Ext::SERVICE_NAME
27
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
27
28
  option :tag_body, default: false
28
29
  end
29
30
  end
@@ -5,17 +5,17 @@ module Datadog
5
5
  module Sneakers
6
6
  # Sneakers integration constants
7
7
  module Ext
8
- APP = 'sneakers'.freeze
9
- ENV_ENABLED = 'DD_TRACE_SNEAKERS_ENABLED'.freeze
10
- ENV_ANALYTICS_ENABLED = 'DD_TRACE_SNEAKERS_ANALYTICS_ENABLED'.freeze
11
- ENV_ANALYTICS_ENABLED_OLD = 'DD_SNEAKERS_ANALYTICS_ENABLED'.freeze
12
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SNEAKERS_ANALYTICS_SAMPLE_RATE'.freeze
13
- ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SNEAKERS_ANALYTICS_SAMPLE_RATE'.freeze
14
- SERVICE_NAME = 'sneakers'.freeze
15
- SPAN_JOB = 'sneakers.job'.freeze
16
- TAG_JOB_ROUTING_KEY = 'sneakers.routing_key'.freeze
17
- TAG_JOB_QUEUE = 'sneakers.queue'.freeze
18
- TAG_JOB_BODY = 'sneakers.body'.freeze
8
+ APP = 'sneakers'
9
+ ENV_ENABLED = 'DD_TRACE_SNEAKERS_ENABLED'
10
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_SNEAKERS_ANALYTICS_ENABLED'
11
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_SNEAKERS_ANALYTICS_ENABLED'
12
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_SNEAKERS_ANALYTICS_SAMPLE_RATE'
13
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_SNEAKERS_ANALYTICS_SAMPLE_RATE'
14
+ SERVICE_NAME = 'sneakers'
15
+ SPAN_JOB = 'sneakers.job'
16
+ TAG_JOB_ROUTING_KEY = 'sneakers.routing_key'
17
+ TAG_JOB_QUEUE = 'sneakers.queue'
18
+ TAG_JOB_BODY = 'sneakers.body'
19
19
  end
20
20
  end
21
21
  end
@@ -14,33 +14,28 @@ module Datadog
14
14
 
15
15
  def call(deserialized_msg, delivery_info, metadata, handler)
16
16
  trace_options = {
17
- service: configuration[:service_name],
18
- span_type: Datadog::Ext::AppTypes::WORKER
17
+ service: configuration[:service_name],
18
+ span_type: Datadog::Ext::AppTypes::WORKER,
19
+ on_error: configuration[:error_handler]
19
20
  }
20
- request_span = tracer.trace(Ext::SPAN_JOB, trace_options)
21
21
 
22
- # Set analytics sample rate
23
- if Datadog::Contrib::Analytics.enabled?(configuration[:analytics_enabled])
24
- Datadog::Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate])
25
- end
22
+ tracer.trace(Ext::SPAN_JOB, trace_options) do |request_span|
23
+ # Set analytics sample rate
24
+ if Datadog::Contrib::Analytics.enabled?(configuration[:analytics_enabled])
25
+ Datadog::Contrib::Analytics.set_sample_rate(request_span, configuration[:analytics_sample_rate])
26
+ end
26
27
 
27
- # Measure service stats
28
- Contrib::Analytics.set_measured(request_span)
28
+ # Measure service stats
29
+ Contrib::Analytics.set_measured(request_span)
29
30
 
30
- request_span.resource = @app.to_proc.binding.eval('self.class').to_s
31
- request_span.set_tag(Ext::TAG_JOB_ROUTING_KEY, delivery_info.routing_key)
32
- request_span.set_tag(Ext::TAG_JOB_QUEUE, delivery_info.consumer.queue.name)
31
+ request_span.resource = @app.to_proc.binding.eval('self.class').to_s
32
+ request_span.set_tag(Ext::TAG_JOB_ROUTING_KEY, delivery_info.routing_key)
33
+ request_span.set_tag(Ext::TAG_JOB_QUEUE, delivery_info.consumer.queue.name)
33
34
 
34
- if configuration[:tag_body]
35
- request_span.set_tag(Ext::TAG_JOB_BODY, deserialized_msg)
36
- end
35
+ request_span.set_tag(Ext::TAG_JOB_BODY, deserialized_msg) if configuration[:tag_body]
37
36
 
38
- @app.call(deserialized_msg, delivery_info, metadata, handler)
39
- rescue StandardError => e
40
- request_span.set_error(e) unless request_span.nil?
41
- raise e
42
- ensure
43
- request_span.finish if request_span
37
+ @app.call(deserialized_msg, delivery_info, metadata, handler)
38
+ end
44
39
  end
45
40
 
46
41
  private
@@ -0,0 +1,69 @@
1
+ require 'set'
2
+ require 'ddtrace/ext/http'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ # Contains methods helpful for tracing/annotating HTTP request libraries
7
+ class StatusCodeMatcher
8
+ REGEX_PARSER = /^\d{3}(?:-\d{3})?(?:,\d{3}(?:-\d{3})?)*$/.freeze
9
+
10
+ def initialize(range)
11
+ @error_response_range = range
12
+ set_range
13
+ end
14
+
15
+ def include?(exception_status)
16
+ set_range.include?(exception_status)
17
+ end
18
+
19
+ def to_s
20
+ @error_response_range.to_s
21
+ end
22
+
23
+ private
24
+
25
+ def set_range
26
+ @datadog_set ||= begin
27
+ set = Set.new
28
+ handle_statuses.each do |statuses|
29
+ status = statuses.to_s.split('-')
30
+ case status.length
31
+ when 1
32
+ set.add(Integer(status[0]))
33
+ when 2
34
+ min, max = status.minmax
35
+ Array(min..max).each do |i|
36
+ set.add(Integer(i))
37
+ end
38
+ end
39
+ end
40
+ set
41
+ end
42
+ @datadog_set
43
+ end
44
+
45
+ def error_responses
46
+ return @error_response_range if @error_response_range.is_a?(String) && !@error_response_range.nil?
47
+
48
+ @error_response_range.join(',') if @error_response_range.is_a?(Array) && !@error_response_range.empty?
49
+ end
50
+
51
+ def handle_statuses
52
+ if error_responses
53
+ filter_error_responses = error_responses.gsub(/\s+/, '').split(',').select do |code|
54
+ if !code.to_s.match(REGEX_PARSER)
55
+ Datadog.logger.debug("Invalid config provided: #{code}. Must be formatted like '400-403,405,410-499'.")
56
+ next
57
+ else
58
+ true
59
+ end
60
+ end
61
+ filter_error_responses.empty? ? Datadog::Ext::HTTP::ERROR_RANGE.to_a : filter_error_responses
62
+ else
63
+ Datadog.logger.debug('No valid config was provided for :error_statuses - falling back to default.')
64
+ Datadog::Ext::HTTP::ERROR_RANGE.to_a
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end