ddtrace 0.44.0 → 0.48.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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +183 -15
  3. data/.circleci/images/primary/Dockerfile-2.0.0 +11 -1
  4. data/.circleci/images/primary/Dockerfile-2.1.10 +11 -1
  5. data/.circleci/images/primary/Dockerfile-2.2.10 +11 -1
  6. data/.circleci/images/primary/Dockerfile-2.3.8 +10 -0
  7. data/.circleci/images/primary/Dockerfile-2.4.6 +10 -0
  8. data/.circleci/images/primary/Dockerfile-2.5.6 +10 -0
  9. data/.circleci/images/primary/Dockerfile-2.6.4 +10 -0
  10. data/.circleci/images/primary/Dockerfile-2.7.0 +10 -0
  11. data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +88 -0
  12. data/.circleci/images/primary/{Dockerfile-jruby-9.2 → Dockerfile-jruby-9.2.0.0} +1 -5
  13. data/.circleci/images/primary/Dockerfile-truffleruby-21.0.0 +73 -0
  14. data/.github/workflows/create-next-milestone.yml +2 -2
  15. data/.gitlab-ci.yml +18 -18
  16. data/.rubocop.yml +269 -7
  17. data/.rubocop_todo.yml +438 -0
  18. data/.simplecov +6 -0
  19. data/Appraisals +87 -9
  20. data/CHANGELOG.md +238 -1
  21. data/Gemfile +63 -3
  22. data/LICENSE-3rdparty.csv +2 -0
  23. data/README.md +1 -0
  24. data/Rakefile +65 -25
  25. data/bin/ddtracerb +15 -0
  26. data/ddtrace.gemspec +9 -36
  27. data/docker-compose.yml +75 -7
  28. data/docs/DevelopmentGuide.md +28 -0
  29. data/docs/GettingStarted.md +162 -68
  30. data/docs/ProfilingDevelopment.md +88 -0
  31. data/integration/README.md +67 -0
  32. data/integration/apps/rack/.dockerignore +1 -0
  33. data/integration/apps/rack/.envrc.sample +1 -0
  34. data/integration/apps/rack/.gitignore +4 -0
  35. data/integration/apps/rack/.rspec +1 -0
  36. data/integration/apps/rack/Dockerfile +28 -0
  37. data/integration/apps/rack/Dockerfile-ci +11 -0
  38. data/integration/apps/rack/Gemfile +24 -0
  39. data/integration/apps/rack/README.md +93 -0
  40. data/integration/apps/rack/app/acme.rb +80 -0
  41. data/integration/apps/rack/app/datadog.rb +17 -0
  42. data/integration/apps/rack/bin/run +22 -0
  43. data/integration/apps/rack/bin/setup +17 -0
  44. data/integration/apps/rack/bin/test +24 -0
  45. data/integration/apps/rack/config.ru +6 -0
  46. data/integration/apps/rack/config/puma.rb +14 -0
  47. data/integration/apps/rack/config/unicorn.rb +23 -0
  48. data/integration/apps/rack/docker-compose.ci.yml +62 -0
  49. data/integration/apps/rack/docker-compose.yml +78 -0
  50. data/integration/apps/rack/script/build-images +38 -0
  51. data/integration/apps/rack/script/ci +50 -0
  52. data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
  53. data/integration/apps/rack/spec/spec_helper.rb +16 -0
  54. data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
  55. data/integration/apps/rails-five/.dockerignore +1 -0
  56. data/integration/apps/rails-five/.env +3 -0
  57. data/integration/apps/rails-five/.envrc.sample +1 -0
  58. data/integration/apps/rails-five/.gitignore +30 -0
  59. data/integration/apps/rails-five/Dockerfile +25 -0
  60. data/integration/apps/rails-five/Dockerfile-ci +11 -0
  61. data/integration/apps/rails-five/Gemfile +104 -0
  62. data/integration/apps/rails-five/README.md +94 -0
  63. data/integration/apps/rails-five/Rakefile +6 -0
  64. data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
  65. data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
  66. data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
  67. data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
  68. data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
  69. data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
  70. data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
  71. data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
  72. data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
  73. data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
  74. data/integration/apps/rails-five/app/models/application_record.rb +3 -0
  75. data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
  76. data/integration/apps/rails-five/app/models/test.rb +2 -0
  77. data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
  78. data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
  79. data/integration/apps/rails-five/bin/bundle +3 -0
  80. data/integration/apps/rails-five/bin/rails +9 -0
  81. data/integration/apps/rails-five/bin/rake +9 -0
  82. data/integration/apps/rails-five/bin/run +24 -0
  83. data/integration/apps/rails-five/bin/setup +27 -0
  84. data/integration/apps/rails-five/bin/spring +17 -0
  85. data/integration/apps/rails-five/bin/test +21 -0
  86. data/integration/apps/rails-five/bin/update +28 -0
  87. data/integration/apps/rails-five/config.ru +5 -0
  88. data/integration/apps/rails-five/config/application.rb +97 -0
  89. data/integration/apps/rails-five/config/boot.rb +4 -0
  90. data/integration/apps/rails-five/config/cable.yml +10 -0
  91. data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
  92. data/integration/apps/rails-five/config/database.yml +28 -0
  93. data/integration/apps/rails-five/config/environment.rb +5 -0
  94. data/integration/apps/rails-five/config/environments/development.rb +51 -0
  95. data/integration/apps/rails-five/config/environments/production.rb +82 -0
  96. data/integration/apps/rails-five/config/environments/test.rb +43 -0
  97. data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
  98. data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
  99. data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
  100. data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
  101. data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
  102. data/integration/apps/rails-five/config/locales/en.yml +33 -0
  103. data/integration/apps/rails-five/config/puma.rb +24 -0
  104. data/integration/apps/rails-five/config/routes.rb +11 -0
  105. data/integration/apps/rails-five/config/spring.rb +6 -0
  106. data/integration/apps/rails-five/config/unicorn.rb +29 -0
  107. data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
  108. data/integration/apps/rails-five/db/schema.rb +23 -0
  109. data/integration/apps/rails-five/db/seeds.rb +7 -0
  110. data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
  111. data/integration/apps/rails-five/docker-compose.yml +100 -0
  112. data/integration/apps/rails-five/lib/tasks/.keep +0 -0
  113. data/integration/apps/rails-five/log/.keep +0 -0
  114. data/integration/apps/rails-five/public/robots.txt +1 -0
  115. data/integration/apps/rails-five/script/build-images +35 -0
  116. data/integration/apps/rails-five/script/ci +50 -0
  117. data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
  118. data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
  119. data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
  120. data/integration/apps/rails-five/storage/.keep +0 -0
  121. data/integration/apps/rails-five/tmp/.keep +0 -0
  122. data/integration/apps/rails-five/vendor/.keep +0 -0
  123. data/integration/apps/ruby/.dockerignore +1 -0
  124. data/integration/apps/ruby/.envrc.sample +1 -0
  125. data/integration/apps/ruby/.gitignore +2 -0
  126. data/integration/apps/ruby/Dockerfile +25 -0
  127. data/integration/apps/ruby/Dockerfile-ci +11 -0
  128. data/integration/apps/ruby/Gemfile +11 -0
  129. data/integration/apps/ruby/README.md +70 -0
  130. data/integration/apps/ruby/agent.yaml +3 -0
  131. data/integration/apps/ruby/app/datadog.rb +13 -0
  132. data/integration/apps/ruby/app/fibonacci.rb +58 -0
  133. data/integration/apps/ruby/bin/run +20 -0
  134. data/integration/apps/ruby/bin/setup +17 -0
  135. data/integration/apps/ruby/bin/test +21 -0
  136. data/integration/apps/ruby/docker-compose.ci.yml +51 -0
  137. data/integration/apps/ruby/docker-compose.yml +63 -0
  138. data/integration/apps/ruby/script/build-images +38 -0
  139. data/integration/apps/ruby/script/ci +50 -0
  140. data/integration/images/agent/Dockerfile +2 -0
  141. data/integration/images/agent/agent.yaml +3 -0
  142. data/integration/images/include/datadog/analyzer.rb +71 -0
  143. data/integration/images/include/datadog/demo_env.rb +101 -0
  144. data/integration/images/include/http-health-check +33 -0
  145. data/integration/images/ruby/2.0/Dockerfile +54 -0
  146. data/integration/images/ruby/2.1/Dockerfile +54 -0
  147. data/integration/images/ruby/2.2/Dockerfile +54 -0
  148. data/integration/images/ruby/2.3/Dockerfile +70 -0
  149. data/integration/images/ruby/2.4/Dockerfile +54 -0
  150. data/integration/images/ruby/2.5/Dockerfile +54 -0
  151. data/integration/images/ruby/2.6/Dockerfile +54 -0
  152. data/integration/images/ruby/2.7/Dockerfile +54 -0
  153. data/integration/images/ruby/3.0/Dockerfile +54 -0
  154. data/integration/images/wrk/Dockerfile +33 -0
  155. data/integration/images/wrk/scripts/entrypoint.sh +17 -0
  156. data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
  157. data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
  158. data/integration/script/build-images +43 -0
  159. data/lib/ddtrace.rb +8 -5
  160. data/lib/ddtrace/analytics.rb +2 -0
  161. data/lib/ddtrace/auto_instrument.rb +3 -0
  162. data/lib/ddtrace/auto_instrument_base.rb +6 -0
  163. data/lib/ddtrace/buffer.rb +4 -4
  164. data/lib/ddtrace/configuration.rb +121 -26
  165. data/lib/ddtrace/configuration/base.rb +1 -1
  166. data/lib/ddtrace/configuration/components.rb +87 -5
  167. data/lib/ddtrace/configuration/option_definition.rb +1 -3
  168. data/lib/ddtrace/configuration/options.rb +4 -7
  169. data/lib/ddtrace/configuration/settings.rb +48 -3
  170. data/lib/ddtrace/context.rb +5 -6
  171. data/lib/ddtrace/context_provider.rb +0 -1
  172. data/lib/ddtrace/contrib/action_cable/event.rb +1 -0
  173. data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
  174. data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -3
  175. data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
  176. data/lib/ddtrace/contrib/action_view/event.rb +1 -1
  177. data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
  178. data/lib/ddtrace/contrib/action_view/utils.rb +1 -1
  179. data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +30 -0
  180. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +107 -18
  181. data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
  182. data/lib/ddtrace/contrib/active_record/utils.rb +57 -20
  183. data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
  184. data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -1
  185. data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -0
  186. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +9 -5
  187. data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
  188. data/lib/ddtrace/contrib/aws/patcher.rb +1 -0
  189. data/lib/ddtrace/contrib/aws/services.rb +2 -0
  190. data/lib/ddtrace/contrib/configurable.rb +63 -39
  191. data/lib/ddtrace/contrib/configuration/resolver.rb +70 -5
  192. data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +19 -20
  193. data/lib/ddtrace/contrib/configuration/settings.rb +7 -6
  194. data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -10
  195. data/lib/ddtrace/contrib/cucumber/ext.rb +0 -2
  196. data/lib/ddtrace/contrib/cucumber/formatter.rb +5 -11
  197. data/lib/ddtrace/contrib/cucumber/integration.rb +5 -0
  198. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -38
  199. data/lib/ddtrace/contrib/delayed_job/plugin.rb +0 -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 +10 -9
  203. data/lib/ddtrace/contrib/excon/middleware.rb +2 -6
  204. data/lib/ddtrace/contrib/extensions.rb +53 -3
  205. data/lib/ddtrace/contrib/faraday/middleware.rb +1 -3
  206. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -36
  207. data/lib/ddtrace/contrib/grape/endpoint.rb +8 -15
  208. data/lib/ddtrace/contrib/grape/patcher.rb +0 -42
  209. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +8 -8
  210. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +1 -0
  211. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -36
  212. data/lib/ddtrace/contrib/http/circuit_breaker.rb +1 -3
  213. data/lib/ddtrace/contrib/http/instrumentation.rb +5 -5
  214. data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
  215. data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
  216. data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
  217. data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
  218. data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
  219. data/lib/ddtrace/contrib/httprb/instrumentation.rb +14 -20
  220. data/lib/ddtrace/contrib/httprb/patcher.rb +5 -2
  221. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -0
  222. data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -3
  223. data/lib/ddtrace/contrib/patchable.rb +18 -7
  224. data/lib/ddtrace/contrib/patcher.rb +9 -6
  225. data/lib/ddtrace/contrib/presto/patcher.rb +5 -2
  226. data/lib/ddtrace/contrib/qless/qless_job.rb +1 -0
  227. data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +1 -0
  228. data/lib/ddtrace/contrib/que/ext.rb +19 -19
  229. data/lib/ddtrace/contrib/que/tracer.rb +1 -1
  230. data/lib/ddtrace/contrib/racecar/event.rb +1 -0
  231. data/lib/ddtrace/contrib/rack/configuration/settings.rb +3 -3
  232. data/lib/ddtrace/contrib/rack/integration.rb +7 -0
  233. data/lib/ddtrace/contrib/rack/middlewares.rb +6 -11
  234. data/lib/ddtrace/contrib/rack/patcher.rb +1 -3
  235. data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
  236. data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
  237. data/lib/ddtrace/contrib/rails/patcher.rb +6 -2
  238. data/lib/ddtrace/contrib/rails/utils.rb +4 -0
  239. data/lib/ddtrace/contrib/rake/instrumentation.rb +4 -2
  240. data/lib/ddtrace/contrib/rake/integration.rb +1 -1
  241. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +11 -4
  242. data/lib/ddtrace/contrib/redis/quantize.rb +1 -0
  243. data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
  244. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +6 -7
  245. data/lib/ddtrace/contrib/registry.rb +2 -2
  246. data/lib/ddtrace/contrib/resque/configuration/settings.rb +17 -1
  247. data/lib/ddtrace/contrib/resque/integration.rb +1 -1
  248. data/lib/ddtrace/contrib/resque/patcher.rb +4 -4
  249. data/lib/ddtrace/contrib/resque/resque_job.rb +24 -1
  250. data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -3
  251. data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -10
  252. data/lib/ddtrace/contrib/rspec/example.rb +24 -10
  253. data/lib/ddtrace/contrib/rspec/ext.rb +0 -3
  254. data/lib/ddtrace/contrib/rspec/integration.rb +6 -1
  255. data/lib/ddtrace/contrib/rspec/patcher.rb +0 -2
  256. data/lib/ddtrace/contrib/sequel/utils.rb +5 -6
  257. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
  258. data/lib/ddtrace/contrib/shoryuken/tracer.rb +7 -4
  259. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +2 -7
  260. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -1
  261. data/lib/ddtrace/contrib/sinatra/env.rb +1 -3
  262. data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
  263. data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -3
  264. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +3 -3
  265. data/lib/ddtrace/contrib/sneakers/ext.rb +11 -11
  266. data/lib/ddtrace/contrib/sneakers/tracer.rb +2 -4
  267. data/lib/ddtrace/contrib/status_code_matcher.rb +5 -3
  268. data/lib/ddtrace/correlation.rb +1 -0
  269. data/lib/ddtrace/diagnostics/environment_logger.rb +3 -2
  270. data/lib/ddtrace/distributed_tracing/headers/headers.rb +1 -0
  271. data/lib/ddtrace/distributed_tracing/headers/helpers.rb +1 -3
  272. data/lib/ddtrace/error.rb +2 -0
  273. data/lib/ddtrace/ext/ci.rb +43 -10
  274. data/lib/ddtrace/ext/distributed.rb +1 -1
  275. data/lib/ddtrace/ext/git.rb +0 -1
  276. data/lib/ddtrace/ext/http.rb +1 -1
  277. data/lib/ddtrace/ext/profiling.rb +52 -0
  278. data/lib/ddtrace/ext/runtime.rb +3 -1
  279. data/lib/ddtrace/ext/transport.rb +1 -0
  280. data/lib/ddtrace/forced_tracing.rb +2 -0
  281. data/lib/ddtrace/logger.rb +1 -1
  282. data/lib/ddtrace/metrics.rb +14 -6
  283. data/lib/ddtrace/opentracer/distributed_headers.rb +3 -0
  284. data/lib/ddtrace/opentracer/span.rb +2 -6
  285. data/lib/ddtrace/opentracer/thread_local_scope.rb +1 -0
  286. data/lib/ddtrace/patcher.rb +25 -4
  287. data/lib/ddtrace/pin.rb +8 -61
  288. data/lib/ddtrace/pipeline/span_filter.rb +1 -1
  289. data/lib/ddtrace/profiling.rb +54 -0
  290. data/lib/ddtrace/profiling/backtrace_location.rb +32 -0
  291. data/lib/ddtrace/profiling/buffer.rb +41 -0
  292. data/lib/ddtrace/profiling/collectors/stack.rb +253 -0
  293. data/lib/ddtrace/profiling/encoding/profile.rb +31 -0
  294. data/lib/ddtrace/profiling/event.rb +13 -0
  295. data/lib/ddtrace/profiling/events/stack.rb +102 -0
  296. data/lib/ddtrace/profiling/exporter.rb +23 -0
  297. data/lib/ddtrace/profiling/ext/cpu.rb +54 -0
  298. data/lib/ddtrace/profiling/ext/cthread.rb +134 -0
  299. data/lib/ddtrace/profiling/ext/forking.rb +97 -0
  300. data/lib/ddtrace/profiling/flush.rb +41 -0
  301. data/lib/ddtrace/profiling/pprof/builder.rb +121 -0
  302. data/lib/ddtrace/profiling/pprof/converter.rb +85 -0
  303. data/lib/ddtrace/profiling/pprof/message_set.rb +12 -0
  304. data/lib/ddtrace/profiling/pprof/payload.rb +18 -0
  305. data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
  306. data/lib/ddtrace/profiling/pprof/pprof_pb.rb +81 -0
  307. data/lib/ddtrace/profiling/pprof/stack_sample.rb +90 -0
  308. data/lib/ddtrace/profiling/pprof/string_table.rb +10 -0
  309. data/lib/ddtrace/profiling/pprof/template.rb +114 -0
  310. data/lib/ddtrace/profiling/preload.rb +3 -0
  311. data/lib/ddtrace/profiling/profiler.rb +28 -0
  312. data/lib/ddtrace/profiling/recorder.rb +87 -0
  313. data/lib/ddtrace/profiling/scheduler.rb +84 -0
  314. data/lib/ddtrace/profiling/tasks/setup.rb +77 -0
  315. data/lib/ddtrace/profiling/transport/client.rb +12 -0
  316. data/lib/ddtrace/profiling/transport/http.rb +122 -0
  317. data/lib/ddtrace/profiling/transport/http/api.rb +43 -0
  318. data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +90 -0
  319. data/lib/ddtrace/profiling/transport/http/api/instance.rb +36 -0
  320. data/lib/ddtrace/profiling/transport/http/api/spec.rb +40 -0
  321. data/lib/ddtrace/profiling/transport/http/builder.rb +28 -0
  322. data/lib/ddtrace/profiling/transport/http/client.rb +33 -0
  323. data/lib/ddtrace/profiling/transport/http/response.rb +21 -0
  324. data/lib/ddtrace/profiling/transport/io.rb +30 -0
  325. data/lib/ddtrace/profiling/transport/io/client.rb +27 -0
  326. data/lib/ddtrace/profiling/transport/io/response.rb +16 -0
  327. data/lib/ddtrace/profiling/transport/parcel.rb +17 -0
  328. data/lib/ddtrace/profiling/transport/request.rb +15 -0
  329. data/lib/ddtrace/profiling/transport/response.rb +8 -0
  330. data/lib/ddtrace/propagation/grpc_propagator.rb +1 -0
  331. data/lib/ddtrace/propagation/http_propagator.rb +17 -2
  332. data/lib/ddtrace/quantization/http.rb +1 -0
  333. data/lib/ddtrace/runtime/cgroup.rb +2 -2
  334. data/lib/ddtrace/runtime/container.rb +32 -26
  335. data/lib/ddtrace/runtime/identity.rb +8 -0
  336. data/lib/ddtrace/sampler.rb +1 -1
  337. data/lib/ddtrace/sampling/rule_sampler.rb +4 -9
  338. data/lib/ddtrace/span.rb +7 -7
  339. data/lib/ddtrace/sync_writer.rb +12 -12
  340. data/lib/ddtrace/tasks/exec.rb +48 -0
  341. data/lib/ddtrace/tasks/help.rb +14 -0
  342. data/lib/ddtrace/tracer.rb +28 -5
  343. data/lib/ddtrace/transport/http.rb +15 -8
  344. data/lib/ddtrace/transport/http/adapters/net.rb +27 -8
  345. data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
  346. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
  347. data/lib/ddtrace/transport/http/builder.rb +7 -1
  348. data/lib/ddtrace/transport/http/env.rb +8 -0
  349. data/lib/ddtrace/transport/http/traces.rb +2 -3
  350. data/lib/ddtrace/transport/io.rb +1 -1
  351. data/lib/ddtrace/transport/io/client.rb +15 -8
  352. data/lib/ddtrace/transport/io/response.rb +1 -3
  353. data/lib/ddtrace/transport/io/traces.rb +6 -0
  354. data/lib/ddtrace/transport/parcel.rb +4 -0
  355. data/lib/ddtrace/transport/traces.rb +18 -1
  356. data/lib/ddtrace/utils/compression.rb +27 -0
  357. data/lib/ddtrace/utils/object_set.rb +41 -0
  358. data/lib/ddtrace/utils/only_once.rb +40 -0
  359. data/lib/ddtrace/utils/sequence.rb +17 -0
  360. data/lib/ddtrace/utils/string_table.rb +45 -0
  361. data/lib/ddtrace/utils/time.rb +32 -1
  362. data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
  363. data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
  364. data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
  365. data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
  366. data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
  367. data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
  368. data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
  369. data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
  370. data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
  371. data/lib/ddtrace/version.rb +3 -1
  372. data/lib/ddtrace/workers.rb +5 -0
  373. data/lib/ddtrace/workers/async.rb +11 -3
  374. data/lib/ddtrace/workers/loop.rb +17 -3
  375. data/lib/ddtrace/workers/polling.rb +1 -0
  376. data/lib/ddtrace/workers/queue.rb +1 -0
  377. data/lib/ddtrace/workers/runtime_metrics.rb +14 -1
  378. data/lib/ddtrace/workers/trace_writer.rb +10 -10
  379. data/lib/ddtrace/writer.rb +7 -4
  380. metadata +213 -379
  381. data/lib/ddtrace/augmentation.rb +0 -13
  382. data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
  383. data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
  384. data/lib/ddtrace/augmentation/shim.rb +0 -102
  385. data/lib/ddtrace/contrib/rspec/example_group.rb +0 -61
  386. data/lib/ddtrace/monkey.rb +0 -58
