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
data/lib/honeybadger/karafka.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
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,
|
42
|
-
RdKafkaMetric.new(:increment_counter, :root,
|
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,
|
46
|
-
RdKafkaMetric.new(:increment_counter, :brokers,
|
47
|
-
RdKafkaMetric.new(:increment_counter, :brokers,
|
48
|
-
RdKafkaMetric.new(:increment_counter, :brokers,
|
49
|
-
RdKafkaMetric.new(:increment_counter, :brokers,
|
50
|
-
RdKafkaMetric.new(:gauge, :brokers,
|
51
|
-
RdKafkaMetric.new(:gauge, :brokers,
|
52
|
-
RdKafkaMetric.new(:gauge, :brokers,
|
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,
|
56
|
-
RdKafkaMetric.new(:gauge, :topics,
|
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,
|
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 = {
|
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(
|
96
|
+
statistics.fetch("topics").each do |topic_name, topic_values|
|
98
97
|
sum = 0
|
99
98
|
|
100
|
-
topic_values[
|
101
|
-
next if partition_name ==
|
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[
|
104
|
-
next if partition_statistics[
|
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 = {
|
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(
|
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 = {
|
145
|
+
extra_tags = {consumer_group: consumer_group_id}
|
147
146
|
|
148
147
|
if Honeybadger.config.load_plugin_insights_metrics?(:karafka)
|
149
|
-
histogram(
|
150
|
-
histogram(
|
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(
|
177
|
-
increment_counter(
|
178
|
-
gauge(
|
179
|
-
histogram(
|
180
|
-
histogram(
|
181
|
-
histogram(
|
182
|
-
histogram(
|
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
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
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(
|
211
|
-
histogram(
|
212
|
-
histogram(
|
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(
|
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(
|
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[
|
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[
|
252
|
+
**base_tags.merge(broker: broker_statistics["nodename"])
|
254
253
|
)
|
255
254
|
end
|
256
255
|
when :topics
|
257
|
-
statistics.fetch(
|
258
|
-
topic_values[
|
259
|
-
next if partition_name ==
|
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[
|
262
|
-
next if partition_statistics[
|
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[
|
266
|
-
next if partition_statistics[
|
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,
|
data/lib/honeybadger/logging.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
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 =
|
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
|
-
|
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,
|
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,
|
92
|
-
raise ArgumentError,
|
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.
|
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(
|
119
|
-
CALLER_LOCATION = Regexp.new("#{Regexp.escape(File.expand_path(
|
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 =
|
122
|
-
DEBUG_SUPPLEMENT =
|
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 =
|
127
|
-
@tty_level = @config.log_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.
|
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
|
172
|
+
if caller&.find { |l| l !~ LOCATE_CALLER_LOCATION && l =~ CALLER_LOCATION }
|
172
173
|
Regexp.last_match(1)
|
173
174
|
end
|
174
175
|
end
|
data/lib/honeybadger/metric.rb
CHANGED
@@ -3,11 +3,11 @@ module Honeybadger
|
|
3
3
|
attr_reader :name, :attributes, :samples
|
4
4
|
|
5
5
|
def self.metric_type
|
6
|
-
name.split(
|
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(
|
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
|
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 {
|
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
|
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 {
|
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 {
|
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 {
|
135
|
+
d { "stopping worker" }
|
136
136
|
end
|
137
|
-
rescue
|
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
|
-
|
151
|
+
nil
|
152
152
|
end
|
153
|
-
rescue
|
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.
|
170
|
+
if mutex.owned?
|
171
171
|
marker.signal
|
172
|
+
else
|
173
|
+
mutex.synchronize { marker.signal }
|
172
174
|
end
|
173
175
|
end
|
174
176
|
end
|