honeybadger 5.29.1 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/lib/honeybadger/agent.rb +36 -35
- data/lib/honeybadger/backend/base.rb +11 -11
- data/lib/honeybadger/backend/debug.rb +4 -4
- data/lib/honeybadger/backend/null.rb +2 -2
- data/lib/honeybadger/backend/server.rb +11 -11
- data/lib/honeybadger/backend/test.rb +2 -2
- data/lib/honeybadger/backend.rb +6 -6
- data/lib/honeybadger/backtrace.rb +27 -22
- data/lib/honeybadger/breadcrumbs/active_support.rb +9 -9
- data/lib/honeybadger/breadcrumbs/breadcrumb.rb +1 -2
- data/lib/honeybadger/breadcrumbs/collector.rb +4 -4
- data/lib/honeybadger/breadcrumbs/logging.rb +11 -14
- data/lib/honeybadger/breadcrumbs.rb +3 -3
- data/lib/honeybadger/cli/deploy.rb +7 -7
- data/lib/honeybadger/cli/exec.rb +41 -41
- data/lib/honeybadger/cli/helpers.rb +18 -18
- data/lib/honeybadger/cli/heroku.rb +36 -36
- data/lib/honeybadger/cli/install.rb +44 -44
- data/lib/honeybadger/cli/main.rb +107 -107
- data/lib/honeybadger/cli/notify.rb +13 -13
- data/lib/honeybadger/cli/test.rb +109 -94
- data/lib/honeybadger/cli.rb +3 -3
- data/lib/honeybadger/config/defaults.rb +218 -218
- data/lib/honeybadger/config/env.rb +5 -5
- data/lib/honeybadger/config/ruby.rb +19 -19
- data/lib/honeybadger/config/yaml.rb +12 -12
- data/lib/honeybadger/config.rb +76 -78
- data/lib/honeybadger/const.rb +4 -4
- data/lib/honeybadger/context_manager.rb +1 -2
- data/lib/honeybadger/conversions.rb +9 -6
- data/lib/honeybadger/counter.rb +4 -4
- data/lib/honeybadger/event.rb +3 -3
- data/lib/honeybadger/events_worker.rb +33 -33
- data/lib/honeybadger/gauge.rb +2 -2
- data/lib/honeybadger/histogram.rb +4 -4
- data/lib/honeybadger/init/hanami.rb +5 -5
- data/lib/honeybadger/init/rails.rb +14 -14
- data/lib/honeybadger/init/rake.rb +19 -21
- data/lib/honeybadger/init/ruby.rb +4 -4
- data/lib/honeybadger/init/sinatra.rb +11 -12
- data/lib/honeybadger/instrumentation.rb +26 -31
- data/lib/honeybadger/instrumentation_helper.rb +11 -12
- data/lib/honeybadger/karafka.rb +55 -56
- data/lib/honeybadger/logging.rb +22 -21
- data/lib/honeybadger/metric.rb +2 -2
- data/lib/honeybadger/metrics_worker.rb +12 -10
- data/lib/honeybadger/notice.rb +55 -58
- data/lib/honeybadger/notification_subscriber.rb +14 -14
- data/lib/honeybadger/plugin.rb +16 -18
- data/lib/honeybadger/plugins/active_job.rb +11 -9
- data/lib/honeybadger/plugins/autotuner.rb +5 -5
- data/lib/honeybadger/plugins/breadcrumbs.rb +7 -7
- data/lib/honeybadger/plugins/delayed_job/plugin.rb +36 -37
- data/lib/honeybadger/plugins/delayed_job.rb +4 -4
- data/lib/honeybadger/plugins/faktory.rb +9 -9
- data/lib/honeybadger/plugins/karafka.rb +3 -3
- data/lib/honeybadger/plugins/lambda.rb +9 -11
- data/lib/honeybadger/plugins/local_variables.rb +4 -4
- data/lib/honeybadger/plugins/net_http.rb +10 -10
- data/lib/honeybadger/plugins/passenger.rb +4 -4
- data/lib/honeybadger/plugins/rails.rb +13 -9
- data/lib/honeybadger/plugins/resque.rb +7 -7
- data/lib/honeybadger/plugins/shoryuken.rb +6 -6
- data/lib/honeybadger/plugins/sidekiq.rb +61 -57
- data/lib/honeybadger/plugins/solid_queue.rb +3 -3
- data/lib/honeybadger/plugins/sucker_punch.rb +5 -5
- data/lib/honeybadger/plugins/system.rb +3 -3
- data/lib/honeybadger/plugins/thor.rb +5 -5
- data/lib/honeybadger/plugins/warden.rb +4 -4
- data/lib/honeybadger/rack/error_notifier.rb +14 -14
- data/lib/honeybadger/rack/user_feedback.rb +11 -12
- data/lib/honeybadger/rack/user_informer.rb +6 -6
- data/lib/honeybadger/registry.rb +2 -2
- data/lib/honeybadger/registry_execution.rb +1 -1
- data/lib/honeybadger/ruby.rb +2 -2
- data/lib/honeybadger/singleton.rb +49 -48
- data/lib/honeybadger/tasks.rb +3 -3
- data/lib/honeybadger/timer.rb +1 -1
- data/lib/honeybadger/util/http.rb +27 -27
- data/lib/honeybadger/util/request_hash.rb +11 -11
- data/lib/honeybadger/util/request_payload.rb +2 -2
- data/lib/honeybadger/util/revision.rb +14 -6
- data/lib/honeybadger/util/sanitizer.rb +22 -22
- data/lib/honeybadger/util/stats.rb +6 -3
- data/lib/honeybadger/version.rb +1 -1
- data/lib/honeybadger/worker.rb +31 -29
- data/lib/honeybadger.rb +5 -5
- data/lib/puma/plugin/honeybadger.rb +12 -8
- metadata +3 -3
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "set"
|
2
2
|
|
3
|
-
require
|
3
|
+
require "honeybadger/conversions"
|
4
4
|
|
5
5
|
module Honeybadger
|
6
6
|
module Util
|
@@ -8,17 +8,17 @@ module Honeybadger
|
|
8
8
|
# are based on Rails' HTTP parameter filter.
|
9
9
|
class Sanitizer
|
10
10
|
COOKIE_PAIRS = /[;,]\s?/
|
11
|
-
COOKIE_SEP =
|
12
|
-
COOKIE_PAIR_SEP =
|
11
|
+
COOKIE_SEP = "=".freeze
|
12
|
+
COOKIE_PAIR_SEP = "; ".freeze
|
13
13
|
|
14
|
-
ENCODE_OPTS = {
|
14
|
+
ENCODE_OPTS = {invalid: :replace, undef: :replace, replace: "?".freeze}.freeze
|
15
15
|
|
16
|
-
BASIC_OBJECT =
|
17
|
-
DEPTH =
|
18
|
-
FILTERED =
|
19
|
-
RAISED =
|
20
|
-
RECURSION =
|
21
|
-
TRUNCATED =
|
16
|
+
BASIC_OBJECT = "#<BasicObject>".freeze
|
17
|
+
DEPTH = "[DEPTH]".freeze
|
18
|
+
FILTERED = "[FILTERED]".freeze
|
19
|
+
RAISED = "[RAISED]".freeze
|
20
|
+
RECURSION = "[RECURSION]".freeze
|
21
|
+
TRUNCATED = "[TRUNCATED]".freeze
|
22
22
|
|
23
23
|
IMMUTABLE = [NilClass, FalseClass, TrueClass, Symbol, Numeric, Method].freeze
|
24
24
|
|
@@ -51,15 +51,15 @@ module Honeybadger
|
|
51
51
|
@deep_regexps, @regexps = @regexps.partition { |r| r.to_s.include?('\\.'.freeze) }
|
52
52
|
deep_strings, @strings = strings.partition { |s| s.include?('\\.'.freeze) }
|
53
53
|
|
54
|
-
@regexps << Regexp.new(strings.join(
|
55
|
-
@deep_regexps << Regexp.new(deep_strings.join(
|
54
|
+
@regexps << Regexp.new(strings.join("|".freeze), true) unless strings.empty?
|
55
|
+
@deep_regexps << Regexp.new(deep_strings.join("|".freeze), true) unless deep_strings.empty?
|
56
56
|
end
|
57
57
|
|
58
58
|
def sanitize(data, depth = 0, stack = nil, parents = [])
|
59
59
|
return BASIC_OBJECT if basic_object?(data)
|
60
60
|
|
61
61
|
if recursive?(data)
|
62
|
-
return RECURSION if stack
|
62
|
+
return RECURSION if stack&.include?(data.object_id)
|
63
63
|
|
64
64
|
stack = stack ? stack.dup : Set.new
|
65
65
|
stack << data.object_id
|
@@ -74,12 +74,12 @@ module Honeybadger
|
|
74
74
|
|
75
75
|
hash.each_pair do |key, value|
|
76
76
|
parents.push(key) if deep_regexps
|
77
|
-
key = key.
|
77
|
+
key = key.is_a?(Symbol) ? key : sanitize(key, depth + 1, stack, parents)
|
78
78
|
|
79
79
|
if filter_key?(key, parents)
|
80
80
|
new_hash[key] = FILTERED
|
81
81
|
else
|
82
|
-
value = sanitize(value, depth+1, stack, parents)
|
82
|
+
value = sanitize(value, depth + 1, stack, parents)
|
83
83
|
|
84
84
|
if blocks.any? && !recursive?(value)
|
85
85
|
key = key.dup if can_dup?(key)
|
@@ -98,13 +98,13 @@ module Honeybadger
|
|
98
98
|
return DEPTH if depth >= max_depth
|
99
99
|
|
100
100
|
data.to_a.map do |value|
|
101
|
-
sanitize(value, depth+1, stack, parents)
|
101
|
+
sanitize(value, depth + 1, stack, parents)
|
102
102
|
end
|
103
103
|
when Numeric, TrueClass, FalseClass, NilClass
|
104
104
|
data
|
105
105
|
when String
|
106
106
|
sanitize_string(data)
|
107
|
-
when ->
|
107
|
+
when ->(d) { d.respond_to?(:to_honeybadger) }
|
108
108
|
return DEPTH if depth >= max_depth
|
109
109
|
|
110
110
|
begin
|
@@ -113,7 +113,7 @@ module Honeybadger
|
|
113
113
|
return RAISED
|
114
114
|
end
|
115
115
|
|
116
|
-
sanitize(data, depth+1, stack, parents)
|
116
|
+
sanitize(data, depth + 1, stack, parents)
|
117
117
|
else # all other objects
|
118
118
|
klass = data.class
|
119
119
|
|
@@ -156,7 +156,7 @@ module Honeybadger
|
|
156
156
|
filtered_url
|
157
157
|
end
|
158
158
|
|
159
|
-
|
159
|
+
private
|
160
160
|
|
161
161
|
attr_reader :max_depth, :regexps, :deep_regexps, :blocks
|
162
162
|
|
@@ -180,7 +180,7 @@ module Honeybadger
|
|
180
180
|
def valid_encoding?(string)
|
181
181
|
string.valid_encoding? && (
|
182
182
|
VALID_ENCODINGS.include?(string.encoding) ||
|
183
|
-
VALID_ENCODINGS.include?(Encoding.compatible?(
|
183
|
+
VALID_ENCODINGS.include?(Encoding.compatible?("".freeze, string))
|
184
184
|
)
|
185
185
|
end
|
186
186
|
|
@@ -202,7 +202,7 @@ module Honeybadger
|
|
202
202
|
end
|
203
203
|
|
204
204
|
def can_dup?(obj)
|
205
|
-
!IMMUTABLE.any? {|k| obj.
|
205
|
+
!IMMUTABLE.any? { |k| obj.is_a?(k) }
|
206
206
|
end
|
207
207
|
|
208
208
|
def inspected?(string)
|
@@ -6,14 +6,17 @@ module Honeybadger
|
|
6
6
|
|
7
7
|
class << self
|
8
8
|
def all
|
9
|
-
{
|
9
|
+
{mem: memory, load: load}
|
10
10
|
end
|
11
11
|
|
12
12
|
# From https://github.com/bloopletech/webstats/blob/master/server/data_providers/mem_info.rb
|
13
13
|
def memory
|
14
14
|
out = {}
|
15
15
|
if HAS_MEM && (meminfo = run_meminfo)
|
16
|
-
out[:total], out[:free], out[:buffers], out[:cached] = meminfo[0..4].map { |l|
|
16
|
+
out[:total], out[:free], out[:buffers], out[:cached] = meminfo[0..4].map { |l|
|
17
|
+
l =~ /^.*?: +(.*?) kB$/
|
18
|
+
($1.to_i / 1024.0).to_f
|
19
|
+
}
|
17
20
|
out[:free_total] = out[:free] + out[:buffers] + out[:cached]
|
18
21
|
end
|
19
22
|
out
|
@@ -23,7 +26,7 @@ module Honeybadger
|
|
23
26
|
def load
|
24
27
|
out = {}
|
25
28
|
if HAS_LOAD && (loadavg = run_loadavg)
|
26
|
-
out[:one], out[:five], out[:fifteen] = loadavg.split(
|
29
|
+
out[:one], out[:five], out[:fifteen] = loadavg.split(" ", 4).map(&:to_f)
|
27
30
|
end
|
28
31
|
out
|
29
32
|
end
|
data/lib/honeybadger/version.rb
CHANGED
data/lib/honeybadger/worker.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "net/http"
|
3
3
|
|
4
|
-
require
|
4
|
+
require "honeybadger/logging"
|
5
5
|
|
6
6
|
module Honeybadger
|
7
7
|
# A concurrent queue to notify the backend.
|
@@ -38,7 +38,7 @@ module Honeybadger
|
|
38
38
|
return false unless start
|
39
39
|
|
40
40
|
if queue.size >= config.max_queue_size
|
41
|
-
warn { sprintf(
|
41
|
+
warn { sprintf("Unable to report error; reached max queue size of %s. id=%s", queue.size, msg.id) }
|
42
42
|
return false
|
43
43
|
end
|
44
44
|
|
@@ -50,7 +50,7 @@ module Honeybadger
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def shutdown(force = false)
|
53
|
-
d {
|
53
|
+
d { "shutting down worker" }
|
54
54
|
|
55
55
|
mutex.synchronize do
|
56
56
|
@shutdown = true
|
@@ -60,11 +60,11 @@ module Honeybadger
|
|
60
60
|
return true unless thread&.alive?
|
61
61
|
|
62
62
|
if throttled?
|
63
|
-
warn { sprintf(
|
63
|
+
warn { sprintf("Unable to report %s error(s) to Honeybadger (currently throttled)", queue.size) } unless queue.empty?
|
64
64
|
return true
|
65
65
|
end
|
66
66
|
|
67
|
-
info { sprintf(
|
67
|
+
info { sprintf("Waiting to report %s error(s) to Honeybadger", queue.size) } unless queue.empty?
|
68
68
|
|
69
69
|
queue.push(SHUTDOWN)
|
70
70
|
!!thread.join
|
@@ -76,7 +76,7 @@ module Honeybadger
|
|
76
76
|
# Blocks until queue is processed up to this point in time.
|
77
77
|
def flush
|
78
78
|
mutex.synchronize do
|
79
|
-
if thread
|
79
|
+
if thread&.alive?
|
80
80
|
queue.push(marker)
|
81
81
|
marker.wait(mutex)
|
82
82
|
end
|
@@ -125,7 +125,7 @@ module Honeybadger
|
|
125
125
|
end
|
126
126
|
|
127
127
|
def kill!
|
128
|
-
d {
|
128
|
+
d { "killing worker thread" }
|
129
129
|
|
130
130
|
if thread
|
131
131
|
Thread.kill(thread)
|
@@ -147,7 +147,7 @@ module Honeybadger
|
|
147
147
|
|
148
148
|
def run
|
149
149
|
begin
|
150
|
-
d {
|
150
|
+
d { "worker started" }
|
151
151
|
loop do
|
152
152
|
case msg = queue.pop
|
153
153
|
when SHUTDOWN then break
|
@@ -156,9 +156,9 @@ module Honeybadger
|
|
156
156
|
end
|
157
157
|
end
|
158
158
|
ensure
|
159
|
-
d {
|
159
|
+
d { "stopping worker" }
|
160
160
|
end
|
161
|
-
rescue
|
161
|
+
rescue => e
|
162
162
|
error {
|
163
163
|
msg = "Error in worker thread (shutting down) class=%s message=%s\n\t%s"
|
164
164
|
sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
|
@@ -171,13 +171,13 @@ module Honeybadger
|
|
171
171
|
send_now(msg)
|
172
172
|
|
173
173
|
if shutdown? && throttled?
|
174
|
-
warn { sprintf(
|
174
|
+
warn { sprintf("Unable to report %s error(s) to Honeybadger (currently throttled)", queue.size) } if queue.size > 1
|
175
175
|
kill!
|
176
176
|
return
|
177
177
|
end
|
178
178
|
|
179
179
|
sleep(throttle_interval)
|
180
|
-
rescue
|
180
|
+
rescue => e
|
181
181
|
error {
|
182
182
|
msg = "Error in worker thread class=%s message=%s\n\t%s"
|
183
183
|
sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
|
@@ -185,12 +185,12 @@ module Honeybadger
|
|
185
185
|
end
|
186
186
|
|
187
187
|
def notify_backend(payload)
|
188
|
-
d { sprintf(
|
188
|
+
d { sprintf("worker notifying backend id=%s", payload.id) }
|
189
189
|
backend.notify(:notices, payload)
|
190
190
|
end
|
191
191
|
|
192
192
|
def calc_throttle_interval
|
193
|
-
((BASE_THROTTLE
|
193
|
+
((BASE_THROTTLE**throttle) - 1).round(3)
|
194
194
|
end
|
195
195
|
|
196
196
|
def inc_throttle
|
@@ -211,33 +211,33 @@ module Honeybadger
|
|
211
211
|
end
|
212
212
|
|
213
213
|
def handle_response(msg, response)
|
214
|
-
d { sprintf(
|
214
|
+
d { sprintf("worker response id=%s code=%s message=%s", msg.id, response.code, response.message.to_s.dump) }
|
215
215
|
|
216
216
|
case response.code
|
217
217
|
when 429, 503
|
218
218
|
throttle = inc_throttle
|
219
|
-
warn { sprintf(
|
219
|
+
warn { sprintf("Error report failed: project is sending too many errors. id=%s code=%s throttle=%s interval=%s", msg.id, response.code, throttle, throttle_interval) }
|
220
220
|
when 402
|
221
|
-
warn { sprintf(
|
221
|
+
warn { sprintf("Error report failed: payment is required. id=%s code=%s", msg.id, response.code) }
|
222
222
|
suspend(3600)
|
223
223
|
when 403
|
224
|
-
warn { sprintf(
|
224
|
+
warn { sprintf("Error report failed: API key is invalid. id=%s code=%s", msg.id, response.code) }
|
225
225
|
suspend(3600)
|
226
226
|
when 413
|
227
|
-
warn { sprintf(
|
227
|
+
warn { sprintf("Error report failed: Payload is too large. id=%s code=%s", msg.id, response.code) }
|
228
228
|
when 201
|
229
|
-
host = config.get(:
|
230
|
-
if throttle = dec_throttle
|
231
|
-
info { sprintf(
|
229
|
+
host = config.get(:"connection.ui_host")
|
230
|
+
if (throttle = dec_throttle)
|
231
|
+
info { sprintf("Success ⚡ https://%s/notice/%s id=%s code=%s throttle=%s interval=%s", host, msg.id, msg.id, response.code, throttle, throttle_interval) }
|
232
232
|
else
|
233
|
-
info { sprintf(
|
233
|
+
info { sprintf("Success ⚡ https://%s/notice/%s id=%s code=%s", host, msg.id, msg.id, response.code) }
|
234
234
|
end
|
235
235
|
when :stubbed
|
236
|
-
info { sprintf(
|
236
|
+
info { sprintf("Success ⚡ Development mode is enabled; this error will be reported if it occurs after you deploy your app. id=%s", msg.id) }
|
237
237
|
when :error
|
238
|
-
warn { sprintf(
|
238
|
+
warn { sprintf("Error report failed: an unknown error occurred. code=%s error=%s", response.code, response.message.to_s.dump) }
|
239
239
|
else
|
240
|
-
warn { sprintf(
|
240
|
+
warn { sprintf("Error report failed: unknown response from server. code=%s", response.code) }
|
241
241
|
end
|
242
242
|
end
|
243
243
|
|
@@ -248,8 +248,10 @@ module Honeybadger
|
|
248
248
|
end
|
249
249
|
|
250
250
|
def signal_marker(marker)
|
251
|
-
mutex.
|
251
|
+
if mutex.owned?
|
252
252
|
marker.signal
|
253
|
+
else
|
254
|
+
mutex.synchronize { marker.signal }
|
253
255
|
end
|
254
256
|
end
|
255
257
|
end
|
data/lib/honeybadger.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
if defined?(::Rails::Railtie)
|
2
|
-
require
|
2
|
+
require "honeybadger/init/rails"
|
3
3
|
elsif defined?(Sinatra::Base)
|
4
|
-
require
|
4
|
+
require "honeybadger/init/sinatra"
|
5
5
|
elsif defined?(::Hanami)
|
6
|
-
require
|
6
|
+
require "honeybadger/init/hanami"
|
7
7
|
else
|
8
|
-
require
|
8
|
+
require "honeybadger/init/ruby"
|
9
9
|
end
|
10
10
|
|
11
11
|
if defined?(Rake.application)
|
12
|
-
require
|
12
|
+
require "honeybadger/init/rake"
|
13
13
|
end
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/instrumentation_helper"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
class PumaPlugin
|
5
5
|
include Honeybadger::InstrumentationHelper
|
6
6
|
|
7
|
-
STATS_KEYS = %i
|
7
|
+
STATS_KEYS = %i[pool_capacity max_threads requests_count backlog running].freeze
|
8
8
|
|
9
9
|
::Puma::Plugin.create do
|
10
10
|
def start(launcher)
|
@@ -19,14 +19,18 @@ module Honeybadger
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def record
|
22
|
-
metric_source
|
22
|
+
metric_source "puma"
|
23
23
|
|
24
|
-
stats =
|
24
|
+
stats = begin
|
25
|
+
::Puma.stats
|
26
|
+
rescue
|
27
|
+
{}
|
28
|
+
end
|
25
29
|
stats = stats.is_a?(Hash) ? stats : JSON.parse(stats, symbolize_names: true)
|
26
30
|
|
27
31
|
if stats[:worker_status].is_a?(Array)
|
28
32
|
stats[:worker_status].each do |worker_data|
|
29
|
-
context = {
|
33
|
+
context = {worker: worker_data[:index]}
|
30
34
|
record_puma_stats(worker_data[:last_status], context)
|
31
35
|
end
|
32
36
|
else
|
@@ -34,14 +38,14 @@ module Honeybadger
|
|
34
38
|
end
|
35
39
|
end
|
36
40
|
|
37
|
-
def record_puma_stats(stats, context={})
|
41
|
+
def record_puma_stats(stats, context = {})
|
38
42
|
if Honeybadger.config.load_plugin_insights_events?(:puma)
|
39
|
-
Honeybadger.event(
|
43
|
+
Honeybadger.event("stats.puma", context.merge(stats))
|
40
44
|
end
|
41
45
|
|
42
46
|
if Honeybadger.config.load_plugin_insights_metrics?(:puma)
|
43
47
|
STATS_KEYS.each do |stat|
|
44
|
-
gauge stat, context, ->{ stats[stat] } if stats[stat]
|
48
|
+
gauge stat, context, -> { stats[stat] } if stats[stat]
|
45
49
|
end
|
46
50
|
end
|
47
51
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: honeybadger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Honeybadger Industries LLC
|
@@ -201,14 +201,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
201
201
|
requirements:
|
202
202
|
- - ">="
|
203
203
|
- !ruby/object:Gem::Version
|
204
|
-
version:
|
204
|
+
version: 3.0.0
|
205
205
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
206
|
requirements:
|
207
207
|
- - ">="
|
208
208
|
- !ruby/object:Gem::Version
|
209
209
|
version: '0'
|
210
210
|
requirements: []
|
211
|
-
rubygems_version: 3.
|
211
|
+
rubygems_version: 3.8.0.dev
|
212
212
|
specification_version: 4
|
213
213
|
summary: Full-stack error tracking, performance monitoring, logging, and more.
|
214
214
|
test_files: []
|