@@ -5,33 +5,32 @@ module Datadog
5
5
  module Configuration
6
6
  # Resolves a value to a configuration key
7
7
  module Resolvers
8
- # Matches strings against Regexps.
9
- class PatternResolver < Datadog::Contrib::Configuration::Resolver
10
- def resolve(name)
11
- return if patterns.empty?
8
+ # Matches Strings and Regexps against `object.to_s` objects
9
+ # and Procs against plain objects.
10
+ class PatternResolver < Contrib::Configuration::Resolver
11
+ def resolve(value)
12
+ return if configurations.empty?
12
13
 
13
14
  # Try to find a matching pattern
14
- matching_pattern = patterns.find do |pattern|
15
- if pattern.is_a?(Proc)
16
- (pattern === name)
17
- else
18
- (pattern === name.to_s) ||
19
- (pattern == name) # Only required during configuration time.
20
- end
15
+ _, config = configurations.reverse_each.find do |matcher, _|
16
+ matcher === if matcher.is_a?(Proc)
17
+ value
18
+ else
19
+ value.to_s
20
+ end
21
21
  end
22
22
 
23
- # Return match or default
24
- matching_pattern
23
+ config
25
24
  end
26
25
 
27
- def add(pattern)
28
- patterns << (pattern.is_a?(Regexp) || pattern.is_a?(Proc) ? pattern : pattern.to_s)
29
- end
30
-
31
- private
26
+ protected
32
27
 
