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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -0
  3. data/lib/honeybadger/agent.rb +36 -35
  4. data/lib/honeybadger/backend/base.rb +11 -11
  5. data/lib/honeybadger/backend/debug.rb +4 -4
  6. data/lib/honeybadger/backend/null.rb +2 -2
  7. data/lib/honeybadger/backend/server.rb +11 -11
  8. data/lib/honeybadger/backend/test.rb +2 -2
  9. data/lib/honeybadger/backend.rb +6 -6
  10. data/lib/honeybadger/backtrace.rb +27 -22
  11. data/lib/honeybadger/breadcrumbs/active_support.rb +9 -9
  12. data/lib/honeybadger/breadcrumbs/breadcrumb.rb +1 -2
  13. data/lib/honeybadger/breadcrumbs/collector.rb +4 -4
  14. data/lib/honeybadger/breadcrumbs/logging.rb +11 -14
  15. data/lib/honeybadger/breadcrumbs.rb +3 -3
  16. data/lib/honeybadger/cli/deploy.rb +7 -7
  17. data/lib/honeybadger/cli/exec.rb +41 -41
  18. data/lib/honeybadger/cli/helpers.rb +18 -18
  19. data/lib/honeybadger/cli/heroku.rb +36 -36
  20. data/lib/honeybadger/cli/install.rb +44 -44
  21. data/lib/honeybadger/cli/main.rb +107 -107
  22. data/lib/honeybadger/cli/notify.rb +13 -13
  23. data/lib/honeybadger/cli/test.rb +109 -94
  24. data/lib/honeybadger/cli.rb +3 -3
  25. data/lib/honeybadger/config/defaults.rb +218 -218
  26. data/lib/honeybadger/config/env.rb +5 -5
  27. data/lib/honeybadger/config/ruby.rb +19 -19
  28. data/lib/honeybadger/config/yaml.rb +12 -12
  29. data/lib/honeybadger/config.rb +76 -78
  30. data/lib/honeybadger/const.rb +4 -4
  31. data/lib/honeybadger/context_manager.rb +1 -2
  32. data/lib/honeybadger/conversions.rb +9 -6
  33. data/lib/honeybadger/counter.rb +4 -4
  34. data/lib/honeybadger/event.rb +3 -3
  35. data/lib/honeybadger/events_worker.rb +33 -33
  36. data/lib/honeybadger/gauge.rb +2 -2
  37. data/lib/honeybadger/histogram.rb +4 -4
  38. data/lib/honeybadger/init/hanami.rb +5 -5
  39. data/lib/honeybadger/init/rails.rb +14 -14
  40. data/lib/honeybadger/init/rake.rb +19 -21
  41. data/lib/honeybadger/init/ruby.rb +4 -4
  42. data/lib/honeybadger/init/sinatra.rb +11 -12
  43. data/lib/honeybadger/instrumentation.rb +26 -31
  44. data/lib/honeybadger/instrumentation_helper.rb +11 -12
  45. data/lib/honeybadger/karafka.rb +55 -56
  46. data/lib/honeybadger/logging.rb +22 -21
  47. data/lib/honeybadger/metric.rb +2 -2
  48. data/lib/honeybadger/metrics_worker.rb +12 -10
  49. data/lib/honeybadger/notice.rb +55 -58
  50. data/lib/honeybadger/notification_subscriber.rb +14 -14
  51. data/lib/honeybadger/plugin.rb +16 -18
  52. data/lib/honeybadger/plugins/active_job.rb +11 -9
  53. data/lib/honeybadger/plugins/autotuner.rb +5 -5
  54. data/lib/honeybadger/plugins/breadcrumbs.rb +7 -7
  55. data/lib/honeybadger/plugins/delayed_job/plugin.rb +36 -37
  56. data/lib/honeybadger/plugins/delayed_job.rb +4 -4
  57. data/lib/honeybadger/plugins/faktory.rb +9 -9
  58. data/lib/honeybadger/plugins/karafka.rb +3 -3
  59. data/lib/honeybadger/plugins/lambda.rb +9 -11
  60. data/lib/honeybadger/plugins/local_variables.rb +4 -4
  61. data/lib/honeybadger/plugins/net_http.rb +10 -10
  62. data/lib/honeybadger/plugins/passenger.rb +4 -4
  63. data/lib/honeybadger/plugins/rails.rb +13 -9
  64. data/lib/honeybadger/plugins/resque.rb +7 -7
  65. data/lib/honeybadger/plugins/shoryuken.rb +6 -6
  66. data/lib/honeybadger/plugins/sidekiq.rb +61 -57
  67. data/lib/honeybadger/plugins/solid_queue.rb +3 -3
  68. data/lib/honeybadger/plugins/sucker_punch.rb +5 -5
  69. data/lib/honeybadger/plugins/system.rb +3 -3
  70. data/lib/honeybadger/plugins/thor.rb +5 -5
  71. data/lib/honeybadger/plugins/warden.rb +4 -4
  72. data/lib/honeybadger/rack/error_notifier.rb +14 -14
  73. data/lib/honeybadger/rack/user_feedback.rb +11 -12
  74. data/lib/honeybadger/rack/user_informer.rb +6 -6
  75. data/lib/honeybadger/registry.rb +2 -2
  76. data/lib/honeybadger/registry_execution.rb +1 -1
  77. data/lib/honeybadger/ruby.rb +2 -2
  78. data/lib/honeybadger/singleton.rb +49 -48
  79. data/lib/honeybadger/tasks.rb +3 -3
  80. data/lib/honeybadger/timer.rb +1 -1
  81. data/lib/honeybadger/util/http.rb +27 -27
  82. data/lib/honeybadger/util/request_hash.rb +11 -11
  83. data/lib/honeybadger/util/request_payload.rb +2 -2
  84. data/lib/honeybadger/util/revision.rb +14 -6
  85. data/lib/honeybadger/util/sanitizer.rb +22 -22
  86. data/lib/honeybadger/util/stats.rb +6 -3
  87. data/lib/honeybadger/version.rb +1 -1
  88. data/lib/honeybadger/worker.rb +31 -29
  89. data/lib/honeybadger.rb +5 -5
  90. data/lib/puma/plugin/honeybadger.rb +12 -8
  91. metadata +3 -3
