elastic / apm-agent-ruby

https://www.elastic.co/solutions/apm
Apache License 2.0
168 stars 131 forks source link

"undefined method `read' for nil:NilClass" for Rack Request body #1465

Open slhck opened 3 months ago

slhck commented 3 months ago

Describe the bug

After updating my Gems, I get this error in my Rspec tests that produce requests:

$ util/rspec.sh spec/requests/export_api/v1/clients_spec.rb 
Running via Spring preloader in process 3443
[rspec-sidekiq] WARNING! Sidekiq will *NOT* process jobs in this environment. See https://github.com/wspurgin/rspec-sidekiq/wiki/FAQ-&-Troubleshooting
2024-07-03T11:22:07.875Z pid=3443 tid=50z INFO: Sidekiq 7.3.0 connecting to Redis with options {:size=>10, :pool_name=>"internal", :url=>"redis://redis:6379/0"}
F

Failures:

  1) ExportApi::V1::Clients fetching clients as JSON GET /export_api/v1/clients returns the clients
     Failure/Error: super(path, **kwarg)

     NoMethodError:
       undefined method `read' for nil:NilClass
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/context_builder.rb:82:in `get_body'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/context_builder.rb:51:in `apply_to_request'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/context_builder.rb:34:in `block in build'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/context_builder.rb:33:in `build'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/agent.rb:235:in `build_context'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm.rb:323:in `build_context'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/middleware.rb:40:in `rescue in call'
     # /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/middleware.rb:37:in `call'
     # /usr/local/bundle/ruby/3.2.0/gems/rack-cors-2.0.2/lib/rack/cors.rb:102:in `call'
     # /usr/local/bundle/ruby/3.2.0/gems/railties-7.1.3.4/lib/rails/engine.rb:536:in `call'
     # /usr/local/bundle/ruby/3.2.0/gems/rack-test-2.1.0/lib/rack/test.rb:360:in `process_request'
     # /usr/local/bundle/ruby/3.2.0/gems/rack-test-2.1.0/lib/rack/test.rb:153:in `request'
     # ./spec/support/json_formattable.rb:14:in `block in <module:ModifiedAcceptHeaders>'
     # ./spec/requests/export_api/v1/clients_spec.rb:13:in `block (4 levels) in <main>'
     # ./spec/rails_helper.rb:106:in `block (3 levels) in <main>'
     # /usr/local/bundle/ruby/3.2.0/gems/database_cleaner-core-2.0.1/lib/database_cleaner/strategy.rb:30:in `cleaning'
     # /usr/local/bundle/ruby/3.2.0/gems/database_cleaner-core-2.0.1/lib/database_cleaner/cleaners.rb:34:in `block (2 levels) in cleaning'
     # /usr/local/bundle/ruby/3.2.0/gems/database_cleaner-core-2.0.1/lib/database_cleaner/cleaners.rb:35:in `cleaning'
     # ./spec/rails_helper.rb:105:in `block (2 levels) in <main>'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-commands-rspec-1.0.4/lib/spring/commands/rspec.rb:18:in `load'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-commands-rspec-1.0.4/lib/spring/commands/rspec.rb:18:in `call'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/command_wrapper.rb:38:in `call'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application.rb:226:in `block in serve'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application.rb:190:in `fork'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application.rb:190:in `serve'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application.rb:153:in `block in run'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application.rb:147:in `loop'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application.rb:147:in `run'
     # /usr/local/bundle/ruby/3.2.0/gems/spring-4.2.1/lib/spring/application/boot.rb:25:in `<top (required)>'
     # -e:1:in `<main>'
     # ------------------
     # --- Caused by: ---
     # NoMethodError:
     #   undefined method `read' for nil:NilClass
     #   /usr/local/bundle/ruby/3.2.0/gems/elastic-apm-4.7.3/lib/elastic_apm/context_builder.rb:82:in `get_body'

Steps to reproduce

Hard to reproduce from scratch … but I can provide the exact request data which shows that the body is indeed nil. When I dump the req object in the get_body function, you can see it has no body:

