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
@@ -20,8 +20,14 @@ module Datadog
20
20
  PROPAGATION_STYLE_DATADOG = 'Datadog'.freeze
21
21
  PROPAGATION_STYLE_B3 = 'B3'.freeze
22
22
  PROPAGATION_STYLE_B3_SINGLE_HEADER = 'B3 single header'.freeze
23
- PROPAGATION_INJECT_STYLE_ENV = 'DD_PROPAGATION_INJECT_STYLE'.freeze
24
- PROPAGATION_EXTRACT_STYLE_ENV = 'DD_PROPAGATION_EXTRACT_STYLE'.freeze
23
+ PROPAGATION_STYLE_INJECT_ENV = 'DD_PROPAGATION_STYLE_INJECT'.freeze
24
+ PROPAGATION_STYLE_EXTRACT_ENV = 'DD_PROPAGATION_STYLE_EXTRACT'.freeze
25
+ # NOTE: the below inject/extract values are deprecated and were defined erronously
26
+ # they were never part of the datadog language client standard or documentation
27
+ # some users may already be relying on them, but we should look to remove these in the future
28
+ # or before 1.0.
29
+ PROPAGATION_INJECT_STYLE_ENV_OLD = 'DD_PROPAGATION_INJECT_STYLE'.freeze
30
+ PROPAGATION_EXTRACT_STYLE_ENV_OLD = 'DD_PROPAGATION_EXTRACT_STYLE'.freeze
25
31
 
26
32
  # gRPC metadata keys for distributed tracing. https://github.com/grpc/grpc-go/blob/v1.10.x/Documentation/grpc-metadata.md
27
33
  GRPC_METADATA_TRACE_ID = 'x-datadog-trace-id'.freeze
@@ -0,0 +1,11 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for Git tags
4
+ module Git
5
+ TAG_BRANCH = 'git.branch'.freeze
6
+ TAG_COMMIT_SHA = 'git.commit.sha'.freeze
7
+ TAG_REPOSITORY_URL = 'git.repository_url'.freeze
8
+ TAG_TAG = 'git.tag'.freeze
9
+ end
10
+ end
11
+ end
@@ -2,7 +2,7 @@ module Datadog
2
2
  module Ext
3
3
  module HTTP
4
4
  BASE_URL = 'http.base_url'.freeze
5
- ERROR_RANGE = 500...600
5
+ ERROR_RANGE = (500...600).freeze
6
6
  METHOD = 'http.method'.freeze
7
7
  STATUS_CODE = 'http.status_code'.freeze
8
8
  TEMPLATE = 'template'.freeze
@@ -5,11 +5,12 @@ module Datadog
5
5
  module Runtime
6
6
  # Identity
7
7
  LANG = 'ruby'.freeze
8
- LANG_INTERPRETER = (RUBY_ENGINE + '-' + RUBY_PLATFORM).freeze
8
+ LANG_INTERPRETER = "#{RUBY_ENGINE}-#{RUBY_PLATFORM}".freeze
9
9
  LANG_VERSION = RUBY_VERSION
10
10
  RUBY_ENGINE = ::RUBY_ENGINE # e.g. 'ruby', 'jruby', 'truffleruby'
11
11
  TRACER_VERSION = Datadog::VERSION::STRING
12
12
 
13
+ TAG_ID = 'runtime-id'.freeze
13
14
  TAG_LANG = 'language'.freeze
14
15
 
15
16
  # Metrics
@@ -0,0 +1,24 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for test tags
4
+ module Test
5
+ TAG_ARGUMENTS = 'test.arguments'.freeze
6
+ TAG_FRAMEWORK = 'test.framework'.freeze
7
+ TAG_NAME = 'test.name'.freeze
8
+ TAG_SKIP_REASON = 'test.skip_reason'.freeze
9
+ TAG_STATUS = 'test.status'.freeze
10
+ TAG_SUITE = 'test.suite'.freeze
11
+ TAG_TRAITS = 'test.traits'.freeze
12
+ TAG_TYPE = 'test.type'.freeze
13
+
14
+ # TODO: is there a better place for SPAN_KIND?
15
+ TAG_SPAN_KIND = 'span.kind'.freeze
16
+
17
+ module Status
18
+ PASS = 'pass'.freeze
19
+ FAIL = 'fail'.freeze
20
+ SKIP = 'skip'.freeze
21
+ end
22
+ end
23
+ end
24
+ end
@@ -7,11 +7,13 @@ module Datadog
7
7
  class << self