@@ -1,39 +1,39 @@
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'
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: 'honeybadger-ruby'.freeze,
17
- url: 'https://github.com/honeybadger-io/honeybadger-ruby'.freeze,
16
+ name: "honeybadger-ruby".freeze,
17
+ url: "https://github.com/honeybadger-io/honeybadger-ruby".freeze,
18
18
  version: VERSION,
19
- language: 'ruby'.freeze
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 = '[GEM_ROOT]'.freeze
24
+ GEM_ROOT = "[GEM_ROOT]".freeze
25
25
 
26
26
  # @api private
27
27
  # Substitution for project root in backtrace lines.
28
- PROJECT_ROOT = '[PROJECT_ROOT]'.freeze
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 = ''.freeze
32
+ STRING_EMPTY = "".freeze
33
33
 
34
34
  # @api private
35
35
  # A Regexp which matches non-blank characters.
36
- NOT_BLANK = /\S/.freeze
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/.freeze
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/.freeze
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
- line.sub(config.root_regexp, PROJECT_ROOT)
181
- else
182
- line
183
- end
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 line !~ %r{lib/honeybadger} }
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 = Time.now.utc
192
- @pid = Process.pid
193
- @id = SecureRandom.uuid
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, 'Notice') {|exception| exception.class.name }
205
- self.error_message = exception_attribute(:error_message, 'No message provided') do |exception|
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})", '') # Gems like error_highlight append the 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 = 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] || {}
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[:'exceptions.rescue_rake']
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 ||= Proc.new do |ignored_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 =~ NOT_BLANK
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('__FILE__')
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('local_variables')
480
+ vars = binding.eval("local_variables")
482
481
  results =
483
- vars.inject([]) { |acc, arg|
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 = Hash[results]
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[:'exceptions.local_variables']
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[:'exceptions.source_radius']
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[:'exceptions.unwrap']
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 && e.cause.is_a?(Exception)
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 && e.original_exception.is_a?(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 && e.continued_exception.is_a?(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['action_dispatch.parameter_filter']) or []
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 'honeybadger/instrumentation_helper'
2
- require 'honeybadger/util/sql'
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 'rails'
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 '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))
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, '[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
- { attachments: mail.attachments.map { |a| { filename: a.filename } } }
142
+ {attachments: mail.attachments.map { |a| {filename: a.filename} }}
143
143
  else
144
144
  {}
145
145
  end
@@ -1,5 +1,5 @@
1
- require 'forwardable'
2
- require 'honeybadger/instrumentation_helper'
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, 'Plugin name is required, but was nil.')
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('skip plugin name=%s reason=disabled', name))
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 = name
161
- @loaded = false
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('skip plugin name=%s reason=loaded', name))
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('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! }
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('skip plugin name=%s reason=requirement', name))
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
- def collectors
269
- @collectors
270
- end
268
+ attr_reader :collectors
271
269
 
272
270
  # @api private
273
271
  def loaded?
@@ -1,4 +1,4 @@
1
- require 'honeybadger/notification_subscriber'
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 StandardError => e
15
- Honeybadger.notify(
16
- e,
17
- context: context,
18
- parameters: { arguments: job.arguments }
19
- ) if job.executions >= Honeybadger.config[:'active_job.attempt_threshold'].to_i
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: 'perform',
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[:'exceptions.enabled']
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 'honeybadger/instrumentation_helper'
2
- require 'honeybadger/plugin'
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('stats.autotuner', metrics)
19
+ Honeybadger.event("stats.autotuner", metrics)
20
20
  end
21
21
 
22
22
  if config.load_plugin_insights_metrics?(:autotuner)
23
- metric_source 'autotuner'
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 'honeybadger/plugin'
2
- require 'honeybadger/breadcrumbs/logging'
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[:'breadcrumbs.enabled'] }
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[:'breadcrumbs.active_support_notifications'].each do |name, 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[:'breadcrumbs.logging.enabled']
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[:'breadcrumbs.logging.enabled']
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] && notification_config[:exclude_when].call(data)
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 'delayed_job'
2
- require 'honeybadger/ruby'
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
- begin
13
- if job.payload_object.class.name == 'ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper'
14
- #buildin support for Rails 4.2 ActiveJob
15
- component = job.payload_object.job_data['job_class']
16
- action = 'perform'
17
- else
18
- #buildin support for Delayed::PerformableMethod
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
- ::Honeybadger.context(
28
- :component => component,
29
- :action => action,
30
- :job_id => job.id,
31
- :handler => job.handler,
32
- :last_error => job.last_error,
33
- :attempts => job.attempts,
34
- :queue => job.queue
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
- block.call(job)
38
- rescue Exception => error
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
- :component => component,
41
- :action => action,
42
- :error_class => error.class.name,
43
- :error_message => "#{ error.class.name }: #{ error.message }",
44
- :backtrace => error.backtrace,
45
- :exception => error
46
- ) if job.attempts.to_i >= ::Honeybadger.config[:'delayed_job.attempt_threshold'].to_i
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 'honeybadger/plugin'
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[:'exceptions.enabled']
19
- require 'honeybadger/plugins/delayed_job/plugin'
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