#<Rack::Request:0x0000ffff65a7fae8
  @env={
      "REQUEST_METHOD"=>"GET",
      "SERVER_NAME"=>"www.example.com",
      "SERVER_PORT"=>"80",
      "SERVER_PROTOCOL"=>"HTTP/1.0",
      "QUERY_STRING"=>"api_key=export-8QDwBg9GbF5XH6GQkDdNEoDcB63MGWnTgEAM7DXmUj9EXQWZwECsWkyVjs4x3ggJ",
      "PATH_INFO"=>"/export_api/v1/clients",
      "rack.url_scheme"=>"http",
      "HTTPS"=>"off",
      "SCRIPT_NAME"=>"",
      "rack.errors"=>#<StringIO:0x0000ffff65b01e80>, "rack.test"=>true, "REMOTE_ADDR"=>"127.0.0.1",
      "REQUEST_URI"=>"/export_api/v1/clients",
      "HTTP_HOST"=>"www.example.com",
      "HTTP_ACCEPT"=>"application/json",
      "HTTP_COOKIE"=>"",
      "action_dispatch.parameter_filter"=>[:passw, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn], "action_dispatch.redirect_filter"=>[], "action_dispatch.secret_key_base"=>"849922813286880fcc2b92672b90930246667ffa6013bd27eca3b2e390d65d1288341434f46fa9d4c3ae374485e89ca1e9edccaf0aa2b86571d17debb6012c03",
      "action_dispatch.show_exceptions"=>:all,
      "action_dispatch.show_detailed_exceptions"=>true,
      "action_dispatch.log_rescued_responses"=>true,
      "action_dispatch.debug_exception_log_level"=>4,
      "action_dispatch.logger"=>#<ActiveSupport::BroadcastLogger:0x0000ffffaea93518
    @broadcasts=[#<ActiveSupport::Logger:0x0000ffffaea56280
      @level=0,
      @progname=nil,
      @default_formatter=#<Logger::Formatter:0x0000ffffaeaefc00
      @datetime_format=nil>,
      @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x0000ffffaeaef7f0
      @datetime_format=nil>,
      @logdev=#<Logger::LogDevice:0x0000ffffaea56190
      @shift_period_suffix="%Y%m%d",
      @shift_size=10485760,
      @shift_age=10,
      @filename="/home/surfmeterserver/log/development.log",
      @dev=#<File:/home/surfmeterserver/log/development.log>,
      @binmode=false,
      @mon_data=#<Monitor:0x0000ffffaeaefa48>,
      @mon_data_owner_object_id=9000>,
      @level_override={},
      @local_level_key=:logger_thread_safe_level_15520>],
  @progname="Broadcast",
  @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x0000ffffaeaef7f0
  @datetime_format=nil>>, "action_dispatch.backtrace_cleaner"=>#<Rails::BacktraceCleaner:0x0000ffffae846c38
  @silencers=[#<Proc:0x0000ffffae846828 /usr/local/bundle/ruby/3.2.0/gems/activesupport-7.1.3.4/lib/active_support/backtrace_cleaner.rb:120>, #<Proc:0x0000ffffae8467b0 /usr/local/bundle/ruby/3.2.0/gems/activesupport-7.1.3.4/lib/active_support/backtrace_cleaner.rb:124>, #<Proc:0x0000ffffae8465a8 /usr/local/bundle/ruby/3.2.0/gems/railties-7.1.3.4/lib/rails/backtrace_cleaner.rb:24>],
  @filters=[#<Proc:0x0000ffffae8468c8 /usr/local/bundle/ruby/3.2.0/gems/activesupport-7.1.3.4/lib/active_support/backtrace_cleaner.rb:116>, #<Proc:0x0000ffffae846670 /usr/local/bundle/ruby/3.2.0/gems/railties-7.1.3.4/lib/rails/backtrace_cleaner.rb:14>, #<Proc:0x0000ffffae846620 /usr/local/bundle/ruby/3.2.0/gems/railties-7.1.3.4/lib/rails/backtrace_cleaner.rb:17>],
  @root="/home/surfmeterserver/">, "action_dispatch.key_generator"=>#<ActiveSupport::CachingKeyGenerator:0x0000ffffae7197c0
  @key_generator=#<ActiveSupport::KeyGenerator:0x0000000000f988>,
  @cache_keys=#<Concurrent::Map:0x0000ffffae719770 entries=3 default_proc=nil>>, "action_dispatch.http_auth_salt"=>"http authentication",
    "action_dispatch.signed_cookie_salt"=>"signed cookie",
    "action_dispatch.encrypted_cookie_salt"=>"encrypted cookie",
    "action_dispatch.encrypted_signed_cookie_salt"=>"signed encrypted cookie",
    "action_dispatch.authenticated_encrypted_cookie_salt"=>"authenticated encrypted cookie",
    "action_dispatch.use_authenticated_cookie_encryption"=>true, "action_dispatch.encrypted_cookie_cipher"=>nil, "action_dispatch.signed_cookie_digest"=>nil, "action_dispatch.cookies_serializer"=>:json, "action_dispatch.cookies_digest"=>nil, "action_dispatch.cookies_rotations"=>#<ActiveSupport::Messages::RotationConfiguration:0x0000ffffb1b86eb8
  @signed=[],
  @encrypted=[]>, "action_dispatch.cookies_same_site_protection"=>#<Proc:0x0000ffff65b01020 /usr/local/bundle/ruby/3.2.0/gems/railties-7.1.3.4/lib/rails/application.rb:705>, "action_dispatch.use_cookies_with_metadata"=>true, "action_dispatch.content_security_policy"=>nil, "action_dispatch.content_security_policy_report_only"=>false, "action_dispatch.content_security_policy_nonce_generator"=>nil, "action_dispatch.content_security_policy_nonce_directives"=>nil, "action_dispatch.permissions_policy"=>nil, "action_dispatch.routes"=>#<ActionDispatch::Routing::RouteSet:0x0000ffffae300508>, "ROUTES_15880_SCRIPT_NAME"=>"",
    "ORIGINAL_FULLPATH"=>"/export_api/v1/clients?api_key=export-8QDwBg9GbF5XH6GQkDdNEoDcB63MGWnTgEAM7DXmUj9EXQWZwECsWkyVjs4x3ggJ",
    "ORIGINAL_SCRIPT_NAME"=>"",
    "rack.cors"=>#<Rack::Cors::Result:0x0000ffff65b002d8
  @preflight=false,
  @hit=false,
  @miss_reason="no-origin">},
  @params=nil>

Expected behavior

The tests should pass.

Environment

Additional context

My backtrace shows a middleware (json_formattable.rb) as the last internal source of the error, but the error persistts when I comment out that middleware, so it is not at fault.

Per the discussion here, I would think that elastic-apm simply needs to handle the body being nil with Rack ≥3.1.0?

Here is the exact Gemfile.lock diff:

diff --git a/surfmeter-web/Gemfile.lock b/surfmeter-web/Gemfile.lock
index e703cf4..04ae276 100644
--- a/surfmeter-web/Gemfile.lock
+++ b/surfmeter-web/Gemfile.lock
@@ -3,35 +3,35 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actioncable (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
       zeitwerk (~> 2.6)
-    actionmailbox (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailbox (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activestorage (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       mail (>= 2.7.1)
       net-imap
       net-pop
       net-smtp
-    actionmailer (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailer (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      actionview (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       mail (~> 2.5, >= 2.5.4)
       net-imap
       net-pop
       net-smtp
       rails-dom-testing (~> 2.2)
-    actionpack (7.1.3.2)
-      actionview (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionpack (7.1.3.4)
+      actionview (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       nokogiri (>= 1.8.5)
       racc
       rack (>= 2.2.4)
@@ -39,15 +39,15 @@ GEM
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.2)
       rails-html-sanitizer (~> 1.6)
-    actiontext (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actiontext (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activestorage (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionview (7.1.3.4)
+      activesupport (= 7.1.3.4)
       builder (~> 3.1)
       erubi (~> 1.11)
       rails-dom-testing (~> 2.2)
@@ -56,27 +56,27 @@ GEM
       activerecord (>= 6.0)
       activesupport (>= 6.0)
       ruby2_keywords
-    activejob (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activejob (7.1.3.4)
+      activesupport (= 7.1.3.4)
       globalid (>= 0.3.6)
-    activemodel (7.1.3.2)
-      activesupport (= 7.1.3.2)
-    activerecord (7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activemodel (7.1.3.4)
+      activesupport (= 7.1.3.4)
+    activerecord (7.1.3.4)
+      activemodel (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       timeout (>= 0.4.0)
-    activerecord-import (1.6.0)
+    activerecord-import (1.7.0)
       activerecord (>= 4.2)
-    activerecord-postgis-adapter (9.0.1)
+    activerecord-postgis-adapter (9.0.2)
       activerecord (~> 7.1.0)
       rgeo-activerecord (~> 7.0.0)
-    activestorage (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activestorage (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       marcel (~> 1.0)
-    activesupport (7.1.3.2)
+    activesupport (7.1.3.4)
       base64
       bigdecimal
       concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -86,30 +86,31 @@ GEM
       minitest (>= 5.1)
       mutex_m
       tzinfo (~> 2.0)
-    addressable (2.8.6)
-      public_suffix (>= 2.0.2, < 6.0)
+    addressable (2.8.7)
+      public_suffix (>= 2.0.2, < 7.0)
     api-pagination (5.0.0)
     ast (2.4.2)
     base64 (0.2.0)
     bcrypt (3.1.20)
-    bigdecimal (3.1.7)
+    bigdecimal (3.1.8)
     bindex (0.8.1)
     blueprinter (1.0.2)
     bootsnap (1.18.3)
       msgpack (~> 1.2)
-    browser (5.3.1)
-    builder (3.2.4)
+    browser (6.0.0)
+    builder (3.3.0)
     byebug (11.1.3)
-    cancancan (3.5.0)
+    cancancan (3.6.1)
     choice (0.2.0)
-    concurrent-ruby (1.2.3)
-    config (5.4.0)
+    concurrent-ruby (1.3.3)
+    config (5.5.1)
       deep_merge (~> 1.2, >= 1.2.1)
     connection_pool (2.4.1)
     crack (1.0.0)
       bigdecimal
       rexml
     crass (1.0.6)
+    csv (3.3.0)
     database_cleaner (2.0.2)
       database_cleaner-active_record (>= 2, < 3)
     database_cleaner-active_record (2.1.0)
@@ -118,7 +119,7 @@ GEM
     database_cleaner-core (2.0.1)
     date (3.3.4)
     deep_merge (1.2.2)
-    devise (4.9.3)
+    devise (4.9.4)
       bcrypt (~> 3.0)
       orm_adapter (~> 0.1)
       railties (>= 4.1.0)
@@ -128,31 +129,31 @@ GEM
     docile (1.4.0)
     domain_name (0.6.20240107)
     drb (2.2.1)
-    elastic-apm (4.7.2)
+    elastic-apm (4.7.3)
       concurrent-ruby (~> 1.0)
       http (>= 3.0)
       ruby2_keywords
-    elasticsearch (7.17.10)
-      elasticsearch-api (= 7.17.10)
-      elasticsearch-transport (= 7.17.10)
-    elasticsearch-api (7.17.10)
+    elastic-transport (8.3.2)
+      faraday (< 3)
       multi_json
-    elasticsearch-model (7.2.1)
+    elasticsearch (8.14.0)
+      elastic-transport (~> 8.3)
+      elasticsearch-api (= 8.14.0)
+    elasticsearch-api (8.14.0)
+      multi_json
+    elasticsearch-model (8.0.0)
       activesupport (> 3)
-      elasticsearch (~> 7)
+      elasticsearch (~> 8)
       hashie
-    elasticsearch-transport (7.17.10)
-      faraday (>= 1, < 3)
-      multi_json
-    erubi (1.12.0)
+    erubi (1.13.0)
     factory_bot (6.4.6)
       activesupport (>= 5.0.0)
     factory_bot_rails (6.4.3)
       factory_bot (~> 6.4)
       railties (>= 5.0.0)
-    faker (3.2.3)
+    faker (3.4.1)
       i18n (>= 1.8.11, < 2)
-    faraday (2.9.0)
+    faraday (2.9.2)
       faraday-net_http (>= 2.0, < 3.2)
     faraday-net_http (3.1.0)
       net-http
@@ -161,7 +162,10 @@ GEM
     fast_page (0.1.6)
       activerecord
       activesupport
-    ffi (1.16.3)
+    ffi (1.17.0-aarch64-linux-gnu)
+    ffi (1.17.0-aarch64-linux-musl)
+    ffi (1.17.0-arm64-darwin)
+    ffi (1.17.0-x86_64-linux-gnu)
     ffi-compiler (1.3.2)
       ffi (>= 1.15.5)
       rake
@@ -171,7 +175,9 @@ GEM
       ruby_parser (~> 3.0)
       sexp_processor (~> 4.0)
     gem-licenses (0.2.2)
-    geocoder (1.8.2)
+    geocoder (1.8.3)
+      base64 (>= 0.1.0)
+      csv (>= 3.0.0)
     globalid (1.2.1)
       activesupport (>= 6.1)
     groupdate (6.4.0)
@@ -184,23 +190,23 @@ GEM
       http-cookie (~> 1.0)
       http-form_data (~> 2.2)
       llhttp-ffi (~> 0.5.0)
-    http-cookie (1.0.5)
+    http-cookie (1.0.6)
       domain_name (~> 0.5)
     http-form_data (2.3.0)
-    i18n (1.14.4)
+    i18n (1.14.5)
       concurrent-ruby (~> 1.0)
     io-console (0.7.2)
-    irb (1.12.0)
-      rdoc
+    irb (1.13.2)
+      rdoc (>= 4.0.0)
       reline (>= 0.4.2)
-    jbuilder (2.11.5)
+    jbuilder (2.12.0)
       actionview (>= 5.0.0)
       activesupport (>= 5.0.0)
-    json (2.7.1)
+    json (2.7.2)
     json_matchers (0.11.1)
       json_schema
     json_schema (0.21.0)
-    jwt (2.8.1)
+    jwt (2.8.2)
       base64
     language_server-protocol (3.17.0.3)
     listen (3.9.0)
@@ -209,6 +215,7 @@ GEM
     llhttp-ffi (0.5.0)
       ffi-compiler (~> 1.0)
       rake (~> 13.0)
+    logger (1.6.0)
     lograge (0.14.0)
       actionpack (>= 4)
       activesupport (>= 4)
@@ -227,50 +234,50 @@ GEM
       net-smtp
     marcel (1.0.4)
     mini_mime (1.1.5)
-    minitest (5.22.3)
+    minitest (5.24.1)
     msgpack (1.7.2)
     multi_json (1.15.0)
     mustache (1.1.1)
     mutex_m (0.2.0)
     net-http (0.4.1)
       uri
-    net-imap (0.4.10)
+    net-imap (0.4.14)
       date
       net-protocol
     net-pop (0.1.2)
       net-protocol
     net-protocol (0.2.2)
       timeout
-    net-smtp (0.4.0.1)
+    net-smtp (0.5.0)
       net-protocol
-    nio4r (2.7.1)
-    nokogiri (1.16.3-aarch64-linux)
+    nio4r (2.7.3)
+    nokogiri (1.16.6-aarch64-linux)
       racc (~> 1.4)
-    nokogiri (1.16.3-arm64-darwin)
+    nokogiri (1.16.6-arm64-darwin)
       racc (~> 1.4)
-    nokogiri (1.16.3-x86_64-linux)
+    nokogiri (1.16.6-x86_64-linux)
       racc (~> 1.4)
     orm_adapter (0.5.0)
-    pagy (7.0.11)
+    pagy (8.6.2)
     paper_trail (15.1.0)
       activerecord (>= 6.1)
       request_store (~> 1.4)
-    parallel (1.24.0)
-    parser (3.3.0.5)
+    parallel (1.25.1)
+    parser (3.3.3.0)
       ast (~> 2.4.1)
       racc
     path_expander (1.1.1)
     patron (0.13.3)
     pg (1.5.6)
-    prometheus_exporter (2.1.0)
+    prometheus_exporter (2.1.1)
       webrick
     psych (5.1.2)
       stringio
-    public_suffix (5.0.4)
+    public_suffix (6.0.0)
     puma (6.4.2)
       nio4r (~> 2.0)
-    racc (1.7.3)
-    rack (3.0.10)
+    racc (1.8.0)
+    rack (3.1.6)
     rack-cors (2.0.2)
       rack (>= 2.0.0)
     rack-session (2.0.0)
@@ -282,20 +289,20 @@ GEM
     rackup (2.1.0)
       rack (>= 3)
       webrick (~> 1.8)
-    rails (7.1.3.2)
-      actioncable (= 7.1.3.2)
-      actionmailbox (= 7.1.3.2)
-      actionmailer (= 7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actiontext (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    rails (7.1.3.4)
+      actioncable (= 7.1.3.4)
+      actionmailbox (= 7.1.3.4)
+      actionmailer (= 7.1.3.4)
+      actionpack (= 7.1.3.4)
+      actiontext (= 7.1.3.4)
+      actionview (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activemodel (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activestorage (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       bundler (>= 1.15.0)
-      railties (= 7.1.3.2)
+      railties (= 7.1.3.4)
     rails-dom-testing (2.2.0)
       activesupport (>= 5.0.0)
       minitest
@@ -308,33 +315,34 @@ GEM
     rails-html-sanitizer (1.6.0)
       loofah (~> 2.21)
       nokogiri (~> 1.14)
-    railties (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    railties (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       irb
       rackup (>= 1.0.0)
       rake (>= 12.2)
       thor (~> 1.0, >= 1.2.2)
       zeitwerk (~> 2.6)
     rainbow (3.1.1)
-    rake (13.1.0)
+    rake (13.2.1)
     rb-fsevent (0.11.2)
-    rb-inotify (0.10.1)
+    rb-inotify (0.11.1)
       ffi (~> 1.0)
-    rdoc (6.6.3.1)
+    rdoc (6.7.0)
       psych (>= 4.0.0)
     redis (4.8.1)
-    redis-client (0.21.1)
+    redis-client (0.22.2)
       connection_pool
-    regexp_parser (2.9.0)
-    reline (0.5.0)
+    regexp_parser (2.9.2)
+    reline (0.5.9)
       io-console (~> 0.5)
-    request_store (1.6.0)
+    request_store (1.7.0)
       rack (>= 1.4)
     responders (3.1.1)
       actionpack (>= 5.2)
       railties (>= 5.2)
-    rexml (3.2.6)
+    rexml (3.3.1)
+      strscan
     rgeo (3.0.1)
     rgeo-activerecord (7.0.1)
       activerecord (>= 5.0)
@@ -345,13 +353,13 @@ GEM
       rspec-mocks (~> 3.13.0)
     rspec-core (3.13.0)
       rspec-support (~> 3.13.0)
-    rspec-expectations (3.13.0)
+    rspec-expectations (3.13.1)
       diff-lcs (>= 1.2.0, < 2.0)
       rspec-support (~> 3.13.0)
-    rspec-mocks (3.13.0)
+    rspec-mocks (3.13.1)
       diff-lcs (>= 1.2.0, < 2.0)
       rspec-support (~> 3.13.0)
-    rspec-rails (6.1.2)
+    rspec-rails (6.1.3)
       actionpack (>= 6.1)
       activesupport (>= 6.1)
       railties (>= 6.1)
@@ -359,7 +367,7 @@ GEM
       rspec-expectations (~> 3.13)
       rspec-mocks (~> 3.13)
       rspec-support (~> 3.13)
-    rspec-sidekiq (4.1.0)
+    rspec-sidekiq (5.0.0)
       rspec-core (~> 3.0)
       rspec-expectations (~> 3.0)
       rspec-mocks (~> 3.0)
@@ -369,7 +377,7 @@ GEM
       activesupport (>= 3.0.0)
       mustache (~> 1.0, >= 0.99.4)
       rspec (~> 3.0)
-    rubocop (1.62.1)
+    rubocop (1.64.1)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)
@@ -380,8 +388,8 @@ GEM
       rubocop-ast (>= 1.31.1, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 2.4.0, < 3.0)
-    rubocop-ast (1.31.2)
-      parser (>= 3.3.0.4)
+    rubocop-ast (1.31.3)
+      parser (>= 3.3.1.0)
     ruby-graphviz (1.2.5)
       rexml
     ruby-progressbar (1.13.0)
@@ -392,11 +400,12 @@ GEM
     sexp_processor (4.17.1)
     shoulda-matchers (6.2.0)
       activesupport (>= 5.2.0)
-    sidekiq (7.2.2)
+    sidekiq (7.3.0)
       concurrent-ruby (< 2)
       connection_pool (>= 2.3.0)
+      logger
       rack (>= 2.2.4)
-      redis-client (>= 0.19.0)
+      redis-client (>= 0.22.2)
     sidekiq-unique-jobs (8.0.10)
       concurrent-ruby (~> 1.0, >= 1.0.5)
       sidekiq (>= 7.0.0, < 8.0.0)
@@ -407,11 +416,12 @@ GEM
       simplecov_json_formatter (~> 0.1)
     simplecov-html (0.12.3)
     simplecov_json_formatter (0.1.4)
-    spring (4.1.3)
+    spring (4.2.1)
     spring-commands-rspec (1.0.4)
       spring (>= 0.9.1)
-    squasher (0.7.3)
-    stringio (3.1.0)
+    squasher (0.8.0)
+    stringio (3.1.1)
+    strscan (3.1.0)
     thor (1.3.1)
     timeout (0.4.1)
     tzinfo (2.0.6)
@@ -427,7 +437,7 @@ GEM
       activemodel (>= 6.0.0)
       bindex (>= 0.4.0)
       railties (>= 6.0.0)
-    webmock (3.23.0)
+    webmock (3.23.1)
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
@@ -437,7 +447,7 @@ GEM
     websocket-extensions (0.1.5)
     yt (0.33.4)
       activesupport
-    zeitwerk (2.6.13)
+    zeitwerk (2.6.16)

 PLATFORMS
   aarch64-linux
@@ -461,6 +471,7 @@ DEPENDENCIES
   database_cleaner
   devise
   elastic-apm
+  elastic-transport
   elasticsearch
   elasticsearch-model
   factory_bot_rails