33
- def patterns
34
- @patterns ||= Set.new
28
+ def parse_matcher(matcher)
29
+ if matcher.is_a?(Regexp) || matcher.is_a?(Proc)
30
+ matcher
31
+ else
32
+ matcher.to_s
33
+ end
35
34
  end
36
35
  end
37
36
  end
@@ -1,4 +1,5 @@
1
1
  require 'ddtrace/configuration/base'
2
+ require 'ddtrace/utils/only_once'
2
3
 
3
4
  module Datadog
4
5
  module Contrib
@@ -7,6 +8,8 @@ module Datadog
7
8
  class Settings
8
9
  include Datadog::Configuration::Base
9
10
 
11
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
12
+
10
13
  option :analytics_enabled, default: false
11
14
  option :analytics_sample_rate, default: 1.0
12
15
  option :enabled, default: true
@@ -14,7 +17,7 @@ module Datadog
14
17
  option :tracer do |o|
15
18
  o.delegate_to { Datadog.tracer }
16
19
  o.on_set do |_value|
17
- log_deprecation_warning(:tracer)
20
+ log_deprecation_warning
18
21
  end
19
22
  end
20
23
 
@@ -41,11 +44,9 @@ module Datadog
41
44
  the correct tracer internally.
42
45
  ).freeze
