ddtrace 0.41.0 → 0.46.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 (332) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +223 -126
  3. data/.circleci/images/primary/Dockerfile-3.0.0 +73 -0
  4. data/.github/workflows/add-milestone-to-pull-requests.yml +42 -0
  5. data/.github/workflows/create-next-milestone.yml +20 -0
  6. data/.rubocop.yml +250 -7
  7. data/.rubocop_todo.yml +396 -0
  8. data/.simplecov +3 -0
  9. data/Appraisals +429 -135
  10. data/CHANGELOG.md +1158 -354
  11. data/CONTRIBUTING.md +2 -2
  12. data/Gemfile +40 -3
  13. data/README.md +1 -0
  14. data/Rakefile +236 -29
  15. data/ddtrace.gemspec +4 -35
  16. data/docker-compose.yml +30 -0
  17. data/docs/DevelopmentGuide.md +40 -2
  18. data/docs/GettingStarted.md +186 -16
  19. data/integration/README.md +68 -0
  20. data/integration/apps/rack/.dockerignore +1 -0
  21. data/integration/apps/rack/.envrc.sample +1 -0
  22. data/integration/apps/rack/.gitignore +4 -0
  23. data/integration/apps/rack/.rspec +1 -0
  24. data/integration/apps/rack/Dockerfile +25 -0
  25. data/integration/apps/rack/Dockerfile-ci +11 -0
  26. data/integration/apps/rack/Gemfile +24 -0
  27. data/integration/apps/rack/README.md +93 -0
  28. data/integration/apps/rack/app/acme.rb +80 -0
  29. data/integration/apps/rack/app/datadog.rb +17 -0
  30. data/integration/apps/rack/bin/run +22 -0
  31. data/integration/apps/rack/bin/setup +17 -0
  32. data/integration/apps/rack/bin/test +24 -0
  33. data/integration/apps/rack/config.ru +6 -0
  34. data/integration/apps/rack/config/puma.rb +14 -0
  35. data/integration/apps/rack/config/unicorn.rb +23 -0
  36. data/integration/apps/rack/docker-compose.ci.yml +62 -0
  37. data/integration/apps/rack/docker-compose.yml +78 -0
  38. data/integration/apps/rack/script/build-images +38 -0
  39. data/integration/apps/rack/script/ci +50 -0
  40. data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
  41. data/integration/apps/rack/spec/spec_helper.rb +16 -0
  42. data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
  43. data/integration/apps/rails-five/.dockerignore +1 -0
  44. data/integration/apps/rails-five/.env +3 -0
  45. data/integration/apps/rails-five/.envrc.sample +1 -0
  46. data/integration/apps/rails-five/.gitignore +30 -0
  47. data/integration/apps/rails-five/Dockerfile +25 -0
  48. data/integration/apps/rails-five/Dockerfile-ci +11 -0
  49. data/integration/apps/rails-five/Gemfile +104 -0
  50. data/integration/apps/rails-five/README.md +94 -0
  51. data/integration/apps/rails-five/Rakefile +6 -0
  52. data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
  53. data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
  54. data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
  55. data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
  56. data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
  57. data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
  58. data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
  59. data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
  60. data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
  61. data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
  62. data/integration/apps/rails-five/app/models/application_record.rb +3 -0
  63. data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
  64. data/integration/apps/rails-five/app/models/test.rb +2 -0
  65. data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
  66. data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
  67. data/integration/apps/rails-five/bin/bundle +3 -0
  68. data/integration/apps/rails-five/bin/rails +9 -0
  69. data/integration/apps/rails-five/bin/rake +9 -0
  70. data/integration/apps/rails-five/bin/run +24 -0
  71. data/integration/apps/rails-five/bin/setup +27 -0
  72. data/integration/apps/rails-five/bin/spring +17 -0
  73. data/integration/apps/rails-five/bin/test +21 -0
  74. data/integration/apps/rails-five/bin/update +28 -0
  75. data/integration/apps/rails-five/config.ru +5 -0
  76. data/integration/apps/rails-five/config/application.rb +97 -0
  77. data/integration/apps/rails-five/config/boot.rb +4 -0
  78. data/integration/apps/rails-five/config/cable.yml +10 -0
  79. data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
  80. data/integration/apps/rails-five/config/database.yml +28 -0
  81. data/integration/apps/rails-five/config/environment.rb +5 -0
  82. data/integration/apps/rails-five/config/environments/development.rb +51 -0
  83. data/integration/apps/rails-five/config/environments/production.rb +82 -0
  84. data/integration/apps/rails-five/config/environments/test.rb +43 -0
  85. data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
  86. data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
  87. data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
  88. data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
  89. data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
  90. data/integration/apps/rails-five/config/locales/en.yml +33 -0
  91. data/integration/apps/rails-five/config/puma.rb +24 -0
  92. data/integration/apps/rails-five/config/routes.rb +11 -0
  93. data/integration/apps/rails-five/config/spring.rb +6 -0
  94. data/integration/apps/rails-five/config/unicorn.rb +29 -0
  95. data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
  96. data/integration/apps/rails-five/db/schema.rb +23 -0
  97. data/integration/apps/rails-five/db/seeds.rb +7 -0
  98. data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
  99. data/integration/apps/rails-five/docker-compose.yml +100 -0
  100. data/integration/apps/rails-five/lib/tasks/.keep +0 -0
  101. data/integration/apps/rails-five/log/.keep +0 -0
  102. data/integration/apps/rails-five/public/robots.txt +1 -0
  103. data/integration/apps/rails-five/script/build-images +35 -0
  104. data/integration/apps/rails-five/script/ci +50 -0
  105. data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
  106. data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
  107. data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
  108. data/integration/apps/rails-five/storage/.keep +0 -0
  109. data/integration/apps/rails-five/tmp/.keep +0 -0
  110. data/integration/apps/rails-five/vendor/.keep +0 -0
  111. data/integration/apps/ruby/.dockerignore +1 -0
  112. data/integration/apps/ruby/.envrc.sample +1 -0
  113. data/integration/apps/ruby/.gitignore +2 -0
  114. data/integration/apps/ruby/Dockerfile +25 -0
  115. data/integration/apps/ruby/Dockerfile-ci +11 -0
  116. data/integration/apps/ruby/Gemfile +11 -0
  117. data/integration/apps/ruby/README.md +70 -0
  118. data/integration/apps/ruby/agent.yaml +3 -0
  119. data/integration/apps/ruby/app/datadog.rb +13 -0
  120. data/integration/apps/ruby/app/fibonacci.rb +58 -0
  121. data/integration/apps/ruby/bin/run +20 -0
  122. data/integration/apps/ruby/bin/setup +17 -0
  123. data/integration/apps/ruby/bin/test +21 -0
  124. data/integration/apps/ruby/docker-compose.ci.yml +51 -0
  125. data/integration/apps/ruby/docker-compose.yml +63 -0
  126. data/integration/apps/ruby/script/build-images +38 -0
  127. data/integration/apps/ruby/script/ci +50 -0
  128. data/integration/images/agent/Dockerfile +2 -0
  129. data/integration/images/agent/agent.yaml +3 -0
  130. data/integration/images/include/datadog/analyzer.rb +71 -0
  131. data/integration/images/include/datadog/demo_env.rb +101 -0
  132. data/integration/images/include/http-health-check +33 -0
  133. data/integration/images/ruby/2.0/Dockerfile +54 -0
  134. data/integration/images/ruby/2.1/Dockerfile +54 -0
  135. data/integration/images/ruby/2.2/Dockerfile +54 -0
  136. data/integration/images/ruby/2.3/Dockerfile +70 -0
  137. data/integration/images/ruby/2.4/Dockerfile +54 -0
  138. data/integration/images/ruby/2.5/Dockerfile +54 -0
  139. data/integration/images/ruby/2.6/Dockerfile +54 -0
  140. data/integration/images/ruby/2.7/Dockerfile +54 -0
  141. data/integration/images/ruby/3.0/Dockerfile +54 -0
  142. data/integration/images/wrk/Dockerfile +33 -0
  143. data/integration/images/wrk/scripts/entrypoint.sh +17 -0
  144. data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
  145. data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
  146. data/integration/script/build-images +43 -0
  147. data/lib/ddtrace.rb +10 -5
  148. data/lib/ddtrace/analytics.rb +2 -0
  149. data/lib/ddtrace/auto_instrument.rb +3 -0
  150. data/lib/ddtrace/auto_instrument_base.rb +6 -0
  151. data/lib/ddtrace/buffer.rb +230 -134
  152. data/lib/ddtrace/configuration.rb +21 -5
  153. data/lib/ddtrace/configuration/base.rb +1 -1
  154. data/lib/ddtrace/configuration/components.rb +2 -2
  155. data/lib/ddtrace/configuration/option_definition.rb +1 -3
  156. data/lib/ddtrace/configuration/options.rb +2 -3
  157. data/lib/ddtrace/configuration/settings.rb +21 -5
  158. data/lib/ddtrace/context.rb +23 -6
  159. data/lib/ddtrace/context_provider.rb +18 -5
  160. data/lib/ddtrace/contrib/action_cable/event.rb +1 -0
  161. data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
  162. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -3
  163. data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
  164. data/lib/ddtrace/contrib/action_view/event.rb +1 -5
  165. data/lib/ddtrace/contrib/action_view/events/render_partial.rb +1 -0
  166. data/lib/ddtrace/contrib/action_view/events/render_template.rb +1 -0
  167. data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
  168. data/lib/ddtrace/contrib/action_view/utils.rb +1 -1
  169. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +17 -5
  170. data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
  171. data/lib/ddtrace/contrib/active_record/utils.rb +68 -21
  172. data/lib/ddtrace/contrib/active_support/cache/instrumentation.rb +104 -3
  173. data/lib/ddtrace/contrib/active_support/cache/patcher.rb +21 -0
  174. data/lib/ddtrace/contrib/active_support/ext.rb +3 -0
  175. data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
  176. data/lib/ddtrace/contrib/active_support/notifications/event.rb +12 -1
  177. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -0
  178. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +9 -5
  179. data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
  180. data/lib/ddtrace/contrib/aws/instrumentation.rb +2 -1
  181. data/lib/ddtrace/contrib/aws/patcher.rb +1 -1
  182. data/lib/ddtrace/contrib/aws/services.rb +2 -0
  183. data/lib/ddtrace/contrib/configurable.rb +2 -0
  184. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +6 -8
  185. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +28 -0
  186. data/lib/ddtrace/contrib/cucumber/ext.rb +17 -0
  187. data/lib/ddtrace/contrib/cucumber/formatter.rb +98 -0
  188. data/lib/ddtrace/contrib/cucumber/instrumentation.rb +24 -0
  189. data/lib/ddtrace/contrib/cucumber/integration.rb +45 -0
  190. data/lib/ddtrace/contrib/cucumber/patcher.rb +23 -0
  191. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -38
  192. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +2 -0
  193. data/lib/ddtrace/contrib/delayed_job/ext.rb +2 -0
  194. data/lib/ddtrace/contrib/delayed_job/plugin.rb +38 -15
  195. data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
  196. data/lib/ddtrace/contrib/ethon/easy_patch.rb +11 -10
  197. data/lib/ddtrace/contrib/ethon/ext.rb +1 -0
  198. data/lib/ddtrace/contrib/excon/middleware.rb +9 -7
  199. data/lib/ddtrace/contrib/extensions.rb +28 -1
  200. data/lib/ddtrace/contrib/faraday/middleware.rb +1 -3
  201. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -36
  202. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -0
  203. data/lib/ddtrace/contrib/grape/endpoint.rb +47 -21
  204. data/lib/ddtrace/contrib/grape/ext.rb +1 -0
  205. data/lib/ddtrace/contrib/grape/patcher.rb +0 -42
  206. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +8 -8
  207. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +1 -1
  208. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +1 -0
  209. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -36
  210. data/lib/ddtrace/contrib/http/circuit_breaker.rb +1 -3
  211. data/lib/ddtrace/contrib/http/instrumentation.rb +7 -7
  212. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
  213. data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
  214. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +151 -0
  215. data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
  216. data/lib/ddtrace/contrib/httpclient/patcher.rb +35 -0
  217. data/lib/ddtrace/contrib/httprb/instrumentation.rb +5 -6
  218. data/lib/ddtrace/contrib/kafka/event.rb +1 -1
  219. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -0
  220. data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -3
  221. data/lib/ddtrace/contrib/patchable.rb +18 -7
  222. data/lib/ddtrace/contrib/patcher.rb +1 -1
  223. data/lib/ddtrace/contrib/qless/configuration/settings.rb +35 -0
  224. data/lib/ddtrace/contrib/qless/ext.rb +20 -0
  225. data/lib/ddtrace/contrib/qless/integration.rb +38 -0
  226. data/lib/ddtrace/contrib/qless/patcher.rb +35 -0
  227. data/lib/ddtrace/contrib/qless/qless_job.rb +73 -0
  228. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +33 -0
  229. data/lib/ddtrace/contrib/que/configuration/settings.rb +1 -0
  230. data/lib/ddtrace/contrib/que/ext.rb +19 -19
  231. data/lib/ddtrace/contrib/que/tracer.rb +3 -2
  232. data/lib/ddtrace/contrib/racecar/event.rb +1 -0
  233. data/lib/ddtrace/contrib/rack/configuration/settings.rb +3 -3
  234. data/lib/ddtrace/contrib/rack/integration.rb +7 -0
  235. data/lib/ddtrace/contrib/rack/middlewares.rb +6 -11
  236. data/lib/ddtrace/contrib/rack/patcher.rb +1 -3
  237. data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
  238. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  239. data/lib/ddtrace/contrib/rails/patcher.rb +19 -5
  240. data/lib/ddtrace/contrib/rails/utils.rb +4 -0
  241. data/lib/ddtrace/contrib/rake/instrumentation.rb +4 -2
  242. data/lib/ddtrace/contrib/rake/integration.rb +1 -1
  243. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +3 -1
  244. data/lib/ddtrace/contrib/redis/configuration/settings.rb +5 -0
  245. data/lib/ddtrace/contrib/redis/ext.rb +1 -0
  246. data/lib/ddtrace/contrib/redis/patcher.rb +20 -3
  247. data/lib/ddtrace/contrib/redis/quantize.rb +28 -0
  248. data/lib/ddtrace/contrib/redis/tags.rb +5 -1
  249. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  250. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +6 -7
  251. data/lib/ddtrace/contrib/registry.rb +2 -2
  252. data/lib/ddtrace/contrib/resque/configuration/settings.rb +1 -0
  253. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  254. data/lib/ddtrace/contrib/resque/resque_job.rb +3 -1
  255. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -3
  256. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +28 -0
  257. data/lib/ddtrace/contrib/rspec/example.rb +75 -0
  258. data/lib/ddtrace/contrib/rspec/ext.rb +16 -0
  259. data/lib/ddtrace/contrib/rspec/integration.rb +46 -0
  260. data/lib/ddtrace/contrib/rspec/patcher.rb +23 -0
  261. data/lib/ddtrace/contrib/sequel/utils.rb +5 -6
  262. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  263. data/lib/ddtrace/contrib/shoryuken/tracer.rb +3 -1
  264. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  265. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +5 -7
  266. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -1
  267. data/lib/ddtrace/contrib/sinatra/env.rb +1 -3
  268. data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
  269. data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -3
  270. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +5 -5
  271. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +1 -0
  272. data/lib/ddtrace/contrib/sneakers/ext.rb +11 -11
  273. data/lib/ddtrace/contrib/sneakers/tracer.rb +16 -21
  274. data/lib/ddtrace/contrib/status_code_matcher.rb +69 -0
  275. data/lib/ddtrace/correlation.rb +1 -0
  276. data/lib/ddtrace/diagnostics/environment_logger.rb +2 -1
  277. data/lib/ddtrace/distributed_tracing/headers/headers.rb +1 -0
  278. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +1 -3
  279. data/lib/ddtrace/ext/app_types.rb +1 -0
  280. data/lib/ddtrace/ext/ci.rb +297 -0
  281. data/lib/ddtrace/ext/distributed.rb +8 -2
  282. data/lib/ddtrace/ext/git.rb +11 -0
  283. data/lib/ddtrace/ext/http.rb +1 -1
  284. data/lib/ddtrace/ext/runtime.rb +2 -1
  285. data/lib/ddtrace/ext/test.rb +24 -0
  286. data/lib/ddtrace/forced_tracing.rb +2 -0
  287. data/lib/ddtrace/logger.rb +1 -1
  288. data/lib/ddtrace/metrics.rb +10 -6
  289. data/lib/ddtrace/opentracer/distributed_headers.rb +3 -0
  290. data/lib/ddtrace/opentracer/span.rb +2 -6
  291. data/lib/ddtrace/opentracer/thread_local_scope.rb +1 -0
  292. data/lib/ddtrace/patcher.rb +2 -3
  293. data/lib/ddtrace/pin.rb +3 -52
  294. data/lib/ddtrace/pipeline/span_filter.rb +1 -1
  295. data/lib/ddtrace/propagation/grpc_propagator.rb +17 -4
  296. data/lib/ddtrace/propagation/http_propagator.rb +17 -2
  297. data/lib/ddtrace/quantization/http.rb +1 -0
  298. data/lib/ddtrace/runtime/cgroup.rb +1 -1
  299. data/lib/ddtrace/runtime/container.rb +2 -2
  300. data/lib/ddtrace/runtime/identity.rb +4 -5
  301. data/lib/ddtrace/sampler.rb +1 -1
  302. data/lib/ddtrace/sampling/rate_limiter.rb +65 -16
  303. data/lib/ddtrace/sampling/rule_sampler.rb +1 -0
  304. data/lib/ddtrace/span.rb +7 -7
  305. data/lib/ddtrace/sync_writer.rb +7 -10
  306. data/lib/ddtrace/tracer.rb +23 -10
  307. data/lib/ddtrace/transport/http.rb +1 -3
  308. data/lib/ddtrace/transport/http/adapters/net.rb +9 -4
  309. data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
  310. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
  311. data/lib/ddtrace/transport/http/builder.rb +2 -0
  312. data/lib/ddtrace/transport/http/traces.rb +2 -3
  313. data/lib/ddtrace/transport/io.rb +1 -1
  314. data/lib/ddtrace/transport/traces.rb +3 -0
  315. data/lib/ddtrace/utils.rb +10 -11
  316. data/lib/ddtrace/utils/forking.rb +52 -0
  317. data/lib/ddtrace/utils/time.rb +25 -1
  318. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  319. data/lib/ddtrace/version.rb +1 -1
  320. data/lib/ddtrace/workers.rb +5 -0
  321. data/lib/ddtrace/workers/async.rb +8 -0
  322. data/lib/ddtrace/workers/loop.rb +3 -0
  323. data/lib/ddtrace/workers/polling.rb +1 -0
  324. data/lib/ddtrace/workers/runtime_metrics.rb +7 -3
  325. data/lib/ddtrace/workers/trace_writer.rb +9 -10
  326. data/lib/ddtrace/writer.rb +22 -4
  327. metadata +168 -358
  328. data/lib/ddtrace/augmentation.rb +0 -13
  329. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  330. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  331. data/lib/ddtrace/augmentation/shim.rb +0 -102
  332. data/lib/ddtrace/monkey.rb +0 -58
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/contrib/httpclient/instrumentation'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ # Datadog Httpclient integration.
7
+ module Httpclient
8
+ # Patcher enables patching of 'httpclient' module.
9
+ module Patcher
10
+ include Contrib::Patcher
11
+
12
+ module_function
13
+
14
+ def patched?
15
+ done?(:httpclient)
16
+ end
17
+
18
+ def target_version
19
+ Integration.version
20
+ end
21
+
22
+ # patch applies our patch
23
+ def patch
24
+ do_once(:httpclient) do
25
+ begin
26
+ ::HTTPClient.send(:include, Instrumentation)
27
+ rescue StandardError => e
28
+ Datadog::Logger.error("Unable to apply httpclient integration: #{e}")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -40,7 +40,7 @@ module Datadog
40
40
  # Add additional request specific tags to the span.
