Ruby and other things!

about me presentations

Logging Airbrake Error IDs in Rack or Sinatra

02 May 2014

One small thing that irked me while implementing Airbrake for an Sinatra app that we have at theScore was the fact that if an error occurs, it isn't logged anywhere. I was relying on the error showing up in Airbrake – if it ever would!

If you have a Sinatra application, make sure to follow their instructions on setting up Airbrake with a Sinatra app. Follow their instructions on setting up Airbrake with a Rack app if you have a Rack app.

Halfway there

One good thing about the Rails integration that Airbrake has is that it will log the link to the Airbrake error. Since there is no unified rack log, this isn't possible. By default, nothing about Airbrake will show up in your log. Airbrake does allow you to set up logging if you want, though (their wiki):


Airbrake.configure do |config|
  config.logger = App.logger
  config.api_key = ENV['airbrake_api_key']
end

However, this will only yield the following:


2014-05-01T18:27:06-0400: [INFO] 32065 ** [Airbrake] Success: Net::HTTPOK

Access the error_id through the rack environment!

Luckily for us, Airbrake exposes the error_id in the rack environment's airbrake.error_id key (briefly mentioned in their wiki). Knowing this, we can insert some middleware above the Airbrake middleware and log it ourselves. Example:

class AfterAirbrakeMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, body = @app.call(env)
    if env["airbrake.error_id"]
      App.logger.fatal "An error was sent to Airbrake with error_id: '#{env["airbrake.error_id"]}'"
    end
    [status, headers, body]
  end
end

class App < Sinatra::Base
  use AfterAirbrakeMiddleware # must go before Airbrake's middleware so that errors are passed to it from Airbrake's middleware
  use Airbrake::Sinatra

  self.logger = Logger.new('./log/service.log')
end

Airbrake.configure do |config|
  config.logger = App.logger
  config.api_key = ENV['airbrake_api_key']
end

Now the log looks like this:


2014-05-01T18:27:06-0400: [INFO] 32065 ** [Airbrake] Success: Net::HTTPOK
2014-05-01T18:27:06-0400: [FATAL] 32065 An error was sent to Airbrake with error_id: '1146548809544442069'

Isn't that better? I'm sure there's a way to create a direct link to the page with that error_id, too! Something to investigate for the future.

comments powered by Disqus