honeybadger 3.2.0 → 3.3.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.
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