Class: Raven::Rack

Inherits:
Object
  • Object
show all
Defined in:
lib/raven/rack.rb

Overview

Middleware for Rack applications. Any errors raised by the upstream application will be delivered to Sentry and re-raised.

Synopsis:

require 'rack'
require 'raven'

Raven.configure do |config|
  config.server = 'http://my_dsn'
end

app = Rack::Builder.app do
  use Raven::Rack
  run lambda { |env| raise "Rack down" }
end

Use a standard Raven.configure call to configure your server credentials.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Rack

Returns a new instance of Rack.



45
46
47
# File 'lib/raven/rack.rb', line 45

def initialize(app)
  @app = app
end

Class Method Details

.capture_exception(exception, env, options = {}) ⇒ Object



23
24
25
26
27
28
29
30
31
32
# File 'lib/raven/rack.rb', line 23

def self.capture_exception(exception, env, options = {})
  if env[:requested_at]
    options[:time_spent] = Time.now - env[:requested_at]
  end
  Raven.capture_exception(exception, options) do |evt|
    evt.interface :http do |int|
      int.from_rack(env)
    end
  end
end

.capture_message(message, env, options = {}) ⇒ Object



34
35
36
37
38
39
40
41
42
43
# File 'lib/raven/rack.rb', line 34

def self.capture_message(message, env, options = {})
  if env[:requested_at]
    options[:time_spent] = Time.now - env[:requested_at]
  end
  Raven.capture_message(message, options) do |evt|
    evt.interface :http do |int|
      int.from_rack(env)
    end
  end
end

Instance Method Details

#call(env) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/raven/rack.rb', line 49

def call(env)
  # clear context at the beginning of the request to ensure a clean slate
  Context.clear!

  # store the current environment in our local context for arbitrary
  # callers
  env[:requested_at] = Time.now
  Raven.rack_context(env)

  begin
    response = @app.call(env)
  rescue Error
    raise # Don't capture Raven errors
  rescue Exception => e
    Raven::Rack.capture_exception(e, env)
    raise
  end

  error = env['rack.exception'] || env['sinatra.error']

  Raven::Rack.capture_exception(error, env) if error

  response
end