41
41
  annotate_span_with_request!(span, req, request_options)
42
42
  rescue StandardError => e
43
- logger.error("error preparing span for http.rb request: #{e}, Soure: #{e.backtrace}")
43
+ logger.error("error preparing span for http.rb request: #{e}, Source: #{e.backtrace}")
44
44
  ensure
45
45
  res = super(req, options)
46
46
  end
@@ -103,7 +103,7 @@ module Datadog
103
103
  Datadog::Pin.new(
104
104
  service,
105
105
  app: Ext::APP,
106
- app_type: Datadog::Ext::AppTypes::WEB,
106
+ app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
107
107
  tracer: -> { config[:tracer] }
108
108
  )
109
109
  end
@@ -126,7 +126,7 @@ module Datadog
126
126
  Datadog::Pin.new(
127
127
  service,
128
128
  app: Ext::APP,
129
- app_type: Datadog::Ext::AppTypes::WEB,
129
+ app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
130
130
  tracer: -> { config[:tracer] }
131
131
  )
132
132
  end
@@ -145,15 +145,14 @@ module Datadog
145
145
  end
146
146
 
147
147
  def should_skip_distributed_tracing?(pin)
148
- if pin.config && pin.config.key?(:distributed_tracing)
149
- return !pin.config[:distributed_tracing]
150
- end
148
+ return !pin.config[:distributed_tracing] if pin.config && pin.config.key?(:distributed_tracing)
151
149
 
