honeybadger 5.29.1 → 6.0.6

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 +69 -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 +224 -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 +16 -16
  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 +34 -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 +32 -19
  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 +10 -10
  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 +74 -60
  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,7 +1,7 @@
1
- require 'honeybadger/histogram'
2
- require 'honeybadger/timer'
3
- require 'honeybadger/counter'
4
- require 'honeybadger/gauge'
1
+ require "honeybadger/histogram"
2
+ require "honeybadger/timer"
3
+ require "honeybadger/counter"
4
+ require "honeybadger/gauge"
5
5
 
6
6
  module Honeybadger
7
7
  # +Honeybadger::Instrumentation+ defines the API for collecting metric data from anywhere
@@ -47,14 +47,13 @@ module Honeybadger
47
47
  def time(name, *args)
48
48
  attributes = extract_attributes(args)
49
49
  callable = extract_callable(args)
50
- value = nil
51
50
 
52
- if callable
53
- value = monotonic_timer{ callable.call }[0]
51
+ value = if callable
52
+ monotonic_timer { callable.call }[0]
54
53
  elsif block_given?
55
- value = monotonic_timer{ yield }[0]
54
+ monotonic_timer { yield }[0]
56
55
  else
57
- value = attributes.delete(:duration) || attributes.delete(:value)
56
+ attributes.delete(:duration) || attributes.delete(:value)
58
57
  end
59
58
 
60
59
  Honeybadger::Timer.register(registry, name, attributes).tap do |timer|
@@ -69,14 +68,13 @@ module Honeybadger
69
68
  def histogram(name, *args)
70
69
  attributes = extract_attributes(args)
71
70
  callable = extract_callable(args)
72
- value = nil
73
71
 
74
- if callable
75
- value = monotonic_timer{ callable.call }[0]
72
+ value = if callable
73
+ monotonic_timer { callable.call }[0]
76
74
  elsif block_given?
77
- value = monotonic_timer{ yield }[0]
75
+ monotonic_timer { yield }[0]
78
76
  else
79
- value = attributes.delete(:duration) || attributes.delete(:value)
77
+ attributes.delete(:duration) || attributes.delete(:value)
80
78
  end
81
79
 
82
80
  Honeybadger::Histogram.register(registry, name, attributes).tap do |histogram|
@@ -91,14 +89,13 @@ module Honeybadger
91
89
  def increment_counter(name, *args)
92
90
  attributes = extract_attributes(args)
93
91
  callable = extract_callable(args)
94
- value = nil
95
92
 
96
- if callable
97
- value = callable.call
93
+ value = if callable
94
+ callable.call
98
95
  elsif block_given?
99
- value = yield
96
+ yield
100
97
  else
101
- value = attributes.delete(:by) || attributes.delete(:value) || 1
98
+ attributes.delete(:by) || attributes.delete(:value) || 1
102
99
  end
103
100
 
104
101
  Honeybadger::Counter.register(registry, name, attributes).tap do |counter|
@@ -109,14 +106,13 @@ module Honeybadger
109
106
  def decrement_counter(name, *args)
110
107
  attributes = extract_attributes(args)
111
108
  callable = extract_callable(args)
112
- value = nil
113
109
 
114
- if callable
115
- value = callable.call
110
+ value = if callable
111
+ callable.call
116
112
  elsif block_given?
117
- value = yield
113
+ yield
118
114
  else
119
- value = attributes.delete(:by) || attributes.delete(:value) || 1
115
+ attributes.delete(:by) || attributes.delete(:value) || 1
120
116
  end
121
117
 
122
118
  Honeybadger::Counter.register(registry, name, attributes).tap do |counter|
@@ -127,14 +123,13 @@ module Honeybadger
127
123
  def gauge(name, *args)
128
124
  attributes = extract_attributes(args)
129
125
  callable = extract_callable(args)
130
- value = nil
131
126
 
132
- if callable
133
- value = callable.call
127
+ value = if callable
128
+ callable.call
134
129
  elsif block_given?
135
- value = yield
130
+ yield
136
131
  else
137
- value = attributes.delete(:duration) || attributes.delete(:value)
132
+ attributes.delete(:duration) || attributes.delete(:value)
138
133
  end
139
134
 
140
135
  Honeybadger::Gauge.register(registry, name, attributes).tap do |gauge|