43
46
 
44
- include Datadog::Patcher # DEV includes #do_once here. We should move that logic to a generic component.
45
-
46
- def log_deprecation_warning(method_name)
47
- do_once(method_name) do
48
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}:#{caller.join("\n")}")
47
+ def log_deprecation_warning
48
+ DEPRECATION_WARN_ONLY_ONCE.run do
49
+ Datadog.logger.warn("tracer:#{DEPRECATION_WARNING}:#{caller.join("\n")}")
49
50
  end
50
51
  end
51
52
  end
@@ -12,16 +12,6 @@ module Datadog
12
12
  o.lazy
13
13
  end
14
14
 
15
- option :analytics_enabled do |o|
16
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, true) }
17
- o.lazy
18
- end
19
-
20
- option :analytics_sample_rate do |o|
21
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
22
- o.lazy
23
- end
24
-
25
15
  option :service_name do |o|
26
16
  o.default { Datadog.configuration.service || Ext::SERVICE_NAME }
27
17
  o.lazy
@@ -4,8 +4,6 @@ module Datadog
4
4
  # Cucumber integration constants
5
5
  module Ext
6
6
  APP = 'cucumber'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_TRACE_CUCUMBER_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_CUCUMBER_ANALYTICS_SAMPLE_RATE'.freeze