152
150
  !Datadog.configuration[:httprb][:distributed_tracing]
153
151
  end
154
152
 
155
153
  def set_analytics_sample_rate(span, request_options)
156
154
  return unless analytics_enabled?(request_options)
155
+
157
156
  Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
158
157
  end
159
158
  end
@@ -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
@@ -8,7 +8,7 @@ module Datadog
8
8
  base.send(:include, Datadog::Patcher)
9
9
 
10
10
  base.singleton_class.send(:prepend, CommonMethods)
11
- base.send(:prepend, CommonMethods) if base.class == Class
11
+ base.send(:prepend, CommonMethods) if base.instance_of?(Class)
12
12
  end
13
13
 
14
14
  # Prepended instance methods for all patchers
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/qless/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Qless
7
+ module Configuration
8
+ # Custom settings for the Qless integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :analytics_enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
12
+ o.lazy
13
+ end
14
+
15
+ option :analytics_sample_rate do |o|
16
+ o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
17
+ o.lazy
18
+ end
19
+
20
+ option :tag_job_data do |o|
21
+ o.default { env_to_bool(Ext::ENV_TAG_JOB_DATA, false) }
22
+ o.lazy
23
+ end
24
+
25
+ option :tag_job_tags do |o|
26
+ o.default { env_to_bool(Ext::ENV_TAG_JOB_TAGS, false) }
27
+ o.lazy
28
+ end
29
+
30
+ option :service_name, default: Ext::SERVICE_NAME
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,20 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Qless
4
+ # Qless integration constants
5
+ module Ext
6
+ APP = 'qless'.freeze
7
+ ENV_ANALYTICS_ENABLED = 'DD_QLESS_ANALYTICS_ENABLED'.freeze
8
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_QLESS_ANALYTICS_SAMPLE_RATE'.freeze
9
+ ENV_TAG_JOB_DATA = 'DD_QLESS_TAG_JOB_DATA'.freeze
10
+ ENV_TAG_JOB_TAGS = 'DD_QLESS_TAG_JOB_TAGS'.freeze
11
+ SERVICE_NAME = 'qless'.freeze
12
+ SPAN_JOB = 'qless.job'.freeze
13
+ TAG_JOB_ID = 'qless.job.id'.freeze
14
+ TAG_JOB_DATA = 'qless.job.data'.freeze
15
+ TAG_JOB_QUEUE = 'qless.job.queue'.freeze
16
+ TAG_JOB_TAGS = 'qless.job.tags'.freeze
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,38 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/qless/configuration/settings'
3
+ require 'ddtrace/contrib/qless/patcher'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Qless
8
+ # Description of Qless integration
9
+ class Integration
10
+ include Contrib::Integration
11
+
12
+ MINIMUM_VERSION = Gem::Version.new('0.10.0')
13
+
14
+ register_as :qless, auto_patch: true
15
+
16
+ def self.version
17
+ Gem.loaded_specs['qless'] && Gem.loaded_specs['qless'].version
18
+ end
19
+
20
+ def self.loaded?
21
+ !defined?(::Qless).nil?
22
+ end
23
+
24
+ def self.compatible?
25
+ super && version >= MINIMUM_VERSION
26
+ end
27
+
28
+ def default_configuration
29
+ Configuration::Settings.new
30
+ end
31
+
32
+ def patcher
33
+ Patcher
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/patcher'
2
+ require 'ddtrace/ext/app_types'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Qless
7
+ # Patcher enables patching of 'qless' 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
+ require_relative 'qless_job'
19
+ require_relative 'tracer_cleaner'
20
+
21
+ # Instrument all Qless Workers
22
+ ::Qless::Workers::BaseWorker.class_eval do
23
+ # These are executed in inverse order of listing here
24
+ include QlessJob
25
+ include TracerCleaner
26
+ end
27
+ end
28
+
29
+ def get_option(option)
30
+ Datadog.configuration[:qless].get_option(option)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,73 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/contrib/analytics'
3
+ require 'qless'
4
+
5
+ module Datadog
6
+ module Contrib
7
+ module Qless
8
+ # Uses Qless job hooks to create traces
9
+ module QlessJob
10
+ def around_perform(job)
11
+ return super unless datadog_configuration && tracer
12
+
13
+ tracer.trace(Ext::SPAN_JOB, span_options) do |span|
14
+ span.resource = job.klass_name
15
+ span.span_type = Datadog::Ext::AppTypes::WORKER
16
+ span.set_tag(Ext::TAG_JOB_ID, job.jid)
17
+ span.set_tag(Ext::TAG_JOB_QUEUE, job.queue_name)
18
+
19
+ tag_job_tags = datadog_configuration[:tag_job_tags]
20
+ span.set_tag(Ext::TAG_JOB_TAGS, job.tags) if tag_job_tags
21
+
22
+ tag_job_data = datadog_configuration[:tag_job_data]
23
+ if tag_job_data && !job.data.empty?
24
+ job_data = job.data.with_indifferent_access
25
+ formatted_data = job_data.except(:tags).map do |key, value|
26
+ "#{key}:#{value}".underscore
27
+ end
28
+
29
+ span.set_tag(Ext::TAG_JOB_DATA, formatted_data)
30
+ end
31
+
32
+ # Set analytics sample rate
33
+ if Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
34
+ Contrib::Analytics.set_sample_rate(span, datadog_configuration[:analytics_sample_rate])
35
+ end
36
+
37
+ # Measure service stats
38
+ Contrib::Analytics.set_measured(span)
39
+
40
+ super
41
+ end
42
+ end
43
+
44
+ def after_fork
45
+ configuration = Datadog.configuration[:qless]
46
+ return if configuration.nil?
47
+
48
+ # Add a pin, marking the job as forked.
49
+ # Used to trigger shutdown in forks for performance reasons.
50
+ # Cleanup happens in the TracerCleaner class
51
+ Datadog::Pin.new(
52
+ configuration[:service_name],
53
+ config: { forked: true }
54
+ ).onto(::Qless)
55
+ end
56
+
57
+ private
58
+
59
+ def span_options
60
+ { service: datadog_configuration[:service_name] }
61
+ end
62
+
63
+ def tracer
64
+ datadog_configuration.tracer
65
+ end
66
+
67
+ def datadog_configuration
68
+ Datadog.configuration[:qless]
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,33 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Qless
4
+ # Shutdown Tracer in forks for performance reasons
5
+ module TracerCleaner
6
+ def around_perform(job)
7
+ return super unless datadog_configuration && tracer
8
+
9
+ super.tap do
10
+ tracer.shutdown! if forked?
11
+ end
12
+ end
13
+
14
+ private
15
+
16
+ def forked?
17
+ pin = Datadog::Pin.get_from(::Qless)
18
+ return false unless pin
19
+
20
+ pin.config[:forked] == true
21
+ end
22
+
23
+ def tracer
24
+ datadog_configuration.tracer
25
+ end
26
+
27
+ def datadog_configuration
28
+ Datadog.configuration[:qless]
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -35,6 +35,7 @@ module Datadog
35
35
  o.default { env_to_bool(Ext::ENV_TAG_DATA_ENABLED, false) }
