honeybadger 3.2.0 → 3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +1 -1
  4. data/lib/honeybadger.rb +0 -7
  5. data/lib/honeybadger/agent.rb +112 -135
  6. data/lib/honeybadger/backend.rb +1 -0
  7. data/lib/honeybadger/backend/base.rb +22 -20
  8. data/lib/honeybadger/backend/debug.rb +3 -3
  9. data/lib/honeybadger/backend/server.rb +7 -12
  10. data/lib/honeybadger/backend/test.rb +7 -10
  11. data/lib/honeybadger/backtrace.rb +9 -8
  12. data/lib/honeybadger/cli.rb +1 -0
  13. data/lib/honeybadger/cli/heroku.rb +3 -3
  14. data/lib/honeybadger/cli/test.rb +1 -1
  15. data/lib/honeybadger/config.rb +6 -19
  16. data/lib/honeybadger/config/defaults.rb +2 -0
  17. data/lib/honeybadger/const.rb +11 -3
  18. data/lib/honeybadger/context_manager.rb +3 -1
  19. data/lib/honeybadger/conversions.rb +4 -3
  20. data/lib/honeybadger/init/rails.rb +2 -0
  21. data/lib/honeybadger/init/rake.rb +2 -1
  22. data/lib/honeybadger/init/ruby.rb +2 -0
  23. data/lib/honeybadger/init/sinatra.rb +3 -0
  24. data/lib/honeybadger/logging.rb +5 -4
  25. data/lib/honeybadger/notice.rb +63 -49
  26. data/lib/honeybadger/plugin.rb +3 -3
  27. data/lib/honeybadger/plugins/rails.rb +6 -6
  28. data/lib/honeybadger/plugins/resque.rb +3 -3
  29. data/lib/honeybadger/plugins/sidekiq.rb +1 -1
  30. data/lib/honeybadger/rack/error_notifier.rb +2 -3
  31. data/lib/honeybadger/rack/user_feedback.rb +8 -2
  32. data/lib/honeybadger/rack/user_informer.rb +2 -2
  33. data/lib/honeybadger/singleton.rb +46 -11
  34. data/lib/honeybadger/util/request_hash.rb +2 -2
  35. data/lib/honeybadger/util/request_payload.rb +4 -4
  36. data/lib/honeybadger/util/revision.rb +2 -2
  37. data/lib/honeybadger/util/sanitizer.rb +2 -2
  38. data/lib/honeybadger/version.rb +2 -2
  39. data/lib/honeybadger/worker.rb +7 -18
  40. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 315f88413aa73eea6868999adbad9707b1a6fb30
4
- data.tar.gz: '0583a2c4a6e6feaf9e9b02d1c9f7d044864b4c03'
2
+ SHA256:
3
+ metadata.gz: a96d12ec0ab7511008ab992216c8d71538903b6a397fc5f263ac877bfee94dda
4
+ data.tar.gz: 63d8ca7feae94980da2281ab0883a61ad7b5479f7e1c60e470c3ea92b8fb48ac
5
5
  SHA512:
6
- metadata.gz: 83eb0c64f6821c92edcc90829b7b7b9e7f43c857937236235cb97b12a54e90ba99619a0e255c3158bf5b67cf6740714d66e33232eb1753d0fc428c72f591bc82
7
- data.tar.gz: 060b06e30f83babcd3ece659c3e9010aa34696911540a3366dff53d181742c2ee8ba62ad5fb33340a1ff9b447404627f7cde6484878e20fd7913de163fac2c03
6
+ metadata.gz: b6a9617ee44a7869b271d7f7a4757f9f1c43a859ce0a9f3c789092ddcb67ce7f1675f1c03f7f4229895f10db9a6c6ead6d7861f1020e273588ea58b987021e89
7
+ data.tar.gz: ac5dc2626be3655eaec5f181a3207eb8b97816d44f9aba1c08f74e1c8f52999461523aca021af59e9ed0865a3e592f3f0cc6c2030a0e2e36f8928cc5042a26d1
data/CHANGELOG.md CHANGED
@@ -5,6 +5,16 @@ adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [3.3.0] - 2018-01-29
9
+ ### Changed
10
+ - Use prepend to add Sidekiq Middleware to fix context getting cleared.
11
+ - Add `Rack::QueryParser::ParameterTypeError` and
12
+ `Rack::QueryParser::InvalidParameterError` to default ignore list.
13
+
14
+ ### Fixed
15
+ - Use a unique route name in rails to avoid name conflicts.
16
+ - Fix `at_exit` callback being skipped in rails apps with a sinatra dependency.
17
+
8
18
  ## [3.2.0] - 2017-11-27