9
7
  ENV_ENABLED = 'DD_TRACE_CUCUMBER_ENABLED'.freeze
10
8
  ENV_OPERATION_NAME = 'DD_TRACE_CUCUMBER_OPERATION_NAME'.freeze
11
9
  FRAMEWORK = 'cucumber'.freeze
@@ -9,10 +9,8 @@ module Datadog
9
9
  module Cucumber
10
10
  # Defines collection of instrumented Cucumber events
11
11
  class Formatter
12
- attr_reader :config
12
+ attr_reader :config, :current_feature_span, :current_step_span
13
13
  private :config
14
-
15
- attr_reader :current_feature_span, :current_step_span
16
14
  private :current_feature_span, :current_step_span
17
15
 
18
16
  def initialize(config)
@@ -43,17 +41,13 @@ module Datadog
43
41
  @current_feature_span.set_tag(Datadog::Ext::Test::TAG_TYPE, Ext::TEST_TYPE)
44
42
  @current_feature_span.set_tag(Datadog::Ext::Test::TAG_SPAN_KIND, Datadog::Ext::AppTypes::TEST)
45
43
 
46
- # Set analytics sample rate
47
- if Datadog::Contrib::Analytics.enabled?(configuration[:analytics_enabled])
48
- Datadog::Contrib::Analytics.set_sample_rate(@current_feature_span, configuration[:analytics_sample_rate])
49
- end
50
-
51
44
  # Measure service stats
