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
data/lib/honeybadger/event.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
1
|
+
require "forwardable"
|
2
2
|
|
3
|
-
require
|
3
|
+
require "honeybadger/util/sanitizer"
|
4
4
|
|
5
5
|
module Honeybadger
|
6
6
|
class Event
|
@@ -18,7 +18,7 @@ module Honeybadger
|
|
18
18
|
def_delegators :payload, :dig, :[], :[]=, :delete
|
19
19
|
|
20
20
|
# @api private
|
21
|
-
def initialize(event_type_or_payload, payload={})
|
21
|
+
def initialize(event_type_or_payload, payload = {})
|
22
22
|
if event_type_or_payload.is_a?(String)
|
23
23
|
@event_type = event_type_or_payload
|
24
24
|
@payload = payload
|
@@ -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.
|
@@ -58,7 +58,7 @@ module Honeybadger
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def shutdown(force = false)
|
61
|
-
d {
|
61
|
+
d { "shutting down events worker" }
|
62
62
|
|
63
63
|
mutex.synchronize do
|
64
64
|
@shutdown = true
|
@@ -68,11 +68,11 @@ module Honeybadger
|
|
68
68
|
return true unless thread&.alive?
|
69
69
|
|
70
70
|
if throttled?
|
71
|
-
warn { sprintf(
|
71
|
+
warn { sprintf("Unable to send %s event(s) to Honeybadger (currently throttled)", queue.size) } unless queue.empty?
|
72
72
|
return true
|
73
73
|
end
|
74
74
|
|
75
|
-
info { sprintf(
|
75
|
+
info { sprintf("Waiting to send %s events(s) to Honeybadger", queue.size) } unless queue.empty?
|
76
76
|
queue.push(FLUSH)
|
77
77
|
queue.push(SHUTDOWN)
|
78
78
|
!!thread.join
|
@@ -84,7 +84,7 @@ module Honeybadger
|
|
84
84
|
# Blocks until queue is processed up to this point in time.
|
85
85
|
def flush
|
86
86
|
mutex.synchronize do
|
87
|
-
if thread
|
87
|
+
if thread&.alive?
|
88
88
|
queue.push(FLUSH)
|
89
89
|
queue.push(marker)
|
90
90
|
marker.wait(mutex)
|
@@ -135,7 +135,7 @@ module Honeybadger
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def kill!
|
138
|
-
d {
|
138
|
+
d { "killing worker thread" }
|
139
139
|
|
140
140
|
if thread
|
141
141
|
Thread.kill(thread)
|
@@ -165,7 +165,7 @@ module Honeybadger
|
|
165
165
|
|
166
166
|
def run
|
167
167
|
begin
|
168
|
-
d {
|
168
|
+
d { "worker started" }
|
169
169
|
mutex.synchronize do
|
170
170
|
@last_sent = Time.now
|
171
171
|
end
|
@@ -179,9 +179,9 @@ module Honeybadger
|
|
179
179
|
end
|
180
180
|
end
|
181
181
|
ensure
|
182
|
-
d {
|
182
|
+
d { "stopping worker" }
|
183
183
|
end
|
184
|
-
rescue
|
184
|
+
rescue => e
|
185
185
|
error {
|
186
186
|
msg = "Error in worker thread (shutting down) class=%s message=%s\n\t%s"
|
187
187
|
sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
|
@@ -208,10 +208,10 @@ module Honeybadger
|
|
208
208
|
send_now(mutex.synchronize { send_queue })
|
209
209
|
mutex.synchronize do
|
210
210
|
@last_sent = Time.now
|
211
|
-
debug { sprintf(
|
211
|
+
debug { sprintf("Sending %s events", send_queue.length) }
|
212
212
|
send_queue.clear
|
213
213
|
if @dropped_events > 0
|
214
|
-
warn { sprintf(
|
214
|
+
warn { sprintf("Dropped %s messages due to exceeding max queue size of %s", @dropped_events, config.events_max_queue_size) }
|
215
215
|
end
|
216
216
|
@dropped_events = 0
|
217
217
|
end
|
@@ -227,7 +227,7 @@ module Honeybadger
|
|
227
227
|
def flush_send_queue
|
228
228
|
return if mutex.synchronize { send_queue.empty? }
|
229
229
|
send_batch
|
230
|
-
rescue
|
230
|
+
rescue => e
|
231
231
|
error {
|
232
232
|
msg = "Error in worker thread class=%s message=%s\n\t%s"
|
233
233
|
sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
|
@@ -239,28 +239,26 @@ module Honeybadger
|
|
239
239
|
check_and_send
|
240
240
|
|
241
241
|
if shutdown? && throttled?
|
242
|
-
warn { sprintf(
|
242
|
+
warn { sprintf("Unable to send %s events(s) to Honeybadger (currently throttled)", queue.size) } if queue.size > 1
|
243
243
|
kill!
|
244
244
|
return
|
245
245
|
end
|
246
246
|
|
247
247
|
sleep(throttle_interval)
|
248
|
-
rescue
|
248
|
+
rescue => e
|
249
249
|
error {
|
250
250
|
msg = "Error in worker thread class=%s message=%s\n\t%s"
|
251
251
|
sprintf(msg, e.class, e.message.dump, Array(e.backtrace).join("\n\t"))
|
252
252
|
}
|
253
253
|
end
|
254
254
|
|
255
|
-
|
256
255
|
def send_to_backend(msg)
|
257
|
-
d {
|
258
|
-
|
259
|
-
response
|
256
|
+
d { "events_worker sending to backend" }
|
257
|
+
backend.event(msg)
|
260
258
|
end
|
261
259
|
|
262
260
|
def calc_throttle_interval
|
263
|
-
((BASE_THROTTLE
|
261
|
+
((BASE_THROTTLE**throttle) - 1).round(3)
|
264
262
|
end
|
265
263
|
|
266
264
|
def inc_throttle
|
@@ -281,32 +279,32 @@ module Honeybadger
|
|
281
279
|
end
|
282
280
|
|
283
281
|
def handle_response(response)
|
284
|
-
d { sprintf(
|
282
|
+
d { sprintf("events_worker response code=%s message=%s", response.code, response.message.to_s.dump) }
|
285
283
|
|
286
284
|
case response.code
|
287
285
|
when 429, 503
|
288
286
|
throttle = inc_throttle
|
289
|
-
warn { sprintf(
|
287
|
+
warn { sprintf("Event send failed: project is sending too many events. code=%s throttle=%s interval=%s", response.code, throttle, throttle_interval) }
|
290
288
|
when 402
|
291
|
-
warn { sprintf(
|
289
|
+
warn { sprintf("Event send failed: payment is required. code=%s", response.code) }
|
292
290
|
suspend(3600)
|
293
291
|
when 403
|
294
|
-
warn { sprintf(
|
292
|
+
warn { sprintf("Event send failed: API key is invalid. code=%s", response.code) }
|
295
293
|
suspend(3600)
|
296
294
|
when 413
|
297
|
-
warn { sprintf(
|
295
|
+
warn { sprintf("Event send failed: Payload is too large. code=%s", response.code) }
|
298
296
|
when 201
|
299
|
-
if throttle = dec_throttle
|
300
|
-
debug { sprintf(
|
297
|
+
if (throttle = dec_throttle)
|
298
|
+
debug { sprintf("Success ⚡ Event sent code=%s throttle=%s interval=%s", response.code, throttle, throttle_interval) }
|
301
299
|
else
|
302
|
-
debug { sprintf(
|
300
|
+
debug { sprintf("Success ⚡ Event sent code=%s", response.code) }
|
303
301
|
end
|
304
302
|
when :stubbed
|
305
|
-
info {
|
303
|
+
info { "Success ⚡ Development mode is enabled; This event will be sent after app is deployed." }
|
306
304
|
when :error
|
307
|
-
warn { sprintf(
|
305
|
+
warn { sprintf("Event send failed: an unknown error occurred. code=%s error=%s", response.code, response.message.to_s.dump) }
|
308
306
|
else
|
309
|
-
warn { sprintf(
|
307
|
+
warn { sprintf("Event send failed: unknown response from server. code=%s", response.code) }
|
310
308
|
end
|
311
309
|
end
|
312
310
|
|
@@ -317,8 +315,10 @@ module Honeybadger
|
|
317
315
|
end
|
318
316
|
|
319
317
|
def signal_marker(marker)
|
320
|
-
mutex.
|
318
|
+
if mutex.owned?
|
321
319
|
marker.signal
|
320
|
+
else
|
321
|
+
mutex.synchronize { marker.signal }
|
322
322
|
end
|
323
323
|
end
|
324
324
|
end
|
data/lib/honeybadger/gauge.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/metric"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
class Gauge < Metric
|
@@ -8,7 +8,7 @@ module Honeybadger
|
|
8
8
|
@samples += 1
|
9
9
|
|
10
10
|
@total ||= 0
|
11
|
-
@total
|
11
|
+
@total += value
|
12
12
|
|
13
13
|
@min = value if @min.nil? || @min > value
|
14
14
|
@max = value if @max.nil? || @max < value
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/metric"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
class Histogram < Metric
|
5
5
|
DEFAULT_BINS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]
|
6
|
-
INFINITY = 1e20
|
6
|
+
INFINITY = 1e20 # not quite, but pretty much
|
7
7
|
|
8
8
|
def record(value)
|
9
9
|
return unless value
|
@@ -11,7 +11,7 @@ module Honeybadger
|
|
11
11
|
@samples += 1
|
12
12
|
|
13
13
|
@total ||= 0
|
14
|
-
@total
|
14
|
+
@total += value
|
15
15
|
|
16
16
|
@min = value if @min.nil? || @min > value
|
17
17
|
@max = value if @max.nil? || @max < value
|
@@ -23,7 +23,7 @@ module Honeybadger
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def find_bin(value)
|
26
|
-
bin = bins.find {|b| b >= value
|
26
|
+
bin = bins.find { |b| b >= value }
|
27
27
|
bin = INFINITY if bin.nil?
|
28
28
|
bin
|
29
29
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/ruby"
|
2
2
|
|
3
3
|
Honeybadger.init!({
|
4
|
-
:
|
5
|
-
:
|
6
|
-
|
4
|
+
framework: :hanami,
|
5
|
+
env: ENV["HANAMI_ENV"] || ENV["RACK_ENV"],
|
6
|
+
"logging.path": "STDOUT"
|
7
7
|
})
|
8
8
|
|
9
9
|
Honeybadger.load_plugins!
|
10
10
|
|
11
|
-
if Hanami::VERSION >=
|
11
|
+
if Hanami::VERSION >= "2.0" && Honeybadger.config[:"exceptions.enabled"]
|
12
12
|
Hanami.app.instance_eval do
|
13
13
|
config.middleware.use Honeybadger::Rack::UserFeedback
|
14
14
|
config.middleware.use Honeybadger::Rack::UserInformer
|
@@ -1,33 +1,33 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "rails"
|
2
|
+
require "yaml"
|
3
3
|
|
4
|
-
require
|
4
|
+
require "honeybadger/ruby"
|
5
5
|
|
6
6
|
module Honeybadger
|
7
7
|
module Init
|
8
8
|
module Rails
|
9
9
|
class Railtie < ::Rails::Railtie
|
10
10
|
rake_tasks do
|
11
|
-
load
|
11
|
+
load "honeybadger/tasks.rb"
|
12
12
|
end
|
13
13
|
|
14
|
-
initializer
|
14
|
+
initializer "honeybadger.install_middleware" do |app|
|
15
15
|
honeybadger_config = Honeybadger::Agent.instance.config
|
16
16
|
|
17
|
-
if honeybadger_config[:
|
17
|
+
if honeybadger_config[:"exceptions.enabled"]
|
18
18
|
app.config.middleware.insert(0, Honeybadger::Rack::ErrorNotifier)
|
19
|
-
app.config.middleware.insert_before(Honeybadger::Rack::ErrorNotifier, Honeybadger::Rack::UserInformer) if honeybadger_config[:
|
20
|
-
app.config.middleware.insert_before(Honeybadger::Rack::ErrorNotifier, Honeybadger::Rack::UserFeedback) if honeybadger_config[:
|
19
|
+
app.config.middleware.insert_before(Honeybadger::Rack::ErrorNotifier, Honeybadger::Rack::UserInformer) if honeybadger_config[:"user_informer.enabled"]
|
20
|
+
app.config.middleware.insert_before(Honeybadger::Rack::ErrorNotifier, Honeybadger::Rack::UserFeedback) if honeybadger_config[:"feedback.enabled"]
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
24
|
config.before_initialize do
|
25
25
|
Honeybadger.init!({
|
26
|
-
:
|
27
|
-
:
|
28
|
-
|
29
|
-
:
|
30
|
-
:
|
26
|
+
root: ::Rails.root.to_s,
|
27
|
+
env: ::Rails.env,
|
28
|
+
"config.path": ::Rails.root.join("config", "honeybadger.yml"),
|
29
|
+
logger: Logging::FormattedLogger.new(::Rails.logger),
|
30
|
+
framework: :rails
|
31
31
|
})
|
32
32
|
end
|
33
33
|
|
@@ -36,7 +36,7 @@ module Honeybadger
|
|
36
36
|
end
|
37
37
|
|
38
38
|
console do
|
39
|
-
unless Honeybadger::Agent.instance.config[:
|
39
|
+
unless (Honeybadger::Agent.instance.config[:"insights.enabled"] = Honeybadger::Agent.instance.config[:"insights.console.enabled"])
|
40
40
|
Honeybadger::Agent.instance.config.logger.debug("Rails console detected, shutting down Honeybadger Insights workers.")
|
41
41
|
Honeybadger::Agent.instance.stop_insights
|
42
42
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/ruby"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
# @api private
|
@@ -6,7 +6,7 @@ module Honeybadger
|
|
6
6
|
module RakeHandler
|
7
7
|
def self.included(klass)
|
8
8
|
klass.class_eval do
|
9
|
-
include Rake087Methods unless defined?(Rake::VERSION) && Rake::VERSION >=
|
9
|
+
include Rake087Methods unless defined?(Rake::VERSION) && Rake::VERSION >= "0.9.0"
|
10
10
|
alias_method :display_error_message_without_honeybadger, :display_error_message
|
11
11
|
alias_method :display_error_message, :display_error_message_with_honeybadger
|
12
12
|
end
|
@@ -20,7 +20,7 @@ module Honeybadger
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def reconstruct_command_line
|
23
|
-
"rake #{ARGV.join(
|
23
|
+
"rake #{ARGV.join(" ")}"
|
24
24
|
end
|
25
25
|
|
26
26
|
# This module brings Rake 0.8.7 error handling to 0.9.0 standards
|
@@ -29,30 +29,28 @@ module Honeybadger
|
|
29
29
|
#
|
30
30
|
# Provide standard exception handling for the given block.
|
31
31
|
def standard_exception_handling
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
exit(false)
|
44
|
-
end
|
32
|
+
yield
|
33
|
+
rescue SystemExit
|
34
|
+
# Exit silently with current status
|
35
|
+
raise
|
36
|
+
rescue OptionParser::InvalidOption => ex
|
37
|
+
warn ex.message
|
38
|
+
exit(false)
|
39
|
+
rescue => ex
|
40
|
+
# Exit with error message
|
41
|
+
display_error_message(ex)
|
42
|
+
exit(false)
|
45
43
|
end
|
46
44
|
|
47
45
|
# Method extracted from Rake 0.8.7 source
|
48
46
|
def display_error_message(ex)
|
49
|
-
|
50
|
-
|
47
|
+
warn "#{name} aborted!"
|
48
|
+
warn ex.message
|
51
49
|
if options.trace
|
52
|
-
|
50
|
+
warn ex.backtrace.join("\n")
|
53
51
|
else
|
54
|
-
|
55
|
-
|
52
|
+
warn ex.backtrace.find { |str| str =~ /#{@rakefile}/ } || ""
|
53
|
+
warn "(See full trace by running task with --trace)"
|
56
54
|
end
|
57
55
|
end
|
58
56
|
end
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/ruby"
|
2
2
|
|
3
3
|
Honeybadger.init!({
|
4
|
-
:
|
5
|
-
:
|
6
|
-
|
4
|
+
framework: :ruby,
|
5
|
+
env: ENV["RUBY_ENV"] || ENV["RACK_ENV"],
|
6
|
+
"logging.path": "STDOUT"
|
7
7
|
})
|
8
8
|
|
9
9
|
Honeybadger.load_plugins!
|
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "sinatra/base"
|
2
|
+
require "honeybadger/ruby"
|
3
3
|
|
4
4
|
module Honeybadger
|
5
5
|
module Init
|
@@ -15,8 +15,8 @@ module Honeybadger
|
|
15
15
|
Honeybadger.install_at_exit_callback
|
16
16
|
build_without_honeybadger(*args, &block)
|
17
17
|
end
|
18
|
-
|
19
|
-
|
18
|
+
alias_method :build_without_honeybadger, :build
|
19
|
+
alias_method :build, :build_with_honeybadger
|
20
20
|
|
21
21
|
def configure_honeybadger
|
22
22
|
return unless defined?(honeybadger_api_key)
|
@@ -27,21 +27,20 @@ module Honeybadger
|
|
27
27
|
|
28
28
|
def install_honeybadger
|
29
29
|
config = Honeybadger.config
|
30
|
-
return unless config[:
|
31
|
-
if config[:
|
30
|
+
return unless config[:"sinatra.enabled"]
|
31
|
+
if config[:"exceptions.enabled"]
|
32
32
|
# These two must come before the ErrorNotifier, since an error/response
|
33
33
|
# passes through middleware from inner to outer (bottom to top)
|
34
|
-
install_honeybadger_middleware(Honeybadger::Rack::UserFeedback) if config[:
|
35
|
-
install_honeybadger_middleware(Honeybadger::Rack::UserInformer) if config[:
|
34
|
+
install_honeybadger_middleware(Honeybadger::Rack::UserFeedback) if config[:"feedback.enabled"]
|
35
|
+
install_honeybadger_middleware(Honeybadger::Rack::UserInformer) if config[:"user_informer.enabled"]
|
36
36
|
install_honeybadger_middleware(Honeybadger::Rack::ErrorNotifier)
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
40
|
def install_honeybadger_middleware(klass)
|
41
|
-
return if middleware.any? {|m| m[0] == klass }
|
41
|
+
return if middleware.any? { |m| m[0] == klass }
|
42
42
|
use(klass)
|
43
43
|
end
|
44
|
-
|
45
44
|
end
|
46
45
|
end
|
47
46
|
end
|
@@ -49,9 +48,9 @@ module Honeybadger
|
|
49
48
|
end
|
50
49
|
|
51
50
|
Honeybadger.init!({
|
52
|
-
env: ENV[
|
51
|
+
env: ENV["APP_ENV"] || ENV["RACK_ENV"],
|
53
52
|
framework: :sinatra,
|
54
|
-
|
53
|
+
"logging.path": "STDOUT"
|
55
54
|
})
|
56
55
|
|
57
56
|
Honeybadger.load_plugins!
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
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
|
-
|
51
|
+
value = if callable
|
52
|
+
monotonic_timer { callable.call }[0]
|
54
53
|
elsif block_given?
|
55
|
-
|
54
|
+
monotonic_timer { yield }[0]
|
56
55
|
else
|
57
|
-
|
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
|
-
|
72
|
+
value = if callable
|
73
|
+
monotonic_timer { callable.call }[0]
|
76
74
|
elsif block_given?
|
77
|
-
|
75
|
+
monotonic_timer { yield }[0]
|
78
76
|
else
|
79
|
-
|
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
|
-
|
93
|
+
value = if callable
|
94
|
+
callable.call
|
98
95
|
elsif block_given?
|
99
|
-
|
96
|
+
yield
|
100
97
|
else
|
101
|
-
|
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
|
-
|
110
|
+
value = if callable
|
111
|
+
callable.call
|
116
112
|
elsif block_given?
|
117
|
-
|
113
|
+
yield
|
118
114
|
else
|
119
|
-
|
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
|
-
|
127
|
+
value = if callable
|
128
|
+
callable.call
|
134
129
|
elsif block_given?
|
135
|
-
|
130
|
+
yield
|
136
131
|
else
|
137
|
-
|
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.
|
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.
|
151
|
+
args.find { |a| a.respond_to?(:call) }
|
157
152
|
end
|
158
153
|
end
|
159
154
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
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
|