honeybadger 5.29.1 → 6.0.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/CHANGELOG.md +22 -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 +9 -9
- 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 +61 -57
- 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 +3 -3
data/lib/honeybadger/notice.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
1
|
+
require "json"
|
2
|
+
require "securerandom"
|
3
|
+
require "forwardable"
|
4
|
+
|
5
|
+
require "honeybadger/version"
|
6
|
+
require "honeybadger/backtrace"
|
7
|
+
require "honeybadger/conversions"
|
8
|
+
require "honeybadger/util/stats"
|
9
|
+
require "honeybadger/util/sanitizer"
|
10
|
+
require "honeybadger/util/request_hash"
|
11
|
+
require "honeybadger/util/request_payload"
|
12
12
|
|
13
13
|
module Honeybadger
|
14
14
|
# @api private
|
15
15
|
NOTIFIER = {
|
16
|
-
name:
|
17
|
-
url:
|
16
|
+
name: "honeybadger-ruby".freeze,
|
17
|
+
url: "https://github.com/honeybadger-io/honeybadger-ruby".freeze,
|
18
18
|
version: VERSION,
|
19
|
-
language:
|
19
|
+
language: "ruby".freeze
|
20
20
|
}.freeze
|
21
21
|
|
22
22
|
# @api private
|
23
23
|
# Substitution for gem root in backtrace lines.
|
24
|
-
GEM_ROOT =
|
24
|
+
GEM_ROOT = "[GEM_ROOT]".freeze
|
25
25
|
|
26
26
|
# @api private
|
27
27
|
# Substitution for project root in backtrace lines.
|
28
|
-
PROJECT_ROOT =
|
28
|
+
PROJECT_ROOT = "[PROJECT_ROOT]".freeze
|
29
29
|
|
30
30
|
# @api private
|
31
31
|
# Empty String (used for equality comparisons and assignment).
|
32
|
-
STRING_EMPTY =
|
32
|
+
STRING_EMPTY = "".freeze
|
33
33
|
|
34
34
|
# @api private
|
35
35
|
# A Regexp which matches non-blank characters.
|
36
|
-
NOT_BLANK = /\S
|
36
|
+
NOT_BLANK = /\S/
|
37
37
|
|
38
38
|
# @api private
|
39
39
|
# Matches lines beginning with ./
|
@@ -53,11 +53,11 @@ module Honeybadger
|
|
53
53
|
|
54
54
|
# @api private
|
55
55
|
# The String character used to split tag strings.
|
56
|
-
TAG_SEPERATOR = /,|\s
|
56
|
+
TAG_SEPERATOR = /,|\s/
|
57
57
|
|
58
58
|
# @api private
|
59
59
|
# The Regexp used to strip invalid characters from individual tags.
|
60
|
-
TAG_SANITIZER = /\s
|
60
|
+
TAG_SANITIZER = /\s/
|
61
61
|
|
62
62
|
# @api private
|
63
63
|
class Cause
|
@@ -177,20 +177,20 @@ module Honeybadger
|
|
177
177
|
c = (PROJECT_ROOT_CACHE[config[:root]] ||= {})
|
178
178
|
return c[line] if c.has_key?(line)
|
179
179
|
c[line] ||= if config.root_regexp
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
180
|
+
line.sub(config.root_regexp, PROJECT_ROOT)
|
181
|
+
else
|
182
|
+
line
|
183
|
+
end
|
184
184
|
},
|
185
185
|
lambda { |line| line.sub(RELATIVE_ROOT, STRING_EMPTY) },
|
186
|
-
lambda { |line| line if
|
186
|
+
lambda { |line| line if !%r{lib/honeybadger}.match?(line) }
|
187
187
|
].freeze
|
188
188
|
|
189
189
|
# @api private
|
190
190
|
def initialize(config, opts = {})
|
191
|
-
@now
|
192
|
-
@pid
|
193
|
-
@id
|
191
|
+
@now = Time.now.utc
|
192
|
+
@pid = Process.pid
|
193
|
+
@id = SecureRandom.uuid
|
194
194
|
@stats = Util::Stats.all
|
195
195
|
|
196
196
|
@opts = opts
|
@@ -201,10 +201,10 @@ module Honeybadger
|
|
201
201
|
|
202
202
|
@exception = unwrap_exception(opts[:exception])
|
203
203
|
|
204
|
-
self.error_class = exception_attribute(:error_class,
|
205
|
-
self.error_message = exception_attribute(:error_message,
|
204
|
+
self.error_class = exception_attribute(:error_class, "Notice") { |exception| exception.class.name }
|
205
|
+
self.error_message = exception_attribute(:error_message, "No message provided") do |exception|
|
206
206
|
message = exception.respond_to?(:detailed_message) ?
|
207
|
-
exception.detailed_message(highlight: false).sub(" (#{exception.class.name})",
|
207
|
+
exception.detailed_message(highlight: false).sub(" (#{exception.class.name})", "") # Gems like error_highlight append the exception class name
|
208
208
|
: exception.message
|
209
209
|
"#{exception.class.name}: #{message}"
|
210
210
|
end
|
@@ -216,13 +216,13 @@ module Honeybadger
|
|
216
216
|
self.api_key = opts[:api_key] || config[:api_key]
|
217
217
|
self.tags = construct_tags(opts[:tags]) | construct_tags(context[:tags])
|
218
218
|
|
219
|
-
self.url
|
220
|
-
self.action
|
221
|
-
self.component
|
222
|
-
self.params
|
223
|
-
self.session
|
224
|
-
self.cgi_data
|
225
|
-
self.details
|
219
|
+
self.url = opts[:url] || request_hash[:url] || nil
|
220
|
+
self.action = opts[:action] || context[:_action] || request_hash[:action] || nil
|
221
|
+
self.component = opts[:controller] || opts[:component] || context[:_component] || request_hash[:component] || nil
|
222
|
+
self.params = opts[:parameters] || opts[:params] || request_hash[:params] || {}
|
223
|
+
self.session = opts[:session] || request_hash[:session] || {}
|
224
|
+
self.cgi_data = opts[:cgi_data] || request_hash[:cgi_data] || {}
|
225
|
+
self.details = opts[:details] || {}
|
226
226
|
self.request_id = opts[:request_id] || nil
|
227
227
|
|
228
228
|
self.session = opts[:session][:data] if opts[:session] && opts[:session][:data]
|
@@ -305,13 +305,12 @@ module Honeybadger
|
|
305
305
|
|
306
306
|
def ignore_by_origin?
|
307
307
|
return false if opts[:origin] != :rake
|
308
|
-
return false if config[:
|
308
|
+
return false if config[:"exceptions.rescue_rake"]
|
309
309
|
true
|
310
310
|
end
|
311
311
|
|
312
312
|
def ignore_by_callbacks?
|
313
|
-
config.exception_filter
|
314
|
-
config.exception_filter.call(self)
|
313
|
+
config.exception_filter&.call(self)
|
315
314
|
end
|
316
315
|
|
317
316
|
# Gets a property named "attribute" of an exception, either from
|
@@ -353,7 +352,7 @@ module Honeybadger
|
|
353
352
|
#
|
354
353
|
# Returns true or false.
|
355
354
|
def ignore_by_class?(ignored_class = nil)
|
356
|
-
@ignore_by_class ||=
|
355
|
+
@ignore_by_class ||= proc do |ignored_class|
|
357
356
|
case error_class
|
358
357
|
when (ignored_class.respond_to?(:name) ? ignored_class.name : ignored_class)
|
359
358
|
true
|
@@ -388,7 +387,7 @@ module Honeybadger
|
|
388
387
|
cgi_data: cgi_data,
|
389
388
|
sanitizer: request_sanitizer
|
390
389
|
}
|
391
|
-
request.delete_if {|k,v| config.excluded_request_keys.include?(k) }
|
390
|
+
request.delete_if { |k, v| config.excluded_request_keys.include?(k) }
|
392
391
|
Util::RequestPayload.build(request)
|
393
392
|
end
|
394
393
|
|
@@ -444,7 +443,7 @@ module Honeybadger
|
|
444
443
|
Array(tags).flatten.each do |val|
|
445
444
|
val.to_s.split(TAG_SEPERATOR).each do |tag|
|
446
445
|
tag.gsub!(TAG_SANITIZER, STRING_EMPTY)
|
447
|
-
ret << tag if tag
|
446
|
+
ret << tag if NOT_BLANK.match?(tag)
|
448
447
|
end
|
449
448
|
end
|
450
449
|
|
@@ -471,27 +470,25 @@ module Honeybadger
|
|
471
470
|
if BINDING_HAS_SOURCE_LOCATION
|
472
471
|
b.source_location[0]
|
473
472
|
else
|
474
|
-
b.eval(
|
473
|
+
b.eval("__FILE__")
|
475
474
|
end =~ /^#{Regexp.escape(config[:root].to_s)}/
|
476
475
|
}
|
477
476
|
end
|
478
477
|
|
479
478
|
binding ||= exception.__honeybadger_bindings_stack[0]
|
480
479
|
|
481
|
-
vars = binding.eval(
|
480
|
+
vars = binding.eval("local_variables")
|
482
481
|
results =
|
483
|
-
vars.
|
482
|
+
vars.each_with_object([]) { |arg, acc|
|
484
483
|
begin
|
485
484
|
result = binding.eval(arg.to_s)
|
486
485
|
acc << [arg, result]
|
487
486
|
rescue NameError
|
488
487
|
# Do Nothing
|
489
488
|
end
|
490
|
-
|
491
|
-
acc
|
492
489
|
}
|
493
490
|
|
494
|
-
result_hash =
|
491
|
+
result_hash = results.to_h
|
495
492
|
request_sanitizer.sanitize(result_hash)
|
496
493
|
end
|
497
494
|
|
@@ -499,7 +496,7 @@ module Honeybadger
|
|
499
496
|
#
|
500
497
|
# Returns true to send local_variables.
|
501
498
|
def send_local_variables?(config)
|
502
|
-
config[:
|
499
|
+
config[:"exceptions.local_variables"]
|
503
500
|
end
|
504
501
|
|
505
502
|
# Parse Backtrace from exception backtrace.
|
@@ -512,7 +509,7 @@ module Honeybadger
|
|
512
509
|
backtrace,
|
513
510
|
filters: construct_backtrace_filters(opts),
|
514
511
|
config: config,
|
515
|
-
source_radius: config[:
|
512
|
+
source_radius: config[:"exceptions.source_radius"]
|
516
513
|
).to_a
|
517
514
|
end
|
518
515
|
|
@@ -523,7 +520,7 @@ module Honeybadger
|
|
523
520
|
#
|
524
521
|
# Returns the Exception to report.
|
525
522
|
def unwrap_exception(exception)
|
526
|
-
return exception unless config[:
|
523
|
+
return exception unless config[:"exceptions.unwrap"]
|
527
524
|
exception_cause(exception) || exception
|
528
525
|
end
|
529
526
|
|
@@ -534,11 +531,11 @@ module Honeybadger
|
|
534
531
|
# Returns the Exception cause.
|
535
532
|
def exception_cause(exception)
|
536
533
|
e = exception
|
537
|
-
if e.respond_to?(:cause) && e.cause
|
534
|
+
if e.respond_to?(:cause) && e.cause&.is_a?(Exception)
|
538
535
|
e.cause
|
539
|
-
elsif e.respond_to?(:original_exception) && e.original_exception
|
536
|
+
elsif e.respond_to?(:original_exception) && e.original_exception&.is_a?(Exception)
|
540
537
|
e.original_exception
|
541
|
-
elsif e.respond_to?(:continued_exception) && e.continued_exception
|
538
|
+
elsif e.respond_to?(:continued_exception) && e.continued_exception&.is_a?(Exception)
|
542
539
|
e.continued_exception
|
543
540
|
end
|
544
541
|
end
|
@@ -566,7 +563,7 @@ module Honeybadger
|
|
566
563
|
#
|
567
564
|
# Returns the Array of causes in Hash payload format.
|
568
565
|
def prepare_causes(causes)
|
569
|
-
causes.map {|c|
|
566
|
+
causes.map { |c|
|
570
567
|
{
|
571
568
|
class: c.error_class,
|
572
569
|
message: c.error_message,
|
@@ -580,7 +577,7 @@ module Honeybadger
|
|
580
577
|
end
|
581
578
|
|
582
579
|
def rails_params_filters
|
583
|
-
rack_env && Array(rack_env[
|
580
|
+
rack_env && Array(rack_env["action_dispatch.parameter_filter"]) or []
|
584
581
|
end
|
585
582
|
end
|
586
583
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "honeybadger/instrumentation_helper"
|
2
|
+
require "honeybadger/util/sql"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
class NotificationSubscriber
|
@@ -27,21 +27,21 @@ module Honeybadger
|
|
27
27
|
end
|
28
28
|
|
29
29
|
if Honeybadger.config.load_plugin_insights_metrics?(:rails)
|
30
|
-
metric_source
|
30
|
+
metric_source "rails"
|
31
31
|
record_metrics(name, payload)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
35
|
def record_metrics(name, payload)
|
36
36
|
case name
|
37
|
-
when
|
38
|
-
gauge(
|
39
|
-
when
|
40
|
-
gauge(
|
41
|
-
gauge(
|
42
|
-
gauge(
|
43
|
-
when
|
44
|
-
gauge(
|
37
|
+
when "sql.active_record"
|
38
|
+
gauge("duration.sql.active_record", value: payload[:duration], **payload.slice(:query))
|
39
|
+
when "process_action.action_controller"
|
40
|
+
gauge("duration.process_action.action_controller", value: payload[:duration], **payload.slice(:method, :controller, :action, :format, :status))
|
41
|
+
gauge("db_runtime.process_action.action_controller", value: payload[:db_runtime], **payload.slice(:method, :controller, :action, :format, :status))
|
42
|
+
gauge("view_runtime.process_action.action_controller", value: payload[:view_runtime], **payload.slice(:method, :controller, :action, :format, :status))
|
43
|
+
when "perform.active_job"
|
44
|
+
gauge("duration.perform.active_job", value: payload[:duration], **payload.slice(:job_class, :queue_name))
|
45
45
|
when /^cache_.*.active_support$/
|
46
46
|
gauge("duration.#{name}", value: payload[:duration], **payload.slice(:store, :key))
|
47
47
|
end
|
@@ -95,11 +95,11 @@ module Honeybadger
|
|
95
95
|
end
|
96
96
|
|
97
97
|
class ActionViewSubscriber < NotificationSubscriber
|
98
|
-
PROJECT_ROOT = defined?(::Rails) ? ::Rails.root.to_s :
|
98
|
+
PROJECT_ROOT = defined?(::Rails) ? ::Rails.root.to_s : ""
|
99
99
|
|
100
100
|
def format_payload(payload)
|
101
101
|
{
|
102
|
-
view: payload[:identifier].to_s.gsub(PROJECT_ROOT,
|
102
|
+
view: payload[:identifier].to_s.gsub(PROJECT_ROOT, "[PROJECT_ROOT]"),
|
103
103
|
layout: payload[:layout]
|
104
104
|
}
|
105
105
|
end
|
@@ -139,7 +139,7 @@ module Honeybadger
|
|
139
139
|
|
140
140
|
# ... but do include any attachment filenames
|
141
141
|
attachment_info = if mail&.attachments&.any?
|
142
|
-
{
|
142
|
+
{attachments: mail.attachments.map { |a| {filename: a.filename} }}
|
143
143
|
else
|
144
144
|
{}
|
145
145
|
end
|
data/lib/honeybadger/plugin.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "honeybadger/instrumentation_helper"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
# +Honeybadger::Plugin+ defines the API for registering plugins with
|
@@ -84,7 +84,7 @@ module Honeybadger
|
|
84
84
|
# @return nil
|
85
85
|
def register(name = nil, &block)
|
86
86
|
name ||= name_from_caller(caller) or
|
87
|
-
raise(ArgumentError,
|
87
|
+
raise(ArgumentError, "Plugin name is required, but was nil.")
|
88
88
|
instances[key = name.to_sym] and fail("Already registered: #{name}")
|
89
89
|
instances[key] = new(name).tap { |d| d.instance_eval(&block) }
|
90
90
|
end
|
@@ -95,7 +95,7 @@ module Honeybadger
|
|
95
95
|
if config.load_plugin?(name)
|
96
96
|
plugin.load!(config)
|
97
97
|
else
|
98
|
-
config.logger.debug(sprintf(
|
98
|
+
config.logger.debug(sprintf("skip plugin name=%s reason=disabled", name))
|
99
99
|
end
|
100
100
|
end
|
101
101
|
end
|
@@ -157,11 +157,11 @@ module Honeybadger
|
|
157
157
|
|
158
158
|
# @api private
|
159
159
|
def initialize(name)
|
160
|
-
@name
|
161
|
-
@loaded
|
160
|
+
@name = name
|
161
|
+
@loaded = false
|
162
162
|
@requirements = []
|
163
|
-
@executions
|
164
|
-
@collectors
|
163
|
+
@executions = []
|
164
|
+
@collectors = []
|
165
165
|
end
|
166
166
|
|
167
167
|
# Define a requirement. All requirement blocks must return +true+ for the
|
@@ -231,13 +231,13 @@ module Honeybadger
|
|
231
231
|
# end
|
232
232
|
#
|
233
233
|
# @return nil
|
234
|
-
def collect(options={}, &block)
|
234
|
+
def collect(options = {}, &block)
|
235
235
|
@collectors << [options, block]
|
236
236
|
end
|
237
237
|
|
238
238
|
# @api private
|
239
239
|
def ok?(config)
|
240
|
-
@requirements.all? {|r| Execution.new(config, &r).call }
|
240
|
+
@requirements.all? { |r| Execution.new(config, &r).call }
|
241
241
|
rescue => e
|
242
242
|
config.logger.error(sprintf("plugin error name=%s class=%s message=%s\n\t%s", name, e.class, e.message.dump, Array(e.backtrace).join("\n\t")))
|
243
243
|
false
|
@@ -246,15 +246,15 @@ module Honeybadger
|
|
246
246
|
# @api private
|
247
247
|
def load!(config)
|
248
248
|
if @loaded
|
249
|
-
config.logger.debug(sprintf(
|
249
|
+
config.logger.debug(sprintf("skip plugin name=%s reason=loaded", name))
|
250
250
|
return false
|
251
251
|
elsif ok?(config)
|
252
|
-
config.logger.debug(sprintf(
|
253
|
-
@executions.each {|e| Execution.new(config, &e).call }
|
254
|
-
@collectors.each {|o,b| CollectorExecution.new(name, config, o, &b).register! }
|
252
|
+
config.logger.debug(sprintf("load plugin name=%s", name))
|
253
|
+
@executions.each { |e| Execution.new(config, &e).call }
|
254
|
+
@collectors.each { |o, b| CollectorExecution.new(name, config, o, &b).register! }
|
255
255
|
@loaded = true
|
256
256
|
else
|
257
|
-
config.logger.debug(sprintf(
|
257
|
+
config.logger.debug(sprintf("skip plugin name=%s reason=requirement", name))
|
258
258
|
end
|
259
259
|
|
260
260
|
@loaded
|
@@ -265,9 +265,7 @@ module Honeybadger
|
|
265
265
|
end
|
266
266
|
|
267
267
|
# @api private
|
268
|
-
|
269
|
-
@collectors
|
270
|
-
end
|
268
|
+
attr_reader :collectors
|
271
269
|
|
272
270
|
# @api private
|
273
271
|
def loaded?
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/notification_subscriber"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Plugins
|
@@ -11,19 +11,21 @@ module Honeybadger
|
|
11
11
|
Honeybadger.clear!
|
12
12
|
context = context(job)
|
13
13
|
block.call
|
14
|
-
rescue
|
15
|
-
Honeybadger.
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
rescue => e
|
15
|
+
if job.executions >= Honeybadger.config[:"active_job.attempt_threshold"].to_i
|
16
|
+
Honeybadger.notify(
|
17
|
+
e,
|
18
|
+
context: context,
|
19
|
+
parameters: {arguments: job.arguments}
|
20
|
+
)
|
21
|
+
end
|
20
22
|
raise e
|
21
23
|
end
|
22
24
|
|
23
25
|
def context(job) # rubocop:disable Metrics/MethodLength
|
24
26
|
{
|
25
27
|
component: job.class,
|
26
|
-
action:
|
28
|
+
action: "perform",
|
27
29
|
enqueued_at: job.try(:enqueued_at),
|
28
30
|
executions: job.executions,
|
29
31
|
job_class: job.class,
|
@@ -51,7 +53,7 @@ module Honeybadger
|
|
51
53
|
end
|
52
54
|
|
53
55
|
execution do
|
54
|
-
::ActiveJob::Base.set_callback(:perform, :around, prepend: true, &ActiveJob.method(:perform_around)) if Honeybadger.config[:
|
56
|
+
::ActiveJob::Base.set_callback(:perform, :around, prepend: true, &ActiveJob.method(:perform_around)) if Honeybadger.config[:"exceptions.enabled"]
|
55
57
|
|
56
58
|
if config.load_plugin_insights?(:active_job)
|
57
59
|
::ActiveSupport::Notifications.subscribe(/(enqueue_at|enqueue|enqueue_retry|enqueue_all|perform|retry_stopped|discard)\.active_job/, Honeybadger::ActiveJobSubscriber.new)
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "honeybadger/instrumentation_helper"
|
2
|
+
require "honeybadger/plugin"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
module Plugins
|
@@ -16,13 +16,13 @@ module Honeybadger
|
|
16
16
|
|
17
17
|
::Autotuner.metrics_reporter = proc do |metrics|
|
18
18
|
if config.load_plugin_insights_events?(:autotuner)
|
19
|
-
Honeybadger.event(
|
19
|
+
Honeybadger.event("stats.autotuner", metrics)
|
20
20
|
end
|
21
21
|
|
22
22
|
if config.load_plugin_insights_metrics?(:autotuner)
|
23
|
-
metric_source
|
23
|
+
metric_source "autotuner"
|
24
24
|
metrics.each do |key, val|
|
25
|
-
gauge key, ->{ val }
|
25
|
+
gauge key, -> { val }
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "honeybadger/plugin"
|
2
|
+
require "honeybadger/breadcrumbs/logging"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
module Plugins
|
@@ -41,19 +41,19 @@ module Honeybadger
|
|
41
41
|
# See RailsBreadcrumbs.send_breadcrumb_notification for specifics on the
|
42
42
|
# options for customization
|
43
43
|
Plugin.register :breadcrumbs do
|
44
|
-
requirement { config[:
|
44
|
+
requirement { config[:"breadcrumbs.enabled"] }
|
45
45
|
|
46
46
|
execution do
|
47
47
|
# Rails specific breadcrumb events
|
48
48
|
#
|
49
49
|
if defined?(::Rails.application) && ::Rails.application
|
50
|
-
config[:
|
50
|
+
config[:"breadcrumbs.active_support_notifications"].each do |name, config|
|
51
51
|
RailsBreadcrumbs.subscribe_to_notification(name, config)
|
52
52
|
end
|
53
|
-
ActiveSupport::LogSubscriber.prepend(Honeybadger::Breadcrumbs::LogSubscriberInjector) if config[:
|
53
|
+
ActiveSupport::LogSubscriber.prepend(Honeybadger::Breadcrumbs::LogSubscriberInjector) if config[:"breadcrumbs.logging.enabled"]
|
54
54
|
end
|
55
55
|
|
56
|
-
::Logger.prepend(Honeybadger::Breadcrumbs::LogWrapper) if config[:
|
56
|
+
::Logger.prepend(Honeybadger::Breadcrumbs::LogWrapper) if config[:"breadcrumbs.logging.enabled"]
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -73,7 +73,7 @@ module Honeybadger
|
|
73
73
|
# @option notification_config [Proc] :transform A proc that accepts the data payload. The return value will replace the current data hash (optional)
|
74
74
|
#
|
75
75
|
def self.send_breadcrumb_notification(name, duration, notification_config, data = {})
|
76
|
-
return if notification_config[:exclude_when]
|
76
|
+
return if notification_config[:exclude_when]&.call(data)
|
77
77
|
|
78
78
|
message =
|
79
79
|
case (m = notification_config[:message])
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "delayed_job"
|
2
|
+
require "honeybadger/ruby"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
module Plugins
|
@@ -8,46 +8,45 @@ module Honeybadger
|
|
8
8
|
callbacks do |lifecycle|
|
9
9
|
lifecycle.around(:invoke_job) do |job, &block|
|
10
10
|
begin
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
component = job.payload_object.object.is_a?(Class) ? job.payload_object.object.name : job.payload_object.object.class.name
|
20
|
-
action = job.payload_object.method_name.to_s
|
21
|
-
end
|
22
|
-
rescue #fallback to support all other classes
|
23
|
-
component = job.payload_object.class.name
|
24
|
-
action = 'perform'
|
11
|
+
if job.payload_object.instance_of?(::ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper)
|
12
|
+
# buildin support for Rails 4.2 ActiveJob
|
13
|
+
component = job.payload_object.job_data["job_class"]
|
14
|
+
action = "perform"
|
15
|
+
else
|
16
|
+
# buildin support for Delayed::PerformableMethod
|
17
|
+
component = job.payload_object.object.is_a?(Class) ? job.payload_object.object.name : job.payload_object.object.class.name
|
18
|
+
action = job.payload_object.method_name.to_s
|
25
19
|
end
|
20
|
+
rescue # fallback to support all other classes
|
21
|
+
component = job.payload_object.class.name
|
22
|
+
action = "perform"
|
23
|
+
end
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
::Honeybadger.context(
|
26
|
+
component: component,
|
27
|
+
action: action,
|
28
|
+
job_id: job.id,
|
29
|
+
handler: job.handler,
|
30
|
+
last_error: job.last_error,
|
31
|
+
attempts: job.attempts,
|
32
|
+
queue: job.queue
|
33
|
+
)
|
36
34
|
|
37
|
-
|
38
|
-
|
35
|
+
block.call(job)
|
36
|
+
rescue => error
|
37
|
+
if job.attempts.to_i >= ::Honeybadger.config[:"delayed_job.attempt_threshold"].to_i
|
39
38
|
::Honeybadger.notify(
|
40
|
-
:
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
44
|
-
:
|
45
|
-
:
|
46
|
-
)
|
47
|
-
raise error
|
48
|
-
ensure
|
49
|
-
::Honeybadger.clear!
|
39
|
+
component: component,
|
40
|
+
action: action,
|
41
|
+
error_class: error.class.name,
|
42
|
+
error_message: "#{error.class.name}: #{error.message}",
|
43
|
+
backtrace: error.backtrace,
|
44
|
+
exception: error
|
45
|
+
)
|
50
46
|
end
|
47
|
+
raise error
|
48
|
+
ensure
|
49
|
+
::Honeybadger.clear!
|
51
50
|
end
|
52
51
|
end
|
53
52
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/plugin"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
Plugin.register do
|
5
5
|
requirement { defined?(::Delayed::Plugin) }
|
6
6
|
requirement { defined?(::Delayed::Worker.plugins) }
|
7
7
|
requirement do
|
8
|
-
if delayed_job_honeybadger = defined?(::Delayed::Plugins::Honeybadger)
|
8
|
+
if (delayed_job_honeybadger = defined?(::Delayed::Plugins::Honeybadger))
|
9
9
|
logger.warn("Support for Delayed Job has been moved " \
|
10
10
|
"to the honeybadger gem. Please remove " \
|
11
11
|
"delayed_job_honeybadger from your " \
|
@@ -15,8 +15,8 @@ module Honeybadger
|
|
15
15
|
end
|
16
16
|
|
17
17
|
execution do
|
18
|
-
return unless Honeybadger.config[:
|
19
|
-
require
|
18
|
+
return unless Honeybadger.config[:"exceptions.enabled"]
|
19
|
+
require "honeybadger/plugins/delayed_job/plugin"
|
20
20
|
::Delayed::Worker.plugins << Plugins::DelayedJob::Plugin
|
21
21
|
end
|
22
22
|
end
|