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,4 +1,4 @@
1
- require 'honeybadger/instrumentation_helper'
1
+ require "honeybadger/instrumentation_helper"
2
2
 
3
3
  module Honeybadger
4
4
  module Karafka
@@ -10,7 +10,6 @@ module Honeybadger
10
10
  context = {
11
11
  type: event[:type]
12
12
  }
13
- tags = ["type:#{event[:type]}"]
14
13
 
15
14
  if (consumer = event.payload[:caller]).respond_to?(:messages)
16
15
  messages = consumer.messages
@@ -38,28 +37,28 @@ module Honeybadger
38
37
  # Note, that the once with `_d` come from Karafka, not rdkafka or Kafka
39
38
  RD_KAFKA_METRICS = [
40
39
  # Client metrics
41
- RdKafkaMetric.new(:increment_counter, :root, 'messages_consumed', 'rxmsgs_d'),
42
- RdKafkaMetric.new(:increment_counter, :root, 'messages_consumed_bytes', 'rxmsg_bytes'),
40
+ RdKafkaMetric.new(:increment_counter, :root, "messages_consumed", "rxmsgs_d"),
41
+ RdKafkaMetric.new(:increment_counter, :root, "messages_consumed_bytes", "rxmsg_bytes"),
43
42
 
44
43
  # Broker metrics
45
- RdKafkaMetric.new(:increment_counter, :brokers, 'consume_attempts', 'txretries_d'),
46
- RdKafkaMetric.new(:increment_counter, :brokers, 'consume_errors', 'txerrs_d'),
47
- RdKafkaMetric.new(:increment_counter, :brokers, 'receive_errors', 'rxerrs_d'),
48
- RdKafkaMetric.new(:increment_counter, :brokers, 'connection_connects', 'connects_d'),
49
- RdKafkaMetric.new(:increment_counter, :brokers, 'connection_disconnects', 'disconnects_d'),
50
- RdKafkaMetric.new(:gauge, :brokers, 'network_latency_avg', %w[rtt avg]),
51
- RdKafkaMetric.new(:gauge, :brokers, 'network_latency_p95', %w[rtt p95]),
52
- RdKafkaMetric.new(:gauge, :brokers, 'network_latency_p99', %w[rtt p99]),
44
+ RdKafkaMetric.new(:increment_counter, :brokers, "consume_attempts", "txretries_d"),
45
+ RdKafkaMetric.new(:increment_counter, :brokers, "consume_errors", "txerrs_d"),
46
+ RdKafkaMetric.new(:increment_counter, :brokers, "receive_errors", "rxerrs_d"),
47
+ RdKafkaMetric.new(:increment_counter, :brokers, "connection_connects", "connects_d"),
48
+ RdKafkaMetric.new(:increment_counter, :brokers, "connection_disconnects", "disconnects_d"),
49
+ RdKafkaMetric.new(:gauge, :brokers, "network_latency_avg", %w[rtt avg]),
50
+ RdKafkaMetric.new(:gauge, :brokers, "network_latency_p95", %w[rtt p95]),
51
+ RdKafkaMetric.new(:gauge, :brokers, "network_latency_p99", %w[rtt p99]),
53
52
 
54
53
  # Topics metrics
55
- RdKafkaMetric.new(:gauge, :topics, 'consumer_lags', 'consumer_lag_stored'),
56
- RdKafkaMetric.new(:gauge, :topics, 'consumer_lags_delta', 'consumer_lag_stored_d')
54
+ RdKafkaMetric.new(:gauge, :topics, "consumer_lags", "consumer_lag_stored"),
55
+ RdKafkaMetric.new(:gauge, :topics, "consumer_lags_delta", "consumer_lag_stored_d")
57
56
  ].freeze
58
57
 
59
58
  # Metrics that sum values on topics levels and not on partition levels
60
59
  AGGREGATED_RD_KAFKA_METRICS = [
61
60
  # Topic aggregated metrics
62
- RdKafkaMetric.new(:gauge, :topics, 'consumer_aggregated_lag', 'consumer_lag_stored')
61
+ RdKafkaMetric.new(:gauge, :topics, "consumer_aggregated_lag", "consumer_lag_stored")
63
62
  ].freeze
64
63
 
