exception_handling 2.15.0 → 2.16.0
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.
- checksums.yaml +4 -4
- data/.github/workflows/pipeline.yml +1 -1
- data/CHANGELOG.md +5 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +5 -2
- data/README.md +54 -18
- data/lib/exception_handling/version.rb +1 -1
- data/lib/exception_handling.rb +23 -1
- data/spec/unit/exception_handling_spec.rb +60 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71ab070f1ab59f2f12838fb7d123fa541a71a8bb42fe0d057f06acb015bf32a2
|
4
|
+
data.tar.gz: 1c268f42c4a302c88b98411890db5a4870d31bb96ca712e0f6463ba6629f188a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f571e8c9dd62c70eba4b01c917af6c4715e3d4750900fec8ad7e4a3d5c67fc30ddc299c1456b48adef17c74a3860769806fd0df4e410cb5180c3f778e58c1aad
|
7
|
+
data.tar.gz: 98f1596f0a95e1591a768b23574c76e4b4039b54a7bb95f07b4f6d41d40336bae360b7ce76750cc5fec7d9c1a64c78ffc4c72d15b88b4924734bab228bb30c94
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,10 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
4
4
|
|
5
5
|
**Note:** this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
6
6
|
|
7
|
+
## [2.16.0] - 2023-05-01
|
8
|
+
### Added
|
9
|
+
- Add interface for automatically adding honeybadger tags `ExceptionHandling.honeybadger_auto_tagger=`
|
10
|
+
|
7
11
|
## [2.15.0] - 2023-03-07
|
8
12
|
### Added
|
9
13
|
- Added support for ActionMailer 7.x
|
@@ -109,6 +113,7 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|
109
113
|
### Changed
|
110
114
|
- No longer depends on hobo_support. Uses invoca-utils 0.3 instead.
|
111
115
|
|
116
|
+
[2.16.0]: https://github.com/Invoca/exception_handling/compare/v2.15.0...v2.16.0
|
112
117
|
[2.15.0]: https://github.com/Invoca/exception_handling/compare/v2.14.0...v2.15.0
|
113
118
|
[2.14.0]: https://github.com/Invoca/exception_handling/compare/v2.13.0...v2.14.0
|
114
119
|
[2.13.0]: https://github.com/Invoca/exception_handling/compare/v2.12.0...v2.13.0
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
exception_handling (2.
|
4
|
+
exception_handling (2.16.0)
|
5
5
|
actionmailer (>= 5.2)
|
6
6
|
actionpack (>= 5.2)
|
7
7
|
activesupport (>= 5.2)
|
@@ -144,6 +144,9 @@ PLATFORMS
|
|
144
144
|
ruby
|
145
145
|
|
146
146
|
DEPENDENCIES
|
147
|
+
actionmailer (~> 6.0)
|
148
|
+
actionpack (~> 6.0)
|
149
|
+
activesupport (~> 6.0)
|
147
150
|
appraisal (~> 2.2)
|
148
151
|
exception_handling!
|
149
152
|
honeybadger (~> 4.11)
|
@@ -156,4 +159,4 @@ DEPENDENCIES
|
|
156
159
|
test-unit
|
157
160
|
|
158
161
|
BUNDLED WITH
|
159
|
-
2.
|
162
|
+
2.3.22
|
data/README.md
CHANGED
@@ -25,24 +25,26 @@ Or install it yourself as:
|
|
25
25
|
Add some code to initialize the settings in your application.
|
26
26
|
For example:
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
28
|
+
```ruby
|
29
|
+
require "exception_handling"
|
30
|
+
|
31
|
+
# required
|
32
|
+
ExceptionHandling.server_name = Cluster['server_name']
|
33
|
+
ExceptionHandling.sender_address = %("Exceptions" <exceptions@example.com>)
|
34
|
+
ExceptionHandling.exception_recipients = ['exceptions@example.com']
|
35
|
+
ExceptionHandling.logger = Rails.logger
|
36
|
+
|
37
|
+
# optional
|
38
|
+
ExceptionHandling.escalation_recipients = ['escalation@example.com']
|
39
|
+
ExceptionHandling.filter_list_filename = "#{Rails.root}/config/exception_filters.yml"
|
40
|
+
ExceptionHandling.email_environment = Rails.env
|
41
|
+
ExceptionHandling.eventmachine_safe = false
|
42
|
+
ExceptionHandling.eventmachine_synchrony = false
|
43
|
+
ExceptionHandling.sensu_host = "127.0.0.1"
|
44
|
+
ExceptionHandling.sensu_port = 3030
|
45
|
+
ExceptionHandling.sensu_prefix = ""
|
46
|
+
ExceptionHandling.honeybadger_auto_tagger = ->(exception) { [] } # See "Automatically Tagging Exceptions" section below for examples
|
47
|
+
```
|
46
48
|
|
47
49
|
## Usage
|
48
50
|
|
@@ -62,6 +64,40 @@ Then call any method available in the `ExceptionHandling::Methods` mixin:
|
|
62
64
|
flash.now['error'] = "A specific error occurred. Support has been notified."
|
63
65
|
end
|
64
66
|
|
67
|
+
### Tagging Exceptions in Honeybadger
|
68
|
+
|
69
|
+
⚠️ Honeybadger differentiates tags by spaces and/or commas, so you should **not** include spaces or commas in your tags.
|
70
|
+
|
71
|
+
⚠️ Tags are case-sensitive.
|
72
|
+
|
73
|
+
#### Manually Tagging Exceptions
|
74
|
+
|
75
|
+
Add `:honeybadger_tags` to your `log_context` usage with an array of strings.
|
76
|
+
|
77
|
+
```ruby
|
78
|
+
log_error(ex, "A specific error occurred.", honeybadger_tags: ["critical", "sequoia"])
|
79
|
+
```
|
80
|
+
|
81
|
+
**Note**: Manual tags will be merged with any automatic tags.
|
82
|
+
|
83
|
+
#### Automatically Tagging Exceptions (`honeybadger_auto_tagger=`)
|
84
|
+
|
85
|
+
Configure exception handling so that you can automatically apply multiple tags to exceptions sent to honeybadger.
|
86
|
+
|
87
|
+
The Proc must accept an `exception` argument that will be the exception in question and must always return an array of strings (the array can be empty).
|
88
|
+
|
89
|
+
Example to enable auto-tagging:
|
90
|
+
```ruby
|
91
|
+
ExceptionHandling.honeybadger_auto_tagger = ->(exception) do
|
92
|
+
exception.message.match?(/fire/) ? ["high-urgency", "danger"] : ["low-urgency"]
|
93
|
+
end
|
94
|
+
```
|
95
|
+
|
96
|
+
Example to disable auto-tagging:
|
97
|
+
```ruby
|
98
|
+
ExceptionHandling.honeybadger_auto_tagger = nil
|
99
|
+
```
|
100
|
+
|
65
101
|
## Custom Hooks
|
66
102
|
|
67
103
|
### custom_data_hook
|
data/lib/exception_handling.rb
CHANGED
@@ -114,6 +114,7 @@ module ExceptionHandling # never included
|
|
114
114
|
attr_reader :filter_list_filename
|
115
115
|
attr_reader :eventmachine_safe
|
116
116
|
attr_reader :eventmachine_synchrony
|
117
|
+
attr_reader :honeybadger_auto_tagger
|
117
118
|
|
118
119
|
@filter_list_filename = "./config/exception_filters.yml"
|
119
120
|
@email_environment = ""
|
@@ -154,6 +155,14 @@ module ExceptionHandling # never included
|
|
154
155
|
@exception_catalog ||= ExceptionCatalog.new(@filter_list_filename)
|
155
156
|
end
|
156
157
|
|
158
|
+
# rubocop:disable Style/TrivialAccessors
|
159
|
+
# @param value [Proc|nil] Proc that accepts 1 parameter that will be the exception object or nil to disable the auto-tagger.
|
160
|
+
# The proc is always expected to return an array of strings. The array can be empty.
|
161
|
+
def honeybadger_auto_tagger=(value)
|
162
|
+
@honeybadger_auto_tagger = value
|
163
|
+
end
|
164
|
+
# rubocop:enable Style/TrivialAccessors
|
165
|
+
|
157
166
|
#
|
158
167
|
# internal settings (don't set directly)
|
159
168
|
#
|
@@ -270,9 +279,10 @@ module ExceptionHandling # never included
|
|
270
279
|
def send_exception_to_honeybadger(exception_info)
|
271
280
|
exception = exception_info.exception
|
272
281
|
exception_description = exception_info.exception_description
|
282
|
+
|
273
283
|
# Note: Both commas and spaces are treated as delimiters for the :tags string. Space-delimiters are not officially documented.
|
274
284
|
# https://github.com/honeybadger-io/honeybadger-ruby/pull/422
|
275
|
-
tags = exception_info.honeybadger_tags.join(' ')
|
285
|
+
tags = (honeybadger_auto_tags(exception) + exception_info.honeybadger_tags).join(' ')
|
276
286
|
response = Honeybadger.notify(error_class: exception_description ? exception_description.filter_name : exception.class.name,
|
277
287
|
error_message: exception.message.to_s,
|
278
288
|
exception: exception,
|
@@ -286,6 +296,18 @@ module ExceptionHandling # never included
|
|
286
296
|
:failure
|
287
297
|
end
|
288
298
|
|
299
|
+
# @param exception [Exception]
|
300
|
+
#
|
301
|
+
# @return [Array<String>]
|
302
|
+
def honeybadger_auto_tags(exception)
|
303
|
+
@honeybadger_auto_tagger&.call(exception) || []
|
304
|
+
rescue => ex
|
305
|
+
traces = ex.backtrace.join("\n")
|
306
|
+
message = "Unable to execute honeybadger_auto_tags callback. #{ExceptionHandling.encode_utf8(ex.message.to_s)} #{traces}\n"
|
307
|
+
ExceptionHandling.log_info(message)
|
308
|
+
[]
|
309
|
+
end
|
310
|
+
|
289
311
|
#
|
290
312
|
# Check if Honeybadger defined.
|
291
313
|
#
|
@@ -107,6 +107,11 @@ describe ExceptionHandling do
|
|
107
107
|
class SmtpClientErrbackStub < SmtpClientStub
|
108
108
|
end
|
109
109
|
|
110
|
+
before(:each) do
|
111
|
+
# Reset this for every test since they are applied to the class
|
112
|
+
ExceptionHandling.honeybadger_auto_tagger = nil
|
113
|
+
end
|
114
|
+
|
110
115
|
context "with warn and honeybadger notify stubbed" do
|
111
116
|
before do
|
112
117
|
allow(ExceptionHandling).to receive(:warn).with(any_args)
|
@@ -149,6 +154,14 @@ describe ExceptionHandling do
|
|
149
154
|
expect(service_name: 'exception_handling').to eq(logged_excluding_reload_filter.last[:context])
|
150
155
|
end
|
151
156
|
|
157
|
+
it "passes :honeybadger_tags in log context to honeybadger" do
|
158
|
+
expect(Honeybadger).to receive(:notify).with(hash_including({ tags: " , awesome , totallytubular, " }))
|
159
|
+
ExceptionHandling.log_error('This is an Error', 'This is the prefix context', honeybadger_tags: ' , awesome , totallytubular, ')
|
160
|
+
|
161
|
+
expect(Honeybadger).to receive(:notify).with(hash_including({ tags: " cool neat" }))
|
162
|
+
ExceptionHandling.log_error('This is an Error', 'This is the prefix context', honeybadger_tags: [" ", " cool ", "neat"])
|
163
|
+
end
|
164
|
+
|
152
165
|
it "logs with Severity::FATAL" do
|
153
166
|
ExceptionHandling.log_error('This is a Warning', service_name: 'exception_handling')
|
154
167
|
expect('FATAL').to eq(logged_excluding_reload_filter.last[:severity])
|
@@ -1245,6 +1258,53 @@ describe ExceptionHandling do
|
|
1245
1258
|
expect(logged_excluding_reload_filter.size).to eq(3)
|
1246
1259
|
end
|
1247
1260
|
end
|
1261
|
+
|
1262
|
+
context "#honeybadger_auto_tagger=" do
|
1263
|
+
context "with proc that runs successfully" do
|
1264
|
+
before do
|
1265
|
+
ExceptionHandling.honeybadger_auto_tagger =
|
1266
|
+
->(exception) do
|
1267
|
+
if exception.message =~ /donuts/
|
1268
|
+
['donut-error', 'high-urgency']
|
1269
|
+
else
|
1270
|
+
['low-urgency']
|
1271
|
+
end
|
1272
|
+
end
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
context "without manually passed tags" do
|
1276
|
+
let(:exception) { StandardError.new("We are out of chocolate milk") }
|
1277
|
+
|
1278
|
+
it "adds tags from autotagger" do
|
1279
|
+
expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "low-urgency" }))
|
1280
|
+
ExceptionHandling.log_error(exception, nil)
|
1281
|
+
end
|
1282
|
+
end
|
1283
|
+
|
1284
|
+
context "with manually passed tags" do
|
1285
|
+
let(:exception) { StandardError.new("The donuts are burning") }
|
1286
|
+
|
1287
|
+
it "merges tags from autotagger with manually passed tags" do
|
1288
|
+
expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "donut-error high-urgency upset-customers" }))
|
1289
|
+
ExceptionHandling.log_error(exception, nil, honeybadger_tags: ["upset-customers"])
|
1290
|
+
end
|
1291
|
+
end
|
1292
|
+
end
|
1293
|
+
end
|
1294
|
+
|
1295
|
+
context "with proc that raises an exception" do
|
1296
|
+
let(:exception) { StandardError.new("Something else occurred") }
|
1297
|
+
|
1298
|
+
before do
|
1299
|
+
ExceptionHandling.honeybadger_auto_tagger = ->(_exception) { raise StandardError, "boom" }
|
1300
|
+
end
|
1301
|
+
|
1302
|
+
it "logs a message and returns [] for the tags" do
|
1303
|
+
expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "some-other-tag" }))
|
1304
|
+
expect(ExceptionHandling).to receive(:log_info).with(/Unable to execute honeybadger_auto_tags callback. boom/)
|
1305
|
+
ExceptionHandling.log_error(exception, nil, honeybadger_tags: ["some-other-tag"])
|
1306
|
+
end
|
1307
|
+
end
|
1248
1308
|
end
|
1249
1309
|
|
1250
1310
|
context "ExceptionHandling < 3.0 " do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: exception_handling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Invoca
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionmailer
|
@@ -211,7 +211,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
|
-
rubygems_version: 3.
|
214
|
+
rubygems_version: 3.1.6
|
215
215
|
signing_key:
|
216
216
|
specification_version: 4
|
217
217
|
summary: Invoca's exception handling logger/emailer layer, based on exception_notifier.
|