52
45
  Contrib::Analytics.set_measured(@current_feature_span)
53
46
  end
54
47
 
55
48
  def on_test_case_finished(event)
56
49
  return if @current_feature_span.nil?
50
+
57
51
  @current_feature_span.status = 1 if event.result.failed?
58
52
  @current_feature_span.set_tag(Datadog::Ext::Test::TAG_STATUS, status_from_result(event.result))
59
53
  @current_feature_span.finish
@@ -69,9 +63,8 @@ module Datadog
69
63
 
70
64
  def on_test_step_finished(event)
71
65
  return if @current_step_span.nil?
72
- unless event.result.passed?
73
- @current_step_span.set_error event.result.exception
74
- end
66
+
67
+ @current_step_span.set_error event.result.exception unless event.result.passed?
75
68
  @current_step_span.set_tag(Datadog::Ext::Test::TAG_STATUS, status_from_result(event.result))
76
69
  @current_step_span.finish
77
70
  end
@@ -84,6 +77,7 @@ module Datadog
84
77
  elsif result.ok?
85
78
  return Datadog::Ext::Test::Status::PASS
86
79
  end
80
+
87
81
  Datadog::Ext::Test::Status::FAIL
88
82
  end
89
83
 
@@ -27,6 +27,11 @@ module Datadog
27
27
  super && version >= MINIMUM_VERSION
28
28
  end
29
29
 
30
+ # test environments should not auto instrument test libraries
31
+ def auto_instrument?
32
+ false
33
+ end
34
+
30
35
  def default_configuration
31
36
  Configuration::Settings.new
32
37
  end
@@ -17,46 +17,8 @@ module Datadog
17
17
  end
18
18
 
19
19
  def patch
20
- add_pin!
21
20
  ::Dalli::Server.send(:include, Instrumentation)
22
21
  end
23
-
24
- # DEPRECATED: Only kept for users still using `Dalli.datadog_pin` to configure.
25
- # Replaced by configuration API, i.e. `c.use :dalli`.
26
- def add_pin!
27
- DeprecatedPin
28
- .new(
29
- get_option(:service_name),
30
- app: Ext::APP,
31
- app_type: Datadog::Ext::AppTypes::CACHE,
32
- tracer: -> { get_option(:tracer) }
33
- ).onto(::Dalli)
34
- end
35
-
36
- def get_option(option)
37
- Datadog.configuration[:dalli].get_option(option)
38
- end
39
-
40
- # Implementation of deprecated Pin, which raises warnings when accessed.
41
- # To be removed when support for Datadog::Pin with Dalli is removed.
42
- class DeprecatedPin < Datadog::Pin
43
- include Datadog::DeprecatedPin
44
-
45
- DEPRECATION_WARNING = %(
46
- Use of Datadog::Pin with Dalli is DEPRECATED.
47
- Upgrade to the configuration API using the migration guide here:
48
- https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
49
-
50
- def service_name=(service_name)
51
- Datadog.configuration[:dalli][:service_name] = service_name
52
- end
53
-
54
- def log_deprecation_warning(method_name)
55
- do_once(method_name) do
56
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
57
- end
58
- end
59
- end
60
22
  end
61
23
  end
62
24
  end
@@ -12,7 +12,6 @@ module Datadog
12
12
 
13
13
  tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name(job),
14
14
  on_error: configuration[:error_handler]) do |span|