65
64
  def initialize
@@ -79,7 +78,7 @@ module Honeybadger
79
78
  statistics = event[:statistics]
80
79
  consumer_group_id = event[:consumer_group_id]
81
80
 
82
- base_tags = { consumer_group: consumer_group_id }
81
+ base_tags = {consumer_group: consumer_group_id}
83
82
 
84
83
  RD_KAFKA_METRICS.each do |metric|
85
84
  report_metric(metric, statistics, base_tags)
@@ -94,14 +93,14 @@ module Honeybadger
94
93
  # @param consumer_group_id [String] cg in context which we operate
95
94
  def report_aggregated_topics_metrics(statistics, consumer_group_id)
96
95
  AGGREGATED_RD_KAFKA_METRICS.each do |metric|
97
- statistics.fetch('topics').each do |topic_name, topic_values|
96
+ statistics.fetch("topics").each do |topic_name, topic_values|
98
97
  sum = 0
99
98
 
100
- topic_values['partitions'].each do |partition_name, partition_statistics|
101
- next if partition_name == '-1'
99
+ topic_values["partitions"].each do |partition_name, partition_statistics|
100
+ next if partition_name == "-1"
102
101
  # Skip until lag info is available
103
- next if partition_statistics['consumer_lag'] == -1
104
- next if partition_statistics['consumer_lag_stored'] == -1
102
+ next if partition_statistics["consumer_lag"] == -1
103
+ next if partition_statistics["consumer_lag_stored"] == -1
105
104
 
106
105
  sum += partition_statistics.dig(*metric.key_location)
107
106
  end
@@ -121,7 +120,7 @@ module Honeybadger
121
120
  #
122
121
  # @param event [Karafka::Core::Monitoring::Event]
123
122
  def on_error_occurred(event)
124
- extra_tags = { type: event[:type] }
123
+ extra_tags = {type: event[:type]}
125
124
 
126
125
  if event.payload[:caller].respond_to?(:messages)
127
126
  extra_tags.merge!(consumer_tags(event.payload[:caller]))
@@ -132,7 +131,7 @@ module Honeybadger
132
131
  end
133
132
 
134
133
  if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
135
- increment_counter('error_occurred', value: 1, **extra_tags)
134
+ increment_counter("error_occurred", value: 1, **extra_tags)
136
135
  end
137
136
  end
138
137
 
@@ -143,11 +142,11 @@ module Honeybadger
143
142
  time_taken = event[:time]
144
143
  messages_count = event[:messages_buffer].size
145
144
  consumer_group_id = event[:subscription_group].consumer_group.id
146
- extra_tags = { consumer_group: consumer_group_id }
145
+ extra_tags = {consumer_group: consumer_group_id}
147
146
 
148
147
  if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
149
- histogram('listener_polling_time_taken', value: time_taken, **extra_tags)
150
- histogram('listener_polling_messages', value: messages_count, **extra_tags)
148
+ histogram("listener_polling_time_taken", value: time_taken, **extra_tags)
149
+ histogram("listener_polling_messages", value: messages_count, **extra_tags)
151
150
  end
152
151
  end
153
152
 
@@ -173,13 +172,13 @@ module Honeybadger
173
172
  end
174
173
 
175
174
  if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
176
- increment_counter('consumer_messages', value: messages.count, **tags)
177
- increment_counter('consumer_batches', value: 1, **tags)
178
- gauge('consumer_offset', value: metadata.last_offset, **tags)
179
- histogram('consumer_consumed_time_taken', value: event[:time], **tags)
180
- histogram('consumer_batch_size', value: messages.count, **tags)
181
- histogram('consumer_processing_lag', value: metadata.processing_lag, **tags)
182
- histogram('consumer_consumption_lag', value: metadata.consumption_lag, **tags)
175
+ increment_counter("consumer_messages", value: messages.count, **tags)
176
+ increment_counter("consumer_batches", value: 1, **tags)
177
+ gauge("consumer_offset", value: metadata.last_offset, **tags)
178
+ histogram("consumer_consumed_time_taken", value: event[:time], **tags)
179
+ histogram("consumer_batch_size", value: messages.count, **tags)
180
+ histogram("consumer_processing_lag", value: metadata.processing_lag, **tags)
181
+ histogram("consumer_consumption_lag", value: metadata.consumption_lag, **tags)
183
182
  end
