honeybadger 5.29.1 → 6.0.1
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/CHANGELOG.md +29 -0
- data/lib/honeybadger/agent.rb +36 -35
- data/lib/honeybadger/backend/base.rb +11 -11
- data/lib/honeybadger/backend/debug.rb +4 -4
- data/lib/honeybadger/backend/null.rb +2 -2
- data/lib/honeybadger/backend/server.rb +11 -11
- data/lib/honeybadger/backend/test.rb +2 -2
- data/lib/honeybadger/backend.rb +6 -6
- data/lib/honeybadger/backtrace.rb +27 -22
- data/lib/honeybadger/breadcrumbs/active_support.rb +9 -9
- data/lib/honeybadger/breadcrumbs/breadcrumb.rb +1 -2
- data/lib/honeybadger/breadcrumbs/collector.rb +4 -4
- data/lib/honeybadger/breadcrumbs/logging.rb +11 -14
- data/lib/honeybadger/breadcrumbs.rb +3 -3
- data/lib/honeybadger/cli/deploy.rb +7 -7
- data/lib/honeybadger/cli/exec.rb +41 -41
- data/lib/honeybadger/cli/helpers.rb +18 -18
- data/lib/honeybadger/cli/heroku.rb +36 -36
- data/lib/honeybadger/cli/install.rb +44 -44
- data/lib/honeybadger/cli/main.rb +107 -107
- data/lib/honeybadger/cli/notify.rb +13 -13
- data/lib/honeybadger/cli/test.rb +109 -94
- data/lib/honeybadger/cli.rb +3 -3
- data/lib/honeybadger/config/defaults.rb +218 -218
- data/lib/honeybadger/config/env.rb +5 -5
- data/lib/honeybadger/config/ruby.rb +19 -19
- data/lib/honeybadger/config/yaml.rb +12 -12
- data/lib/honeybadger/config.rb +76 -78
- data/lib/honeybadger/const.rb +4 -4
- data/lib/honeybadger/context_manager.rb +1 -2
- data/lib/honeybadger/conversions.rb +9 -6
- data/lib/honeybadger/counter.rb +4 -4
- data/lib/honeybadger/event.rb +3 -3
- data/lib/honeybadger/events_worker.rb +33 -33
- data/lib/honeybadger/gauge.rb +2 -2
- data/lib/honeybadger/histogram.rb +4 -4
- data/lib/honeybadger/init/hanami.rb +5 -5
- data/lib/honeybadger/init/rails.rb +14 -14
- data/lib/honeybadger/init/rake.rb +19 -21
- data/lib/honeybadger/init/ruby.rb +4 -4
- data/lib/honeybadger/init/sinatra.rb +11 -12
- data/lib/honeybadger/instrumentation.rb +26 -31
- data/lib/honeybadger/instrumentation_helper.rb +11 -12
- data/lib/honeybadger/karafka.rb +55 -56
- data/lib/honeybadger/logging.rb +22 -21
- data/lib/honeybadger/metric.rb +2 -2
- data/lib/honeybadger/metrics_worker.rb +12 -10
- data/lib/honeybadger/notice.rb +55 -58
- data/lib/honeybadger/notification_subscriber.rb +14 -14
- data/lib/honeybadger/plugin.rb +16 -18
- data/lib/honeybadger/plugins/active_job.rb +11 -9
- data/lib/honeybadger/plugins/autotuner.rb +5 -5
- data/lib/honeybadger/plugins/breadcrumbs.rb +7 -7
- data/lib/honeybadger/plugins/delayed_job/plugin.rb +36 -37
- data/lib/honeybadger/plugins/delayed_job.rb +4 -4
- data/lib/honeybadger/plugins/faktory.rb +10 -10
- data/lib/honeybadger/plugins/karafka.rb +3 -3
- data/lib/honeybadger/plugins/lambda.rb +9 -11
- data/lib/honeybadger/plugins/local_variables.rb +4 -4
- data/lib/honeybadger/plugins/net_http.rb +10 -10
- data/lib/honeybadger/plugins/passenger.rb +4 -4
- data/lib/honeybadger/plugins/rails.rb +13 -9
- data/lib/honeybadger/plugins/resque.rb +7 -7
- data/lib/honeybadger/plugins/shoryuken.rb +6 -6
- data/lib/honeybadger/plugins/sidekiq.rb +62 -58
- data/lib/honeybadger/plugins/solid_queue.rb +3 -3
- data/lib/honeybadger/plugins/sucker_punch.rb +5 -5
- data/lib/honeybadger/plugins/system.rb +3 -3
- data/lib/honeybadger/plugins/thor.rb +5 -5
- data/lib/honeybadger/plugins/warden.rb +4 -4
- data/lib/honeybadger/rack/error_notifier.rb +14 -14
- data/lib/honeybadger/rack/user_feedback.rb +11 -12
- data/lib/honeybadger/rack/user_informer.rb +6 -6
- data/lib/honeybadger/registry.rb +2 -2
- data/lib/honeybadger/registry_execution.rb +1 -1
- data/lib/honeybadger/ruby.rb +2 -2
- data/lib/honeybadger/singleton.rb +49 -48
- data/lib/honeybadger/tasks.rb +3 -3
- data/lib/honeybadger/timer.rb +1 -1
- data/lib/honeybadger/util/http.rb +27 -27
- data/lib/honeybadger/util/request_hash.rb +11 -11
- data/lib/honeybadger/util/request_payload.rb +2 -2
- data/lib/honeybadger/util/revision.rb +14 -6
- data/lib/honeybadger/util/sanitizer.rb +22 -22
- data/lib/honeybadger/util/stats.rb +6 -3
- data/lib/honeybadger/version.rb +1 -1
- data/lib/honeybadger/worker.rb +31 -29
- data/lib/honeybadger.rb +5 -5
- data/lib/puma/plugin/honeybadger.rb +12 -8
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "honeybadger/plugin"
|
2
|
+
require "honeybadger/ruby"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
module Plugins
|
@@ -15,8 +15,8 @@ module Honeybadger
|
|
15
15
|
|
16
16
|
def invoke_command_with_honeybadger(*args)
|
17
17
|
invoke_command_without_honeybadger(*args)
|
18
|
-
rescue
|
19
|
-
Honeybadger.notify(
|
18
|
+
rescue => error
|
19
|
+
Honeybadger.notify(error)
|
20
20
|
raise
|
21
21
|
end
|
22
22
|
end
|
@@ -25,7 +25,7 @@ module Honeybadger
|
|
25
25
|
requirement { defined?(::Thor.no_commands) }
|
26
26
|
|
27
27
|
execution do
|
28
|
-
return unless Honeybadger.config[:
|
28
|
+
return unless Honeybadger.config[:"exceptions.enabled"]
|
29
29
|
::Thor.send(:include, Thor)
|
30
30
|
end
|
31
31
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "honeybadger/plugin"
|
2
|
+
require "honeybadger/ruby"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
Plugin.register do
|
@@ -9,8 +9,8 @@ module Honeybadger
|
|
9
9
|
::Warden::Manager.after_set_user do |user, auth, opts|
|
10
10
|
if user.respond_to?(:id)
|
11
11
|
::Honeybadger.context({
|
12
|
-
:
|
13
|
-
:
|
12
|
+
user_scope: opts[:scope].to_s,
|
13
|
+
user_id: user.id.to_s
|
14
14
|
})
|
15
15
|
end
|
16
16
|
end
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "rack/request"
|
3
3
|
|
4
|
-
require
|
4
|
+
require "honeybadger/ruby"
|
5
5
|
|
6
6
|
module Honeybadger
|
7
7
|
module Rack
|
@@ -23,22 +23,22 @@ module Honeybadger
|
|
23
23
|
|
24
24
|
def initialize(app, agent = nil)
|
25
25
|
@app = app
|
26
|
-
@agent = agent.
|
26
|
+
@agent = agent.is_a?(Agent) && agent
|
27
27
|
end
|
28
28
|
|
29
29
|
def call(env)
|
30
30
|
agent.with_rack_env(env) do
|
31
31
|
begin
|
32
|
-
env[
|
32
|
+
env["honeybadger.config"] = config
|
33
33
|
response = @app.call(env)
|
34
|
-
rescue
|
35
|
-
env[
|
34
|
+
rescue => error
|
35
|
+
env["honeybadger.error_id"] = notify_honeybadger(error, env)
|
36
36
|
raise
|
37
37
|
end
|
38
38
|
|
39
39
|
framework_exception = framework_exception(env)
|
40
40
|
if framework_exception
|
41
|
-
env[
|
41
|
+
env["honeybadger.error_id"] = notify_honeybadger(framework_exception, env)
|
42
42
|
end
|
43
43
|
|
44
44
|
response
|
@@ -57,15 +57,15 @@ module Honeybadger
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def ignored_user_agent?(env)
|
60
|
-
true if config[:
|
61
|
-
flatten
|
62
|
-
any? { |ua| ua === env[
|
60
|
+
true if config[:"exceptions.ignored_user_agents"]
|
61
|
+
.flatten
|
62
|
+
.any? { |ua| ua === env["HTTP_USER_AGENT"] }
|
63
63
|
end
|
64
64
|
|
65
65
|
def notify_honeybadger(exception, env)
|
66
66
|
return if ignored_user_agent?(env)
|
67
67
|
|
68
|
-
if config[:
|
68
|
+
if config[:"breadcrumbs.enabled"]
|
69
69
|
# Drop the last breadcrumb only if the message contains the error class name
|
70
70
|
agent.breadcrumbs.drop_previous_breadcrumb_if do |bc|
|
71
71
|
bc.category == "log" && bc.message.include?(exception.class.to_s)
|
@@ -84,8 +84,8 @@ module Honeybadger
|
|
84
84
|
end
|
85
85
|
|
86
86
|
def framework_exception(env)
|
87
|
-
env[
|
88
|
-
env[
|
87
|
+
env["action_dispatch.exception"] || env["rack.exception"] ||
|
88
|
+
env["sinatra.error"] || env["honeybadger.exception"]
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "erb"
|
2
|
+
require "uri"
|
3
|
+
require "forwardable"
|
4
4
|
|
5
5
|
begin
|
6
|
-
require
|
6
|
+
require "i18n"
|
7
7
|
rescue LoadError
|
8
8
|
module Honeybadger
|
9
9
|
module I18n
|
10
|
-
def self.t(key, options={})
|
10
|
+
def self.t(key, options = {})
|
11
11
|
options[:default]
|
12
12
|
end
|
13
13
|
end
|
@@ -23,18 +23,18 @@ module Honeybadger
|
|
23
23
|
|
24
24
|
def initialize(app, agent = nil)
|
25
25
|
@app = app
|
26
|
-
@agent = agent.
|
26
|
+
@agent = agent.is_a?(Agent) && agent
|
27
27
|
end
|
28
28
|
|
29
29
|
def call(env)
|
30
30
|
status, headers, body = @app.call(env)
|
31
|
-
if env[
|
31
|
+
if env["honeybadger.error_id"] && (form = render_form(env["honeybadger.error_id"]))
|
32
32
|
new_body = []
|
33
33
|
body.each do |chunk|
|
34
34
|
new_body << chunk.gsub("<!-- HONEYBADGER FEEDBACK -->", form)
|
35
35
|
end
|
36
36
|
body.close if body.respond_to?(:close)
|
37
|
-
headers[
|
37
|
+
headers["Content-Length"] = new_body.reduce(0) { |a, e| a + e.bytesize }.to_s
|
38
38
|
body = new_body
|
39
39
|
end
|
40
40
|
[status, headers, body]
|
@@ -43,7 +43,7 @@ module Honeybadger
|
|
43
43
|
# @private
|
44
44
|
# @todo Make this method and others actually private.
|
45
45
|
def action
|
46
|
-
URI.parse("#{config.connection_protocol}://#{config[:
|
46
|
+
URI.parse("#{config.connection_protocol}://#{config[:"connection.host"]}:#{config.connection_port}/v1/feedback/").to_s
|
47
47
|
rescue URI::InvalidURIError
|
48
48
|
nil
|
49
49
|
end
|
@@ -56,7 +56,7 @@ module Honeybadger
|
|
56
56
|
|
57
57
|
# @private
|
58
58
|
def custom_template_file
|
59
|
-
@custom_template_file ||= File.join(config[:root],
|
59
|
+
@custom_template_file ||= File.join(config[:root], "lib", "honeybadger", "templates", "feedback_form.erb")
|
60
60
|
end
|
61
61
|
|
62
62
|
# @private
|
@@ -69,7 +69,7 @@ module Honeybadger
|
|
69
69
|
if custom_template_file?
|
70
70
|
custom_template_file
|
71
71
|
else
|
72
|
-
File.expand_path(
|
72
|
+
File.expand_path("../../templates/feedback_form.erb", __FILE__)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -81,7 +81,6 @@ module Honeybadger
|
|
81
81
|
def agent
|
82
82
|
@agent || Honeybadger::Agent.instance
|
83
83
|
end
|
84
|
-
|
85
84
|
end
|
86
85
|
end
|
87
86
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "forwardable"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Rack
|
@@ -9,23 +9,23 @@ module Honeybadger
|
|
9
9
|
|
10
10
|
def initialize(app, agent = nil)
|
11
11
|
@app = app
|
12
|
-
@agent = agent.
|
12
|
+
@agent = agent.is_a?(Agent) && agent
|
13
13
|
end
|
14
14
|
|
15
15
|
def replacement(with)
|
16
|
-
config[:
|
16
|
+
config[:"user_informer.info"].gsub(/\{\{\s*error_id\s*\}\}/, with.to_s)
|
17
17
|
end
|
18
18
|
|
19
19
|
def call(env)
|
20
20
|
status, headers, body = @app.call(env)
|
21
|
-
if env[
|
21
|
+
if env["honeybadger.error_id"]
|
22
22
|
new_body = []
|
23
|
-
replace
|
23
|
+
replace = replacement(env["honeybadger.error_id"])
|
24
24
|
body.each do |chunk|
|
25
25
|
new_body << chunk.gsub("<!-- HONEYBADGER ERROR -->", replace)
|
26
26
|
end
|
27
27
|
body.close if body.respond_to?(:close)
|
28
|
-
headers[
|
28
|
+
headers["Content-Length"] = new_body.reduce(0) { |a, e| a + e.bytesize }.to_s
|
29
29
|
body = new_body
|
30
30
|
end
|
31
31
|
[status, headers, body]
|
data/lib/honeybadger/registry.rb
CHANGED
@@ -2,7 +2,7 @@ module Honeybadger
|
|
2
2
|
class Registry
|
3
3
|
def initialize
|
4
4
|
@mutex = Mutex.new
|
5
|
-
@metrics =
|
5
|
+
@metrics = {}
|
6
6
|
end
|
7
7
|
|
8
8
|
def register(metric)
|
@@ -19,7 +19,7 @@ module Honeybadger
|
|
19
19
|
|
20
20
|
def flush
|
21
21
|
@mutex.synchronize do
|
22
|
-
@metrics =
|
22
|
+
@metrics = {}
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -4,7 +4,7 @@ module Honeybadger
|
|
4
4
|
@registry = registry
|
5
5
|
@config = config
|
6
6
|
@options = options
|
7
|
-
@interval = config[:
|
7
|
+
@interval = config[:"insights.registry_flush_interval"] || options.fetch(:interval, 60)
|
8
8
|
@end_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) + @interval
|
9
9
|
end
|
10
10
|
|
data/lib/honeybadger/ruby.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "honeybadger/const"
|
2
|
+
require "honeybadger/singleton"
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "honeybadger/agent"
|
3
3
|
|
4
4
|
# Honeybadger's public API is made up of two parts: the {Honeybadger} singleton
|
5
5
|
# module, and the {Agent} class. The singleton module delegates its methods to
|
@@ -25,90 +25,91 @@ module Honeybadger
|
|
25
25
|
# @!method $2(...)
|
26
26
|
# Forwards to {$1}.
|
27
27
|
# @see Agent#$2
|
28
|
-
def_delegator :
|
29
|
-
def_delegator :
|
30
|
-
def_delegator :
|
31
|
-
def_delegator :
|
32
|
-
def_delegator :
|
33
|
-
def_delegator :
|
34
|
-
def_delegator :
|
35
|
-
def_delegator :
|
36
|
-
def_delegator :
|
37
|
-
def_delegator :
|
38
|
-
def_delegator :
|
39
|
-
def_delegator :
|
40
|
-
def_delegator :
|
41
|
-
def_delegator :
|
42
|
-
def_delegator :
|
43
|
-
def_delegator :
|
44
|
-
def_delegator :
|
45
|
-
def_delegator :
|
46
|
-
def_delegator :
|
47
|
-
def_delegator :
|
48
|
-
def_delegator :
|
49
|
-
def_delegator :
|
50
|
-
def_delegator :
|
51
|
-
def_delegator :
|
28
|
+
def_delegator :"Honeybadger::Agent.instance", :check_in
|
29
|
+
def_delegator :"Honeybadger::Agent.instance", :context
|
30
|
+
def_delegator :"Honeybadger::Agent.instance", :event_context
|
31
|
+
def_delegator :"Honeybadger::Agent.instance", :configure
|
32
|
+
def_delegator :"Honeybadger::Agent.instance", :get_context
|
33
|
+
def_delegator :"Honeybadger::Agent.instance", :get_event_context
|
34
|
+
def_delegator :"Honeybadger::Agent.instance", :flush
|
35
|
+
def_delegator :"Honeybadger::Agent.instance", :stop
|
36
|
+
def_delegator :"Honeybadger::Agent.instance", :exception_filter
|
37
|
+
def_delegator :"Honeybadger::Agent.instance", :exception_fingerprint
|
38
|
+
def_delegator :"Honeybadger::Agent.instance", :backtrace_filter
|
39
|
+
def_delegator :"Honeybadger::Agent.instance", :add_breadcrumb
|
40
|
+
def_delegator :"Honeybadger::Agent.instance", :breadcrumbs
|
41
|
+
def_delegator :"Honeybadger::Agent.instance", :clear!
|
42
|
+
def_delegator :"Honeybadger::Agent.instance", :track_deployment
|
43
|
+
def_delegator :"Honeybadger::Agent.instance", :event
|
44
|
+
def_delegator :"Honeybadger::Agent.instance", :collect
|
45
|
+
def_delegator :"Honeybadger::Agent.instance", :registry
|
46
|
+
def_delegator :"Honeybadger::Agent.instance", :instrumentation
|
47
|
+
def_delegator :"Honeybadger::Agent.instance", :time
|
48
|
+
def_delegator :"Honeybadger::Agent.instance", :histogram
|
49
|
+
def_delegator :"Honeybadger::Agent.instance", :gauge
|
50
|
+
def_delegator :"Honeybadger::Agent.instance", :increment_counter
|
51
|
+
def_delegator :"Honeybadger::Agent.instance", :decrement_counter
|
52
52
|
|
53
53
|
# @!macro [attach] def_delegator
|
54
54
|
# @!method $2(...)
|
55
55
|
# @api private
|
56
56
|
# Forwards to {$1}.
|
57
57
|
# @see Agent#$2
|
58
|
-
def_delegator :
|
59
|
-
def_delegator :
|
60
|
-
def_delegator :
|
58
|
+
def_delegator :"Honeybadger::Agent.instance", :config
|
59
|
+
def_delegator :"Honeybadger::Agent.instance", :init!
|
60
|
+
def_delegator :"Honeybadger::Agent.instance", :with_rack_env
|
61
61
|
|
62
62
|
# @!method notify(...)
|
63
63
|
# Forwards to {Agent.instance}.
|
64
64
|
# @see Agent#notify
|
65
|
-
def notify(exception_or_opts
|
65
|
+
def notify(exception_or_opts = nil, **opts)
|
66
66
|
# Note this is defined directly (instead of via forwardable) so that
|
67
67
|
# generated stack traces work as expected.
|
68
|
-
Agent.instance.notify(exception_or_opts, opts
|
68
|
+
Agent.instance.notify(exception_or_opts, **opts)
|
69
69
|
end
|
70
70
|
|
71
71
|
# @api private
|
72
72
|
def load_plugins!
|
73
|
-
Dir[File.expand_path(
|
73
|
+
Dir[File.expand_path("../plugins/*.rb", __FILE__)].sort.each do |plugin|
|
74
74
|
require plugin
|
75
75
|
end
|
76
|
-
Plugin.load!(
|
76
|
+
Plugin.load!(config)
|
77
77
|
end
|
78
78
|
|
79
79
|
# @api private
|
80
80
|
def install_at_exit_callback
|
81
81
|
at_exit do
|
82
|
-
if $! && !ignored_exception?($!) && Honeybadger.config[:
|
83
|
-
Honeybadger.notify($!, component:
|
82
|
+
if $! && !ignored_exception?($!) && Honeybadger.config[:"exceptions.notify_at_exit"]
|
83
|
+
Honeybadger.notify($!, component: "at_exit", sync: true)
|
84
84
|
end
|
85
85
|
|
86
|
-
Honeybadger.stop if Honeybadger.config[:
|
86
|
+
Honeybadger.stop if Honeybadger.config[:send_data_at_exit]
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
90
|
# @deprecated
|
91
91
|
def start(config = {})
|
92
|
-
raise NoMethodError,
|
93
|
-
`Honeybadger.start` is no longer necessary and has been removed.
|
92
|
+
raise NoMethodError, <<~WARNING
|
93
|
+
`Honeybadger.start` is no longer necessary and has been removed.
|
94
94
|
|
95
|
-
|
95
|
+
Use `Honeybadger.configure` to explicitly configure the agent from Ruby moving forward:
|
96
96
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
WARNING
|
97
|
+
Honeybadger.configure do |config|
|
98
|
+
config.api_key = 'project api key'
|
99
|
+
config.exceptions.ignore += [CustomError]
|
100
|
+
end
|
101
|
+
WARNING
|
102
102
|
end
|
103
103
|
|
104
104
|
private
|
105
|
+
|
105
106
|
# @api private
|
106
107
|
def ignored_exception?(exception)
|
107
108
|
exception.is_a?(SystemExit) ||
|
108
|
-
(
|
109
|
-
(
|
109
|
+
(exception.is_a?(SignalException) &&
|
110
|
+
((exception.respond_to?(:signm) && exception.signm == "SIGTERM") ||
|
110
111
|
# jruby has a missing #signm implementation
|
111
|
-
["TERM", "SIGTERM"].include?(exception.to_s)
|
112
|
-
|
112
|
+
["TERM", "SIGTERM"].include?(exception.to_s))
|
113
|
+
)
|
113
114
|
end
|
114
115
|
end
|
data/lib/honeybadger/tasks.rb
CHANGED
@@ -5,18 +5,18 @@ namespace :honeybadger do
|
|
5
5
|
|
6
6
|
desc "Verify your gem installation by sending a test exception to the honeybadger service"
|
7
7
|
task :test do
|
8
|
-
warn_task_moved(
|
8
|
+
warn_task_moved("test")
|
9
9
|
end
|
10
10
|
|
11
11
|
desc "Notify Honeybadger of a new deploy."
|
12
12
|
task :deploy do
|
13
|
-
warn_task_moved(
|
13
|
+
warn_task_moved("deploy")
|
14
14
|
end
|
15
15
|
|
16
16
|
namespace :heroku do
|
17
17
|
desc "Install Heroku deploy notifications addon"
|
18
18
|
task :add_deploy_notification do
|
19
|
-
warn_task_moved(
|
19
|
+
warn_task_moved("heroku:add_deploy_notification", "honeybadger heroku help install_deploy_notification")
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/lib/honeybadger/timer.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "net/http"
|
3
|
+
require "json"
|
4
|
+
require "zlib"
|
5
|
+
require "openssl"
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require "honeybadger/version"
|
8
|
+
require "honeybadger/logging"
|
9
9
|
|
10
10
|
module Honeybadger
|
11
11
|
module Util
|
@@ -15,23 +15,23 @@ module Honeybadger
|
|
15
15
|
include Honeybadger::Logging::Helper
|
16
16
|
|
17
17
|
HEADERS = {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
"Content-type".freeze => "application/json".freeze,
|
19
|
+
"Content-Encoding".freeze => "deflate".freeze,
|
20
|
+
"Accept".freeze => "text/json, application/json".freeze,
|
21
|
+
"User-Agent".freeze => "HB-Ruby #{VERSION}; #{RUBY_VERSION}; #{RUBY_PLATFORM}".freeze
|
22
22
|
}.freeze
|
23
23
|
|
24
24
|
ERRORS = [Timeout::Error,
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
25
|
+
Errno::EINVAL,
|
26
|
+
Errno::ECONNRESET,
|
27
|
+
Errno::ECONNREFUSED,
|
28
|
+
Errno::ENETUNREACH,
|
29
|
+
EOFError,
|
30
|
+
Net::HTTPBadResponse,
|
31
|
+
Net::HTTPHeaderSyntaxError,
|
32
|
+
Net::ProtocolError,
|
33
|
+
OpenSSL::SSL::SSLError,
|
34
|
+
SocketError].freeze
|
35
35
|
|
36
36
|
def initialize(config)
|
37
37
|
@config = config
|
@@ -66,19 +66,19 @@ module Honeybadger
|
|
66
66
|
def http_headers(headers = nil)
|
67
67
|
{}.tap do |hash|
|
68
68
|
hash.merge!(HEADERS)
|
69
|
-
hash
|
69
|
+
hash["X-API-Key"] = config[:api_key].to_s
|
70
70
|
hash.merge!(headers) if headers
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
def setup_http_connection
|
75
|
-
http_class = Net::HTTP::Proxy(config[:
|
76
|
-
http = http_class.new(config[:
|
75
|
+
http_class = Net::HTTP::Proxy(config[:"connection.proxy_host"], config[:"connection.proxy_port"], config[:"connection.proxy_user"], config[:"connection.proxy_pass"])
|
76
|
+
http = http_class.new(config[:"connection.host"], config.connection_port)
|
77
77
|
|
78
|
-
http.read_timeout = config[:
|
79
|
-
http.open_timeout = config[:
|
78
|
+
http.read_timeout = config[:"connection.http_read_timeout"]
|
79
|
+
http.open_timeout = config[:"connection.http_open_timeout"]
|
80
80
|
|
81
|
-
if config[:
|
81
|
+
if config[:"connection.secure"]
|
82
82
|
http.use_ssl = true
|
83
83
|
|
84
84
|
http.ca_file = config.ca_bundle_path
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require
|
1
|
+
require "set"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Util
|
5
5
|
# Constructs a request hash from a Rack::Request matching the /v1/notices
|
6
6
|
# API specification.
|
7
7
|
module RequestHash
|
8
|
-
HTTP_HEADER_PREFIX =
|
8
|
+
HTTP_HEADER_PREFIX = "HTTP_".freeze
|
9
9
|
|
10
|
-
CGI_WHITELIST = %w
|
10
|
+
CGI_WHITELIST = %w[
|
11
11
|
AUTH_TYPE
|
12
12
|
CONTENT_LENGTH
|
13
13
|
CONTENT_TYPE
|
@@ -22,7 +22,7 @@ module Honeybadger
|
|
22
22
|
SERVER_PORT
|
23
23
|
SERVER_PROTOCOL
|
24
24
|
SERVER_SOFTWARE
|
25
|
-
|
25
|
+
].freeze
|
26
26
|
|
27
27
|
def self.from_env(env)
|
28
28
|
return {} unless defined?(::Rack::Request)
|
@@ -32,8 +32,8 @@ module Honeybadger
|
|
32
32
|
|
33
33
|
hash[:url] = extract_url(request)
|
34
34
|
hash[:params] = extract_params(request)
|
35
|
-
hash[:component] = hash[:params][
|
36
|
-
hash[:action] = hash[:params][
|
35
|
+
hash[:component] = hash[:params]["controller"]
|
36
|
+
hash[:action] = hash[:params]["action"]
|
37
37
|
hash[:session] = extract_session(request)
|
38
38
|
hash[:cgi_data] = extract_cgi_data(request)
|
39
39
|
|
@@ -41,15 +41,15 @@ module Honeybadger
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.extract_url(request)
|
44
|
-
request.env[
|
44
|
+
request.env["honeybadger.request.url"] || request.url
|
45
45
|
rescue => e
|
46
46
|
"Failed to access URL -- #{e}"
|
47
47
|
end
|
48
48
|
|
49
49
|
def self.extract_params(request)
|
50
|
-
(request.env[
|
50
|
+
(request.env["action_dispatch.request.parameters"] || request.params).to_hash || {}
|
51
51
|
rescue => e
|
52
|
-
{
|
52
|
+
{error: "Failed to access params -- #{e}"}
|
53
53
|
end
|
54
54
|
|
55
55
|
def self.extract_session(request)
|
@@ -58,11 +58,11 @@ module Honeybadger
|
|
58
58
|
# Rails raises ArgumentError when `config.secret_token` is missing, and
|
59
59
|
# ActionDispatch::Session::SessionRestoreError when the session can't be
|
60
60
|
# restored.
|
61
|
-
{
|
61
|
+
{error: "Failed to access session data -- #{e}"}
|
62
62
|
end
|
63
63
|
|
64
64
|
def self.extract_cgi_data(request)
|
65
|
-
request.env.each_with_object({}) do |(k,v), env|
|
65
|
+
request.env.each_with_object({}) do |(k, v), env|
|
66
66
|
next unless k.is_a?(String)
|
67
67
|
next unless k.start_with?(HTTP_HEADER_PREFIX) || CGI_WHITELIST.include?(k)
|
68
68
|
env[k] = v
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/util/sanitizer"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Util
|
@@ -18,7 +18,7 @@ module Honeybadger
|
|
18
18
|
KEYS = DEFAULTS.keys.freeze
|
19
19
|
|
20
20
|
# The cgi_data key where the raw Cookie header is stored.
|
21
|
-
HTTP_COOKIE_KEY =
|
21
|
+
HTTP_COOKIE_KEY = "HTTP_COOKIE".freeze
|
22
22
|
|
23
23
|
def self.build(opts = {})
|
24
24
|
sanitizer = opts.fetch(:sanitizer) { Sanitizer.new }
|
@@ -8,7 +8,7 @@ module Honeybadger
|
|
8
8
|
from_git
|
9
9
|
|
10
10
|
revision = revision.to_s.strip
|
11
|
-
return unless
|
11
|
+
return unless /\S/.match?(revision)
|
12
12
|
|
13
13
|
revision
|
14
14
|
end
|
@@ -20,18 +20,26 @@ module Honeybadger
|
|
20
20
|
#
|
21
21
|
# See https://devcenter.heroku.com/articles/dyno-metadata
|
22
22
|
def from_heroku
|
23
|
-
ENV[
|
23
|
+
ENV["HEROKU_SLUG_COMMIT"]
|
24
24
|
end
|
25
25
|
|
26
26
|
def from_capistrano(root)
|
27
|
-
file = File.join(root,
|
27
|
+
file = File.join(root, "REVISION")
|
28
28
|
return nil unless File.file?(file)
|
29
|
-
|
29
|
+
begin
|
30
|
+
File.read(file)
|
31
|
+
rescue
|
32
|
+
nil
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
def from_git
|
33
|
-
return nil unless File.directory?(
|
34
|
-
|
37
|
+
return nil unless File.directory?(".git")
|
38
|
+
begin
|
39
|
+
`git rev-parse HEAD 2> #{File::NULL}`
|
40
|
+
rescue
|
41
|
+
nil
|
42
|
+
end
|
35
43
|
end
|
36
44
|
end
|
37
45
|
end
|