15
-
16
15
  set_sample_rate(span)
17
16
 
18
17
  # Measure service stats
@@ -1,3 +1,4 @@
1
+ require 'ddtrace/patcher'
1
2
  require 'ddtrace/contrib/patcher'
2
3
  require 'ddtrace/ext/app_types'
3
4
  require 'ddtrace/ext/integration'
@@ -17,7 +17,7 @@ module Datadog
17
17
 
18
18
  def format_url(url)
19
19
  sanitize_fragment_with_id(url)
20
- .gsub(/(?:[\d]+)/, PLACEHOLDER)
20
+ .gsub(/(?:\d+)/, PLACEHOLDER)
21
21
  end
22
22
 
23
23
  def format_body(body, options = {})
@@ -60,6 +60,7 @@ module Datadog
60
60
  # If JSON parsing fails, it prints fail_value.
61
61
  def reserialize_json(string, fail_value = PLACEHOLDER)
62
62
  return string unless block_given?
63
+
63
64
  begin
64
65
  JSON.dump(yield(JSON.parse(string)))
65
66
  rescue JSON::ParserError
@@ -72,7 +73,7 @@ module Datadog
72
73
  # This is meant as simple heuristic that attempts to detect if particular fragment
73
74
  # represents document Id. This is meant to reduce the cardinality in most frequent cases.
74
75
  def sanitize_fragment_with_id(url)
75
- url.gsub(%r{^(/?[^/]*/[^/]*/)(?:[^\?/\d]*[\d]+[^\?/]*)}, ID_PLACEHOLDER)
76
+ url.gsub(%r{^(/?[^/]*/[^/]*/)(?:[^?/\d]*\d+[^?/]*)}, ID_PLACEHOLDER)
76
77
  end
77
78
  end
78
79
  end
@@ -13,8 +13,8 @@ module Datadog
13
13
  def self.included(base)
14
14
  base.send(:prepend, InstanceMethods)
15
15
  end
16
+
16
17
  # InstanceMethods - implementing instrumentation
17
- # rubocop:disable Metrics/ModuleLength
18
18
  module InstanceMethods
19
19
  include Datadog::Contrib::HttpAnnotationHelper
20
20
 
@@ -36,12 +36,14 @@ module Datadog
36
36
  def perform
37
37
  load_datadog_configuration_for(url)
38
38
  return super unless tracer_enabled?
39
+
39
40
  datadog_before_request
40
41
  super
41
42
  end
42
43
 
43
44
  def complete
44
45
  return super unless tracer_enabled?
46
+
45
47
  begin
46
48
  response_options = mirror.options
47
49
  response_code = (response_options[:response_code] || response_options[:code]).to_i
@@ -100,20 +102,20 @@ module Datadog
100
102
  def datadog_tag_request
101
103
  span = @datadog_span
102
104
  method = Ext::NOT_APPLICABLE_METHOD
103
- if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
104
- method = @datadog_method.to_s
105
- end
105
+ method = @datadog_method.to_s if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
106
106
  span.resource = method
107
107
  # Tag as an external peer service
108
108
  span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
109
109
  # Set analytics sample rate
110
110
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
111
111
 
112
- return unless uri
113
- span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
112
+ this_uri = uri
113
+ return unless this_uri
114
+
115
+ span.set_tag(Datadog::Ext::HTTP::URL, this_uri.path)
114
116
  span.set_tag(Datadog::Ext::HTTP::METHOD, method)
115
- span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
116
- span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
117
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, this_uri.host)
118
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, this_uri.port)
117
119
  end
118
120
 
119
121
  def set_span_error_message(message)
@@ -124,7 +126,6 @@ module Datadog
124
126
 
125
127
  def uri
126
128
  URI.parse(url)
127
- # rubocop:disable Lint/HandleExceptions
128
129
  rescue URI::InvalidURIError
129
130
  end
130
131
 
@@ -119,9 +119,7 @@ module Datadog
119
119
  span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
120
120
 
121
121
  # Set analytics sample rate
122
- if analytics_enabled?
123
- Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
124
- end
122
+ Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
125
123
 
126
124
  span.set_tag(Datadog::Ext::HTTP::URL, datum[:path])
127
125
  span.set_tag(Datadog::Ext::HTTP::METHOD, datum[:method].to_s.upcase)
@@ -136,9 +134,7 @@ module Datadog
136
134
 
137
135
  if datum.key?(:response)
138
136
  response = datum[:response]
139
- if error_handler.call(response)
140
- span.set_error(["Error #{response[:status]}", response[:body]])
141
- end
137
+ span.set_error(["Error #{response[:status]}", response[:body]]) if error_handler.call(response)
142
138
  span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response[:status])
143
139
  end
144
140
  span.set_error(datum[:error]) if datum.key?(:error)
@@ -27,8 +27,27 @@ module Datadog
27
27
 
28
28
  # Activate integrations
29
29
  if target.respond_to?(:integrations_pending_activation)
30
+ reduce_verbosity = target.respond_to?(:reduce_verbosity?) ? target.reduce_verbosity? : false
30
31
  target.integrations_pending_activation.each do |integration|
