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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +10 -0
- data/README.md +1 -1
- data/lib/honeybadger.rb +0 -7
- data/lib/honeybadger/agent.rb +112 -135
- data/lib/honeybadger/backend.rb +1 -0
- data/lib/honeybadger/backend/base.rb +22 -20
- data/lib/honeybadger/backend/debug.rb +3 -3
- data/lib/honeybadger/backend/server.rb +7 -12
- data/lib/honeybadger/backend/test.rb +7 -10
- data/lib/honeybadger/backtrace.rb +9 -8
- data/lib/honeybadger/cli.rb +1 -0
- data/lib/honeybadger/cli/heroku.rb +3 -3
- data/lib/honeybadger/cli/test.rb +1 -1
- data/lib/honeybadger/config.rb +6 -19
- data/lib/honeybadger/config/defaults.rb +2 -0
- data/lib/honeybadger/const.rb +11 -3
- data/lib/honeybadger/context_manager.rb +3 -1
- data/lib/honeybadger/conversions.rb +4 -3
- data/lib/honeybadger/init/rails.rb +2 -0
- data/lib/honeybadger/init/rake.rb +2 -1
- data/lib/honeybadger/init/ruby.rb +2 -0
- data/lib/honeybadger/init/sinatra.rb +3 -0
- data/lib/honeybadger/logging.rb +5 -4
- data/lib/honeybadger/notice.rb +63 -49
- data/lib/honeybadger/plugin.rb +3 -3
- data/lib/honeybadger/plugins/rails.rb +6 -6
- data/lib/honeybadger/plugins/resque.rb +3 -3
- data/lib/honeybadger/plugins/sidekiq.rb +1 -1
- data/lib/honeybadger/rack/error_notifier.rb +2 -3
- data/lib/honeybadger/rack/user_feedback.rb +8 -2
- data/lib/honeybadger/rack/user_informer.rb +2 -2
- data/lib/honeybadger/singleton.rb +46 -11
- data/lib/honeybadger/util/request_hash.rb +2 -2
- data/lib/honeybadger/util/request_payload.rb +4 -4
- data/lib/honeybadger/util/revision.rb +2 -2
- data/lib/honeybadger/util/sanitizer.rb +2 -2
- data/lib/honeybadger/version.rb +2 -2
- data/lib/honeybadger/worker.rb +7 -18
- metadata +3 -3
data/lib/honeybadger/plugin.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
|
3
3
|
module Honeybadger
|
4
|
+
# @api private
|
4
5
|
class Plugin
|
5
6
|
CALLER_FILE = Regexp.new('\A(?:\w:)?([^:]+)(?=(:\d+))').freeze
|
6
7
|
|
@@ -94,9 +95,8 @@ module Honeybadger
|
|
94
95
|
false
|
95
96
|
end
|
96
97
|
|
97
|
-
#
|
98
|
-
#
|
99
|
-
# Returns nothing
|
98
|
+
# @private
|
99
|
+
# Used for testing only; don't normally call this. :)
|
100
100
|
def reset!
|
101
101
|
@loaded = false
|
102
102
|
end
|
@@ -4,15 +4,15 @@ module Honeybadger
|
|
4
4
|
module Plugins
|
5
5
|
module Rails
|
6
6
|
module ExceptionsCatcher
|
7
|
-
#
|
7
|
+
# Adds additional Honeybadger info to Request env when an
|
8
8
|
# exception is rendered in Rails' middleware.
|
9
9
|
#
|
10
|
-
# arg
|
11
|
-
#
|
12
|
-
# exception
|
10
|
+
# @param [Hash, ActionDispatch::Request] arg The Rack env +Hash+ in
|
11
|
+
# Rails 3.0-4.2. After Rails 5 +arg+ is an +ActionDispatch::Request+.
|
12
|
+
# @param [Exception] exception The error which was rescued.
|
13
13
|
#
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# @return The super value of the middleware's +#render_exception()+
|
15
|
+
# method.
|
16
16
|
def render_exception(arg, exception)
|
17
17
|
if arg.kind_of?(::ActionDispatch::Request)
|
18
18
|
request = arg
|
@@ -5,7 +5,7 @@ module Honeybadger
|
|
5
5
|
module Plugins
|
6
6
|
module Resque
|
7
7
|
module Extension
|
8
|
-
# Executed before
|
8
|
+
# Executed before +on_failure+ hook; the flush is necessary so that
|
9
9
|
# errors reported within jobs get sent before the worker dies.
|
10
10
|
def around_perform_with_honeybadger(*args)
|
11
11
|
Honeybadger.flush { yield }
|
@@ -13,8 +13,8 @@ module Honeybadger
|
|
13
13
|
Honeybadger.context.clear!
|
14
14
|
end
|
15
15
|
|
16
|
-
# Error notifications must be synchronous as the
|
17
|
-
# executed after
|
16
|
+
# Error notifications must be synchronous as the +on_failure+ hook is
|
17
|
+
# executed after +around_perform+.
|
18
18
|
def on_failure_with_honeybadger(e, *args)
|
19
19
|
Honeybadger.notify(e, parameters: { job_arguments: args }, sync: true) if send_exception_to_honeybadger?(e, args)
|
20
20
|
end
|
@@ -5,11 +5,10 @@ require 'honeybadger/ruby'
|
|
5
5
|
|
6
6
|
module Honeybadger
|
7
7
|
module Rack
|
8
|
-
#
|
8
|
+
# Middleware for Rack applications. Any errors raised by the upstream
|
9
9
|
# application will be delivered to Honeybadger and re-raised.
|
10
10
|
#
|
11
|
-
#
|
12
|
-
#
|
11
|
+
# @example
|
13
12
|
# require 'honeybadger/rack/error_notifier'
|
14
13
|
#
|
15
14
|
# app = Rack::Builder.app do
|
@@ -16,8 +16,8 @@ end
|
|
16
16
|
|
17
17
|
module Honeybadger
|
18
18
|
module Rack
|
19
|
-
#
|
20
|
-
#
|
19
|
+
# Middleware for Rack applications. Adds a feedback form to the Rack
|
20
|
+
# response when an error has occurred.
|
21
21
|
class UserFeedback
|
22
22
|
extend Forwardable
|
23
23
|
|
@@ -41,25 +41,31 @@ module Honeybadger
|
|
41
41
|
[status, headers, body]
|
42
42
|
end
|
43
43
|
|
44
|
+
# @private
|
45
|
+
# @todo Make this method and others actually private.
|
44
46
|
def action
|
45
47
|
URI.parse("#{config.connection_protocol}://#{config[:'connection.host']}:#{config.connection_port}/v1/feedback/").to_s
|
46
48
|
rescue URI::InvalidURIError
|
47
49
|
nil
|
48
50
|
end
|
49
51
|
|
52
|
+
# @private
|
50
53
|
def render_form(error_id, action = action())
|
51
54
|
return unless action
|
52
55
|
ERB.new(@template ||= File.read(template_file)).result(binding)
|
53
56
|
end
|
54
57
|
|
58
|
+
# @private
|
55
59
|
def custom_template_file
|
56
60
|
@custom_template_file ||= File.join(config[:root], 'lib', 'honeybadger', 'templates', 'feedback_form.erb')
|
57
61
|
end
|
58
62
|
|
63
|
+
# @private
|
59
64
|
def custom_template_file?
|
60
65
|
custom_template_file && File.exist?(custom_template_file)
|
61
66
|
end
|
62
67
|
|
68
|
+
# @private
|
63
69
|
def template_file
|
64
70
|
if custom_template_file?
|
65
71
|
custom_template_file
|
@@ -2,8 +2,8 @@ require 'forwardable'
|
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Rack
|
5
|
-
#
|
6
|
-
#
|
5
|
+
# Middleware for Rack applications. Adds an error ID to the Rack response
|
6
|
+
# when an error has occurred.
|
7
7
|
class UserInformer
|
8
8
|
extend Forwardable
|
9
9
|
|
@@ -1,25 +1,59 @@
|
|
1
1
|
require 'forwardable'
|
2
2
|
require 'honeybadger/agent'
|
3
3
|
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
4
|
+
# Honeybadger's public API is made up of two parts: the {Honeybadger} singleton
|
5
|
+
# module, and the {Agent} class. The singleton module delegates its methods to
|
6
|
+
# a global agent instance, {Agent#instance}; this allows methods to be accessed
|
7
|
+
# directly, for example when calling +Honeybadger.notify+:
|
8
|
+
#
|
9
|
+
# begin
|
10
|
+
# raise 'testing an error report'
|
11
|
+
# rescue => err
|
12
|
+
# Honeybadger.notify(err)
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Custom agents may also be created by users who want to report to multiple
|
16
|
+
# Honeybadger projects in the same app (or have fine-grained control over
|
17
|
+
# configuration), however most users will use the global agent.
|
18
|
+
#
|
19
|
+
# @see Honeybadger::Agent
|
7
20
|
module Honeybadger
|
8
21
|
extend Forwardable
|
9
22
|
extend self
|
10
23
|
|
11
|
-
|
12
|
-
|
13
|
-
|
24
|
+
# @!macro [attach] def_delegator
|
25
|
+
# @!method $2(...)
|
26
|
+
# Forwards to {$1}.
|
27
|
+
# @see Agent#$2
|
28
|
+
def_delegator :'Honeybadger::Agent.instance', :check_in
|
29
|
+
def_delegator :'Honeybadger::Agent.instance', :context
|
30
|
+
def_delegator :'Honeybadger::Agent.instance', :configure
|
31
|
+
def_delegator :'Honeybadger::Agent.instance', :get_context
|
32
|
+
def_delegator :'Honeybadger::Agent.instance', :flush
|
33
|
+
def_delegator :'Honeybadger::Agent.instance', :stop
|
34
|
+
def_delegator :'Honeybadger::Agent.instance', :exception_filter
|
35
|
+
def_delegator :'Honeybadger::Agent.instance', :exception_fingerprint
|
36
|
+
def_delegator :'Honeybadger::Agent.instance', :backtrace_filter
|
14
37
|
|
38
|
+
# @!macro [attach] def_delegator
|
39
|
+
# @!method $2(...)
|
40
|
+
# @api private
|
41
|
+
# Forwards to {$1}.
|
42
|
+
# @see Agent#$2
|
43
|
+
def_delegator :'Honeybadger::Agent.instance', :config
|
44
|
+
def_delegator :'Honeybadger::Agent.instance', :init!
|
45
|
+
def_delegator :'Honeybadger::Agent.instance', :with_rack_env
|
46
|
+
|
47
|
+
# @!method notify(...)
|
48
|
+
# Forwards to {Agent.instance}.
|
49
|
+
# @see Agent#notify
|
15
50
|
def notify(exception_or_opts, opts = {})
|
51
|
+
# Note this is defined directly (instead of via forwardable) so that
|
52
|
+
# generated stack traces work as expected.
|
16
53
|
Agent.instance.notify(exception_or_opts, opts)
|
17
54
|
end
|
18
55
|
|
19
|
-
|
20
|
-
Agent.instance.check_in(id)
|
21
|
-
end
|
22
|
-
|
56
|
+
# @api private
|
23
57
|
def load_plugins!
|
24
58
|
Dir[File.expand_path('../plugins/*.rb', __FILE__)].each do |plugin|
|
25
59
|
require plugin
|
@@ -27,6 +61,7 @@ module Honeybadger
|
|
27
61
|
Plugin.load!(self.config)
|
28
62
|
end
|
29
63
|
|
64
|
+
# @api private
|
30
65
|
def install_at_exit_callback
|
31
66
|
at_exit do
|
32
67
|
if $! && !$!.is_a?(SystemExit) && Honeybadger.config[:'exceptions.notify_at_exit']
|
@@ -37,7 +72,7 @@ module Honeybadger
|
|
37
72
|
end
|
38
73
|
end
|
39
74
|
|
40
|
-
#
|
75
|
+
# @deprecated
|
41
76
|
def start(config = {})
|
42
77
|
raise NoMethodError, <<-WARNING
|
43
78
|
`Honeybadger.start` is no longer necessary and has been removed.
|
@@ -2,8 +2,8 @@ require 'set'
|
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Util
|
5
|
-
#
|
6
|
-
#
|
5
|
+
# Constructs a request hash from a Rack::Request matching the /v1/notices
|
6
|
+
# API specification.
|
7
7
|
module RequestHash
|
8
8
|
HTTP_HEADER_PREFIX = 'HTTP_'.freeze
|
9
9
|
|
@@ -2,9 +2,9 @@ require 'honeybadger/util/sanitizer'
|
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Util
|
5
|
-
#
|
5
|
+
# Constructs/sanitizes request data for notices
|
6
6
|
module RequestPayload
|
7
|
-
#
|
7
|
+
# Default values to use for request data.
|
8
8
|
DEFAULTS = {
|
9
9
|
url: nil,
|
10
10
|
component: nil,
|
@@ -14,10 +14,10 @@ module Honeybadger
|
|
14
14
|
cgi_data: {}.freeze
|
15
15
|
}.freeze
|
16
16
|
|
17
|
-
#
|
17
|
+
# Allowed keys.
|
18
18
|
KEYS = DEFAULTS.keys.freeze
|
19
19
|
|
20
|
-
#
|
20
|
+
# The cgi_data key where the raw Cookie header is stored.
|
21
21
|
HTTP_COOKIE_KEY = 'HTTP_COOKIE'.freeze
|
22
22
|
|
23
23
|
def self.build(opts = {})
|
@@ -10,8 +10,8 @@ module Honeybadger
|
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
# Requires (currently) alpha platform feature
|
14
|
-
#
|
13
|
+
# Requires (currently) alpha platform feature `heroku labs:enable
|
14
|
+
# runtime-dyno-metadata`
|
15
15
|
#
|
16
16
|
# See https://devcenter.heroku.com/articles/dyno-metadata
|
17
17
|
def from_heroku
|
@@ -5,8 +5,8 @@ require 'honeybadger/conversions'
|
|
5
5
|
|
6
6
|
module Honeybadger
|
7
7
|
module Util
|
8
|
-
#
|
9
|
-
#
|
8
|
+
# Sanitizer sanitizes data for sending to Honeybadger's API. The filters
|
9
|
+
# are based on Rails' HTTP parameter filter.
|
10
10
|
class Sanitizer
|
11
11
|
COOKIE_PAIRS = /[;,]\s?/
|
12
12
|
COOKIE_SEP = '='.freeze
|
data/lib/honeybadger/version.rb
CHANGED
data/lib/honeybadger/worker.rb
CHANGED
@@ -4,16 +4,17 @@ require 'net/http'
|
|
4
4
|
require 'honeybadger/logging'
|
5
5
|
|
6
6
|
module Honeybadger
|
7
|
-
#
|
7
|
+
# A concurrent queue to notify the backend.
|
8
|
+
# @api private
|
8
9
|
class Worker
|
9
10
|
extend Forwardable
|
10
11
|
|
11
12
|
include Honeybadger::Logging::Helper
|
12
13
|
|
13
|
-
#
|
14
|
+
# Sub-class thread so we have a named thread (useful for debugging in Thread.list).
|
14
15
|
class Thread < ::Thread; end
|
15
16
|
|
16
|
-
#
|
17
|
+
# A queue which enforces a maximum size.
|
17
18
|
class Queue < ::Queue
|
18
19
|
attr_reader :max_size
|
19
20
|
|
@@ -48,9 +49,6 @@ module Honeybadger
|
|
48
49
|
handle_response(msg, notify_backend(msg))
|
49
50
|
end
|
50
51
|
|
51
|
-
# Internal: Shutdown the worker after sending remaining data.
|
52
|
-
#
|
53
|
-
# Returns true.
|
54
52
|
def shutdown
|
55
53
|
d { 'shutting down worker' }
|
56
54
|
|
@@ -91,9 +89,7 @@ module Honeybadger
|
|
91
89
|
true
|
92
90
|
end
|
93
91
|
|
94
|
-
#
|
95
|
-
#
|
96
|
-
# Returns nothing.
|
92
|
+
# Blocks until queue is processed up to this point in time.
|
97
93
|
def flush
|
98
94
|
mutex.synchronize do
|
99
95
|
if thread && thread.alive?
|
@@ -226,19 +222,12 @@ module Honeybadger
|
|
226
222
|
end
|
227
223
|
end
|
228
224
|
|
229
|
-
#
|
230
|
-
#
|
231
|
-
#
|
232
|
-
# Returns nothing.
|
225
|
+
# Release the marker. Important to perform during cleanup when shutting
|
226
|
+
# down, otherwise it could end up waiting indefinitely.
|
233
227
|
def release_marker
|
234
228
|
signal_marker(marker)
|
235
229
|
end
|
236
230
|
|
237
|
-
# Internal: Signal a marker.
|
238
|
-
#
|
239
|
-
# marker - The ConditionVariable marker to signal.
|
240
|
-
#
|
241
|
-
# Returns nothing.
|
242
231
|
def signal_marker(marker)
|
243
232
|
mutex.synchronize do
|
244
233
|
marker.signal
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honeybadger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Honeybadger Industries LLC
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Make managing application errors a more pleasant experience.
|
14
14
|
email:
|
@@ -143,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
143
143
|
version: '0'
|
144
144
|
requirements: []
|
145
145
|
rubyforge_project:
|
146
|
-
rubygems_version: 2.
|
146
|
+
rubygems_version: 2.7.3
|
147
147
|
signing_key:
|
148
148
|
specification_version: 4
|
149
149
|
summary: Error reports you can be happy about.
|