class Logtail::Integrations::Rails::ErrorEvent

A Rack middleware that is responsible for capturing exception and error events {Logtail::Events::Error}.

Constants

EXCEPTION_WRAPPER_TAKES_CLEANER

We determine this when the app loads to avoid the overhead on a per request basis.

Public Instance Methods

call(env) click to toggle source
# File lib/logtail-rails/error_event.rb, line 22
def call(env)
  begin
    status, headers, body = @app.call(env)
  rescue Exception => exception
    Config.instance.logger.fatal do
      backtrace = extract_backtrace(env, exception)
      Events::Error.new(
        name: exception.class.name,
        error_message: exception.message,
        backtrace: backtrace
      )
    end

    raise exception
  end
end

Private Instance Methods

extract_backtrace(env, exception) click to toggle source

Rails provides a backtrace cleaner, so we use it here.

# File lib/logtail-rails/error_event.rb, line 42
def extract_backtrace(env, exception)
  if defined?(::ActionDispatch::ExceptionWrapper)
    wrapper = if EXCEPTION_WRAPPER_TAKES_CLEANER
                request = Util::Request.new(env)
                backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
                ::ActionDispatch::ExceptionWrapper.new(backtrace_cleaner, exception)
              else
                ::ActionDispatch::ExceptionWrapper.new(env, exception)
              end

    trace = wrapper.application_trace
    trace = wrapper.framework_trace if trace.empty?
    trace
  else
    exception.backtrace
  end
end