8
8
  def keep(span)
9
9
  return if span.nil? || span.context.nil?
10
+
10
11
  span.context.sampling_priority = Datadog::Ext::Priority::USER_KEEP
11
12
  end
12
13
 
13
14
  def drop(span)
14
15
  return if span.nil? || span.context.nil?
16
+
15
17
  span.context.sampling_priority = Datadog::Ext::Priority::USER_REJECT
16
18
  end
17
19
  end
@@ -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
@@ -24,9 +24,7 @@ module Datadog
24
24
  def do_once(key = nil, options = {})
25
25
  # If already done, don't do again
26
26
  @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
27
+ return @done_once[key][options[:for]] if @done_once.key?(key) && @done_once[key].key?(options[:for])
30
28
 
31
29
  # Otherwise 'do'
32
30
  yield.tap do
@@ -37,6 +35,7 @@ module Datadog
37
35
 
38
36
  def done?(key, options = {})
39
37
  return false unless instance_variable_defined?(:@done_once)
38
+
40
39
  !@done_once.nil? && @done_once.key?(key) && @done_once[key].key?(options[:for])
41
40
  end
42
41
  end
data/lib/ddtrace/pin.rb CHANGED
@@ -9,17 +9,11 @@ module Datadog
9
9
  class Pin
10
10
  def self.get_from(obj)
11
11
  return nil unless obj.respond_to? :datadog_pin
12
+
12
13
  obj.datadog_pin
13
14
  end
14
15
 
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
16
+ attr_accessor :app, :app_type, :config, :name, :service_name, :tags, :writer
23
17
 
24
18
  alias service= service_name=
25
19
  alias service service_name
@@ -42,6 +36,7 @@ module Datadog
42
36
 
43
37
  def enabled?
44
38
  return tracer.enabled if tracer
39
+
45
40
  false
46
41
  end
47
42
 
@@ -91,48 +86,4 @@ module Datadog
91
86
  end
92
87
  end
93
88
  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}")
135
- end
136
- end
137
- end
138
89
  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,
@@ -38,24 +39,36 @@ module Datadog
38
39
  end
39
40
 
40
41
  def trace_id
41
- value = @metadata[GRPC_METADATA_TRACE_ID].to_i
42
+ value = metadata_for_key(GRPC_METADATA_TRACE_ID).to_i
42
43
  value if (1..Span::EXTERNAL_MAX_ID).cover? value
43
44
  end
44
45
 
45
46
  def parent_id
46
- value = @metadata[GRPC_METADATA_PARENT_ID].to_i
47
+ value = metadata_for_key(GRPC_METADATA_PARENT_ID).to_i
47
48
  value if (1..Span::EXTERNAL_MAX_ID).cover? value
48
49
  end
49
50
 
50
51
  def sampling_priority
51
- value = @metadata[GRPC_METADATA_SAMPLING_PRIORITY]
52
+ value = metadata_for_key(GRPC_METADATA_SAMPLING_PRIORITY)
52
53
  value && value.to_i
53
54
  end
54
55
 
55
56
  def origin
56
- value = @metadata[GRPC_METADATA_ORIGIN]
57
+ value = metadata_for_key(GRPC_METADATA_ORIGIN)
57
58
  value if value != ''
58
59
  end
60
+
61
+ private
62
+
63
+ def metadata_for_key(key)
64
+ # metadata values can be arrays (multiple headers with the same key)
65
+ value = @metadata[key]
66
+ if value.is_a?(Array)
67
+ value.first
68
+ else
69
+ value
70
+ end
71
+ end
59
72
  end
60
73
  end
61
74
  end
@@ -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,
@@ -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,
@@ -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