36
36
  o.lazy
37
37
  end
38
+ option :error_handler, default: Datadog::Tracer::DEFAULT_ON_ERROR
38
39
  end
39
40
  end
40
41
  end
@@ -5,25 +5,25 @@ module Datadog
5
5
  module Que
6
6
  # Que integration constants
7
7
  module Ext
8
- APP = 'que'.freeze
9
- ENV_ANALYTICS_ENABLED = 'DD_TRACE_QUE_ANALYTICS_ENABLED'.freeze
10
- ENV_ANALYTICS_ENABLED_OLD = 'DD_QUE_ANALYTICS_ENABLED'.freeze
11
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_QUE_ANALYTICS_SAMPLE_RATE'.freeze
12
- ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_QUE_ANALYTICS_SAMPLE_RATE'.freeze
13
- ENV_ENABLED = 'DD_TRACE_QUE_ENABLED'.freeze
14
- ENV_TAG_ARGS_ENABLED = 'DD_TRACE_QUE_TAG_ARGS_ENABLED'.freeze
15
- ENV_TAG_DATA_ENABLED = 'DD_TRACE_QUE_TAG_DATA_ENABLED'.freeze
16
- SERVICE_NAME = 'que'.freeze
17
- SPAN_JOB = 'que.job'.freeze
18
- TAG_JOB_ARGS = 'que.job.args'.freeze
19
- TAG_JOB_DATA = 'que.job.data'.freeze
20
- TAG_JOB_ERROR_COUNT = 'que.job.error_count'.freeze
21
- TAG_JOB_EXPIRED_AT = 'que.job.expired_at'.freeze
22
- TAG_JOB_FINISHED_AT = 'que.job.finished_at'.freeze
23
- TAG_JOB_ID = 'que.job.id'.freeze
24
- TAG_JOB_PRIORITY = 'que.job.priority'.freeze
25
- TAG_JOB_QUEUE = 'que.job.queue'.freeze
26
- TAG_JOB_RUN_AT = 'que.job.run_at'.freeze
8
+ APP = 'que'
9
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_QUE_ANALYTICS_ENABLED'
10
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_QUE_ANALYTICS_ENABLED'
11
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_QUE_ANALYTICS_SAMPLE_RATE'
12
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_QUE_ANALYTICS_SAMPLE_RATE'
13
+ ENV_ENABLED = 'DD_TRACE_QUE_ENABLED'
14
+ ENV_TAG_ARGS_ENABLED = 'DD_TRACE_QUE_TAG_ARGS_ENABLED'
15
+ ENV_TAG_DATA_ENABLED = 'DD_TRACE_QUE_TAG_DATA_ENABLED'
16
+ SERVICE_NAME = 'que'
17
+ SPAN_JOB = 'que.job'
18
+ TAG_JOB_ARGS = 'que.job.args'
19
+ TAG_JOB_DATA = 'que.job.data'
20
+ TAG_JOB_ERROR_COUNT = 'que.job.error_count'
21
+ TAG_JOB_EXPIRED_AT = 'que.job.expired_at'
22
+ TAG_JOB_FINISHED_AT = 'que.job.finished_at'
23
+ TAG_JOB_ID = 'que.job.id'
24
+ TAG_JOB_PRIORITY = 'que.job.priority'
25
+ TAG_JOB_QUEUE = 'que.job.queue'
26
+ TAG_JOB_RUN_AT = 'que.job.run_at'
27
27
  end
28
28
  end
29
29
  end