9
19
  ### Changed
10
20
  - Objects which explicitly alias `#to_s` to `#inspect` (such as `OpenStruct`) are
data/README.md CHANGED
@@ -21,7 +21,7 @@ Pull requests are welcome. If you're adding a new feature, please [submit an iss
21
21
 
22
22
  If you're integrating your gem/open source project with Honeybadger, please consider submitting an official plugin to our gem. [Submit an issue](https://github.com/honeybadger-io/honeybadger-ruby/issues/new) to discuss with us!
23
23
 
24
- We use [TomDoc](http://tomdoc.org/) to document our API. Classes and methods which are safe to depend on in your gems/projects are marked "Public". All other classes/methods are considered internal and may change without notice -- don't depend on them! If you need a new public API, we're happy to work with you. [Submit an issue](https://github.com/honeybadger-io/honeybadger-ruby/issues/new) to discuss.
24
+ We use [YARD](https://yardoc.org/) to document our API. Classes and methods which are safe to depend on in your gems/projects are marked "Public". All other classes/methods are considered internal and may change without notice -- don't depend on them! If you need a new public API, we're happy to work with you. [Submit an issue](https://github.com/honeybadger-io/honeybadger-ruby/issues/new) to discuss.
25
25
 
26
26
  ### To contribute your code:
27
27
 
data/lib/honeybadger.rb CHANGED
@@ -9,10 +9,3 @@ end
9
9
  if defined?(Rake.application)
10
10
  require 'honeybadger/init/rake'
11
11
  end
12
-
13
- # Sinatra is a special case. Sinatra starts the web application in an at_exit
14
- # handler. And, since we require sinatra before requiring HB, the only way to
15
- # setup our at_exit callback is in the sinatra build callback honeybadger/init/sinatra.rb
16
- if !defined?(Sinatra::Base)
17
- Honeybadger.install_at_exit_callback
18
- end
@@ -9,17 +9,21 @@ require 'honeybadger/logging'
9
9
  require 'honeybadger/worker'
10
10
 
11
11
  module Honeybadger
12
- # Public: The Honeybadger agent contains all the methods for interacting with
13
- # the Honeybadger service. It can be used to send notifications to multiple
14
- # projects in large apps.
12
+ # The Honeybadger agent contains all the methods for interacting with the
13
+ # Honeybadger service. It can be used to send notifications to multiple
14
+ # projects in large apps. The global agent instance ({Agent.instance}) should
15
+ # always be accessed through the {Honeybadger} singleton.
16
+ #
17
+ # === Context
15
18
  #
16
19
  # Context is global by default, meaning agents created via
17
- # `Honeybadger::Agent.new` will share context (added via
18
- # `Honeybadger.context` or `Honeybadger::Agent#context`) with other agents.
19
- # This also includes the Rack environment when using the Honeybadger rack
20
- # middleware.
20
+ # +Honeybadger::Agent.new+ will share context (added via
21
+ # +Honeybadger.context+ or {Honeybadger::Agent#context}) with other agents.
22
+ # This also includes the Rack environment when using the
23
+ # {Honeybadger::Rack::ErrorNotifier} middleware. To localize context for a
24
+ # custom agent, use the +local_context: true+ option when initializing.
21
25
  #
22
- # Examples
26
+ # @example
23
27
  #
24
28
  # # Standard usage:
25
29
  # OtherBadger = Honeybadger::Agent.new
@@ -41,10 +45,12 @@ module Honeybadger
41
45
 
42
46
  include Logging::Helper
43
47
 
48
+ # @api private
44
49
  def self.instance
45
50
  @instance
46
51
  end
47
52
 
53
+ # @api private
48
54
  def self.instance=(instance)
49
55
  @instance = instance
50
56
  end
@@ -63,30 +69,10 @@ module Honeybadger
63
69
  init_worker
64
70
  end
65
71
 
66
- # Public: Send an exception to Honeybadger. Does not report ignored
67
- # exceptions by default.
68
- #
69
- # exception_or_opts - An Exception object, or a Hash of options which is used
70
- # to build the notice. All other types of objects will
71
- # be converted to a String and used as the `:error_message`.
72
- # opts - The options Hash when the first argument is an
73
- # Exception (default: {}):
74
- # :error_message - The String error message.
75
- # :error_class - The String class name of the error (default: "Notice").
76
- # :backtrace - The Array backtrace of the error (optional).
77
- # :fingerprint - The String grouping fingerprint of the exception (optional).
78
- # :force - Always report the exception when true, even when ignored (default: false).
79
- # :tags - The String comma-separated list of tags (optional).
80
- # :context - The Hash context to associate with the exception (optional).
81
- # :controller - The String controller name (such as a Rails controller) (optional).
82
- # :action - The String action name (such as a Rails controller action) (optional).
83
- # :parameters - The Hash HTTP request paramaters (optional).
84
- # :session - The Hash HTTP request session (optional).
85
- # :url - The String HTTP request URL (optional).
86
- # :cause - The Exception cause for this error (optional).
87
- #
88
- # Examples
72
+ # Sends an exception to Honeybadger. Does not report ignored exceptions by
73
+ # default.
89
74
  #
75
+ # @example
90
76
  # # With an exception:
91
77
  # begin
92
78
  # fail 'oops'
@@ -102,13 +88,32 @@ module Honeybadger
102
88
  # context: {my_data: 'value'}
103
89
  # }) # => '06220c5a-b471-41e5-baeb-de247da45a56'
104
90
  #
105
- # Returns a String UUID reference to the notice within Honeybadger or false
106
- # when ignored.
91
+ # @param [Exception, Hash, Object] exception_or_opts An Exception object,
92
+ # or a Hash of options which is used to build the notice. All other types
93
+ # of objects will be converted to a String and used as the :error_message.
94
+ # @param [Hash] opts The options Hash when the first argument is an Exception.
95
+ #
96
+ # @option opts [String] :error_message The error message.
97
+ # @option opts [String] :error_class ('Notice') The class name of the error.
98
+ # @option opts [Array] :backtrace The backtrace of the error (optional).
99
+ # @option opts [String] :fingerprint The grouping fingerprint of the exception (optional).
100
+ # @option opts [Boolean] :force (false) Always report the exception when true, even when ignored (optional).
101
+ # @option opts [String] :tags The comma-separated list of tags (optional).
102
+ # @option opts [Hash] :context The context to associate with the exception (optional).
103
+ # @option opts [String] :controller The controller name (such as a Rails controller) (optional).
104
+ # @option opts [String] :action The action name (such as a Rails controller action) (optional).
105
+ # @option opts [Hash] :parameters The HTTP request paramaters (optional).
106
+ # @option opts [Hash] :session The HTTP request session (optional).
107
+ # @option opts [String] :url The HTTP request URL (optional).
108
+ # @option opts [Exception] :cause The cause for this error (optional).
109
+ #
110
+ # @return [String] UUID reference to the notice within Honeybadger.
111
+ # @return [false] when ignored.
107
112
  def notify(exception_or_opts, opts = {})
108
113
  return false if config.disabled?
109
114
 
110
115
  if exception_or_opts.is_a?(Exception)
111
- opts.merge!(exception: exception_or_opts)
116
+ opts[:exception] = exception_or_opts
112
117
  elsif exception_or_opts.respond_to?(:to_hash)
113
118
  opts.merge!(exception_or_opts.to_hash)
114
119
  else
@@ -143,16 +148,15 @@ module Honeybadger
143
148
  notice.id
144
149
  end
145
150
 
146
- # Public: Perform a synchronous check_in.
147
- #
148
- # id - The unique check in id (e.g. '1MqIo1') or the check in url.
149
- #
150
- # Examples
151
+ # Perform a synchronous check_in.
151
152
  #
153
+ # @example
152
154
  # Honeybadger.check_in('1MqIo1')
153
155
  #
154
- # Returns a boolean which is true if the check in was successful and false
155
- # otherwise.
156
+ # @param [String] id The unique check in id (e.g. '1MqIo1') or the check in url.
157
+ #
158
+ # @return [Boolean] true if the check in was successful and false
159
+ # otherwise.
156
160
  def check_in(id)
157
161
  # this is to allow check ins even if a url is passed
158
162
  check_in_id = id.to_s.strip.gsub(/\/$/, '').split('/').last
@@ -160,21 +164,9 @@ module Honeybadger
160
164
  response.success?
161
165
  end
162
166
 
163
- # Public: Save global context for the current request.
164
- #
165
- # context - A Hash of data which will be sent to Honeybadger when an error
166
- # occurs. If the object responds to #to_honeybadger_context, the return
167
- # value of that method will be used (explicit conversion). Can
168
- # include any key/value, but a few keys have a special meaning in
169
- # Honeybadger (default: nil):
170
- # :user_id - The String user ID used by Honeybadger to aggregate
171
- # user data across occurrences on the error page (optional).
172
- # :user_email - The String user email address (optional).
173
- # :tags - The String comma-separated list of tags. When present,
174
- # tags will be applied to errors with this context (optional).
175
- #
176
- # Examples
167
+ # Save global context for the current request.
177
168
  #
169
+ # @example
178
170
  # Honeybadger.context({my_data: 'my value'})
179
171
  #
180
172
  # # Inside a Rails controller:
@@ -195,39 +187,47 @@ module Honeybadger
195
187
  # # Clearing global context:
196
188
  # Honeybadger.context.clear!
197
189
  #
198
- # Returns self so that method calls can be chained.
190
+ # @param [Hash] context A Hash of data which will be sent to Honeybadger
191
+ # when an error occurs. If the object responds to +#to_honeybadger_context+,
192
+ # the return value of that method will be used (explicit conversion). Can
193
+ # include any key/value, but a few keys have a special meaning in
194
+ # Honeybadger.
195
+ #
196
+ # @option context [String] :user_id The user ID used by Honeybadger
197
+ # to aggregate user data across occurrences on the error page (optional).
198
+ # @option context [String] :user_email The user email address (optional).
199
+ # @option context [String] :tags The comma-separated list of tags.
200
+ # When present, tags will be applied to errors with this context
201
+ # (optional).
202
+ #
203
+ # @return [self] so that method calls can be chained.
199
204
  def context(context = nil)
200
205
  context_manager.set_context(context) unless context.nil?
201
206
  self
202
207
  end
203
208
 
204
- # Internal: Used to clear context via `#context.clear!`.
205
- def clear!
209
+ # @api private
210
+ # Used to clear context via `#context.clear!`.
211
+ def clear! # :nodoc:
206
212
  context_manager.clear!
207
213
  end
208
214
 
209
- # Public: Get global context for the current request.
210
- #
211
- #
212
- # Examples
215
+ # Get global context for the current request.
213
216
  #
217
+ # @example
214
218
  # Honeybadger.context({my_data: 'my value'})
215
- # Honeybadger.get_context #now returns {my_data: 'my value'}
219
+ # Honeybadger.get_context # => {my_data: 'my value'}
216
220
  #
217
- # Returns hash or nil.
221
+ # @return [Hash, nil]
218
222
  def get_context
219
223
  context_manager.get_context
220
224
  end
221
225
 
222
- # Public: Flushes all data from workers before returning. This is most useful
223
- # in tests when using the test backend, where normally the asynchronous
224
- # nature of this library could create race conditions.
225
- #
226
- # block - The optional block to execute (exceptions will propagate after data
227
- # is flushed).
228
- #
229
- # Examples
226
+ # Flushes all data from workers before returning. This is most useful in
227
+ # tests when using the test backend, where normally the asynchronous nature
228
+ # of this library could create race conditions.
230
229
  #
230
+ # @example
231
231
  # # Without a block:
232
232
  # it "sends a notification to Honeybadger" do
233
233
  # expect {
@@ -247,8 +247,11 @@ module Honeybadger
247
247
  # }.to change(Honeybadger::Backend::Test.notifications[:notices], :size).by(49)
248
248
  # end
249
249
  #
250
- # Returns value of block if block is given, otherwise true on success or
251
- # false if Honeybadger isn't running.
250
+ # @yield An optional block to execute (exceptions will propagate after
251
+ # data is flushed).
252
+ #
253
+ # @return [Object, Boolean] value of block if block is given, otherwise true
254
+ # on success or false if Honeybadger isn't running.
252
255
  def flush
253
256
  return true unless block_given?
254
257
  yield
@@ -256,44 +259,35 @@ module Honeybadger
256
259
  worker.flush
257
260
  end
258
261
 
259
- # Public: Stops the Honeybadger service.
260
- #
261
- # Examples
262
+ # Stops the Honeybadger service.
262
263
  #
264
+ # @example
263
265
  # Honeybadger.stop # => nil
264
- #
265
- # Returns nothing
266
266
  def stop(force = false)
267
267
  worker.send(force ? :shutdown! : :shutdown)
268
268
  true
269
269
  end
270
270
 
271
+ # @api private
271
272
  attr_reader :config
272
273
 
273
- # Public: Configure the Honeybadger agent via Ruby.
274
- #
275
- # block - The configuration block.
276
- #
277
- # Examples
274
+ # Configure the Honeybadger agent via Ruby.
278
275
  #
276
+ # @example
279
277
  # Honeybadger.configure do |config|
280
278
  # config.api_key = 'project api key'
281
279
  # config.exceptions.ignore += [CustomError]
282
280
  # end
283
281
  #
284
- # Yields configuration object.
285
- # Returns nothing.
282
+ # @!method configure
283
+ # @yield [Config::Ruby] configuration object.
286
284
  def_delegator :config, :configure
287
285
 
288
- # Public: Callback to ignore exceptions.
289
- #
290
- # See public API documentation for Honeybadger::Notice for available attributes.
291
- #
292
- # block - A block returning TrueClass true (to ignore) or FalseClass false
293
- # (to send).
286
+ # Callback to ignore exceptions.
294
287
  #
295
- # Examples
288
+ # See public API documentation for {Honeybadger::Notice} for available attributes.
296
289
  #
290
+ # @example
297
291
  # # Ignoring based on error message:
298
292
  # Honeybadger.exception_filter do |notice|
299
293
  # notice[:error_message] =~ /sensitive data/
@@ -304,61 +298,40 @@ module Honeybadger
304
298
  # notice[:exception].class < MyError
305
299
  # end
306
300
  #
307
- # Returns nothing.
301
+ # @!method exception_filter
302
+ # @yieldreturn [Boolean] true (to ignore) or false (to send).
308
303
  def_delegator :config, :exception_filter
309
304
 
310
- # Public: Callback to add a custom grouping strategy for exceptions. The
311
- # return value is hashed and sent to Honeybadger. Errors with the same
312
- # fingerprint will be grouped.
305
+ # Callback to add a custom grouping strategy for exceptions. The return
306
+ # value is hashed and sent to Honeybadger. Errors with the same fingerprint
307
+ # will be grouped.
313
308
  #
314
- # See public API documentation for Honeybadger::Notice for available attributes.
315
- #
316
- # block - A block returning any Object responding to #to_s.
317
- #
318
- # Examples
309
+ # See public API documentation for {Honeybadger::Notice} for available attributes.
319
310
  #
311
+ # @example
320
312
  # Honeybadger.exception_fingerprint do |notice|
321
313
  # [notice[:error_class], notice[:component], notice[:backtrace].to_s].join(':')
322
314
  # end
323
315
  #
324
- # Returns nothing.
316
+ # @!method exception_fingerprint
317
+ # @yieldreturn [#to_s] The fingerprint of the error.
325
318
  def_delegator :config, :exception_fingerprint
326
319
 
327
- # Public: Callback to filter backtrace lines. One use for this is to make
320
+ # Callback to filter backtrace lines. One use for this is to make
328
321
  # additional [PROJECT_ROOT] or [GEM_ROOT] substitutions, which are used by
329
322
  # Honeybadger when grouping errors and displaying application traces.
330
323
  #
331
- # block - A block which can be used to modify the Backtrace lines sent to
332
- # Honeybadger. The block expects one argument (line) which is the String line
333
- # from the Backtrace, and must return the String new line.
334
- #
335
- # Examples
336
- #
337
- # Honeybadger.backtrace_filter do |line|
338
- # line.gsub(/^\/my\/unknown\/bundle\/path/, "[GEM_ROOT]")
339
- # end
324
+ # @example
325
+ # Honeybadger.backtrace_filter do |line|
326
+ # line.gsub(/^\/my\/unknown\/bundle\/path/, "[GEM_ROOT]")
327
+ # end
340
328
  #
341
- # Returns nothing.
329
+ # @!method backtrace_filter
330
+ # @yieldparam [String] line The backtrace line to modify.
331
+ # @yieldreturn [String] The new (modified) backtrace line.
342
332
  def_delegator :config, :backtrace_filter
343
333
 
344
- # Public: Sets the Rack environment which is used to report request data
345
- # with errors.
346
- #
347
- # rack_env - The Hash Rack environment.
348
- # block - A block to call. Errors reported from within the block will
349
- # include request data.
350
- #
351
- # Examples
352
- #
353
- # Honeybadger.with_rack_env(env) do
354
- # begin
355
- # # Risky operation
356
- # rescue => e
357
- # Honeybadger.notify(e)
358
- # end
359
- # end
360
- #
361
- # Returns the return value of block.
334
+ # @api private
362
335
  def with_rack_env(rack_env, &block)
363
336
  context_manager.set_rack_env(rack_env)
364
337
  yield
@@ -366,13 +339,17 @@ module Honeybadger
366
339
  context_manager.set_rack_env(nil)
367
340
  end
368
341
 
369
- # Internal
342
+ # @api private
370
343
  attr_reader :worker
371
344
 
372
- # Internal
345
+ # @api private
346
+ # @!method init!(...)
347
+ # @see Config#init!
373
348
  def_delegators :config, :init!
374
349
 
375
- # Internal
350
+ # @api private
351
+ # @!method backend
352
+ # @see Config#backend
376
353
  def_delegators :config, :backend
377
354
 
378
355
  private
@@ -7,6 +7,7 @@ require 'honeybadger/backend/null'
7
7
  require 'honeybadger/backend/debug'
8
8
 
9
9
  module Honeybadger
10
+ # @api private
10
11
  module Backend
11
12
  class BackendError < StandardError; end
12
13