appsignal/appsignal-ruby

Appsignal logger causes sidekiq to crash

fazo96 opened this issue · 2 comments

Describe the bug

Since upgrading to Rails 7.1, we can't use the appsignal logger with sidekiq anymore.

When setting config.logger = ActiveSupport::TaggedLogging.new(AppsignalLogger.new('rails')) and then running sidekiq with bundle exec sidekiq, Sidekiq will crash with the following stack trace:

undefined method `broadcast_to' for #<Appsignal::Logger:0x00007fccd1a3c460 @group="rails", @level=1, @format=0, @mutex=#<Thread::Mutex:0x00007fccd2017510>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x00007fccd2016cf0 @datetime_format=nil, @thread_key="activesupport_tagged_logging_tags:79520">>
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/lib/sidekiq/rails.rb:62:in `block (2 levels) in <class:Rails>'
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/lib/sidekiq.rb:98:in `configure_server'
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/lib/sidekiq/rails.rb:53:in `block in <class:Rails>'
/usr/local/rvm/gems/ruby-3.2.2/gems/activesupport-7.1.2/lib/active_support/lazy_load_hooks.rb:94:in `block in execute_hook'
/usr/local/rvm/gems/ruby-3.2.2/gems/activesupport-7.1.2/lib/active_support/lazy_load_hooks.rb:87:in `with_execution_control'
/usr/local/rvm/gems/ruby-3.2.2/gems/activesupport-7.1.2/lib/active_support/lazy_load_hooks.rb:92:in `execute_hook'
/usr/local/rvm/gems/ruby-3.2.2/gems/activesupport-7.1.2/lib/active_support/lazy_load_hooks.rb:78:in `block in run_load_hooks'
/usr/local/rvm/gems/ruby-3.2.2/gems/activesupport-7.1.2/lib/active_support/lazy_load_hooks.rb:77:in `each'
/usr/local/rvm/gems/ruby-3.2.2/gems/activesupport-7.1.2/lib/active_support/lazy_load_hooks.rb:77:in `run_load_hooks'
/usr/local/rvm/gems/ruby-3.2.2/gems/railties-7.1.2/lib/rails/application/finisher.rb:93:in `block in <module:Finisher>'
/usr/local/rvm/gems/ruby-3.2.2/gems/railties-7.1.2/lib/rails/initializable.rb:32:in `instance_exec'
/usr/local/rvm/gems/ruby-3.2.2/gems/railties-7.1.2/lib/rails/initializable.rb:32:in `run'
/usr/local/rvm/gems/ruby-3.2.2/gems/railties-7.1.2/lib/rails/initializable.rb:61:in `block in run_initializers'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:228:in `block in tsort_each'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:350:in `block (2 levels) in each_strongly_connected_component'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:431:in `each_strongly_connected_component_from'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:349:in `block in each_strongly_connected_component'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:347:in `each'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:347:in `call'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:347:in `each_strongly_connected_component'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:226:in `tsort_each'
/usr/local/rvm/rubies/ruby-3.2.2/lib/ruby/3.2.0/tsort.rb:205:in `tsort_each'
/usr/local/rvm/gems/ruby-3.2.2/gems/railties-7.1.2/lib/rails/initializable.rb:60:in `run_initializers'
/usr/local/rvm/gems/ruby-3.2.2/gems/railties-7.1.2/lib/rails/application.rb:423:in `initialize!'
/workspaces/flexhire/backend/config/environment.rb:5:in `<top (required)>'
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/lib/sidekiq/cli.rb:303:in `require'
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/lib/sidekiq/cli.rb:303:in `boot_application'
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/lib/sidekiq/cli.rb:42:in `run'
/usr/local/rvm/gems/ruby-3.2.2/gems/sidekiq-7.2.0/bin/sidekiq:31:in `<top (required)>'
/usr/local/rvm/gems/ruby-3.2.2/bin/sidekiq:25:in `load'
/usr/local/rvm/gems/ruby-3.2.2/bin/sidekiq:25:in `<top (required)>'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/cli/exec.rb:58:in `load'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/cli/exec.rb:58:in `kernel_load'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/cli/exec.rb:23:in `run'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/cli.rb:483:in `exec'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/cli.rb:31:in `dispatch'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/cli.rb:25:in `start'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/exe/bundle:48:in `block in <top (required)>'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
/usr/local/rvm/gems/ruby-3.2.2/gems/bundler-2.3.17/exe/bundle:36:in `<top (required)>'
/usr/local/rvm/gems/ruby-3.2.2/bin/bundle:25:in `load'
/usr/local/rvm/gems/ruby-3.2.2/bin/bundle:25:in `<main>'

To Reproduce

Steps to reproduce the behavior:

  • Using AppSignal for Ruby gem version 3.5.3
  • Use Rails 7.1 and Sidekiq 7.2
  • Set up the logger:
      # config/initializers/logger.rb
      Rails.application.configure do |config|
        config.logger = ActiveSupport::TaggedLogging.new(AppsignalLogger.new('rails'))
      end
  • run bundle exec sidekiq

Hi @fazo96,

Can you try adding the AppSignal logger like in this example?

Rails.logger.broadcast_to(Appsignal::Logger.new("rails"))

This may also work, but haven't tested it yet:

Rails.application.configure do |config|
  config.logger.broadcast_to(Appsignal::Logger.new("rails"))
end

hi @tombruijn, thanks for the help, the first suggestion worked!