@@ -148,12 +143,12 @@ module Honeybadger
148
143
 
149
144
  # @api private
150
145
  def extract_attributes(args)
151
- args.select { |a| a.is_a?(Hash) }.first || {}
146
+ args.find { |a| a.is_a?(Hash) } || {}
152
147
  end
153
148
 
154
149
  # @api private
155
150
  def extract_callable(args)
156
- args.select { |a| a.respond_to?(:call) }.first
151
+ args.find { |a| a.respond_to?(:call) }
157
152
  end
158
153
  end
159
154
  end
@@ -1,4 +1,4 @@
1
- require 'honeybadger/instrumentation'
1
+ require "honeybadger/instrumentation"
2
2
 
3
3
  module Honeybadger
4
4
  # +Honeybadger::InstrumentationHelper+ is a module that can be included into any class. This module
@@ -25,7 +25,6 @@ module Honeybadger
25
25
  # end
26
26
  # end
27
27
  module InstrumentationHelper
28
-
29
28
  # returns two parameters, the first is the duration of the execution, and the second is
30
29
  # the return value of the passed block
31
30
  def monotonic_timer
@@ -53,9 +52,9 @@ module Honeybadger
53
52
  attributes = extract_attributes(args)
54
53
  callable = extract_callable(args)
55
54
  if callable
56
- metric_instrumentation.time(name, attributes, ->{ callable.call })
55
+ metric_instrumentation.time(name, attributes, -> { callable.call })
57
56
  elsif block_given?
58
- metric_instrumentation.time(name, attributes, ->{ yield })
57
+ metric_instrumentation.time(name, attributes, -> { yield })
59
58
  else
60
59
  metric_instrumentation.time(name, attributes)
61
60
  end
@@ -65,9 +64,9 @@ module Honeybadger
65
64
  attributes = extract_attributes(args)
66
65
  callable = extract_callable(args)
67
66
  if callable
68
- metric_instrumentation.histogram(name, attributes, ->{ callable.call })
67
+ metric_instrumentation.histogram(name, attributes, -> { callable.call })
69
68
  elsif block_given?
70
- metric_instrumentation.histogram(name, attributes, ->{ yield })
69
+ metric_instrumentation.histogram(name, attributes, -> { yield })
71
70
  else
72
71
  metric_instrumentation.histogram(name, attributes)
73
72
  end
@@ -77,9 +76,9 @@ module Honeybadger
77
76
  attributes = extract_attributes(args)
78
77
  callable = extract_callable(args)
79
78
  if callable
80
- metric_instrumentation.increment_counter(name, attributes, ->{ callable.call })
79
+ metric_instrumentation.increment_counter(name, attributes, -> { callable.call })
81
80
  elsif block_given?
82
- metric_instrumentation.increment_counter(name, attributes, ->{ yield })
81
+ metric_instrumentation.increment_counter(name, attributes, -> { yield })
83
82
  else
84
83
  metric_instrumentation.increment_counter(name, attributes)
85
84
  end
@@ -89,9 +88,9 @@ module Honeybadger
89
88
  attributes = extract_attributes(args)
90
89
  callable = extract_callable(args)
91
90
  if callable
92
- metric_instrumentation.decrement_counter(name, attributes, ->{ callable.call })
91
+ metric_instrumentation.decrement_counter(name, attributes, -> { callable.call })
93
92
  elsif block_given?
94
- metric_instrumentation.decrement_counter(name, attributes, ->{ yield })
93
+ metric_instrumentation.decrement_counter(name, attributes, -> { yield })
95
94
  else
96
95
  metric_instrumentation.decrement_counter(name, attributes)
97
96
  end
@@ -101,9 +100,9 @@ module Honeybadger
101
100
  attributes = extract_attributes(args)
102
101
  callable = extract_callable(args)
103
102
  if callable
104
- metric_instrumentation.gauge(name, attributes, ->{ callable.call })
103
+ metric_instrumentation.gauge(name, attributes, -> { callable.call })
105
104
  elsif block_given?
106
- metric_instrumentation.gauge(name, attributes, ->{ yield })
105
+ metric_instrumentation.gauge(name, attributes, -> { yield })
107
106
  else
108
107
  metric_instrumentation.gauge(name, attributes)
109
108
  end
@@ -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