184
183
  end
185
184
 
@@ -189,15 +188,15 @@ module Honeybadger
189
188
  ticked: :tick
190
189
  }.each do |after, name|
191
190
  class_eval <<~RUBY, __FILE__, __LINE__ + 1
192
- # Keeps track of user code execution
193
- #
194
- # @param event [Karafka::Core::Monitoring::Event]
195
- def on_consumer_#{after}(event)
196
- if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
197
- tags = consumer_tags(event.payload[:caller])
198
- increment_counter('consumer_#{name}', value: 1, **tags)
199
- end
200
- end
191
+ # Keeps track of user code execution
192
+ #
193
+ # @param event [Karafka::Core::Monitoring::Event]
194
+ def on_consumer_#{after}(event)
195
+ if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
196
+ tags = consumer_tags(event.payload[:caller])
197
+ increment_counter('consumer_#{name}', value: 1, **tags)
198
+ end
199
+ end
201
200
  RUBY
202
201
  end
203
202
 
@@ -207,9 +206,9 @@ module Honeybadger
207
206
  jq_stats = event[:jobs_queue].statistics
208
207
 
209
208
  if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
210
- gauge('worker_total_threads', value: ::Karafka::App.config.concurrency)
211
- histogram('worker_processing', value: jq_stats[:busy])
212
- histogram('worker_enqueued_jobs', value: jq_stats[:enqueued])
209
+ gauge("worker_total_threads", value: ::Karafka::App.config.concurrency)
210
+ histogram("worker_processing", value: jq_stats[:busy])
211
+ histogram("worker_enqueued_jobs", value: jq_stats[:enqueued])
213
212
  end
214
213
  end
215
214
 
@@ -220,7 +219,7 @@ module Honeybadger
220
219
  jq_stats = event[:jobs_queue].statistics
221
220
 
222
221
  if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
223
- histogram('worker_processing', value: jq_stats[:busy])
222
+ histogram("worker_processing", value: jq_stats[:busy])
224
223
  end
225
224
  end
226
225
 
@@ -240,30 +239,30 @@ module Honeybadger
240
239
  **base_tags
241
240
  )
242
241
  when :brokers
243
- statistics.fetch('brokers').each_value do |broker_statistics|
242
+ statistics.fetch("brokers").each_value do |broker_statistics|
244
243
  # Skip bootstrap nodes
245
244
  # Bootstrap nodes have nodeid -1, other nodes have positive
246
245
  # node ids
247
- next if broker_statistics['nodeid'] == -1
246
+ next if broker_statistics["nodeid"] == -1
248
247
 
249
248
  public_send(
250
249
  metric.type,
251
250
  metric.name,
252
251
  value: broker_statistics.dig(*metric.key_location),
253
- **base_tags.merge(broker: broker_statistics['nodename'])
252
+ **base_tags.merge(broker: broker_statistics["nodename"])
254
253
  )
255
254
  end
256
255
  when :topics
257
- statistics.fetch('topics').each do |topic_name, topic_values|
258
- topic_values['partitions'].each do |partition_name, partition_statistics|
259
- next if partition_name == '-1'
256
+ statistics.fetch("topics").each do |topic_name, topic_values|
257
+ topic_values["partitions"].each do |partition_name, partition_statistics|
258
+ next if partition_name == "-1"
260
259
  # Skip until lag info is available
261
- next if partition_statistics['consumer_lag'] == -1
262
- next if partition_statistics['consumer_lag_stored'] == -1
260
+ next if partition_statistics["consumer_lag"] == -1
261
+ next if partition_statistics["consumer_lag_stored"] == -1
263
262
 
264
263
  # Skip if we do not own the fetch assignment
265
- next if partition_statistics['fetch_state'] == 'stopped'
266
- next if partition_statistics['fetch_state'] == 'none'
264
+ next if partition_statistics["fetch_state"] == "stopped"
265
+ next if partition_statistics["fetch_state"] == "none"
267
266
 
