airbrake-ruby 2.9.0 → 2.10.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/lib/airbrake-ruby.rb +40 -18
- data/lib/airbrake-ruby/async_sender.rb +0 -6
- data/lib/airbrake-ruby/backtrace.rb +0 -10
- data/lib/airbrake-ruby/code_hunk.rb +0 -4
- data/lib/airbrake-ruby/config.rb +23 -22
- data/lib/airbrake-ruby/config/validator.rb +0 -10
- data/lib/airbrake-ruby/file_cache.rb +0 -6
- data/lib/airbrake-ruby/filter_chain.rb +0 -5
- data/lib/airbrake-ruby/filters/context_filter.rb +1 -0
- data/lib/airbrake-ruby/filters/dependency_filter.rb +31 -0
- data/lib/airbrake-ruby/filters/exception_attributes_filter.rb +45 -0
- data/lib/airbrake-ruby/filters/gem_root_filter.rb +2 -3
- data/lib/airbrake-ruby/filters/keys_blacklist.rb +1 -2
- data/lib/airbrake-ruby/filters/keys_filter.rb +9 -14
- data/lib/airbrake-ruby/filters/keys_whitelist.rb +0 -2
- data/lib/airbrake-ruby/filters/root_directory_filter.rb +2 -3
- data/lib/airbrake-ruby/filters/system_exit_filter.rb +2 -3
- data/lib/airbrake-ruby/filters/thread_filter.rb +2 -4
- data/lib/airbrake-ruby/nested_exception.rb +0 -2
- data/lib/airbrake-ruby/notice.rb +6 -44
- data/lib/airbrake-ruby/notifier.rb +4 -40
- data/lib/airbrake-ruby/promise.rb +0 -6
- data/lib/airbrake-ruby/response.rb +0 -4
- data/lib/airbrake-ruby/sync_sender.rb +0 -4
- data/lib/airbrake-ruby/version.rb +1 -3
- data/spec/airbrake_spec.rb +71 -140
- data/spec/async_sender_spec.rb +9 -0
- data/spec/config_spec.rb +4 -0
- data/spec/filters/dependency_filter_spec.rb +16 -0
- data/spec/filters/exception_attributes_filter_spec.rb +65 -0
- data/spec/filters/keys_whitelist_spec.rb +17 -23
- data/spec/notice_spec.rb +111 -69
- data/spec/notifier_spec.rb +304 -495
- data/spec/response_spec.rb +82 -0
- data/spec/sync_sender_spec.rb +31 -14
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 706d644022c1c9c99dc3e01584d0e405411d2159
|
4
|
+
data.tar.gz: 56b17f05ad9e78e0579e20a58dfbeef86e35ec54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ee8b4959b41efcc3687f16a5d6ec145644bb8b28b5e3b9fd18dbb9eb729a712708cf082b0afdd0f1ccf12b150974dda5563a535b1a3229e1d8e0ecbd7df7f8b
|
7
|
+
data.tar.gz: dbfbf97c9f39401e42d2cd00438616432e1acf9d87a07742c0aa7b405691debd2289b955779fa76dd5dd86f5656043538e25791af06c040100f07672d5399ad8
|
data/lib/airbrake-ruby.rb
CHANGED
@@ -24,12 +24,13 @@ require 'airbrake-ruby/filters/system_exit_filter'
|
|
24
24
|
require 'airbrake-ruby/filters/root_directory_filter'
|
25
25
|
require 'airbrake-ruby/filters/thread_filter'
|
26
26
|
require 'airbrake-ruby/filters/context_filter'
|
27
|
+
require 'airbrake-ruby/filters/exception_attributes_filter'
|
28
|
+
require 'airbrake-ruby/filters/dependency_filter'
|
27
29
|
require 'airbrake-ruby/filter_chain'
|
28
30
|
require 'airbrake-ruby/notifier'
|
29
31
|
require 'airbrake-ruby/code_hunk'
|
30
32
|
require 'airbrake-ruby/file_cache'
|
31
33
|
|
32
|
-
##
|
33
34
|
# This module defines the Airbrake API. The user is meant to interact with
|
34
35
|
# Airbrake via its public class methods. Before using the library, you must to
|
35
36
|
# {configure} the default notifier.
|
@@ -64,44 +65,73 @@ require 'airbrake-ruby/file_cache'
|
|
64
65
|
# @see Airbrake::Notifier
|
65
66
|
# @since v1.0.0
|
66
67
|
module Airbrake
|
67
|
-
##
|
68
68
|
# The general error that this library uses when it wants to raise.
|
69
69
|
Error = Class.new(StandardError)
|
70
70
|
|
71
|
-
##
|
72
71
|
# @return [String] the label to be prepended to the log output
|
73
72
|
LOG_LABEL = '**Airbrake:'.freeze
|
74
73
|
|
75
|
-
##
|
76
74
|
# @return [Boolean] true if current Ruby is Ruby 2.0.*. The result is used
|
77
75
|
# for special cases where we need to work around older implementations
|
78
76
|
RUBY_20 = RUBY_VERSION.start_with?('2.0')
|
79
77
|
|
80
|
-
##
|
81
78
|
# @return [Boolean] true if current Ruby is JRuby. The result is used for
|
82
79
|
# special cases where we need to work around older implementations
|
83
80
|
JRUBY = (RUBY_ENGINE == 'jruby')
|
84
81
|
|
85
|
-
|
82
|
+
# @!macro see_public_api_method
|
83
|
+
# @see Airbrake.$0
|
84
|
+
|
85
|
+
# NilNotifier is a no-op notifier, which mimics +Airbrake::Notifier+ and
|
86
|
+
# serves only for the purpose of making the library API easier to use.
|
87
|
+
#
|
88
|
+
# @since 2.1.0
|
89
|
+
class NilNotifier
|
90
|
+
# @macro see_public_api_method
|
91
|
+
def notify(_exception, _params = {}, &block); end
|
92
|
+
|
93
|
+
# @macro see_public_api_method
|
94
|
+
def notify_sync(_exception, _params = {}, &block); end
|
95
|
+
|
96
|
+
# @macro see_public_api_method
|
97
|
+
def add_filter(_filter = nil, &_block); end
|
98
|
+
|
99
|
+
# @macro see_public_api_method
|
100
|
+
def build_notice(_exception, _params = {}); end
|
101
|
+
|
102
|
+
# @macro see_public_api_method
|
103
|
+
def close; end
|
104
|
+
|
105
|
+
# @macro see_public_api_method
|
106
|
+
def create_deploy(_deploy_params); end
|
107
|
+
|
108
|
+
# @macro see_public_api_method
|
109
|
+
def configured?
|
110
|
+
false
|
111
|
+
end
|
112
|
+
|
113
|
+
# @macro see_public_api_method
|
114
|
+
def merge_context(_context); end
|
115
|
+
end
|
116
|
+
|
86
117
|
# A Hash that holds all notifiers. The keys of the Hash are notifier
|
87
118
|
# names, the values are Airbrake::Notifier instances. If a notifier is not
|
88
119
|
# assigned to the hash, then it returns a null object (NilNotifier).
|
89
120
|
@notifiers = Hash.new(NilNotifier.new)
|
90
121
|
|
91
122
|
class << self
|
92
|
-
##
|
93
123
|
# Retrieves configured notifiers.
|
94
124
|
#
|
95
125
|
# @example
|
96
126
|
# Airbrake[:my_notifier].notify('oops')
|
97
127
|
#
|
98
|
-
# @
|
128
|
+
# @param [Symbol] notifier_name the name of the notifier you want to use
|
129
|
+
# @return [Airbrake::Notifier, NilClass]
|
99
130
|
# @since v1.8.0
|
100
131
|
def [](notifier_name)
|
101
132
|
@notifiers[notifier_name]
|
102
133
|
end
|
103
134
|
|
104
|
-
##
|
105
135
|
# Configures a new +notifier+ with the given name. If the name is not given,
|
106
136
|
# configures the default notifier.
|
107
137
|
#
|
@@ -138,14 +168,12 @@ module Airbrake
|
|
138
168
|
end
|
139
169
|
end
|
140
170
|
|
141
|
-
##
|
142
171
|
# @return [Boolean] true if the notifier was configured, false otherwise
|
143
172
|
# @since 2.3.0
|
144
173
|
def configured?
|
145
174
|
@notifiers[:default].configured?
|
146
175
|
end
|
147
176
|
|
148
|
-
##
|
149
177
|
# Sends an exception to Airbrake asynchronously.
|
150
178
|
#
|
151
179
|
# @example Sending an exception
|
@@ -171,7 +199,6 @@ module Airbrake
|
|
171
199
|
@notifiers[:default].notify(exception, params, &block)
|
172
200
|
end
|
173
201
|
|
174
|
-
##
|
175
202
|
# Sends an exception to Airbrake synchronously.
|
176
203
|
#
|
177
204
|
# @example
|
@@ -192,7 +219,6 @@ module Airbrake
|
|
192
219
|
@notifiers[:default].notify_sync(exception, params, &block)
|
193
220
|
end
|
194
221
|
|
195
|
-
##
|
196
222
|
# Runs a callback before {.notify} or {.notify_sync} kicks in. This is
|
197
223
|
# useful if you want to ignore specific notices or filter the data the
|
198
224
|
# notice contains.
|
@@ -222,7 +248,6 @@ module Airbrake
|
|
222
248
|
@notifiers[:default].add_filter(filter, &block)
|
223
249
|
end
|
224
250
|
|
225
|
-
##
|
226
251
|
# Builds an Airbrake notice. This is useful, if you want to add or modify a
|
227
252
|
# value only for a specific notice. When you're done modifying the notice,
|
228
253
|
# send it with {.notify} or {.notify_sync}.
|
@@ -241,7 +266,6 @@ module Airbrake
|
|
241
266
|
@notifiers[:default].build_notice(exception, params)
|
242
267
|
end
|
243
268
|
|
244
|
-
##
|
245
269
|
# Makes the notifier a no-op, which means you cannot use the {.notify} and
|
246
270
|
# {.notify_sync} methods anymore. It also stops the notifier's worker
|
247
271
|
# threads.
|
@@ -255,7 +279,6 @@ module Airbrake
|
|
255
279
|
@notifiers[:default].close
|
256
280
|
end
|
257
281
|
|
258
|
-
##
|
259
282
|
# Pings the Airbrake Deploy API endpoint about the occurred deploy. This
|
260
283
|
# method is used by the airbrake gem for various integrations.
|
261
284
|
#
|
@@ -270,7 +293,6 @@ module Airbrake
|
|
270
293
|
@notifiers[:default].create_deploy(deploy_params)
|
271
294
|
end
|
272
295
|
|
273
|
-
##
|
274
296
|
# Merges +context+ with the current context.
|
275
297
|
#
|
276
298
|
# The context will be attached to the notice object upon a notify call and
|
@@ -287,7 +309,7 @@ module Airbrake
|
|
287
309
|
# Airbrake.notify('fruitception')
|
288
310
|
# end
|
289
311
|
#
|
290
|
-
# def load_veggies
|
312
|
+
# def load_veggies(veggies)
|
291
313
|
# Airbrake.merge_context(veggies: veggies)
|
292
314
|
# end
|
293
315
|
#
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Airbrake
|
2
|
-
##
|
3
2
|
# Responsible for sending notices to Airbrake asynchronously. The class
|
4
3
|
# supports an unlimited number of worker threads and an unlimited queue size
|
5
4
|
# (both values are configurable).
|
@@ -8,7 +7,6 @@ module Airbrake
|
|
8
7
|
# @api private
|
9
8
|
# @since v1.0.0
|
10
9
|
class AsyncSender
|
11
|
-
##
|
12
10
|
# @param [Airbrake::Config] config
|
13
11
|
def initialize(config)
|
14
12
|
@config = config
|
@@ -20,7 +18,6 @@ module Airbrake
|
|
20
18
|
@pid = nil
|
21
19
|
end
|
22
20
|
|
23
|
-
##
|
24
21
|
# Asynchronously sends a notice to Airbrake.
|
25
22
|
#
|
26
23
|
# @param [Airbrake::Notice] notice A notice that was generated by the
|
@@ -33,7 +30,6 @@ module Airbrake
|
|
33
30
|
promise
|
34
31
|
end
|
35
32
|
|
36
|
-
##
|
37
33
|
# Closes the instance making it a no-op (it shut downs all worker
|
38
34
|
# threads). Before closing, waits on all unsent notices to be sent.
|
39
35
|
#
|
@@ -57,14 +53,12 @@ module Airbrake
|
|
57
53
|
@config.logger.debug("#{LOG_LABEL} closed")
|
58
54
|
end
|
59
55
|
|
60
|
-
##
|
61
56
|
# Checks whether the sender is closed and thus usable.
|
62
57
|
# @return [Boolean]
|
63
58
|
def closed?
|
64
59
|
@closed
|
65
60
|
end
|
66
61
|
|
67
|
-
##
|
68
62
|
# Checks if an active sender has any workers. A sender doesn't have any
|
69
63
|
# workers only in two cases: when it was closed or when all workers
|
70
64
|
# crashed. An *active* sender doesn't have any workers only when something
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Airbrake
|
2
|
-
##
|
3
2
|
# Represents a cross-Ruby backtrace from exceptions (including JRuby Java
|
4
3
|
# exceptions). Provides information about stack frames (such as line number,
|
5
4
|
# file and method) in convenient for Airbrake format.
|
@@ -15,7 +14,6 @@ module Airbrake
|
|
15
14
|
# @since v1.0.0
|
16
15
|
module Backtrace
|
17
16
|
module Patterns
|
18
|
-
##
|
19
17
|
# @return [Regexp] the pattern that matches standard Ruby stack frames,
|
20
18
|
# such as ./spec/notice_spec.rb:43:in `block (3 levels) in <top (required)>'
|
21
19
|
RUBY = %r{\A
|
@@ -26,7 +24,6 @@ module Airbrake
|
|
26
24
|
`(?<function>.*)' # Matches "`block (3 levels) in <top (required)>'"
|
27
25
|
\z}x
|
28
26
|
|
29
|
-
##
|
30
27
|
# @return [Regexp] the pattern that matches JRuby Java stack frames, such
|
31
28
|
# as org.jruby.ast.NewlineNode.interpret(NewlineNode.java:105)
|
32
29
|
JAVA = %r{\A
|
@@ -44,7 +41,6 @@ module Airbrake
|
|
44
41
|
\)
|
45
42
|
\z}x
|
46
43
|
|
47
|
-
##
|
48
44
|
# @return [Regexp] the pattern that tries to assume what a generic stack
|
49
45
|
# frame might look like, when exception's backtrace is set manually.
|
50
46
|
GENERIC = %r{\A
|
@@ -59,7 +55,6 @@ module Airbrake
|
|
59
55
|
)? # ... or nothing
|
60
56
|
\z}x
|
61
57
|
|
62
|
-
##
|
63
58
|
# @return [Regexp] the pattern that matches exceptions from PL/SQL such as
|
64
59
|
# ORA-06512: at "STORE.LI_LICENSES_PACK", line 1945
|
65
60
|
# @note This is raised by https://github.com/kubo/ruby-oci8
|
@@ -74,7 +69,6 @@ module Airbrake
|
|
74
69
|
)
|
75
70
|
\z/x
|
76
71
|
|
77
|
-
##
|
78
72
|
# @return [Regexp] the pattern that matches CoffeeScript backtraces
|
79
73
|
# usually coming from Rails & ExecJS
|
80
74
|
EXECJS = /\A
|
@@ -90,17 +84,14 @@ module Airbrake
|
|
90
84
|
)
|
91
85
|
\z/x
|
92
86
|
|
93
|
-
##
|
94
87
|
# @return [Regexp] +EXECJS+ pattern without named captures and
|
95
88
|
# uncommon frames
|
96
89
|
EXECJS_SIMPLIFIED = /\A.+ \(.+:\d+:\d+\)\z/
|
97
90
|
end
|
98
91
|
|
99
|
-
##
|
100
92
|
# @return [Integer] how many first frames should include code hunks
|
101
93
|
CODE_FRAME_LIMIT = 10
|
102
94
|
|
103
|
-
##
|
104
95
|
# Parses an exception's backtrace.
|
105
96
|
#
|
106
97
|
# @param [Exception] exception The exception, which contains a backtrace to
|
@@ -111,7 +102,6 @@ module Airbrake
|
|
111
102
|
parse_backtrace(config, exception)
|
112
103
|
end
|
113
104
|
|
114
|
-
##
|
115
105
|
# Checks whether the given exception was generated by JRuby's VM.
|
116
106
|
#
|
117
107
|
# @param [Exception] exception
|
@@ -1,14 +1,11 @@
|
|
1
1
|
module Airbrake
|
2
|
-
##
|
3
2
|
# Represents a small hunk of code consisting of a base line and a couple lines
|
4
3
|
# around it
|
5
4
|
# @api private
|
6
5
|
class CodeHunk
|
7
|
-
##
|
8
6
|
# @return [Integer] the maximum length of a line
|
9
7
|
MAX_LINE_LEN = 200
|
10
8
|
|
11
|
-
##
|
12
9
|
# @return [Integer] how many lines should be read around the base line
|
13
10
|
NLINES = 2
|
14
11
|
|
@@ -16,7 +13,6 @@ module Airbrake
|
|
16
13
|
@config = config
|
17
14
|
end
|
18
15
|
|
19
|
-
##
|
20
16
|
# @param [String] file The file to read
|
21
17
|
# @param [Integer] line The base line in the file
|
22
18
|
# @return [Hash{Integer=>String}, nil] lines of code around the base line
|
data/lib/airbrake-ruby/config.rb
CHANGED
@@ -1,84 +1,88 @@
|
|
1
1
|
module Airbrake
|
2
|
-
##
|
3
2
|
# Represents the Airbrake config. A config contains all the options that you
|
4
3
|
# can use to configure an Airbrake instance.
|
5
4
|
#
|
6
5
|
# @api private
|
7
6
|
# @since v1.0.0
|
8
7
|
class Config
|
9
|
-
##
|
10
8
|
# @return [Integer] the project identificator. This value *must* be set.
|
9
|
+
# @api public
|
11
10
|
attr_accessor :project_id
|
12
11
|
|
13
|
-
##
|
14
12
|
# @return [String] the project key. This value *must* be set.
|
13
|
+
# @api public
|
15
14
|
attr_accessor :project_key
|
16
15
|
|
17
|
-
##
|
18
16
|
# @return [Hash] the proxy parameters such as (:host, :port, :user and
|
19
17
|
# :password)
|
18
|
+
# @api public
|
20
19
|
attr_accessor :proxy
|
21
20
|
|
22
|
-
##
|
23
21
|
# @return [Logger] the default logger used for debug output
|
22
|
+
# @api public
|
24
23
|
attr_reader :logger
|
25
24
|
|
26
|
-
##
|
27
25
|
# @return [String] the version of the user's application
|
26
|
+
# @api public
|
28
27
|
attr_accessor :app_version
|
29
28
|
|
30
|
-
|
29
|
+
# @return [Hash{String=>String}] arbitrary versions that your app wants to
|
30
|
+
# track
|
31
|
+
# @api public
|
32
|
+
# @since v2.10.0
|
33
|
+
attr_accessor :versions
|
34
|
+
|
31
35
|
# @return [Integer] the max number of notices that can be queued up
|
36
|
+
# @api public
|
32
37
|
attr_accessor :queue_size
|
33
38
|
|
34
|
-
##
|
35
39
|
# @return [Integer] the number of worker threads that process the notice
|
36
40
|
# queue
|
41
|
+
# @api public
|
37
42
|
attr_accessor :workers
|
38
43
|
|
39
|
-
##
|
40
44
|
# @return [String] the host, which provides the API endpoint to which
|
41
45
|
# exceptions should be sent
|
46
|
+
# @api public
|
42
47
|
attr_accessor :host
|
43
48
|
|
44
|
-
##
|
45
49
|
# @return [String, Pathname] the working directory of your project
|
50
|
+
# @api public
|
46
51
|
attr_accessor :root_directory
|
47
52
|
|
48
|
-
##
|
49
53
|
# @return [String, Symbol] the environment the application is running in
|
54
|
+
# @api public
|
50
55
|
attr_accessor :environment
|
51
56
|
|
52
|
-
##
|
53
57
|
# @return [Array<String,Symbol,Regexp>] the array of environments that
|
54
58
|
# forbids sending exceptions when the application is running in them.
|
55
59
|
# Other possible environments not listed in the array will allow sending
|
56
60
|
# occurring exceptions.
|
61
|
+
# @api public
|
57
62
|
attr_accessor :ignore_environments
|
58
63
|
|
59
|
-
##
|
60
64
|
# @return [Integer] The HTTP timeout in seconds.
|
65
|
+
# @api public
|
61
66
|
attr_accessor :timeout
|
62
67
|
|
63
|
-
##
|
64
68
|
# @return [Array<String, Symbol, Regexp>] the keys, which should be
|
65
69
|
# filtered
|
70
|
+
# @api public
|
66
71
|
# @since 1.2.0
|
67
72
|
attr_accessor :blacklist_keys
|
68
73
|
|
69
|
-
##
|
70
74
|
# @return [Array<String, Symbol, Regexp>] the keys, which shouldn't be
|
71
75
|
# filtered
|
76
|
+
# @api public
|
72
77
|
# @since 1.2.0
|
73
78
|
attr_accessor :whitelist_keys
|
74
79
|
|
75
|
-
##
|
76
80
|
# @return [Boolean] true if the library should attach code hunks to each
|
77
81
|
# frame in a backtrace, false otherwise
|
82
|
+
# @api public
|
78
83
|
# @since v2.5.0
|
79
84
|
attr_accessor :code_hunks
|
80
85
|
|
81
|
-
##
|
82
86
|
# @param [Hash{Symbol=>Object}] user_config the hash to be used to build the
|
83
87
|
# config
|
84
88
|
def initialize(user_config = {})
|
@@ -108,10 +112,11 @@ module Airbrake
|
|
108
112
|
Dir.pwd
|
109
113
|
)
|
110
114
|
|
115
|
+
self.versions = {}
|
116
|
+
|
111
117
|
merge(user_config)
|
112
118
|
end
|
113
119
|
|
114
|
-
##
|
115
120
|
# The full URL to the Airbrake Notice API. Based on the +:host+ option.
|
116
121
|
# @return [URI] the endpoint address
|
117
122
|
def endpoint
|
@@ -123,14 +128,12 @@ module Airbrake
|
|
123
128
|
end
|
124
129
|
end
|
125
130
|
|
126
|
-
##
|
127
131
|
# Sets the logger. Never allows to assign `nil` as the logger.
|
128
132
|
# @return [Logger] the logger
|
129
133
|
def logger=(logger)
|
130
134
|
@logger = logger || @logger
|
131
135
|
end
|
132
136
|
|
133
|
-
##
|
134
137
|
# Merges the given +config_hash+ with itself.
|
135
138
|
#
|
136
139
|
# @example
|
@@ -142,7 +145,6 @@ module Airbrake
|
|
142
145
|
self
|
143
146
|
end
|
144
147
|
|
145
|
-
##
|
146
148
|
# @return [Boolean] true if the config meets the requirements, false
|
147
149
|
# otherwise
|
148
150
|
def valid?
|
@@ -159,7 +161,6 @@ module Airbrake
|
|
159
161
|
@validator.error_message
|
160
162
|
end
|
161
163
|
|
162
|
-
##
|
163
164
|
# @return [Boolean] true if the config ignores current environment, false
|
164
165
|
# otherwise
|
165
166
|
def ignored_environment?
|