lib/honeybadger/plugins/resque.rb
require "honeybadger/plugin" require "honeybadger/ruby" module Honeybadger module Plugins module Resque module Extension # Executed before +on_failure+ hook; the flush is necessary so that # errors reported within jobs get sent before the worker dies. def around_perform_with_honeybadger(*args) Honeybadger.flush { yield } end def after_perform_with_honeybadger(*args) Honeybadger.clear! end # Error notifications must be synchronous as the +on_failure+ hook is # executed after +around_perform+. def on_failure_with_honeybadger(e, *args) Honeybadger.notify(e, parameters: {job_arguments: args}, sync: true) if send_exception_to_honeybadger?(e, args) ensure Honeybadger.clear! end def send_exception_to_honeybadger?(e, args) return true unless respond_to?(:retry_criteria_valid?) return true if ::Honeybadger.config[:"resque.resque_retry.send_exceptions_when_retrying"] !retry_criteria_valid?(e) rescue => e Honeybadger.notify(e, parameters: {job_arguments: args}, sync: true) end end module Installer def self.included(base) base.send(:alias_method, :payload_class_without_honeybadger, :payload_class) base.send(:alias_method, :payload_class, :payload_class_with_honeybadger) end def payload_class_with_honeybadger payload_class_without_honeybadger.tap do |klass| unless klass.respond_to?(:around_perform_with_honeybadger) klass.instance_eval do extend(::Honeybadger::Plugins::Resque::Extension) end end end end end Plugin.register do requirement { defined?(::Resque::Job) } requirement do if (resque_honeybadger = defined?(::Resque::Failure::Honeybadger)) logger.warn("Support for Resque has been moved " \ "to the honeybadger gem. Please remove " \ "resque-honeybadger from your " \ "Gemfile.") end !resque_honeybadger end execution do next unless Honeybadger.config[:"exceptions.enabled"] ::Resque::Job.send(:include, Installer) end end end end end