268
267
  public_send(
269
268
  metric.type,
@@ -1,12 +1,12 @@
1
- require 'logger'
2
- require 'singleton'
3
- require 'delegate'
4
- require 'forwardable'
1
+ require "logger"
2
+ require "singleton"
3
+ require "delegate"
4
+ require "forwardable"
5
5
 
6
6
  module Honeybadger
7
7
  # @api private
8
8
  module Logging
9
- PREFIX = '** [Honeybadger] '.freeze
9
+ PREFIX = "** [Honeybadger] ".freeze
10
10
  LOGGER_PROG = "honeybadger".freeze
11
11
 
12
12
  # Logging helper methods. Requires a Honeybadger::Config @config instance
@@ -15,12 +15,13 @@ module Honeybadger
15
15
  # logger directly to avoid extra object allocation.
16
16
  module Helper
17
17
  private
18
+
18
19
  def debug(msg = nil)
19
20
  return true unless logger.debug?
20
21
  msg = yield if block_given?
21
22
  logger.debug(msg)
22
23
  end
23
- alias :d :debug
24
+ alias_method :d, :debug
24
25
 
25
26
  def info(msg = nil)
26
27
  return true unless logger.info?
@@ -57,7 +58,7 @@ module Honeybadger
57
58
  end
58
59
 
59
60
  def add(severity, msg)
60
- raise NotImplementedError, 'must define #add on subclass.'
61
+ raise NotImplementedError, "must define #add on subclass."
61
62
  end
62
63
 
63
64
  def level
@@ -88,13 +89,13 @@ module Honeybadger
88
89
  extend Forwardable
89
90
 
90
91
  def initialize(logger = Logger.new(nil))
91
- raise ArgumentError, 'logger not specified' unless logger
92
- raise ArgumentError, 'logger must be a logger' unless logger.respond_to?(:add)
92
+ raise ArgumentError, "logger not specified" unless logger
93
+ raise ArgumentError, "logger must be a logger" unless logger.respond_to?(:add)
93
94
 
94
95
  @logger = logger
95
96
  end
96
97
 
97
- def add(severity, msg, progname=LOGGER_PROG)
98
+ def add(severity, msg, progname = LOGGER_PROG)
98
99
  @logger.add(severity, msg, progname)
99
100
  end
100
101
 
@@ -102,29 +103,29 @@ module Honeybadger
102
103
  end
103
104
 
104
105
  class FormattedLogger < StandardLogger
105
- def add(severity, msg, progname=LOGGER_PROG)
106
+ def add(severity, msg, progname = LOGGER_PROG)
106
107
  super(severity, format_message(msg), progname)
107
108
  end
108
109
 
109
110
  private
110
111
 
111
112
  def format_message(msg)
112
- return msg unless msg.kind_of?(String)
113
+ return msg unless msg.is_a?(String)
113
114
  PREFIX + msg
114
115
  end
115
116
  end
116
117
 
117
118
  class ConfigLogger < StandardLogger
118
- LOCATE_CALLER_LOCATION = Regexp.new("#{Regexp.escape(__FILE__)}").freeze
119
- CALLER_LOCATION = Regexp.new("#{Regexp.escape(File.expand_path('../../../', __FILE__))}/(.*)").freeze
119
+ LOCATE_CALLER_LOCATION = Regexp.new(Regexp.escape(__FILE__).to_s).freeze
120
+ CALLER_LOCATION = Regexp.new("#{Regexp.escape(File.expand_path("../../../", __FILE__))}/(.*)").freeze
120
121
 
121
- INFO_SUPPLEMENT = ' level=%s pid=%s'.freeze
122
- DEBUG_SUPPLEMENT = ' at=%s'.freeze
122
+ INFO_SUPPLEMENT = " level=%s pid=%s".freeze
123
+ DEBUG_SUPPLEMENT = " at=%s".freeze
123
124
 
124
125
  def initialize(config, logger = Logger.new(nil))
125
126
  @config = config
126
- @tty = STDOUT.tty?
127
- @tty_level = @config.log_level(:'logging.tty_level')
127
+ @tty = $stdout.tty?
128
+ @tty_level = @config.log_level(:"logging.tty_level")
128
129
  super(logger)
129
130
  end
130
131
 
@@ -156,11 +157,11 @@ module Honeybadger
156
157
  end
157
158
 
158
159
  def supplement(msg, severity)
159
- return msg unless msg.kind_of?(String)
160
+ return msg unless msg.is_a?(String)
160
161
 
161
162
  r = msg.dup
162
163
  r << sprintf(INFO_SUPPLEMENT, severity, Process.pid)
163
- if severity == Logger::Severity::DEBUG && l = caller_location
164
+ if severity == Logger::Severity::DEBUG && (l = caller_location)
164
165
  r << sprintf(DEBUG_SUPPLEMENT, l.dump)
165
166
  end
166
167
 
@@ -168,7 +169,7 @@ module Honeybadger
168
169
  end
169
170
 
170
171
  def caller_location
171
- if caller && caller.find {|l| l !~ LOCATE_CALLER_LOCATION && l =~ CALLER_LOCATION }
172
+ if caller&.find { |l| l !~ LOCATE_CALLER_LOCATION && l =~ CALLER_LOCATION }
172
173
  Regexp.last_match(1)
173
174
  end
174
175
  end
@@ -3,11 +3,11 @@ module Honeybadger
3
3
  attr_reader :name, :attributes, :samples
4
4
 
5
5
  def self.metric_type
6
- name.split('::').last.downcase
6
+ name.split("::").last.downcase
7
7
  end
8
8
 
9
9
  def self.signature(metric_type, name, attributes)
10
- Digest::SHA1.hexdigest("#{metric_type}-#{name}-#{attributes.keys.join('-')}-#{attributes.values.join('-')}").to_sym
10
+ Digest::SHA1.hexdigest("#{metric_type}-#{name}-#{attributes.keys.join("-")}-#{attributes.values.join("-")}").to_sym
11
11
  end
12
12
 
13
13
  def self.register(registry, metric_name, attributes)
@@ -1,4 +1,4 @@
1
- require 'honeybadger/logging'
1
+ require "honeybadger/logging"
2
2
 
3
3
  module Honeybadger
4
4
  # A concurrent queue to execute plugin collect blocks and registry.
@@ -40,7 +40,7 @@ module Honeybadger
40
40
  end
41
41
 
42
42
  def shutdown(force = false)
43
- d { 'shutting down worker' }
43
+ d { "shutting down worker" }
44
44
 
45
45
  mutex.synchronize do
46
46
  @shutdown = true
@@ -59,7 +59,7 @@ module Honeybadger
59
59
  # Blocks until queue is processed up to this point in time.
60
60
  def flush
61
61
  mutex.synchronize do
62
- if thread && thread.alive?
62
+ if thread&.alive?
63
63
  queue.push(marker)
64
64
  marker.wait(mutex)
65
65
  end
@@ -101,7 +101,7 @@ module Honeybadger
101
101
  end
102
102
 
103
103
  def kill!
104
- d { 'killing worker thread' }
104
+ d { "killing worker thread" }
105
105
 
106
106
  if thread
107
107
  Thread.kill(thread)
@@ -123,7 +123,7 @@ module Honeybadger
123
123
 
124
124
  def run
125
125
  begin
126
- d { 'worker started' }
126
+ d { "worker started" }
127
127
  loop do
128
128
  case msg = queue.pop
129
129
  when SHUTDOWN then break
@@ -132,9 +132,9 @@ module Honeybadger
132
132
  end
133
133
  end
134
134
  ensure
135
- d { 'stopping worker' }
135
+ d { "stopping worker" }
136
136
  end
137
- rescue Exception => e
137
+ rescue => e
138
138
  error {
139
139
  msg = "Error in worker thread (shutting down) class=%s message=%s\n\t%s"
140
140
  sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
@@ -148,9 +148,9 @@ module Honeybadger
148
148
 
149
149
  if shutdown?
150
150
  kill!
151
- return
151
+ nil
152
152
  end
153
- rescue StandardError => e
153
+ rescue => e
154
154
  error {
155
155
  err = "Error in worker thread class=%s message=%s\n\t%s"
156
156
  sprintf(err, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
@@ -167,8 +167,10 @@ module Honeybadger
167
167
  end
168
168
 
169
169
  def signal_marker(marker)
170
- mutex.synchronize do
170
+ if mutex.owned?
171
171
  marker.signal
172
+ else
173
+ mutex.synchronize { marker.signal }
172
174
  end
173
175
  end
174
176
  end