bugsnag 1.1.5 → 1.2.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Gemfile.lock +5 -5
- data/README.md +132 -22
- data/VERSION +1 -1
- data/bugsnag.gemspec +13 -8
- data/lib/bugsnag.rb +39 -18
- data/lib/bugsnag/configuration.rb +54 -43
- data/lib/bugsnag/helpers.rb +35 -21
- data/lib/bugsnag/middleware/callbacks.rb +19 -0
- data/lib/bugsnag/middleware/rack_request.rb +48 -0
- data/lib/bugsnag/middleware/rails2_request.rb +45 -0
- data/lib/bugsnag/middleware/rails3_request.rb +27 -0
- data/lib/bugsnag/middleware/warden_user.rb +47 -0
- data/lib/bugsnag/middleware_stack.rb +64 -0
- data/lib/bugsnag/notification.rb +146 -57
- data/lib/bugsnag/rack.rb +34 -49
- data/lib/bugsnag/rails.rb +12 -3
- data/lib/bugsnag/rails/action_controller_rescue.rb +33 -21
- data/lib/bugsnag/rails/controller_methods.rb +34 -50
- data/lib/bugsnag/railtie.rb +26 -14
- data/lib/bugsnag/tasks.rb +1 -1
- data/lib/{tasks → bugsnag/tasks}/bugsnag.rake +5 -0
- metadata +31 -17
- data/lib/bugsnag/delay/resque.rb +0 -21
data/lib/bugsnag/rack.rb
CHANGED
@@ -1,70 +1,55 @@
|
|
1
|
+
require "bugsnag/middleware/rack_request"
|
2
|
+
require "bugsnag/middleware/warden_user"
|
3
|
+
require "bugsnag/middleware/callbacks"
|
4
|
+
|
1
5
|
module Bugsnag
|
2
6
|
class Rack
|
3
7
|
def initialize(app)
|
4
8
|
@app = app
|
5
9
|
|
6
|
-
#
|
7
|
-
Bugsnag.
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
if
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
break
|
18
|
-
end
|
10
|
+
# Configure bugsnag rack defaults
|
11
|
+
Bugsnag.configure do |config|
|
12
|
+
# Try to set the release_stage automatically if it hasn't already been set
|
13
|
+
config.release_stage ||= ENV["RACK_ENV"] if ENV["RACK_ENV"]
|
14
|
+
|
15
|
+
# Try to set the project_root if it hasn't already been set, or show a warning if we can't
|
16
|
+
unless config.project_root && !config.project_root.empty?
|
17
|
+
if defined?(settings)
|
18
|
+
config.project_root = settings.root
|
19
|
+
else
|
20
|
+
Bugsnag.warn("You should set your app's project_root (see https://bugsnag.com/docs/notifiers/ruby#project_root).")
|
19
21
|
end
|
20
22
|
end
|
23
|
+
|
24
|
+
# Hook up rack-based notification middlewares
|
25
|
+
config.middleware.use Bugsnag::Middleware::RackRequest
|
26
|
+
config.middleware.use Bugsnag::Middleware::WardenUser if defined?(Warden)
|
21
27
|
end
|
22
28
|
end
|
23
29
|
|
24
30
|
def call(env)
|
31
|
+
# Set the request data for bugsnag middleware to use
|
32
|
+
Bugsnag.set_request_data(:rack_env, env)
|
33
|
+
|
25
34
|
begin
|
26
35
|
response = @app.call(env)
|
27
36
|
rescue Exception => raised
|
28
|
-
|
37
|
+
# Notify bugsnag of rack exceptions
|
38
|
+
Bugsnag.auto_notify(raised)
|
39
|
+
|
40
|
+
# Re-raise the exception
|
29
41
|
raise
|
30
42
|
end
|
31
43
|
|
32
|
-
|
33
|
-
|
44
|
+
# Notify bugsnag of rack exceptions
|
45
|
+
if env["rack.exception"]
|
46
|
+
Bugsnag.auto_notify(env["rack.exception"])
|
34
47
|
end
|
35
|
-
|
48
|
+
|
36
49
|
response
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
def bugsnag_request_data(env)
|
41
|
-
request = ::Rack::Request.new(env)
|
42
|
-
|
43
|
-
session = env["rack.session"]
|
44
|
-
params = env["action_dispatch.request.parameters"] || request.params
|
45
|
-
user_id = session[:session_id] || session["session_id"] rescue nil
|
46
|
-
|
47
|
-
{
|
48
|
-
:user_id => user_id,
|
49
|
-
:context => Bugsnag::Helpers.param_context(params) || Bugsnag::Helpers.request_context(request),
|
50
|
-
:meta_data => {
|
51
|
-
:request => {
|
52
|
-
:url => request.url,
|
53
|
-
:controller => params[:controller],
|
54
|
-
:action => params[:action],
|
55
|
-
:params => bugsnag_filter_if_filtering(env, Bugsnag::Helpers.cleanup_hash(params.to_hash)),
|
56
|
-
},
|
57
|
-
:session => bugsnag_filter_if_filtering(env, Bugsnag::Helpers.cleanup_hash(session)),
|
58
|
-
:environment => bugsnag_filter_if_filtering(env, Bugsnag::Helpers.cleanup_hash(env))
|
59
|
-
}
|
60
|
-
}
|
61
|
-
end
|
62
|
-
|
63
|
-
private
|
64
|
-
def bugsnag_filter_if_filtering(env, hash)
|
65
|
-
@params_filters ||= env["action_dispatch.parameter_filter"]
|
66
|
-
Bugsnag::Helpers.apply_filters(hash, @params_filters)
|
67
|
-
end
|
50
|
+
ensure
|
51
|
+
# Clear per-request data after processing the each request
|
52
|
+
Bugsnag.clear_request_data
|
68
53
|
end
|
69
54
|
end
|
70
|
-
end
|
55
|
+
end
|
data/lib/bugsnag/rails.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
# Rails 2.x
|
1
|
+
# Rails 2.x hooks
|
2
|
+
# For Rails 3+ hooks, see railtie.rb
|
2
3
|
|
3
4
|
require "bugsnag"
|
4
5
|
require "bugsnag/rails/controller_methods"
|
5
6
|
require "bugsnag/rails/action_controller_rescue"
|
7
|
+
require "bugsnag/middleware/rails2_request"
|
8
|
+
require "bugsnag/middleware/callbacks"
|
6
9
|
|
7
10
|
module Bugsnag
|
8
11
|
module Rails
|
@@ -21,11 +24,17 @@ module Bugsnag
|
|
21
24
|
end
|
22
25
|
|
23
26
|
Bugsnag.configure do |config|
|
24
|
-
config.logger
|
27
|
+
config.logger ||= rails_logger
|
25
28
|
config.release_stage = RAILS_ENV if defined?(RAILS_ENV)
|
26
29
|
config.project_root = RAILS_ROOT if defined?(RAILS_ROOT)
|
27
|
-
|
30
|
+
|
31
|
+
config.middleware.use Bugsnag::Middleware::Rails2Request
|
28
32
|
end
|
33
|
+
|
34
|
+
# Auto-load configuration settings from config/bugsnag.yml if it exists
|
35
|
+
config_file = File.join(RAILS_ROOT, "config", "bugsnag.yml")
|
36
|
+
config = YAML.load_file(config_file) if File.exists?(config_file)
|
37
|
+
Bugsnag.configure(config[RAILS_ENV] ? config[RAILS_ENV] : config) if config
|
29
38
|
end
|
30
39
|
end
|
31
40
|
end
|
@@ -1,26 +1,38 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
# Rails 2.x only
|
2
|
+
module Bugsnag::Rails
|
3
|
+
module ActionControllerRescue
|
4
|
+
def self.included(base)
|
5
|
+
# Hook into rails exception rescue stack
|
6
|
+
base.send(:alias_method, :rescue_action_in_public_without_bugsnag, :rescue_action_in_public)
|
7
|
+
base.send(:alias_method, :rescue_action_in_public, :rescue_action_in_public_with_bugsnag)
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
end
|
9
|
+
base.send(:alias_method, :rescue_action_locally_without_bugsnag, :rescue_action_locally)
|
10
|
+
base.send(:alias_method, :rescue_action_locally, :rescue_action_locally_with_bugsnag)
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
12
|
+
# Run filters on requests to capture request data
|
13
|
+
base.send(:before_filter, :set_bugsnag_request_data)
|
14
|
+
base.send(:after_filter, :clear_bugsnag_request_data)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def set_bugsnag_request_data
|
19
|
+
Bugsnag.set_request_data(:rails2_request, request)
|
20
|
+
end
|
21
|
+
|
22
|
+
def clear_bugsnag_request_data
|
23
|
+
Bugsnag.clear_request_data
|
24
|
+
end
|
25
|
+
|
26
|
+
def rescue_action_in_public_with_bugsnag(exception)
|
27
|
+
Bugsnag.auto_notify(exception)
|
28
|
+
|
29
|
+
rescue_action_in_public_without_bugsnag(exception)
|
30
|
+
end
|
31
|
+
|
32
|
+
def rescue_action_locally_with_bugsnag(exception)
|
33
|
+
Bugsnag.auto_notify(exception)
|
34
|
+
|
35
|
+
rescue_action_locally_without_bugsnag(exception)
|
24
36
|
end
|
25
37
|
end
|
26
38
|
end
|
@@ -1,64 +1,48 @@
|
|
1
|
-
module Bugsnag
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
module Bugsnag::Rails
|
2
|
+
module ControllerMethods
|
3
|
+
def self.included(base)
|
4
|
+
base.extend ClassMethods
|
5
|
+
end
|
6
|
+
|
7
|
+
module ClassMethods
|
8
|
+
private
|
9
|
+
def before_bugsnag_notify(*methods, &block)
|
10
|
+
_add_bugsnag_notify_callback(:rails_before_callbacks, *methods, &block)
|
9
11
|
end
|
10
12
|
|
11
|
-
def
|
12
|
-
|
13
|
-
:user_id => bugsnag_session_id,
|
14
|
-
:context => Bugsnag::Helpers.param_context(params),
|
15
|
-
:meta_data => {
|
16
|
-
:request => {
|
17
|
-
:url => bugsnag_request_url,
|
18
|
-
:controller => params[:controller],
|
19
|
-
:action => params[:action],
|
20
|
-
:params => bugsnag_filter_if_filtering(Bugsnag::Helpers.cleanup_hash(params.to_hash)),
|
21
|
-
},
|
22
|
-
:session => bugsnag_filter_if_filtering(Bugsnag::Helpers.cleanup_hash(bugsnag_session_data)),
|
23
|
-
:environment => bugsnag_filter_if_filtering(Bugsnag::Helpers.cleanup_hash(request.env))
|
24
|
-
}
|
25
|
-
}
|
13
|
+
def after_bugsnag_notify(*methods, &block)
|
14
|
+
_add_bugsnag_notify_callback(:rails_after_callbacks, *methods, &block)
|
26
15
|
end
|
27
16
|
|
28
|
-
def
|
29
|
-
|
30
|
-
session[:session_id] || session["session_id"]
|
31
|
-
end
|
32
|
-
|
33
|
-
def bugsnag_request_url
|
34
|
-
url = "#{request.protocol}#{request.host}"
|
17
|
+
def _add_bugsnag_notify_callback(callback_key, *methods, &block)
|
18
|
+
options = methods.last.is_a?(Hash) ? methods.pop : {}
|
35
19
|
|
36
|
-
|
37
|
-
|
38
|
-
|
20
|
+
before_filter(options) do |controller|
|
21
|
+
request_data = Bugsnag.configuration.request_data
|
22
|
+
request_data[callback_key] ||= []
|
39
23
|
|
40
|
-
|
41
|
-
|
42
|
-
|
24
|
+
# Set up "method symbol" callbacks
|
25
|
+
methods.each do |method_symbol|
|
26
|
+
request_data[callback_key] << lambda { |notification|
|
27
|
+
self.send(method_symbol, notification)
|
28
|
+
}
|
29
|
+
end
|
43
30
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
session.data
|
31
|
+
# Set up "block" callbacks
|
32
|
+
request_data[callback_key] << lambda { |notification|
|
33
|
+
controller.instance_exec(notification, &block)
|
34
|
+
} if block_given?
|
49
35
|
end
|
50
36
|
end
|
51
|
-
|
52
|
-
def bugsnag_filter_if_filtering(hash)
|
53
|
-
return hash if ! hash.is_a?(Hash)
|
37
|
+
end
|
54
38
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
hash
|
59
|
-
end
|
60
|
-
end
|
39
|
+
private
|
40
|
+
def notify_bugsnag(exception, custom_data=nil)
|
41
|
+
Bugsnag.warn "DEPRECATED METHOD: notify_bugsnag is deprecated and will be removed in the future. Please use Bugsnag.notify instead" if Bugsnag.configuration.release_stage != "production"
|
61
42
|
|
43
|
+
overrides = {}
|
44
|
+
overrides[:custom] = custom_data if custom_data
|
45
|
+
Bugsnag.notify(exception, overrides)
|
62
46
|
end
|
63
47
|
end
|
64
48
|
end
|
data/lib/bugsnag/railtie.rb
CHANGED
@@ -1,12 +1,33 @@
|
|
1
|
-
# Rails 3.x
|
1
|
+
# Rails 3.x hooks
|
2
2
|
|
3
|
-
require "bugsnag"
|
4
3
|
require "rails"
|
4
|
+
require "bugsnag"
|
5
|
+
require "bugsnag/middleware/rails3_request"
|
5
6
|
|
6
7
|
module Bugsnag
|
7
8
|
class Railtie < Rails::Railtie
|
8
9
|
rake_tasks do
|
9
|
-
load "tasks/bugsnag.rake"
|
10
|
+
load "bugsnag/tasks/bugsnag.rake"
|
11
|
+
end
|
12
|
+
|
13
|
+
config.before_initialize do
|
14
|
+
# Configure bugsnag rails defaults
|
15
|
+
Bugsnag.configure do |config|
|
16
|
+
config.logger = Rails.logger
|
17
|
+
config.release_stage = Rails.env.to_s
|
18
|
+
config.project_root = Rails.root.to_s
|
19
|
+
config.params_filters += Rails.configuration.filter_parameters
|
20
|
+
end
|
21
|
+
|
22
|
+
# Auto-load configuration settings from config/bugsnag.yml if it exists
|
23
|
+
config_file = Rails.root.join("config", "bugsnag.yml")
|
24
|
+
config = YAML.load_file(config_file) if File.exists?(config_file)
|
25
|
+
Bugsnag.configure(config[Rails.env] ? config[Rails.env] : config) if config
|
26
|
+
|
27
|
+
if defined?(::ActionController::Base)
|
28
|
+
require "bugsnag/rails/controller_methods"
|
29
|
+
::ActionController::Base.send(:include, Bugsnag::Rails::ControllerMethods)
|
30
|
+
end
|
10
31
|
end
|
11
32
|
|
12
33
|
initializer "bugsnag.use_rack_middleware" do |app|
|
@@ -19,17 +40,8 @@ module Bugsnag
|
|
19
40
|
|
20
41
|
config.after_initialize do
|
21
42
|
Bugsnag.configure do |config|
|
22
|
-
config.
|
23
|
-
config.project_root = ::Rails.root
|
24
|
-
config.framework = "Rails: #{::Rails::VERSION::STRING}"
|
25
|
-
|
26
|
-
config.logger ||= ::Rails.logger
|
27
|
-
end
|
28
|
-
|
29
|
-
if defined?(::ActionController::Base)
|
30
|
-
require "bugsnag/rails/controller_methods"
|
31
|
-
::ActionController::Base.send(:include, Bugsnag::Rails::ControllerMethods)
|
43
|
+
config.middleware.use Bugsnag::Middleware::Rails3Request
|
32
44
|
end
|
33
45
|
end
|
34
46
|
end
|
35
|
-
end
|
47
|
+
end
|
data/lib/bugsnag/tasks.rb
CHANGED
@@ -42,6 +42,11 @@ namespace :bugsnag do
|
|
42
42
|
Bugsnag.notify(e, {:context => "rake#test_exception"})
|
43
43
|
end
|
44
44
|
end
|
45
|
+
|
46
|
+
desc "Show the bugsnag middleware stack"
|
47
|
+
task :middleware => :load do
|
48
|
+
Bugsnag.configuration.middleware.each {|m| puts m.to_s}
|
49
|
+
end
|
45
50
|
end
|
46
51
|
|
47
52
|
task :load do
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bugsnag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: -639319559
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
-
|
10
|
-
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
- beta
|
11
|
+
version: 1.2.0.beta
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- James Smith
|
@@ -15,7 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2012-09-
|
19
|
+
date: 2012-09-29 00:00:00 Z
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
requirement: &id001 !ruby/object:Gem::Requirement
|
@@ -36,14 +37,20 @@ dependencies:
|
|
36
37
|
requirement: &id002 !ruby/object:Gem::Requirement
|
37
38
|
none: false
|
38
39
|
requirements:
|
39
|
-
- -
|
40
|
+
- - <
|
40
41
|
- !ruby/object:Gem::Version
|
41
|
-
hash:
|
42
|
+
hash: 15
|
42
43
|
segments:
|
44
|
+
- 1
|
43
45
|
- 0
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
version: "1.0"
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 1
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
- 5
|
53
|
+
version: "0.5"
|
47
54
|
version_requirements: *id002
|
48
55
|
name: httparty
|
49
56
|
prerelease: false
|
@@ -113,8 +120,13 @@ files:
|
|
113
120
|
- lib/bugsnag.rb
|
114
121
|
- lib/bugsnag/capistrano.rb
|
115
122
|
- lib/bugsnag/configuration.rb
|
116
|
-
- lib/bugsnag/delay/resque.rb
|
117
123
|
- lib/bugsnag/helpers.rb
|
124
|
+
- lib/bugsnag/middleware/callbacks.rb
|
125
|
+
- lib/bugsnag/middleware/rack_request.rb
|
126
|
+
- lib/bugsnag/middleware/rails2_request.rb
|
127
|
+
- lib/bugsnag/middleware/rails3_request.rb
|
128
|
+
- lib/bugsnag/middleware/warden_user.rb
|
129
|
+
- lib/bugsnag/middleware_stack.rb
|
118
130
|
- lib/bugsnag/notification.rb
|
119
131
|
- lib/bugsnag/rack.rb
|
120
132
|
- lib/bugsnag/rails.rb
|
@@ -122,9 +134,9 @@ files:
|
|
122
134
|
- lib/bugsnag/rails/controller_methods.rb
|
123
135
|
- lib/bugsnag/railtie.rb
|
124
136
|
- lib/bugsnag/tasks.rb
|
137
|
+
- lib/bugsnag/tasks/bugsnag.rake
|
125
138
|
- lib/bugsnag/version.rb
|
126
139
|
- lib/resque/failure/bugsnag.rb
|
127
|
-
- lib/tasks/bugsnag.rake
|
128
140
|
- rails/init.rb
|
129
141
|
- test/helper.rb
|
130
142
|
- test/test_bugsnag.rb
|
@@ -148,12 +160,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
148
160
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
161
|
none: false
|
150
162
|
requirements:
|
151
|
-
- - "
|
163
|
+
- - ">"
|
152
164
|
- !ruby/object:Gem::Version
|
153
|
-
hash:
|
165
|
+
hash: 25
|
154
166
|
segments:
|
155
|
-
-
|
156
|
-
|
167
|
+
- 1
|
168
|
+
- 3
|
169
|
+
- 1
|
170
|
+
version: 1.3.1
|
157
171
|
requirements: []
|
158
172
|
|
159
173
|
rubyforge_project:
|