Уведомлять Airbrake при захвате исключения и регистрации ошибки вручную

В нашем приложении Rails мы используем Airbrake, подключенный к размещенному серверу Errbit.

Мы используем rescue и rescue_from во многих местах, где мы хотим обрабатывать любые исключения определенным образом, а затем сами регистрируем исключение, прежде чем возвращать ответ.

Некоторые примеры у нас есть в нашем ApplicationController:

  rescue_from CanCan::AccessDenied do |e|
    Rails.logger.error "CanCan exception: #{e.message}"
    render 'errors/401', status: 401
  end

  rescue_from ActionController::InvalidAuthenticityToken do |e|
    Rails.logger.error "Authenticity exception: #{e.message}"
    render 'errors/csrf', status: 400
  end

И затем у нас также есть некоторые отдельные методы, такие как API:

def try_request
  Response.new(yield)
rescue RestClient::Unauthorized,
       RestClient::ExceptionWithResponse,
       RestClient::InternalServerError,
       RestClient::BadRequest => e
  Rails.logger.error "API exception: #{e.message}"
  Response.new(e.response)
end

Однако, используя rescue, мы заметили, что Errbit больше не собирает наши исключения, потому что мы их перехватывали... это имеет смысл... но мы все еще хотим видеть их в наших отчетах Errbit!

Вы можете вручную уведомить Airbrake с помощью:

Airbrake.notify(e)

Но мы надеялись избежать необходимости помещать этот код в каждый блок восстановления.

Возможно ли иметь оператор более высокого уровня, который может автоматически уведомлять Airbrake при регистрации ошибок вручную? Возможно, промежуточное ПО, которое вызывается при вызове Rails.logger.error?


person Cameron    schedule 17.04.2020    source источник


Ответы (1)


rescue - рубиновая оговорка, вы не можете переопределить ее напрямую (и даже если бы вы могли - это не было бы хорошей идеей)

Во всех ваших примерах есть Rails.logger.error, вы можете сделать себе помощника, например:

module MyErrorNotifier
  def self.notify(message, exception, params = {}, &block)
    Rails.logger.error("#{message}: #{exception.message}")
    Airbrake.notify(exception, params, &block)
  end
end

и вместо регистратора вызовите его:

def try_request
 ...
rescue e
  MyErrorNotifier.notify("Foo exception happened", e)
  Response.new(e.response)
end
person Vasfed    schedule 21.12.2020
comment
Я думал, что автоматический воздушный тормоз при фактической регистрации, а не отмена спасения ... например. может какое-то промежуточное ПО? - person Cameron; 21.12.2020