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
@@ -23,7 +23,7 @@ module Datadog
23
23
  end
24
24
 
25
25
  if message.nil?
26
- if block_given?
26
+ if block
27
27
  super(severity, message, progname) do
28
28
  "[#{self.progname}] #{where}#{yield}"
29
29
  end
@@ -41,7 +41,7 @@ module Datadog
41
41
  end
42
42
 
43
43
  def default_statsd_client
44
- require 'datadog/statsd' unless defined?(::Datadog::Statsd)
44
+ require 'datadog/statsd'
45
45
 
46
46
  # Create a StatsD client that points to the agent.
47
47
  Datadog::Statsd.new(default_hostname, default_port)
@@ -58,7 +58,8 @@ module Datadog
58
58
 
59
59
  def count(stat, value = nil, options = nil, &block)
60
60
  return unless send_stats? && statsd.respond_to?(:count)
61
- value, options = yield if block_given?
61
+
62
+ value, options = yield if block
62
63
  raise ArgumentError if value.nil?
63
64
 
64
65
  statsd.count(stat, value, metric_options(options))
@@ -68,7 +69,8 @@ module Datadog
68
69
 
69
70
  def distribution(stat, value = nil, options = nil, &block)
70
71
  return unless send_stats? && statsd.respond_to?(:distribution)
71
- value, options = yield if block_given?
72
+
73
+ value, options = yield if block
72
74
  raise ArgumentError if value.nil?
73
75
 
74
76
  statsd.distribution(stat, value, metric_options(options))
@@ -78,6 +80,7 @@ module Datadog
78
80
 
79
81
  def increment(stat, options = nil)
80
82
  return unless send_stats? && statsd.respond_to?(:increment)
83
+
81
84
  options = yield if block_given?
82
85
 
83
86
  statsd.increment(stat, metric_options(options))
@@ -87,7 +90,8 @@ module Datadog
87
90
 
88
91
  def gauge(stat, value = nil, options = nil, &block)
89
92
  return unless send_stats? && statsd.respond_to?(:gauge)
90
- value, options = yield if block_given?
93
+
94
+ value, options = yield if block
91
95
  raise ArgumentError if value.nil?
92
96
 
93
97
  statsd.gauge(stat, value, metric_options(options))
@@ -100,7 +104,7 @@ module Datadog
100
104
 
101
105
  # Calculate time, send it as a distribution.
102
106
  start = Utils::Time.get_time
103
- return yield
107
+ yield
104
108
  ensure
105
109
  begin
106
110
  if send_stats? && !start.nil?
@@ -186,7 +190,7 @@ module Datadog
186
190
  attr_accessor :logger
187
191
 
188
192
  def initialize(logger = nil)
189
- @logger = logger || Logger.new(STDOUT).tap do |l|
193
+ @logger = logger || Logger.new($stdout).tap do |l|
190
194
  l.level = Logger::INFO
191
195
  l.progname = nil
192
196
  l.formatter = proc do |_severity, datetime, _progname, msg|
@@ -29,8 +29,10 @@ module Datadog
29
29
  # It's important to make a difference between no header,
30
30
  # and a header defined to zero.
31
31
  return unless hdr
32
+
32
33
  value = hdr.to_i
33
34
  return if value < 0
35
+
34
36
  value
35
37
  end
36
38
 
@@ -45,6 +47,7 @@ module Datadog
45
47
  def id(header)
46
48
  value = @carrier[header].to_i
47
49
  return if value.zero? || value >= Datadog::Span::EXTERNAL_MAX_ID
50
+
48
51
  value < 0 ? value + 0x1_0000_0000_0000_0000 : value
49
52
  end
50
53
  end
@@ -73,9 +73,7 @@ module Datadog
73
73
  super # Log deprecation warning
74
74
 
75
75
  # If the fields specify an error
76
- if fields.key?(:'error.object')
77
- datadog_span.set_error(fields[:'error.object'])
78
- end
76
+ datadog_span.set_error(fields[:'error.object']) if fields.key?(:'error.object')
79
77
  end
80
78
 
81
79
  # Add a log entry to this span
@@ -83,9 +81,7 @@ module Datadog
83
81
  # @param fields [Hash] Additional information to log
84
82
  def log_kv(timestamp: Time.now, **fields)
85
83
  # If the fields specify an error
86
- if fields.key?(:'error.object')
87
- datadog_span.set_error(fields[:'error.object'])
88
- end
84
+ datadog_span.set_error(fields[:'error.object']) if fields.key?(:'error.object')
89
85
  end
90
86
 
91
87
  # Finish the {Span}
@@ -22,6 +22,7 @@ module Datadog
22
22
  # undefined behavior.
23
23
  def close
24
24
  return unless equal?(manager.active)
