bugsnag 1.1.5 → 1.2.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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:
|