bugsnag 5.3.3 → 5.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/CHANGELOG.md +7 -0
- data/VERSION +1 -1
- data/issue_template.md +18 -0
- data/lib/bugsnag.rb +25 -1
- data/lib/bugsnag/configuration.rb +1 -15
- data/lib/bugsnag/delayed_job.rb +6 -0
- data/lib/bugsnag/mailman.rb +8 -1
- data/lib/bugsnag/middleware/classify_error.rb +53 -0
- data/lib/bugsnag/notification.rb +45 -1
- data/lib/bugsnag/que.rb +8 -1
- data/lib/bugsnag/rack.rb +14 -2
- data/lib/bugsnag/rails/action_controller_rescue.rb +14 -2
- data/lib/bugsnag/rails/active_record_rescue.rb +8 -1
- data/lib/bugsnag/railtie.rb +8 -1
- data/lib/bugsnag/rake.rb +8 -1
- data/lib/bugsnag/resque.rb +10 -1
- data/lib/bugsnag/shoryuken.rb +8 -1
- data/lib/bugsnag/sidekiq.rb +8 -1
- data/spec/integration_spec.rb +4 -2
- data/spec/notification_spec.rb +77 -6
- data/spec/rack_spec.rb +15 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d3869fd6bf3186cfc8d91a049cba4a365d97b64
|
4
|
+
data.tar.gz: fb2cd85bf8583242d04d10f7962cae0dc19d6b6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28e4baccdf37a126880827fe389c19ae3c2e44719257509fdcb031192a7485d6b879bec48f2440c34ec1a76a716db68a3076d9567368f50d9e6d2f8363b73559
|
7
|
+
data.tar.gz: ea9958e1172c387a2b6b6c1864218be3489870f66e2f68ff6e007e46d1724ab9baa40d06760e0ed00b9c0f0412f0d8869d8450c5bcc7932433ccebb6308e0840
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
+
## 5.4.0 (02 Oct 2017)
|
5
|
+
|
6
|
+
### Enhancements
|
7
|
+
|
8
|
+
* Add a one-time warning if the API key is not set
|
9
|
+
* Track whether errors were captured automatically and by which middleware
|
10
|
+
|
4
11
|
## 5.3.3 (16 June 2017)
|
5
12
|
|
6
13
|
* [Rails] Fix failure to report when encountering objects which throw in `to_s`
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
5.
|
1
|
+
5.4.0
|
data/issue_template.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
### Expected behavior
|
2
|
+
*[Insert details on expected behaviour]*
|
3
|
+
|
4
|
+
### Observed behavior
|
5
|
+
*[Insert details on observed behaviour]*
|
6
|
+
|
7
|
+
### Steps to reproduce
|
8
|
+
*[Insert reproduction steps (if known)]*
|
9
|
+
|
10
|
+
### Version
|
11
|
+
*[Insert version information]*
|
12
|
+
|
13
|
+
### Additional information
|
14
|
+
*[Insert any additional information]*
|
15
|
+
|
16
|
+
#### Can't comment on Issues?
|
17
|
+
Some users have been unable to comment on Github issues when an [adblocker extension is enabled](https://docs.bugsnag.com/platforms/browsers/faq/#is-bugsnag-blocked-by-ad-blockers).
|
18
|
+
We recommend temporarily disabling the extension, or if that fails, contacting support@bugsnag.com.
|
data/lib/bugsnag.rb
CHANGED
@@ -24,6 +24,7 @@ require "bugsnag/middleware/sidekiq"
|
|
24
24
|
require "bugsnag/middleware/mailman"
|
25
25
|
require "bugsnag/middleware/rake"
|
26
26
|
require "bugsnag/middleware/callbacks"
|
27
|
+
require "bugsnag/middleware/classify_error"
|
27
28
|
|
28
29
|
module Bugsnag
|
29
30
|
LOG_PREFIX = "** [Bugsnag] "
|
@@ -43,6 +44,17 @@ module Bugsnag
|
|
43
44
|
# Use resque for asynchronous notification if required
|
44
45
|
require "bugsnag/delay/resque" if configuration.delay_with_resque && defined?(Resque)
|
45
46
|
|
47
|
+
# Add info error classifier to internal middleware
|
48
|
+
configuration.internal_middleware.use(Bugsnag::Middleware::ClassifyError)
|
49
|
+
|
50
|
+
# Warn if an api_key hasn't been set
|
51
|
+
@key_warning = false unless defined?(@key_warning)
|
52
|
+
|
53
|
+
if !configuration.api_key && !@key_warning
|
54
|
+
warn "No API key has been set, check your configuration"
|
55
|
+
@key_warning = true
|
56
|
+
end
|
57
|
+
|
46
58
|
# Log that we are ready to rock
|
47
59
|
@logged_ready = false unless defined?(@logged_ready)
|
48
60
|
|
@@ -56,8 +68,19 @@ module Bugsnag
|
|
56
68
|
def notify(exception, overrides=nil, request_data=nil, &block)
|
57
69
|
notification = Notification.new(exception, configuration, overrides, request_data)
|
58
70
|
|
71
|
+
initial_severity = notification.severity
|
72
|
+
initial_reason = notification.severity_reason
|
73
|
+
|
59
74
|
yield(notification) if block_given?
|
60
75
|
|
76
|
+
if notification.severity != initial_severity
|
77
|
+
notification.severity_reason = {
|
78
|
+
:type => Bugsnag::Notification::USER_CALLBACK_SET_SEVERITY
|
79
|
+
}
|
80
|
+
else
|
81
|
+
notification.severity_reason = initial_reason
|
82
|
+
end
|
83
|
+
|
61
84
|
unless notification.ignore?
|
62
85
|
notification.deliver
|
63
86
|
notification
|
@@ -72,7 +95,8 @@ module Bugsnag
|
|
72
95
|
# error class
|
73
96
|
def auto_notify(exception, overrides=nil, request_data=nil, &block)
|
74
97
|
overrides ||= {}
|
75
|
-
overrides
|
98
|
+
overrides[:severity] = "error" unless overrides.has_key? :severity
|
99
|
+
overrides[:unhandled] = true unless overrides.has_key? :unhandled
|
76
100
|
notify_or_ignore(exception, overrides, request_data, &block) if configuration.auto_notify
|
77
101
|
end
|
78
102
|
|
@@ -45,20 +45,6 @@ module Bugsnag
|
|
45
45
|
"rack.request.form_vars"
|
46
46
|
].freeze
|
47
47
|
|
48
|
-
DEFAULT_IGNORE_CLASSES = [
|
49
|
-
"AbstractController::ActionNotFound",
|
50
|
-
"ActionController::InvalidAuthenticityToken",
|
51
|
-
"ActionController::ParameterMissing",
|
52
|
-
"ActionController::UnknownAction",
|
53
|
-
"ActionController::UnknownFormat",
|
54
|
-
"ActionController::UnknownHttpMethod",
|
55
|
-
"ActiveRecord::RecordNotFound",
|
56
|
-
"CGI::Session::CookieStore::TamperedWithCookie",
|
57
|
-
"Mongoid::Errors::DocumentNotFound",
|
58
|
-
"SignalException",
|
59
|
-
"SystemExit",
|
60
|
-
].freeze
|
61
|
-
|
62
48
|
DEFAULT_IGNORE_USER_AGENTS = [].freeze
|
63
49
|
|
64
50
|
DEFAULT_DELIVERY_METHOD = :thread_queue
|
@@ -72,7 +58,7 @@ module Bugsnag
|
|
72
58
|
self.send_environment = false
|
73
59
|
self.send_code = true
|
74
60
|
self.params_filters = Set.new(DEFAULT_PARAMS_FILTERS)
|
75
|
-
self.ignore_classes = Set.new(
|
61
|
+
self.ignore_classes = Set.new()
|
76
62
|
self.ignore_user_agents = Set.new(DEFAULT_IGNORE_USER_AGENTS)
|
77
63
|
self.endpoint = DEFAULT_ENDPOINT
|
78
64
|
self.hostname = default_hostname
|
data/lib/bugsnag/delayed_job.rb
CHANGED
@@ -17,6 +17,12 @@ unless defined? Delayed::Plugins::Bugsnag
|
|
17
17
|
:job => {
|
18
18
|
:class => job.class.name,
|
19
19
|
:id => job.id,
|
20
|
+
},
|
21
|
+
:severity_reason => {
|
22
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
23
|
+
:attributes => {
|
24
|
+
:framework => "DelayedJob"
|
25
|
+
}
|
20
26
|
}
|
21
27
|
}
|
22
28
|
if job.respond_to?(:queue) && (queue = job.queue)
|
data/lib/bugsnag/mailman.rb
CHANGED
@@ -15,7 +15,14 @@ module Bugsnag
|
|
15
15
|
yield
|
16
16
|
rescue Exception => ex
|
17
17
|
raise ex if [Interrupt, SystemExit, SignalException].include? ex.class
|
18
|
-
Bugsnag.auto_notify(ex
|
18
|
+
Bugsnag.auto_notify(ex, {
|
19
|
+
:severity_reason => {
|
20
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
21
|
+
:attributes => {
|
22
|
+
:framework => "Mailman"
|
23
|
+
}
|
24
|
+
}
|
25
|
+
})
|
19
26
|
raise
|
20
27
|
ensure
|
21
28
|
Bugsnag.clear_request_data
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Bugsnag::Middleware
|
2
|
+
class ClassifyError
|
3
|
+
INFO_CLASSES = [
|
4
|
+
"AbstractController::ActionNotFound",
|
5
|
+
"ActionController::InvalidAuthenticityToken",
|
6
|
+
"ActionController::ParameterMissing",
|
7
|
+
"ActionController::UnknownAction",
|
8
|
+
"ActionController::UnknownFormat",
|
9
|
+
"ActionController::UnknownHttpMethod",
|
10
|
+
"ActiveRecord::RecordNotFound",
|
11
|
+
"CGI::Session::CookieStore::TamperedWithCookie",
|
12
|
+
"Mongoid::Errors::DocumentNotFound",
|
13
|
+
"SignalException",
|
14
|
+
"SystemExit"
|
15
|
+
]
|
16
|
+
|
17
|
+
def initialize(bugsnag)
|
18
|
+
@bugsnag = bugsnag
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(notification)
|
22
|
+
notification.exceptions.each do |ex|
|
23
|
+
|
24
|
+
outer_break = false
|
25
|
+
|
26
|
+
ancestor_chain = ex.class.ancestors.select {
|
27
|
+
|ancestor| ancestor.is_a?(Class)
|
28
|
+
}.map {
|
29
|
+
|ancestor| ancestor.to_s
|
30
|
+
}
|
31
|
+
|
32
|
+
INFO_CLASSES.each do |info_class|
|
33
|
+
if ancestor_chain.include?(info_class)
|
34
|
+
notification.severity_reason = {
|
35
|
+
:type => Bugsnag::Notification::ERROR_CLASS,
|
36
|
+
:attributes => {
|
37
|
+
:errorClass => info_class
|
38
|
+
}
|
39
|
+
}
|
40
|
+
notification.severity = 'info'
|
41
|
+
outer_break = true
|
42
|
+
break
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
break if outer_break
|
47
|
+
end
|
48
|
+
|
49
|
+
@bugsnag.call(notification)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
data/lib/bugsnag/notification.rb
CHANGED
@@ -15,6 +15,13 @@ module Bugsnag
|
|
15
15
|
NOTIFIER_VERSION = Bugsnag::VERSION
|
16
16
|
NOTIFIER_URL = "http://www.bugsnag.com"
|
17
17
|
|
18
|
+
HANDLED_EXCEPTION = "handledException"
|
19
|
+
UNHANDLED_EXCEPTION = "unhandledException"
|
20
|
+
UNHANDLED_EXCEPTION_MIDDLEWARE = "unhandledExceptionMiddleware"
|
21
|
+
ERROR_CLASS = "errorClass"
|
22
|
+
USER_SPECIFIED_SEVERITY = "userSpecifiedSeverity"
|
23
|
+
USER_CALLBACK_SET_SEVERITY = "userCallbackSetSeverity"
|
24
|
+
|
18
25
|
API_KEY_REGEX = /[0-9a-f]{32}/i
|
19
26
|
|
20
27
|
# e.g. "org/jruby/RubyKernel.java:1264:in `catch'"
|
@@ -31,6 +38,8 @@ module Bugsnag
|
|
31
38
|
|
32
39
|
attr_accessor :context
|
33
40
|
attr_reader :user
|
41
|
+
attr_reader :severity
|
42
|
+
attr_accessor :severity_reason
|
34
43
|
attr_accessor :configuration
|
35
44
|
attr_accessor :meta_data
|
36
45
|
|
@@ -50,10 +59,36 @@ module Bugsnag
|
|
50
59
|
@user = {}
|
51
60
|
@should_ignore = false
|
52
61
|
@severity = nil
|
62
|
+
@unhandled = false
|
63
|
+
@severity_reason = nil
|
53
64
|
@grouping_hash = nil
|
54
65
|
@delivery_method = nil
|
55
66
|
|
56
|
-
|
67
|
+
if @overrides.key? :unhandled
|
68
|
+
@unhandled = @overrides[:unhandled]
|
69
|
+
@overrides.delete :unhandled
|
70
|
+
end
|
71
|
+
|
72
|
+
valid_severity = @overrides.key?(:severity) && SUPPORTED_SEVERITIES.include?(@overrides[:severity])
|
73
|
+
has_reason = @overrides.key? :severity_reason
|
74
|
+
|
75
|
+
if valid_severity && has_reason
|
76
|
+
@severity = @overrides[:severity]
|
77
|
+
@severity_reason = @overrides[:severity_reason]
|
78
|
+
elsif valid_severity
|
79
|
+
@severity = @overrides[:severity]
|
80
|
+
@severity_reason = {
|
81
|
+
:type => USER_SPECIFIED_SEVERITY
|
82
|
+
}
|
83
|
+
elsif has_reason
|
84
|
+
@severity_reason = @overrides[:severity_reason]
|
85
|
+
else
|
86
|
+
@severity_reason = {
|
87
|
+
:type => HANDLED_EXCEPTION
|
88
|
+
}
|
89
|
+
end
|
90
|
+
|
91
|
+
@overrides.delete :severity_reason
|
57
92
|
@overrides.delete :severity
|
58
93
|
|
59
94
|
if @overrides.key? :grouping_hash
|
@@ -214,12 +249,19 @@ module Bugsnag
|
|
214
249
|
# make meta_data available to public middleware
|
215
250
|
@meta_data = generate_meta_data(@exceptions, @overrides)
|
216
251
|
|
252
|
+
initial_severity = self.severity
|
253
|
+
|
217
254
|
# Run the middleware here (including Bugsnag::Middleware::Callbacks)
|
218
255
|
# at the end of the middleware stack, execute the actual notification delivery
|
219
256
|
@configuration.middleware.run(self) do
|
220
257
|
# This supports self.ignore! for before_notify_callbacks.
|
221
258
|
return if @should_ignore
|
222
259
|
|
260
|
+
# Check to see if the severity has been changed
|
261
|
+
if initial_severity != self.severity
|
262
|
+
|
263
|
+
end
|
264
|
+
|
223
265
|
# Build the endpoint url
|
224
266
|
endpoint = (@configuration.use_ssl ? "https://" : "http://") + @configuration.endpoint
|
225
267
|
Bugsnag.log("Notifying #{endpoint} of #{@exceptions.last.class}")
|
@@ -243,6 +285,8 @@ module Bugsnag
|
|
243
285
|
:payloadVersion => payload_version,
|
244
286
|
:exceptions => exception_list,
|
245
287
|
:severity => self.severity,
|
288
|
+
:unhandled => @unhandled,
|
289
|
+
:severityReason => @severity_reason,
|
246
290
|
:groupingHash => self.grouping_hash,
|
247
291
|
}
|
248
292
|
|
data/lib/bugsnag/que.rb
CHANGED
@@ -3,7 +3,14 @@ if defined?(::Que)
|
|
3
3
|
begin
|
4
4
|
job = job.dup # Make sure the original job object is not mutated.
|
5
5
|
|
6
|
-
Bugsnag.auto_notify(error
|
6
|
+
Bugsnag.auto_notify(error, {
|
7
|
+
:severity_reason => {
|
8
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
9
|
+
:attributes => {
|
10
|
+
:framework => "Que"
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}) do |notification|
|
7
14
|
job[:error_count] += 1
|
8
15
|
|
9
16
|
# If the job was scheduled using ActiveJob then unwrap the job details for clarity:
|
data/lib/bugsnag/rack.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
module Bugsnag
|
2
2
|
class Rack
|
3
|
+
|
4
|
+
SEVERITY_REASON = {
|
5
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
6
|
+
:attributes => {
|
7
|
+
:framework => "Rack"
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
3
11
|
def initialize(app)
|
4
12
|
@app = app
|
5
13
|
|
@@ -34,7 +42,9 @@ module Bugsnag
|
|
34
42
|
response = @app.call(env)
|
35
43
|
rescue Exception => raised
|
36
44
|
# Notify bugsnag of rack exceptions
|
37
|
-
Bugsnag.auto_notify(raised
|
45
|
+
Bugsnag.auto_notify(raised, {
|
46
|
+
:severity_reason => SEVERITY_REASON
|
47
|
+
})
|
38
48
|
|
39
49
|
# Re-raise the exception
|
40
50
|
raise
|
@@ -42,7 +52,9 @@ module Bugsnag
|
|
42
52
|
|
43
53
|
# Notify bugsnag of rack exceptions
|
44
54
|
if env["rack.exception"]
|
45
|
-
Bugsnag.auto_notify(env["rack.exception"]
|
55
|
+
Bugsnag.auto_notify(env["rack.exception"], {
|
56
|
+
:severity_reason => SEVERITY_REASON
|
57
|
+
})
|
46
58
|
end
|
47
59
|
|
48
60
|
response
|
@@ -1,6 +1,14 @@
|
|
1
1
|
# Rails 2.x only
|
2
2
|
module Bugsnag::Rails
|
3
3
|
module ActionControllerRescue
|
4
|
+
|
5
|
+
SEVERITY_REASON = {
|
6
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
7
|
+
:attributes => {
|
8
|
+
:framework => "Rails"
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
4
12
|
def self.included(base)
|
5
13
|
base.extend(ClassMethods)
|
6
14
|
|
@@ -22,13 +30,17 @@ module Bugsnag::Rails
|
|
22
30
|
end
|
23
31
|
|
24
32
|
def rescue_action_in_public_with_bugsnag(exception)
|
25
|
-
Bugsnag.auto_notify(exception
|
33
|
+
Bugsnag.auto_notify(exception, {
|
34
|
+
:severity_reason => SEVERITY_REASON
|
35
|
+
})
|
26
36
|
|
27
37
|
rescue_action_in_public_without_bugsnag(exception)
|
28
38
|
end
|
29
39
|
|
30
40
|
def rescue_action_locally_with_bugsnag(exception)
|
31
|
-
Bugsnag.auto_notify(exception
|
41
|
+
Bugsnag.auto_notify(exception, {
|
42
|
+
:severity_reason => SEVERITY_REASON
|
43
|
+
})
|
32
44
|
|
33
45
|
rescue_action_locally_without_bugsnag(exception)
|
34
46
|
end
|
@@ -8,7 +8,14 @@ module Bugsnag::Rails
|
|
8
8
|
super
|
9
9
|
rescue StandardError => exception
|
10
10
|
# This exception will NOT be escalated, so notify it here.
|
11
|
-
Bugsnag.auto_notify(exception
|
11
|
+
Bugsnag.auto_notify(exception, {
|
12
|
+
:severity_reason => {
|
13
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
14
|
+
:attributes => {
|
15
|
+
:framework => "Rails"
|
16
|
+
}
|
17
|
+
}
|
18
|
+
})
|
12
19
|
raise
|
13
20
|
end
|
14
21
|
else
|
data/lib/bugsnag/railtie.rb
CHANGED
@@ -17,7 +17,14 @@ module Bugsnag
|
|
17
17
|
runner do
|
18
18
|
at_exit do
|
19
19
|
if $!
|
20
|
-
Bugsnag.auto_notify(
|
20
|
+
Bugsnag.auto_notify($!, {
|
21
|
+
:severity_reason => {
|
22
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
23
|
+
:attributes => {
|
24
|
+
:framework => "Rails"
|
25
|
+
}
|
26
|
+
}
|
27
|
+
})
|
21
28
|
end
|
22
29
|
end
|
23
30
|
end
|
data/lib/bugsnag/rake.rb
CHANGED
@@ -12,7 +12,14 @@ class Rake::Task
|
|
12
12
|
execute_without_bugsnag(args)
|
13
13
|
|
14
14
|
rescue Exception => ex
|
15
|
-
Bugsnag.auto_notify(ex
|
15
|
+
Bugsnag.auto_notify(ex, {
|
16
|
+
:severity_reason => {
|
17
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
18
|
+
:attributes => {
|
19
|
+
:framework => "Rake"
|
20
|
+
}
|
21
|
+
}
|
22
|
+
})
|
16
23
|
raise
|
17
24
|
ensure
|
18
25
|
Bugsnag.set_request_data :bugsnag_running_task, old_task
|
data/lib/bugsnag/resque.rb
CHANGED
@@ -26,7 +26,16 @@ module Bugsnag
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def save
|
29
|
-
Bugsnag.auto_notify(exception, {
|
29
|
+
Bugsnag.auto_notify(exception, {
|
30
|
+
:context => "#{payload['class']}@#{queue}",
|
31
|
+
:payload => payload,
|
32
|
+
:severity_reason => {
|
33
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
34
|
+
:attributes => {
|
35
|
+
:framework => "Resque"
|
36
|
+
}
|
37
|
+
}
|
38
|
+
})
|
30
39
|
end
|
31
40
|
end
|
32
41
|
end
|
data/lib/bugsnag/shoryuken.rb
CHANGED
@@ -18,7 +18,14 @@ module Bugsnag
|
|
18
18
|
|
19
19
|
yield
|
20
20
|
rescue Exception => ex
|
21
|
-
Bugsnag.auto_notify(ex
|
21
|
+
Bugsnag.auto_notify(ex, {
|
22
|
+
:severity_reason => {
|
23
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
24
|
+
:attributes => {
|
25
|
+
:framework => "Shoryuken"
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}) unless [Interrupt, SystemExit, SignalException].include?(ex.class)
|
22
29
|
raise
|
23
30
|
ensure
|
24
31
|
Bugsnag.clear_request_data
|
data/lib/bugsnag/sidekiq.rb
CHANGED
@@ -16,7 +16,14 @@ module Bugsnag
|
|
16
16
|
yield
|
17
17
|
rescue Exception => ex
|
18
18
|
raise ex if [Interrupt, SystemExit, SignalException].include? ex.class
|
19
|
-
Bugsnag.auto_notify(ex
|
19
|
+
Bugsnag.auto_notify(ex, {
|
20
|
+
:severity_reason => {
|
21
|
+
:type => Bugsnag::Notification::UNHANDLED_EXCEPTION_MIDDLEWARE,
|
22
|
+
:attributes => {
|
23
|
+
:framework => "Sidekiq"
|
24
|
+
}
|
25
|
+
}
|
26
|
+
})
|
20
27
|
raise
|
21
28
|
ensure
|
22
29
|
Bugsnag.clear_request_data
|
data/spec/integration_spec.rb
CHANGED
@@ -28,8 +28,10 @@ describe 'Bugsnag' do
|
|
28
28
|
Dir.chdir(task_fixtures_path) do
|
29
29
|
system("bundle exec rake test:crash > /dev/null 2>&1")
|
30
30
|
end
|
31
|
-
|
32
|
-
|
31
|
+
|
32
|
+
result = request()
|
33
|
+
expect(result["events"][0]["metaData"]["rake_task"]).not_to be_nil
|
34
|
+
expect(result["events"][0]["metaData"]["rake_task"]["name"]).to eq("test:crash")
|
33
35
|
end
|
34
36
|
|
35
37
|
it 'should send notifications over the wire' do
|
data/spec/notification_spec.rb
CHANGED
@@ -113,6 +113,83 @@ describe Bugsnag::Notification do
|
|
113
113
|
}
|
114
114
|
end
|
115
115
|
|
116
|
+
it "uses correct unhandled defaults" do
|
117
|
+
Bugsnag.notify(BugsnagTestException.new("It crashed"))
|
118
|
+
|
119
|
+
expect(Bugsnag).to have_sent_notification{ |payload|
|
120
|
+
event = get_event_from_payload(payload)
|
121
|
+
expect(event["unhandled"]).to be false
|
122
|
+
expect(event["severity"]).to eq("warning")
|
123
|
+
expect(event["severityReason"]).to eq({
|
124
|
+
"type" => "handledException"
|
125
|
+
})
|
126
|
+
}
|
127
|
+
end
|
128
|
+
|
129
|
+
it "sets correct severityReason if severity is modified" do
|
130
|
+
Bugsnag.notify(BugsnagTestException.new("It crashed"), {:severity => "info"})
|
131
|
+
|
132
|
+
expect(Bugsnag).to have_sent_notification{ |payload|
|
133
|
+
event = get_event_from_payload(payload)
|
134
|
+
expect(event["unhandled"]).to be false
|
135
|
+
expect(event["severity"]).to eq("info")
|
136
|
+
expect(event["severityReason"]).to eq({
|
137
|
+
"type" => "userSpecifiedSeverity"
|
138
|
+
})
|
139
|
+
}
|
140
|
+
end
|
141
|
+
|
142
|
+
it "sets correct severityReason if severity is modified in a block" do
|
143
|
+
Bugsnag.notify(BugsnagTestException.new("It crashed")) do |notification|
|
144
|
+
notification.severity = "info"
|
145
|
+
end
|
146
|
+
expect(Bugsnag).to have_sent_notification{ |payload|
|
147
|
+
event = get_event_from_payload(payload)
|
148
|
+
expect(event["unhandled"]).to be false
|
149
|
+
expect(event["severity"]).to eq("info")
|
150
|
+
expect(event["severityReason"]).to eq({
|
151
|
+
"type" => "userCallbackSetSeverity"
|
152
|
+
})
|
153
|
+
}
|
154
|
+
end
|
155
|
+
|
156
|
+
it "sets unhandled and severityReasons through auto_notify" do
|
157
|
+
Bugsnag.auto_notify(BugsnagTestException.new("It crashed"), {
|
158
|
+
:severity_reason => {
|
159
|
+
:type => "unhandledExceptionMiddleware",
|
160
|
+
:attributes => {
|
161
|
+
:framework => "ruby test"
|
162
|
+
}
|
163
|
+
}
|
164
|
+
})
|
165
|
+
expect(Bugsnag).to have_sent_notification{ |payload|
|
166
|
+
event = get_event_from_payload(payload)
|
167
|
+
expect(event["unhandled"]).to be true
|
168
|
+
expect(event["severity"]).to eq("error")
|
169
|
+
expect(event["severityReason"]).to eq({
|
170
|
+
"type" => "unhandledExceptionMiddleware",
|
171
|
+
"attributes" => {
|
172
|
+
"framework" => "ruby test"
|
173
|
+
}
|
174
|
+
})
|
175
|
+
}
|
176
|
+
end
|
177
|
+
|
178
|
+
it "sets correct severity and reason for specific error classes" do
|
179
|
+
Bugsnag.notify(SignalException.new("TERM"))
|
180
|
+
expect(Bugsnag).to have_sent_notification{ |payload|
|
181
|
+
event = get_event_from_payload(payload)
|
182
|
+
expect(event["unhandled"]).to be false
|
183
|
+
expect(event["severity"]).to eq("info")
|
184
|
+
expect(event["severityReason"]).to eq({
|
185
|
+
"type" => "errorClass",
|
186
|
+
"attributes" => {
|
187
|
+
"errorClass" => "SignalException"
|
188
|
+
}
|
189
|
+
})
|
190
|
+
}
|
191
|
+
end
|
192
|
+
|
116
193
|
# TODO: nested context
|
117
194
|
|
118
195
|
it "accepts tabs in overrides and adds them to metaData" do
|
@@ -580,12 +657,6 @@ describe Bugsnag::Notification do
|
|
580
657
|
}
|
581
658
|
end
|
582
659
|
|
583
|
-
it "does not notify if the exception class is in the default ignore_classes list" do
|
584
|
-
Bugsnag.notify_or_ignore(ActiveRecord::RecordNotFound.new("It crashed"))
|
585
|
-
|
586
|
-
expect(Bugsnag).not_to have_sent_notification
|
587
|
-
end
|
588
|
-
|
589
660
|
it "does not notify if the non-default exception class is added to the ignore_classes" do
|
590
661
|
Bugsnag.configuration.ignore_classes << "BugsnagTestException"
|
591
662
|
|
data/spec/rack_spec.rb
CHANGED
@@ -32,6 +32,21 @@ describe Bugsnag::Rack do
|
|
32
32
|
|
33
33
|
end
|
34
34
|
|
35
|
+
it "applies the correct severity reason" do
|
36
|
+
rack_stack.call(rack_env) rescue nil
|
37
|
+
|
38
|
+
expect(Bugsnag).to have_sent_notification{ |payload|
|
39
|
+
event = get_event_from_payload(payload)
|
40
|
+
expect(event["unhandled"]).to be true
|
41
|
+
expect(event["severityReason"]).to eq({
|
42
|
+
"type" => "unhandledExceptionMiddleware",
|
43
|
+
"attributes" => {
|
44
|
+
"framework" => "Rack"
|
45
|
+
}
|
46
|
+
})
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
35
50
|
it "does not deliver an exception if auto_notify is disabled" do
|
36
51
|
Bugsnag.configure do |config|
|
37
52
|
config.auto_notify = false
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bugsnag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- Rakefile
|
116
116
|
- VERSION
|
117
117
|
- bugsnag.gemspec
|
118
|
+
- issue_template.md
|
118
119
|
- lib/bugsnag.rb
|
119
120
|
- lib/bugsnag/capistrano.rb
|
120
121
|
- lib/bugsnag/capistrano2.rb
|
@@ -130,6 +131,7 @@ files:
|
|
130
131
|
- lib/bugsnag/mailman.rb
|
131
132
|
- lib/bugsnag/meta_data.rb
|
132
133
|
- lib/bugsnag/middleware/callbacks.rb
|
134
|
+
- lib/bugsnag/middleware/classify_error.rb
|
133
135
|
- lib/bugsnag/middleware/clearance_user.rb
|
134
136
|
- lib/bugsnag/middleware/mailman.rb
|
135
137
|
- lib/bugsnag/middleware/rack_request.rb
|