honeybadger 5.29.0 → 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 +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 -223
- 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 -89
- 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 +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1d099839929e7500ff1c1119a4f769643b63a2dfb54afd1fe148e9566c65ab7
|
4
|
+
data.tar.gz: ed455a3f986d76d58bebf53d451079c3fd6858f55bb7634a6c3cf8b1792cdafc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8cf3de73c54226cf5ca6f8e55eaf3de2b3a632382c0286abf79e8cf6c123d3fef6d3f4ac3015cc0c3daaa27306e126c9d9d868bf9cad9cf85ccc57b4a69c0d1
|
7
|
+
data.tar.gz: 5632865e05554e2331647c42cda4da072bbcc47931ad1bd8197b5cea66c493ba1fe3c1d089ae1c29eeb045ae4979e2ab0d29cc7b0eada9396921a7cf216a79a8
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,35 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
3
|
|
4
|
+
## [6.0.0](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.29.1...v6.0.0) (2025-07-21)
|
5
|
+
|
6
|
+
|
7
|
+
### ⚠ BREAKING CHANGES
|
8
|
+
|
9
|
+
* remove second opts argument in Honeybadger.notify ([#499](https://github.com/honeybadger-io/honeybadger-ruby/issues/499))
|
10
|
+
* Minimum supported Ruby version is now 3.0.0
|
11
|
+
|
12
|
+
### Features
|
13
|
+
|
14
|
+
* enable Insights by default ([#707](https://github.com/honeybadger-io/honeybadger-ruby/issues/707)) ([ab0f35e](https://github.com/honeybadger-io/honeybadger-ruby/commit/ab0f35e648b00d40ac27b2375c85d6e0a37ad546))
|
15
|
+
|
16
|
+
|
17
|
+
### Miscellaneous Chores
|
18
|
+
|
19
|
+
* use standard ([#696](https://github.com/honeybadger-io/honeybadger-ruby/issues/696)) ([795408c](https://github.com/honeybadger-io/honeybadger-ruby/commit/795408c69be4710672f696a0d4c4d2b8ad666ec3))
|
20
|
+
|
21
|
+
|
22
|
+
### Code Refactoring
|
23
|
+
|
24
|
+
* remove second opts argument in Honeybadger.notify ([#499](https://github.com/honeybadger-io/honeybadger-ruby/issues/499)) ([4530fd5](https://github.com/honeybadger-io/honeybadger-ruby/commit/4530fd50d5b3f2f751cc9bdec7b0a1af13e3aa94))
|
25
|
+
|
26
|
+
## [5.29.1](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.29.0...v5.29.1) (2025-07-01)
|
27
|
+
|
28
|
+
|
29
|
+
### Bug Fixes
|
30
|
+
|
31
|
+
* Revert "feat: exclude insights from rake tasks config ([#697](https://github.com/honeybadger-io/honeybadger-ruby/issues/697))" ([381566c](https://github.com/honeybadger-io/honeybadger-ruby/commit/381566cf976e110ff5b55770038aac25f51ee4ea)), closes [#702](https://github.com/honeybadger-io/honeybadger-ruby/issues/702)
|
32
|
+
|
4
33
|
## [5.29.0](https://github.com/honeybadger-io/honeybadger-ruby/compare/v5.28.0...v5.29.0) (2025-06-27)
|
5
34
|
|
6
35
|
|
data/lib/honeybadger/agent.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require
|
14
|
-
require
|
15
|
-
require
|
16
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "zlib"
|
3
|
+
|
4
|
+
require "honeybadger/version"
|
5
|
+
require "honeybadger/config"
|
6
|
+
require "honeybadger/context_manager"
|
7
|
+
require "honeybadger/notice"
|
8
|
+
require "honeybadger/event"
|
9
|
+
require "honeybadger/plugin"
|
10
|
+
require "honeybadger/logging"
|
11
|
+
require "honeybadger/worker"
|
12
|
+
require "honeybadger/events_worker"
|
13
|
+
require "honeybadger/metrics_worker"
|
14
|
+
require "honeybadger/breadcrumbs"
|
15
|
+
require "honeybadger/registry"
|
16
|
+
require "honeybadger/registry_execution"
|
17
17
|
|
18
18
|
module Honeybadger
|
19
19
|
# The Honeybadger agent contains all the methods for interacting with the
|
@@ -63,7 +63,7 @@ module Honeybadger
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def initialize(opts = {})
|
66
|
-
if opts.
|
66
|
+
if opts.is_a?(Config)
|
67
67
|
@config = opts
|
68
68
|
opts = {}
|
69
69
|
end
|
@@ -125,14 +125,13 @@ module Honeybadger
|
|
125
125
|
#
|
126
126
|
# @return [String] UUID reference to the notice within Honeybadger.
|
127
127
|
# @return [false] when ignored.
|
128
|
-
def notify(exception_or_opts = nil, opts
|
129
|
-
if !config[:
|
130
|
-
debug {
|
128
|
+
def notify(exception_or_opts = nil, **opts)
|
129
|
+
if !config[:"exceptions.enabled"]
|
130
|
+
debug { "disabled feature=notices" }
|
131
131
|
return false
|
132
132
|
end
|
133
133
|
|
134
134
|
opts = opts.dup
|
135
|
-
opts.merge!(kwargs)
|
136
135
|
|
137
136
|
if exception_or_opts.is_a?(Exception)
|
138
137
|
already_reported_notice_id = exception_or_opts.instance_variable_get(:@__hb_notice_id)
|
@@ -146,11 +145,13 @@ module Honeybadger
|
|
146
145
|
|
147
146
|
validate_notify_opts!(opts)
|
148
147
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
148
|
+
if config[:"breadcrumbs.enabled"]
|
149
|
+
add_breadcrumb(
|
150
|
+
"Honeybadger Notice",
|
151
|
+
metadata: opts,
|
152
|
+
category: "notice"
|
153
|
+
)
|
154
|
+
end
|
154
155
|
|
155
156
|
opts[:rack_env] ||= context_manager.get_rack_env
|
156
157
|
opts[:global_context] ||= context_manager.get_context
|
@@ -164,22 +165,22 @@ module Honeybadger
|
|
164
165
|
with_error_handling { hook.call(notice) }
|
165
166
|
end
|
166
167
|
|
167
|
-
unless notice.api_key
|
168
|
-
error { sprintf(
|
168
|
+
unless NOT_BLANK.match?(notice.api_key)
|
169
|
+
error { sprintf("Unable to send error report: API key is missing. id=%s", notice.id) }
|
169
170
|
return false
|
170
171
|
end
|
171
172
|
|
172
173
|
if !opts[:force] && notice.ignore?
|
173
|
-
debug { sprintf(
|
174
|
+
debug { sprintf("ignore notice feature=notices id=%s", notice.id) }
|
174
175
|
return false
|
175
176
|
end
|
176
177
|
|
177
178
|
if notice.halted?
|
178
|
-
debug {
|
179
|
+
debug { "halted notice feature=notices" }
|
179
180
|
return false
|
180
181
|
end
|
181
182
|
|
182
|
-
info { sprintf(
|
183
|
+
info { sprintf("Reporting error id=%s", notice.id) }
|
183
184
|
|
184
185
|
if opts[:sync] || config[:sync]
|
185
186
|
send_now(notice)
|
@@ -205,7 +206,7 @@ module Honeybadger
|
|
205
206
|
# otherwise.
|
206
207
|
def check_in(id)
|
207
208
|
# this is to allow check ins even if a url is passed
|
208
|
-
check_in_id = id.to_s.strip.gsub(/\/$/,
|
209
|
+
check_in_id = id.to_s.strip.gsub(/\/$/, "").split("/").last
|
209
210
|
response = backend.check_in(check_in_id)
|
210
211
|
response.success?
|
211
212
|
end
|
@@ -412,7 +413,7 @@ module Honeybadger
|
|
412
413
|
|
413
414
|
extra_payload = {}.tap do |p|
|
414
415
|
p[:request_id] = context_manager.get_request_id if context_manager.get_request_id
|
415
|
-
p[:hostname] = config[:hostname].to_s if config[:
|
416
|
+
p[:hostname] = config[:hostname].to_s if config[:"events.attach_hostname"]
|
416
417
|
p.update(context_manager.get_event_context || {})
|
417
418
|
end
|
418
419
|
|
@@ -632,7 +633,7 @@ module Honeybadger
|
|
632
633
|
# Always send metrics events
|
633
634
|
return true if event[:event_type] == "metric.hb"
|
634
635
|
|
635
|
-
sample_rate = config[:
|
636
|
+
sample_rate = config[:"events.sample_rate"]
|
636
637
|
sample_rate = event.dig(:_hb, :sample_rate) if event.dig(:_hb, :sample_rate).is_a?(Numeric)
|
637
638
|
|
638
639
|
return true if sample_rate >= 100
|
@@ -647,7 +648,7 @@ module Honeybadger
|
|
647
648
|
def validate_notify_opts!(opts)
|
648
649
|
return if opts.has_key?(:exception)
|
649
650
|
return if opts.has_key?(:error_message)
|
650
|
-
msg = sprintf(
|
651
|
+
msg = sprintf("`Honeybadger.notify` was called with invalid arguments. You must pass either an Exception or options Hash containing the `:error_message` key. location=%s", caller[caller.size - 1])
|
651
652
|
raise ArgumentError.new(msg) if config.dev?
|
652
653
|
warn(msg)
|
653
654
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "forwardable"
|
2
|
+
require "net/http"
|
3
|
+
require "json"
|
4
4
|
|
5
|
-
require
|
5
|
+
require "honeybadger/logging"
|
6
6
|
|
7
7
|
module Honeybadger
|
8
8
|
module Backend
|
@@ -34,7 +34,7 @@ module Honeybadger
|
|
34
34
|
# @param [String] message The String message returned by the server (or
|
35
35
|
# set by the backend in the case of an :error code).
|
36
36
|
def initialize(*args)
|
37
|
-
if (response = args.first).
|
37
|
+
if (response = args.first).is_a?(Net::HTTPResponse)
|
38
38
|
@code, @body, @message = response.code.to_i, response.body.to_s, response.message
|
39
39
|
else
|
40
40
|
@code, @body, @message = args
|
@@ -51,18 +51,18 @@ module Honeybadger
|
|
51
51
|
def error_message
|
52
52
|
return message if code == :error
|
53
53
|
return FRIENDLY_ERRORS[code] if FRIENDLY_ERRORS[code]
|
54
|
-
return error if error
|
54
|
+
return error if NOT_BLANK.match?(error)
|
55
55
|
msg = "The server responded with #{code}"
|
56
|
-
msg << ": #{message}" if message
|
56
|
+
msg << ": #{message}" if NOT_BLANK.match?(message)
|
57
57
|
msg
|
58
58
|
end
|
59
59
|
|
60
60
|
private
|
61
61
|
|
62
62
|
def parse_error(body)
|
63
|
-
return unless body
|
63
|
+
return unless NOT_BLANK.match?(body)
|
64
64
|
obj = JSON.parse(body)
|
65
|
-
|
65
|
+
obj["error"] if obj.is_a?(Hash)
|
66
66
|
rescue JSON::ParserError
|
67
67
|
nil
|
68
68
|
end
|
@@ -88,7 +88,7 @@ module Honeybadger
|
|
88
88
|
#
|
89
89
|
# @raise NotImplementedError
|
90
90
|
def notify(feature, payload)
|
91
|
-
raise NotImplementedError,
|
91
|
+
raise NotImplementedError, "must define #notify on subclass."
|
92
92
|
end
|
93
93
|
|
94
94
|
# Does a check in using the input id.
|
@@ -97,7 +97,7 @@ module Honeybadger
|
|
97
97
|
#
|
98
98
|
# @raise NotImplementedError
|
99
99
|
def check_in(id)
|
100
|
-
raise NotImplementedError,
|
100
|
+
raise NotImplementedError, "must define #check_in on subclass."
|
101
101
|
end
|
102
102
|
|
103
103
|
# Track a deployment
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/backend/null"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Backend
|
@@ -8,19 +8,19 @@ module Honeybadger
|
|
8
8
|
class Debug < Null
|
9
9
|
def notify(feature, payload)
|
10
10
|
logger.unknown("notifying debug backend of feature=#{feature}\n\t#{payload.to_json}")
|
11
|
-
return Response.new(ENV[
|
11
|
+
return Response.new(ENV["DEBUG_BACKEND_STATUS"].to_i, nil) if ENV["DEBUG_BACKEND_STATUS"]
|
12
12
|
super
|
13
13
|
end
|
14
14
|
|
15
15
|
def check_in(id)
|
16
16
|
logger.unknown("checking in debug backend with id=#{id}")
|
17
|
-
return Response.new(ENV[
|
17
|
+
return Response.new(ENV["DEBUG_BACKEND_STATUS"].to_i, nil) if ENV["DEBUG_BACKEND_STATUS"]
|
18
18
|
super
|
19
19
|
end
|
20
20
|
|
21
21
|
def event(payload)
|
22
22
|
logger.unknown("sending event to debug backend with event=#{payload.to_json}")
|
23
|
-
return Response.new(ENV[
|
23
|
+
return Response.new(ENV["DEBUG_BACKEND_STATUS"].to_i, nil) if ENV["DEBUG_BACKEND_STATUS"]
|
24
24
|
super
|
25
25
|
end
|
26
26
|
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/backend/base"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Backend
|
5
5
|
class Null < Base
|
6
6
|
class StubbedResponse < Response
|
7
7
|
def initialize
|
8
|
-
super(:stubbed,
|
8
|
+
super(:stubbed, "{}".freeze)
|
9
9
|
end
|
10
10
|
|
11
11
|
def success?
|
@@ -1,20 +1,20 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
1
|
+
require "net/http"
|
2
|
+
require "json"
|
3
|
+
require "zlib"
|
4
|
+
require "openssl"
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
6
|
+
require "honeybadger/backend/base"
|
7
|
+
require "honeybadger/util/http"
|
8
8
|
|
9
9
|
module Honeybadger
|
10
10
|
module Backend
|
11
11
|
class Server < Base
|
12
12
|
ENDPOINTS = {
|
13
|
-
notices:
|
14
|
-
deploys:
|
13
|
+
notices: "/v1/notices".freeze,
|
14
|
+
deploys: "/v1/deploys".freeze
|
15
15
|
}.freeze
|
16
|
-
CHECK_IN_ENDPOINT =
|
17
|
-
EVENTS_ENDPOINT =
|
16
|
+
CHECK_IN_ENDPOINT = "/v1/check_in".freeze
|
17
|
+
EVENTS_ENDPOINT = "/v1/events".freeze
|
18
18
|
|
19
19
|
HTTP_ERRORS = Util::HTTP::ERRORS
|
20
20
|
|
@@ -64,7 +64,7 @@ module Honeybadger
|
|
64
64
|
def payload_headers(payload)
|
65
65
|
if payload.respond_to?(:api_key) && payload.api_key
|
66
66
|
{
|
67
|
-
|
67
|
+
"X-API-Key" => payload.api_key
|
68
68
|
}
|
69
69
|
end
|
70
70
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/backend/null"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Backend
|
@@ -10,7 +10,7 @@ module Honeybadger
|
|
10
10
|
#
|
11
11
|
# @return [Hash] Notifications hash.
|
12
12
|
def self.notifications
|
13
|
-
@notifications ||= Hash.new {|h,k| h[k] = [] }
|
13
|
+
@notifications ||= Hash.new { |h, k| h[k] = [] }
|
14
14
|
end
|
15
15
|
|
16
16
|
# The event list.
|
data/lib/honeybadger/backend.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "forwardable"
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
3
|
+
require "honeybadger/backend/base"
|
4
|
+
require "honeybadger/backend/server"
|
5
|
+
require "honeybadger/backend/test"
|
6
|
+
require "honeybadger/backend/null"
|
7
|
+
require "honeybadger/backend/debug"
|
8
8
|
|
9
9
|
module Honeybadger
|
10
10
|
# @api private
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "json"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
# @api private
|
@@ -8,7 +8,7 @@ module Honeybadger
|
|
8
8
|
class Line
|
9
9
|
# Backtrace line regexp (optionally allowing leading X: for windows support).
|
10
10
|
# Capture quoted strings either with leading backtick (pre Ruby 3.4) or single quote.
|
11
|
-
INPUT_FORMAT = %r{^((?:[a-zA-Z]:)?[^:]+):(\d+)(?::in (?:`|')([^']+)')?$}
|
11
|
+
INPUT_FORMAT = %r{^((?:[a-zA-Z]:)?[^:]+):(\d+)(?::in (?:`|')([^']+)')?$}
|
12
12
|
|
13
13
|
# The file portion of the line (such as app/models/user.rb).
|
14
14
|
attr_reader :file
|
@@ -45,21 +45,19 @@ module Honeybadger
|
|
45
45
|
file, number, method = match[1], match[2], match[3]
|
46
46
|
filtered_args = [fmatch[1], fmatch[2], fmatch[3]]
|
47
47
|
new(file, number, method, *filtered_args, opts.fetch(:source_radius, 2))
|
48
|
-
else
|
49
|
-
nil
|
50
48
|
end
|
51
49
|
end
|
52
50
|
|
53
51
|
def initialize(file, number, method, filtered_file = file,
|
54
|
-
|
55
|
-
|
56
|
-
self.filtered_file
|
52
|
+
filtered_number = number, filtered_method = method,
|
53
|
+
source_radius = 2)
|
54
|
+
self.filtered_file = filtered_file
|
57
55
|
self.filtered_number = filtered_number
|
58
56
|
self.filtered_method = filtered_method
|
59
|
-
self.file
|
60
|
-
self.number
|
61
|
-
self.method
|
62
|
-
self.source_radius
|
57
|
+
self.file = file
|
58
|
+
self.number = number
|
59
|
+
self.method = method
|
60
|
+
self.source_radius = source_radius
|
63
61
|
end
|
64
62
|
|
65
63
|
# Reconstructs the line in a readable fashion.
|
@@ -72,7 +70,7 @@ module Honeybadger
|
|
72
70
|
end
|
73
71
|
|
74
72
|
def inspect
|
75
|
-
"<Line:#{
|
73
|
+
"<Line:#{self}>"
|
76
74
|
end
|
77
75
|
|
78
76
|
# Determines if this line is part of the application trace or not.
|
@@ -102,8 +100,11 @@ module Honeybadger
|
|
102
100
|
|
103
101
|
l = 0
|
104
102
|
File.open(file) do |f|
|
105
|
-
start.times {
|
106
|
-
|
103
|
+
start.times {
|
104
|
+
f.gets
|
105
|
+
l += 1
|
106
|
+
}
|
107
|
+
return duration.times.map { (line = f.gets) ? [(l += 1), line] : nil }.compact.to_h
|
107
108
|
end
|
108
109
|
else
|
109
110
|
{}
|
@@ -121,7 +122,7 @@ module Honeybadger
|
|
121
122
|
Line.parse(unparsed_line.to_s, opts)
|
122
123
|
end.compact
|
123
124
|
|
124
|
-
|
125
|
+
new(lines)
|
125
126
|
end
|
126
127
|
|
127
128
|
def initialize(lines)
|
@@ -133,9 +134,9 @@ module Honeybadger
|
|
133
134
|
#
|
134
135
|
# Returns array containing backtrace lines.
|
135
136
|
def to_ary
|
136
|
-
lines.take(1000).map { |l| {
|
137
|
+
lines.take(1000).map { |l| {number: l.filtered_number, file: l.filtered_file, method: l.filtered_method, source: l.source} }
|
137
138
|
end
|
138
|
-
|
139
|
+
alias_method :to_a, :to_ary
|
139
140
|
|
140
141
|
# JSON support.
|
141
142
|
#
|
@@ -171,11 +172,15 @@ module Honeybadger
|
|
171
172
|
|
172
173
|
attr_writer :lines, :application_lines
|
173
174
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
backtrace
|
175
|
+
class << self
|
176
|
+
private
|
177
|
+
|
178
|
+
def split_multiline_backtrace(backtrace)
|
179
|
+
if backtrace.size == 1
|
180
|
+
backtrace.first.to_s.split(/\n\s*/)
|
181
|
+
else
|
182
|
+
backtrace
|
183
|
+
end
|
179
184
|
end
|
180
185
|
end
|
181
186
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/util/sql"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Breadcrumbs
|
@@ -19,7 +19,7 @@ module Honeybadger
|
|
19
19
|
transform: lambda do |data|
|
20
20
|
if data[:sql]
|
21
21
|
connection = data.delete(:connection)
|
22
|
-
adapter =
|
22
|
+
adapter = connection&.adapter_name&.downcase || active_record_connection_db_config[:adapter]
|
23
23
|
data[:sql] = Util::SQL.obfuscate(data[:sql], adapter)
|
24
24
|
end
|
25
25
|
data
|
@@ -49,7 +49,7 @@ module Honeybadger
|
|
49
49
|
"perform_start.active_job" => {
|
50
50
|
message: "Active Job Perform Start",
|
51
51
|
select_keys: [],
|
52
|
-
category: "job"
|
52
|
+
category: "job"
|
53
53
|
},
|
54
54
|
|
55
55
|
# ActiveSupport Actions
|
@@ -67,32 +67,32 @@ module Honeybadger
|
|
67
67
|
#
|
68
68
|
"halted_callback.action_controller" => {
|
69
69
|
message: "Action Controller Callback Halted",
|
70
|
-
category: "request"
|
70
|
+
category: "request"
|
71
71
|
},
|
72
72
|
"process_action.action_controller" => {
|
73
73
|
message: "Action Controller Action Process",
|
74
74
|
select_keys: [:controller, :action, :format, :method, :path, :status, :view_runtime, :db_runtime],
|
75
|
-
category: "request"
|
75
|
+
category: "request"
|
76
76
|
},
|
77
77
|
"start_processing.action_controller" => {
|
78
78
|
message: "Action Controller Start Process",
|
79
79
|
select_keys: [:controller, :action, :format, :method, :path],
|
80
|
-
category: "request"
|
80
|
+
category: "request"
|
81
81
|
},
|
82
82
|
"redirect_to.action_controller" => {
|
83
83
|
message: "Action Controller Redirect",
|
84
|
-
category: "request"
|
84
|
+
category: "request"
|
85
85
|
},
|
86
86
|
|
87
87
|
# View Actions
|
88
88
|
#
|
89
89
|
"render_template.action_view" => {
|
90
90
|
message: "Action View Template Render",
|
91
|
-
category: "render"
|
91
|
+
category: "render"
|
92
92
|
},
|
93
93
|
"render_partial.action_view" => {
|
94
94
|
message: "Action View Partial Render",
|
95
|
-
category: "render"
|
95
|
+
category: "render"
|
96
96
|
},
|
97
97
|
|
98
98
|
# Mailer actions
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "time"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Breadcrumbs
|
@@ -32,7 +32,6 @@ module Honeybadger
|
|
32
32
|
to_h <=> other.to_h
|
33
33
|
end
|
34
34
|
|
35
|
-
|
36
35
|
# Is the Breadcrumb active or not. Inactive Breadcrumbs not be included
|
37
36
|
# with any outgoing payloads.
|
38
37
|
#
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "forwardable"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Breadcrumbs
|
@@ -35,7 +35,7 @@ module Honeybadger
|
|
35
35
|
#
|
36
36
|
# @return [self] Filtered breadcrumbs
|
37
37
|
def add!(breadcrumb)
|
38
|
-
return unless @config[:
|
38
|
+
return unless @config[:"breadcrumbs.enabled"]
|
39
39
|
@buffer.add!(breadcrumb)
|
40
40
|
|
41
41
|
self
|
@@ -48,7 +48,7 @@ module Honeybadger
|
|
48
48
|
# block returns a falsy value
|
49
49
|
#
|
50
50
|
def drop_previous_breadcrumb_if
|
51
|
-
@buffer.drop if
|
51
|
+
@buffer.drop if previous && block_given? && yield(previous)
|
52
52
|
end
|
53
53
|
|
54
54
|
# All active breadcrumbs you want to remove a breadcrumb from the trail,
|
@@ -61,7 +61,7 @@ module Honeybadger
|
|
61
61
|
|
62
62
|
def to_h
|
63
63
|
{
|
64
|
-
enabled: @config[:
|
64
|
+
enabled: @config[:"breadcrumbs.enabled"],
|
65
65
|
trail: trail.map(&:to_h)
|
66
66
|
}
|
67
67
|
end
|
@@ -7,10 +7,10 @@ module Honeybadger
|
|
7
7
|
org_severity, org_message, org_progname = severity, message, progname
|
8
8
|
if defined?(Dry::Logger::Entry) && progname.is_a?(Dry::Logger::Entry) # Hanami uses dry-logger
|
9
9
|
message, progname = progname.message || progname.exception, progname.progname
|
10
|
-
|
11
|
-
message, progname = [progname, nil]
|
10
|
+
elsif message.nil?
|
11
|
+
message, progname = [progname, nil]
|
12
12
|
end
|
13
|
-
message
|
13
|
+
message &&= message.to_s.strip
|
14
14
|
unless should_ignore_log?(message, progname)
|
15
15
|
Honeybadger.add_breadcrumb(message, category: :log, metadata: {
|
16
16
|
severity: format_severity(severity),
|
@@ -25,9 +25,9 @@ module Honeybadger
|
|
25
25
|
|
26
26
|
def should_ignore_log?(message, progname)
|
27
27
|
message.nil? ||
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
message == "" ||
|
29
|
+
Thread.current[:__hb_within_log_subscriber] ||
|
30
|
+
progname == "honeybadger"
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -39,17 +39,14 @@ module Honeybadger
|
|
39
39
|
# class that provides LogSubscriber events, we want to filter out those
|
40
40
|
# logs as they just become noise.
|
41
41
|
module LogSubscriberInjector
|
42
|
-
%w
|
42
|
+
%w[info debug warn error fatal unknown].each do |level|
|
43
43
|
define_method(level) do |*args, &block|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
Thread.current[:__hb_within_log_subscriber] = false
|
49
|
-
end
|
44
|
+
Thread.current[:__hb_within_log_subscriber] = true
|
45
|
+
super(*args, &block)
|
46
|
+
ensure
|
47
|
+
Thread.current[:__hb_within_log_subscriber] = false
|
50
48
|
end
|
51
49
|
end
|
52
50
|
end
|
53
51
|
end
|
54
52
|
end
|
55
|
-
|
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "honeybadger/breadcrumbs/ring_buffer"
|
2
|
+
require "honeybadger/breadcrumbs/breadcrumb"
|
3
|
+
require "honeybadger/breadcrumbs/collector"
|
4
4
|
|
5
5
|
module Honeybadger
|
6
6
|
module Breadcrumbs
|