25
+
25
26
  span.finish if finish_on_close
26
27
  manager.send(:set_scope, @previous_scope)
27
28
  end
@@ -1,7 +1,21 @@
1
+ require 'ddtrace/utils/only_once'
2
+
1
3
  module Datadog
2
- # Defines some useful patching methods for integrations
4
+ # Deprecated: This module should no longer be included. It's only being kept around for backwards compatibility
5
+ # concerns regarding customer usage.
3
6
  module Patcher
7
+ INCLUDED_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
8
+ DO_ONCE_USAGE_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
9
+
4
10
  def self.included(base)
11
+ INCLUDED_WARN_ONLY_ONCE.run do
12
+ Datadog.logger.warn(
13
+ 'Including Datadog::Patcher is deprecated. ' \
14
+ 'For the #do_once behavior, use Datadog::Utils::OnlyOnce instead. ' \
15
+ 'For the #without_warnings behavior, use Datadog::Patcher.without_warnings { ... } as a module function.'
16
+ )
17
+ end
18
+
5
19
  base.send(:extend, CommonMethods)
6
20
  base.send(:include, CommonMethods)
7
21
  end
@@ -22,11 +36,13 @@ module Datadog
22
36
  end
23
37
 
24
38
  def do_once(key = nil, options = {})
39
+ DO_ONCE_USAGE_WARN_ONLY_ONCE.run do
40
+ Datadog.logger.warn('Datadog::Patcher#do_once is deprecated. Use Datadog::Utils::OnlyOnce instead.')
41
+ end
42
+
25
43
  # If already done, don't do again
26
44
  @done_once ||= Hash.new { |h, k| h[k] = {} }
27
- if @done_once.key?(key) && @done_once[key].key?(options[:for])
28
- return @done_once[key][options[:for]]
29
- end
45
+ return @done_once[key][options[:for]] if @done_once.key?(key) && @done_once[key].key?(options[:for])
30
46
 
31
47
  # Otherwise 'do'
32
48
  yield.tap do
@@ -36,7 +52,12 @@ module Datadog
36
52
  end
37
53
 
38
54
  def done?(key, options = {})
55
+ DO_ONCE_USAGE_WARN_ONLY_ONCE.run do
56
+ Datadog.logger.warn('Datadog::Patcher#done? is deprecated. Use Datadog::Utils::OnlyOnce instead.')
57
+ end
58
+
39
59
  return false unless instance_variable_defined?(:@done_once)
60
+
40
61
  !@done_once.nil? && @done_once.key?(key) && @done_once[key].key?(options[:for])
41
62
  end
42
63
  end
data/lib/ddtrace/pin.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'ddtrace/patcher'
2
+ require 'ddtrace/utils/only_once'
2
3
 
3
4
  # \Datadog global namespace that includes all tracing functionality for Tracer and Span classes.
4
5
  module Datadog
@@ -7,19 +8,15 @@ module Datadog
7
8
  # This is useful if you wanted to, say, trace two different
8
9
  # database clusters.
9
10
  class Pin
11
+ DEPRECATION_WARN_ONLY_ONCE = Datadog::Utils::OnlyOnce.new
12
+
10
13
  def self.get_from(obj)
11
14
  return nil unless obj.respond_to? :datadog_pin
15
+
12
16
  obj.datadog_pin
13
17
  end
14
18
 
15
- attr_accessor :app
16
- attr_accessor :app_type
17
- attr_accessor :config
18
- attr_accessor :name
19
- attr_accessor :service_name
20
- attr_accessor :tags
21
- attr_reader :tracer
22
- attr_accessor :writer
19
+ attr_accessor :app, :app_type, :config, :name, :service_name, :tags, :writer
23
20
 
24
21
  alias service= service_name=
25
22
  alias service service_name
@@ -42,6 +39,7 @@ module Datadog
42
39
 
43
40
  def enabled?
44
41
  return tracer.enabled if tracer
42
+
45
43
  false
46
44
  end
47
45
 
@@ -79,59 +77,8 @@ module Datadog
79
77
  ).freeze
80
78
 
81
79
  def deprecation_warning