31
- integration.patch if integration.respond_to?(:patch)
32
+ next unless integration.respond_to?(:patch)
33
+
34
+ # integration.patch returns either true or a hash of details on why patching failed
35
+ patch_results = integration.patch
36
+
37
+ next if patch_results == true
38
+
39
+ # if patching failed, only log output if verbosity is unset
40
+ # or if patching failure is due to compatibility or integration specific reasons
41
+ next unless !reduce_verbosity ||
42
+ ((patch_results[:available] && patch_results[:loaded]) &&
43
+ (!patch_results[:compatible] || !patch_results[:patchable]))
44
+
45
+ desc = "Available?: #{patch_results[:available]}"
46
+ desc += ", Loaded? #{patch_results[:loaded]}"
47
+ desc += ", Compatible? #{patch_results[:compatible]}"
48
+ desc += ", Patchable? #{patch_results[:patchable]}"
49
+
50
+ Datadog.logger.warn("Unable to patch #{patch_results[:name]} (#{desc})")
32
51
  end
33
52
 
34
53
  target.integrations_pending_activation.clear
@@ -48,9 +67,32 @@ module Datadog
48
67
  end
49
68
  end
50
69
 
51
- def [](integration_name, configuration_name = :default)
70
+ # For the provided `integration_name`, resolves a matching configuration
71
+ # for the provided integration from an integration-specific `key`.
72
+ #
73
+ # How the matching is performed is integration-specific.
74
+ #
75
+ # @param [Symbol] integration_name the integration name
76
+ # @param [Object] key the integration-specific lookup key
77
+ # @return [Datadog::Contrib::Configuration::Settings]
78
+ def [](integration_name, key = :default)
79
+ integration = fetch_integration(integration_name)
80
+ integration.resolve(key) unless integration.nil?
81
+ end
82
+
83
+ # For the provided `integration_name`, retrieves a configuration previously
84
+ # stored by `#instrument`. Specifically, `describes` should be
85
+ # the same value provided in the `describes:` option for `#instrument`.
86
+ #
87
+ # If no `describes` value is provided, the default configuration is returned.
88
+ #
89
+ # @param [Symbol] integration_name the integration name
90
+ # @param [Object] describes the previously configured `describes:` object. If `nil`,
91
+ # fetches the default configuration
92
+ # @return [Datadog::Contrib::Configuration::Settings]
93
+ def configuration(integration_name, describes = nil)
52
94
  integration = fetch_integration(integration_name)
53
- integration.configuration(configuration_name) unless integration.nil?
95
+ integration.configuration(describes) unless integration.nil?
54
96
  end
55
97
 
56
98
  def instrument(integration_name, options = {}, &block)
@@ -86,6 +128,14 @@ module Datadog
86
128
  registry[name] ||
87
129
  raise(InvalidIntegrationError, "'#{name}' is not a valid integration.")
88
130
  end
131
+
132
+ def reduce_verbosity?
133
+ defined?(@reduce_verbosity) ? @reduce_verbosity : false
134
+ end
135
+
136
+ def reduce_log_verbosity
137
+ @reduce_verbosity ||= true
138
+ end
89
139
  end
90
140
  end
91
141
  end
@@ -57,9 +57,7 @@ module Datadog
57
57
  end
58
58
 
59
59
  def handle_response(span, env, options)
60
- if options.fetch(:error_handler).call(env)
61
- span.set_error(["Error #{env[:status]}", env[:body]])
62
- end
60
+ span.set_error(["Error #{env[:status]}", env[:body]]) if options.fetch(:error_handler).call(env)
63
61
 
64
62
  span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, env[:status])
65
63
  end
@@ -20,21 +20,10 @@ module Datadog
20
20
  def patch
21
21
  require 'ddtrace/contrib/faraday/middleware'
22
22
 
23
- add_pin!
24
23
  register_middleware!
25
24
  add_default_middleware!
26
25
  end
27
26
 
28
- def add_pin!
29
- DeprecatedPin
30
- .new(
31
- get_option(:service_name),
32
- app: Ext::APP,
33
- app_type: Datadog::Ext::HTTP::TYPE_OUTBOUND,
34
- tracer: -> { get_option(:tracer) }
35
- ).onto(::Faraday)
36
- end
37
-
38
27
  def register_middleware!
39
28
  ::Faraday::Middleware.register_middleware(ddtrace: Middleware)
40
29
  end
@@ -58,31 +47,6 @@ module Datadog
58
47
  ::Faraday::RackBuilder.send(:prepend, RackBuilder)
59
48
  end
60
49
  end
61
-
62
- def get_option(option)
63
- Datadog.configuration[:faraday].get_option(option)
64
- end
65
-
66
- # Implementation of deprecated Pin, which raises warnings when accessed.
67
- # To be removed when support for Datadog::Pin with Faraday is removed.
68
- class DeprecatedPin < Datadog::Pin
69
- include Datadog::DeprecatedPin
70
-
71
- DEPRECATION_WARNING = %(
72
- Use of Datadog::Pin with Faraday is DEPRECATED.
73
- Upgrade to the configuration API using the migration guide here:
74
- https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
75
-
76
- def service_name=(service_name)
77
- Datadog.configuration[:faraday][:service_name] = service_name
78
- end
79
-
80
- def log_deprecation_warning(method_name)
81
- do_once(method_name) do
82
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
83
- end
84
- end
85
- end
86
50
  end
87
51
  end
88
52
  end