Skip to content

Commit

Permalink
Add global error handler feature
Browse files Browse the repository at this point in the history
  • Loading branch information
mperham committed Feb 25, 2014
1 parent b56d97e commit f39be47
Show file tree
Hide file tree
Showing 7 changed files with 52 additions and 9 deletions.
6 changes: 4 additions & 2 deletions Changes.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
3.0.0
-----------

Please see [Upgrading.md](Upgrading.md) for upgrade notes.
Please see [Upgrading.md](Upgrading.md) for more comprehensive upgrade notes.

- **Global Error Handlers** - blocks of code which process errors which
occur anywhere within Sidekiq, not just within middleware.
- **Dead Job Queue** - jobs which run out of retries are now moved to a dead
job queue. These jobs must be retried manually or they will expire
after 6 months or 10,000 jobs. The Web UI contains a Dead tab
after 6 months or 10,000 jobs. The Web UI contains a "Dead" tab
exposing these jobs.
- **Remove official support for Ruby 1.9** Things still might work but
I no longer actively test on it.
Expand Down
19 changes: 19 additions & 0 deletions Upgrading.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,22 @@ changes a few data elements in Redis. To upgrade cleanly:
support policy is to support the current and previous major releases
of Ruby and Rails. As of February 2014, that's Ruby 2.1, Ruby 2.0, Rails 4.0
and Rails 3.2. I will accept PRs to fix issues found by users.

## Error Service Providers

If you previously provided a middleware to capture job errors, you
should instead provide a global error handler with Sidekiq 3.0. This
ensures **any** error within Sidekiq will be logged appropriately, not
just during job execution.

```ruby
if Sidekiq::VERSION < '3'
# old behavior
else
Sidekiq.configure_server do |config|
config.error_handlers << Proc.new {|ex,context| ... }
end
end
```

Your error handler must respond to `call(exception, context_hash)`.
6 changes: 5 additions & 1 deletion lib/sidekiq.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
require 'sidekiq/client'
require 'sidekiq/worker'
require 'sidekiq/redis_connection'
require 'sidekiq/util'
require 'sidekiq/api'

require 'json'
Expand All @@ -20,6 +19,7 @@ module Sidekiq
:environment => nil,
:timeout => 8,
:profile => false,
:error_handlers => [],
}

def self.❨╯°□°❩╯︵┻━┻
Expand Down Expand Up @@ -117,6 +117,10 @@ def self.poll_interval=(interval)
self.options[:poll_interval] = interval
end

def self.error_handlers
self.options[:error_handlers]
end

end

require 'sidekiq/extensions/class_methods'
Expand Down
2 changes: 1 addition & 1 deletion lib/sidekiq/cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ def parse_options(argv)
def initialize_logger
Sidekiq::Logging.initialize_logger(options[:logfile]) if options[:logfile]

Sidekiq.logger.level = Logger::DEBUG if options[:verbose]
Sidekiq.logger.level = ::Logger::DEBUG if options[:verbose]
end

def write_pid
Expand Down
25 changes: 22 additions & 3 deletions lib/sidekiq/exception_handler.rb
Original file line number Diff line number Diff line change
@@ -1,10 +1,29 @@
require 'sidekiq'

module Sidekiq
module ExceptionHandler

class Logger
def call(ex, ctxHash)
Sidekiq.logger.warn(ctxHash) if !ctxHash.empty?
Sidekiq.logger.warn ex
Sidekiq.logger.warn ex.backtrace.join("\n") unless ex.backtrace.nil?
end

# Set up default handler which just logs the error
Sidekiq.error_handlers << Sidekiq::ExceptionHandler::Logger.new
end

def handle_exception(ex, ctxHash={})
Sidekiq.logger.warn(ctxHash) if !ctxHash.empty?
Sidekiq.logger.warn ex
Sidekiq.logger.warn ex.backtrace.join("\n") unless ex.backtrace.nil?
Sidekiq.error_handlers.each do |handler|
begin
handler.call(ex, ctxHash)
rescue => ex
Sidekiq.logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
Sidekiq.logger.error ex
Sidekiq.logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
end
end
end

end
Expand Down
2 changes: 1 addition & 1 deletion lib/sidekiq/processor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ def retry_and_suppress_exceptions(max_retries = 2)
sleep(1)
retry
else
Sidekiq.logger.info {"Exhausted #{max_retries} retries due to Redis timeouts: #{e.inspect}"}
handle_exception(e, { :message => "Exhausted #{max_retries} retries"})
end
end
end
Expand Down
1 change: 0 additions & 1 deletion test/test_exception_handler.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
require 'helper'
require 'sidekiq'
require 'sidekiq/exception_handler'
require 'stringio'
require 'logger'
Expand Down

0 comments on commit f39be47

Please sign in to comment.