82
- log_deprecation_warning('Datadog::Pin.new')
83
- end
84
-
85
- include Datadog::Patcher
86
-
87
- def log_deprecation_warning(method_name)
88
- # Only log each deprecation warning once (safeguard against log spam)
89
- do_once(method_name) do
90
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
91
- end
92
- end
93
- end
94
-
95
- # Modification to Pin which logs deprecation warnings if accessed.
96
- # Will be used by integrations which are phasing out the direct use of #datadog_pin.
97
- module DeprecatedPin
98
- include Datadog::Patcher
99
-
100
- DEPRECATION_WARNING = %(
101
- Use of Datadog::Pin is DEPRECATED.
102
- Upgrade to the configuration API using the migration guide here:
103
- https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
104
-
105
- # Raise a deprecation warning when #datadog_pin or #datadog_pin= is accessed.
106
- def onto(obj)
107
- obj.instance_exec(self) do |pin|
108
- @datadog_deprecated_pin = pin
109
-
110
- unless respond_to? :datadog_pin=
111
- def datadog_pin=(pin)
112
- @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin=')
113
- @datadog_pin = pin
114
- end
115
- end
116
-
117
- unless respond_to? :datadog_pin
118
- def datadog_pin
119
- @datadog_deprecated_pin.log_deprecation_warning('#datadog_pin')
120
- @datadog_pin
121
- end
122
- end
123
-
124
- # Set instance variable to avoid deprecation warnings
125
- @datadog_pin = @datadog_deprecated_pin
126
- end
127
-
128
- self
129
- end
130
-
131
- def log_deprecation_warning(method_name)
132
- # Only log each deprecation warning once (safeguard against log spam)
133
- do_once(method_name) do
134
- Datadog.logger.warn("#{method_name}:#{DEPRECATION_WARNING}")
80
+ DEPRECATION_WARN_ONLY_ONCE.run do
81
+ Datadog.logger.warn("Datadog::Pin.new:#{DEPRECATION_WARNING}")
135
82
  end
136
83
  end
137
84
  end
@@ -10,7 +10,7 @@ module Datadog
10
10
  @criteria = filter || block
11
11
  end
12
12
 
13
- # Note: this SpanFilter implementation only handles traces in which child spans appear
13
+ # NOTE: this SpanFilter implementation only handles traces in which child spans appear
14
14
  # after parent spans in the trace array. If in the future child spans can be before
15
15
  # parent spans, then the code below will need to be updated.
16
16
  def call(trace)
@@ -19,6 +19,7 @@ module Datadog
19
19
  def self.extract(metadata)
20
20
  metadata = Carrier.new(metadata)
21
21
  return Datadog::Context.new unless metadata.valid?
22
+
22
23
  Datadog::Context.new(trace_id: metadata.trace_id,
23
24
  span_id: metadata.parent_id,
24
25
  sampling_priority: metadata.sampling_priority,
@@ -26,7 +26,14 @@ module Datadog
26
26
  # Inject all configured propagation styles
27
27
  ::Datadog.configuration.distributed_tracing.propagation_inject_style.each do |style|
28
28
  propagator = PROPAGATION_STYLES[style]
29
- propagator.inject!(context, env) unless propagator.nil?
29
+ begin
30
+ propagator.inject!(context, env) unless propagator.nil?
31
+ rescue => e
32
+ Datadog.logger.error(
33
+ 'Error injecting propagated context into the environment. ' \
34
+ "Cause: #{e} Location: #{e.backtrace.first}"
35
+ )
36
+ end
30
37
  end
31
38
  end
32
39
 
@@ -42,7 +49,15 @@ module Datadog
42
49
 
43
50
  # Extract context
44
51
  # DEV: `propagator.extract` will return `nil`, where `HTTPPropagator#extract` will not
45
- extracted_context = propagator.extract(env)
52
+ begin
53
+ extracted_context = propagator.extract(env)
54
+ rescue => e
55
+ Datadog.logger.error(
56
+ 'Error extracting propagated context from the environment. ' \
57
+ "Cause: #{e} Location: #{e.backtrace.first}"
58
+ )
59
+ end
60
+
46
61
  # Skip this style if no valid headers were found
47
62
  next if extracted_context.nil?
48
63
 
@@ -61,6 +61,7 @@ module Datadog
61
61
  # e.g. Reduces "foo&bar=bar&bar=bar&foo" to "foo&bar=bar&bar=bar"
62
62
  def collect_query(query, options = {})
63
63
  return query unless block_given?
64
+
64
65
  uniq = options[:uniq].nil? ? false : options[:uniq]
65
66
  keys = Set.new
66
67
 
@@ -4,7 +4,7 @@ module Datadog
4
4
  module Runtime
5
5
  # For control groups
6
6
  module Cgroup
7
- LINE_REGEX = /^(\d+):([^:]*):(.+)$/
7
+ LINE_REGEX = /^(\d+):([^:]*):(.+)$/.freeze
8
8
 
9
9
  Descriptor = Struct.new(
10
10
  :id,
@@ -21,7 +21,7 @@ module Datadog
21
21
  filepath = "/proc/#{process}/cgroup"
22
22
 
23
23
  if File.exist?(filepath)
24
- File.open("/proc/#{process}/cgroup").each do |line|
24
+ File.foreach("/proc/#{process}/cgroup") do |line|
25
25
  line = line.strip
26
26
  descriptors << parse(line) unless line.empty?
27
27
  end
@@ -8,8 +8,8 @@ module Datadog
8
8
  UUID_PATTERN = '[0-9a-f]{8}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{4}[-_]?[0-9a-f]{12}'.freeze
9
9
  CONTAINER_PATTERN = '[0-9a-f]{64}'.freeze
10
10
 
11
- POD_REGEX = /(pod)?(#{UUID_PATTERN})(?:.slice)?$/
12
- CONTAINER_REGEX = /(#{UUID_PATTERN}|#{CONTAINER_PATTERN})(?:.scope)?$/
11
+ POD_REGEX = /(pod)?(#{UUID_PATTERN})(?:.slice)?$/.freeze
12
+ CONTAINER_REGEX = /(#{UUID_PATTERN}|#{CONTAINER_PATTERN})(?:.scope)?$/.freeze
13
13
 
14
14
  Descriptor = Struct.new(
15
15
  :platform,
@@ -32,39 +32,37 @@ module Datadog
32
32
  end
33
33
 
34
34
  def descriptor
35
- @descriptor ||= begin
36
- Descriptor.new.tap do |descriptor|
37
- begin
38
- Cgroup.descriptors.each do |cgroup_descriptor|
39
- # Parse container data from cgroup descriptor
40
- path = cgroup_descriptor.path
41
- next if path.nil?
35
+ @descriptor ||= Descriptor.new.tap do |descriptor|
36
+ begin
37
+ Cgroup.descriptors.each do |cgroup_descriptor|
38
+ # Parse container data from cgroup descriptor
39
+ path = cgroup_descriptor.path
40
+ next if path.nil?
42
41
 
43
- # Split path into parts
44
- parts = path.split('/')
45
- parts.shift # Remove leading empty part
46
- next if parts.length < 2
42
+ # Split path into parts
43
+ parts = path.split('/')
44
+ parts.shift # Remove leading empty part
45
+ next if parts.length < 2
47
46
 
48
- # Read info from path
49
- platform = parts[0]
50
- container_id = parts[-1][CONTAINER_REGEX]
51
- task_uid = parts[-2][POD_REGEX]
47
+ # Read info from path
48
+ platform = parts[0]
49
+ container_id = parts[-1][CONTAINER_REGEX]
50
+ task_uid = parts[-2][POD_REGEX]
52
51
 
53
- # If container ID wasn't found, ignore.
54
- # Path might describe a non-container environment.
55
- next if container_id.nil?
52
+ # If container ID wasn't found, ignore.
53
+ # Path might describe a non-container environment.
54
+ next if container_id.nil?
56
55
 
57
- descriptor.platform = platform
58
- descriptor.container_id = container_id
59
- descriptor.task_uid = task_uid
56
+ descriptor.platform = platform
57
+ descriptor.container_id = container_id
58
+ descriptor.task_uid = task_uid
60
59
 
61
- break
62
- end
63
- rescue StandardError => e
64
- Datadog.logger.error(
65
- "Error while parsing container info. Cause: #{e.message} Location: #{e.backtrace.first}"
66
- )
60
+ break
67
61
  end
62
+ rescue StandardError => e
63
+ Datadog.logger.error(
64
+ "Error while parsing container info. Cause: #{e.message} Location: #{e.backtrace.first}"
65
+ )
68
66
  end
69
67
  end
70
68
  end
@@ -1,22 +1,21 @@
1
1
  require 'securerandom'
2
2
  require 'ddtrace/ext/runtime'
3
+ require 'ddtrace/utils/forking'
3
4
 
4
5
  module Datadog
5
6
  module Runtime
6
7
  # For runtime identity
7
8
  module Identity
9
+ extend Datadog::Utils::Forking
10
+
8
11
  module_function
9
12
 
10
13
  # Retrieves number of classes from runtime
11
14
  def id
12
- @pid ||= Process.pid
13
15
  @id ||= SecureRandom.uuid
14
16
 
15
17
  # Check if runtime has changed, e.g. forked.
16
- if Process.pid != @pid
17
- @pid = Process.pid
18
- @id = SecureRandom.uuid
19
- end
18
+ after_fork! { @id = SecureRandom.uuid }
20
19
 
21
20
  @id
22
21
  end
@@ -25,10 +24,18 @@ module Datadog
25
24
  Ext::Runtime::LANG
26
25
  end
27
26
 
27
+ def lang_engine
28
+ Ext::Runtime::LANG_ENGINE
29
+ end
30
+
28
31
  def lang_interpreter
29
32
  Ext::Runtime::LANG_INTERPRETER
30
33
  end
31
34
 
35
+ def lang_platform
36
+ Ext::Runtime::LANG_PLATFORM
37
+ end
38
+
32
39
  def lang_version
33
40
  Ext::Runtime::LANG_VERSION
34
41
  end