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,19 +1,19 @@
|
|
1
|
-
require
|
1
|
+
require "set"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
class Config
|
5
5
|
module Env
|
6
|
-
CONFIG_KEY = /\AHONEYBADGER_(.+)\Z
|
7
|
-
CONFIG_MAPPING =
|
6
|
+
CONFIG_KEY = /\AHONEYBADGER_(.+)\Z/
|
7
|
+
CONFIG_MAPPING = DEFAULTS.keys.map { |k| [k.to_s.upcase.gsub(KEY_REPLACEMENT, "_"), k] }.to_h.freeze
|
8
8
|
ARRAY_VALUES = Regexp.new('\s*,\s*').freeze
|
9
9
|
IGNORED_TYPES = Set[Hash]
|
10
10
|
|
11
11
|
def self.new(env = ENV)
|
12
12
|
hash = {}
|
13
13
|
|
14
|
-
env.each_pair do |k,v|
|
14
|
+
env.each_pair do |k, v|
|
15
15
|
next unless k.match(CONFIG_KEY)
|
16
|
-
next unless config_key = CONFIG_MAPPING[$1]
|
16
|
+
next unless (config_key = CONFIG_MAPPING[$1])
|
17
17
|
type = OPTIONS[config_key][:type]
|
18
18
|
next if IGNORED_TYPES.include?(type)
|
19
19
|
hash[config_key] = cast_value(v, type)
|
@@ -12,7 +12,7 @@ module Honeybadger
|
|
12
12
|
def to_hash
|
13
13
|
hash.to_hash
|
14
14
|
end
|
15
|
-
|
15
|
+
alias_method :to_h, :to_hash
|
16
16
|
|
17
17
|
private
|
18
18
|
|
@@ -41,25 +41,25 @@ module Honeybadger
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def mash?(method)
|
44
|
-
key = [prefix, method.to_s +
|
45
|
-
KEYS.any? {|k| k.start_with?(key) }
|
44
|
+
key = [prefix, method.to_s + "."].compact.join(".")
|
45
|
+
KEYS.any? { |k| k.start_with?(key) }
|
46
46
|
end
|
47
47
|
|
48
48
|
def setter?(method_name)
|
49
|
-
return false unless method_name.to_s
|
49
|
+
return false unless method_name.to_s.end_with?("=")
|
50
50
|
key = key(method_name)
|
51
|
-
KEYS.any? {|k| k == key }
|
51
|
+
KEYS.any? { |k| k == key }
|
52
52
|
end
|
53
53
|
|
54
54
|
def getter?(method_name)
|
55
55
|
key = key(method_name)
|
56
|
-
KEYS.any? {|k| k == key }
|
56
|
+
KEYS.any? { |k| k == key }
|
57
57
|
end
|
58
58
|
|
59
59
|
def key(method_name)
|
60
|
-
parts = [prefix, method_name.to_s.chomp(
|
60
|
+
parts = [prefix, method_name.to_s.chomp("=")]
|
61
61
|
parts.compact!
|
62
|
-
parts.join(
|
62
|
+
parts.join(".")
|
63
63
|
end
|
64
64
|
|
65
65
|
def get(key)
|
@@ -89,9 +89,9 @@ module Honeybadger
|
|
89
89
|
def before_notify(action = nil, &block)
|
90
90
|
hooks = Array(get(:before_notify)).dup
|
91
91
|
|
92
|
-
if action && validate_before_action(action,
|
92
|
+
if action && validate_before_action(action, "notify")
|
93
93
|
hooks << action
|
94
|
-
elsif block_given? && validate_before_action(block,
|
94
|
+
elsif block_given? && validate_before_action(block, "notify")
|
95
95
|
hooks << block
|
96
96
|
end
|
97
97
|
|
@@ -101,9 +101,9 @@ module Honeybadger
|
|
101
101
|
def before_event(action = nil, &block)
|
102
102
|
hooks = Array(get(:before_event)).dup
|
103
103
|
|
104
|
-
if action && validate_before_action(action,
|
104
|
+
if action && validate_before_action(action, "event")
|
105
105
|
hooks << action
|
106
|
-
elsif block_given? && validate_before_action(block,
|
106
|
+
elsif block_given? && validate_before_action(block, "event")
|
107
107
|
hooks << block
|
108
108
|
end
|
109
109
|
|
@@ -112,7 +112,7 @@ module Honeybadger
|
|
112
112
|
|
113
113
|
def backtrace_filter(&block)
|
114
114
|
if block_given?
|
115
|
-
logger.warn(
|
115
|
+
logger.warn("DEPRECATED: backtrace_filter is deprecated. Please use before_notify instead. See https://docs.honeybadger.io/ruby/support/v4-upgrade#backtrace_filter")
|
116
116
|
hash[:backtrace_filter] = block if block_given?
|
117
117
|
end
|
118
118
|
|
@@ -121,7 +121,7 @@ module Honeybadger
|
|
121
121
|
|
122
122
|
def exception_filter(&block)
|
123
123
|
if block_given?
|
124
|
-
logger.warn(
|
124
|
+
logger.warn("DEPRECATED: exception_filter is deprecated. Please use before_notify instead. See https://docs.honeybadger.io/ruby/support/v4-upgrade#exception_filter")
|
125
125
|
hash[:exception_filter] = block
|
126
126
|
end
|
127
127
|
|
@@ -130,7 +130,7 @@ module Honeybadger
|
|
130
130
|
|
131
131
|
def exception_fingerprint(&block)
|
132
132
|
if block_given?
|
133
|
-
logger.warn(
|
133
|
+
logger.warn("DEPRECATED: exception_fingerprint is deprecated. Please use before_notify instead. See https://docs.honeybadger.io/ruby/support/v4-upgrade#exception_fingerprint")
|
134
134
|
hash[:exception_fingerprint] = block
|
135
135
|
end
|
136
136
|
|
@@ -143,15 +143,15 @@ module Honeybadger
|
|
143
143
|
if !action.respond_to?(:call)
|
144
144
|
logger.warn(
|
145
145
|
"You attempted to add a before #{type} hook that does not respond " \
|
146
|
-
|
147
|
-
|
146
|
+
"to #call. We are discarding this hook so your intended behavior " \
|
147
|
+
"will not occur."
|
148
148
|
)
|
149
149
|
false
|
150
150
|
elsif action.arity != 1
|
151
151
|
logger.warn(
|
152
152
|
"You attempted to add a before #{type} hook that has an arity " \
|
153
|
-
|
154
|
-
|
153
|
+
"other than one. We are discarding this hook so your intended " \
|
154
|
+
"behavior will not occur."
|
155
155
|
)
|
156
156
|
false
|
157
157
|
else
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
1
|
+
require "pathname"
|
2
|
+
require "yaml"
|
3
|
+
require "erb"
|
4
4
|
|
5
5
|
module Honeybadger
|
6
6
|
class Config
|
7
7
|
module Yaml
|
8
|
-
DISALLOWED_KEYS = [:
|
8
|
+
DISALLOWED_KEYS = [:"config.path"].freeze
|
9
9
|
|
10
|
-
def self.new(path, env =
|
11
|
-
path = path.
|
10
|
+
def self.new(path, env = "production")
|
11
|
+
path = path.is_a?(Pathname) ? path : Pathname.new(path)
|
12
12
|
|
13
13
|
if !path.exist?
|
14
14
|
raise ConfigError, "The configuration file #{path} was not found."
|
@@ -19,7 +19,7 @@ module Honeybadger
|
|
19
19
|
end
|
20
20
|
|
21
21
|
yaml = load_yaml(path)
|
22
|
-
yaml.merge!(yaml[env]) if yaml[env].
|
22
|
+
yaml.merge!(yaml[env]) if yaml[env].is_a?(Hash)
|
23
23
|
|
24
24
|
dotify_keys(yaml)
|
25
25
|
end
|
@@ -36,8 +36,8 @@ module Honeybadger
|
|
36
36
|
|
37
37
|
if e.backtrace
|
38
38
|
backtrace = e.backtrace.map do |line|
|
39
|
-
if line.start_with?(
|
40
|
-
line.gsub(
|
39
|
+
if line.start_with?("(erb)".freeze)
|
40
|
+
line.gsub("(erb)".freeze, path.to_s)
|
41
41
|
else
|
42
42
|
line
|
43
43
|
end
|
@@ -60,9 +60,9 @@ module Honeybadger
|
|
60
60
|
|
61
61
|
def self.dotify_keys(hash, key_prefix = nil)
|
62
62
|
{}.tap do |new_hash|
|
63
|
-
hash.each_pair do |k,v|
|
64
|
-
k = [key_prefix, k].compact.join(
|
65
|
-
if v.
|
63
|
+
hash.each_pair do |k, v|
|
64
|
+
k = [key_prefix, k].compact.join(".")
|
65
|
+
if v.is_a?(Hash)
|
66
66
|
new_hash.update(dotify_keys(v, k))
|
67
67
|
else
|
68
68
|
next if DISALLOWED_KEYS.include?(k.to_sym)
|
data/lib/honeybadger/config.rb
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
13
|
-
require 'honeybadger/logging'
|
1
|
+
require "pathname"
|
2
|
+
require "delegate"
|
3
|
+
require "logger"
|
4
|
+
require "fileutils"
|
5
|
+
require "openssl"
|
6
|
+
|
7
|
+
require "honeybadger/version"
|
8
|
+
require "honeybadger/logging"
|
9
|
+
require "honeybadger/backend"
|
10
|
+
require "honeybadger/config/defaults"
|
11
|
+
require "honeybadger/util/http"
|
12
|
+
require "honeybadger/util/revision"
|
14
13
|
|
15
14
|
module Honeybadger
|
16
15
|
# @api private
|
@@ -25,9 +24,9 @@ module Honeybadger
|
|
25
24
|
|
26
25
|
# Config subclasses have circular dependencies, so they must be loaded
|
27
26
|
# after constants are defined.
|
28
|
-
autoload :Env,
|
29
|
-
autoload :Yaml,
|
30
|
-
autoload :Ruby,
|
27
|
+
autoload :Env, "honeybadger/config/env"
|
28
|
+
autoload :Yaml, "honeybadger/config/yaml"
|
29
|
+
autoload :Ruby, "honeybadger/config/ruby"
|
31
30
|
|
32
31
|
KEY_REPLACEMENT = Regexp.new('[^a-z\d_]', Regexp::IGNORECASE).freeze
|
33
32
|
|
@@ -55,8 +54,8 @@ module Honeybadger
|
|
55
54
|
init_logging!
|
56
55
|
init_backend!
|
57
56
|
|
58
|
-
logger.debug(sprintf(
|
59
|
-
logger.warn(
|
57
|
+
logger.debug(sprintf("Initializing Honeybadger Error Tracker for Ruby. Ship it! version=%s framework=%s", Honeybadger::VERSION, detected_framework))
|
58
|
+
logger.warn("Development mode is enabled. Data will not be reported until you deploy your app.") if warn_development?
|
60
59
|
|
61
60
|
self
|
62
61
|
end
|
@@ -65,7 +64,7 @@ module Honeybadger
|
|
65
64
|
return self if @loaded
|
66
65
|
self.framework = framework.freeze
|
67
66
|
self.env = Env.new(env).freeze
|
68
|
-
load_config_from_disk {|yaml| self.yaml = yaml.freeze }
|
67
|
+
load_config_from_disk { |yaml| self.yaml = yaml.freeze }
|
69
68
|
detect_revision!
|
70
69
|
@loaded = true
|
71
70
|
self
|
@@ -81,7 +80,7 @@ module Honeybadger
|
|
81
80
|
|
82
81
|
def backtrace_filter(&block)
|
83
82
|
if block_given?
|
84
|
-
warn(
|
83
|
+
warn("DEPRECATED: backtrace_filter is deprecated. Please use before_notify instead. See https://docs.honeybadger.io/ruby/support/v4-upgrade#backtrace_filter")
|
85
84
|
self[:backtrace_filter] = block
|
86
85
|
end
|
87
86
|
|
@@ -98,7 +97,7 @@ module Honeybadger
|
|
98
97
|
|
99
98
|
def exception_filter(&block)
|
100
99
|
if block_given?
|
101
|
-
warn(
|
100
|
+
warn("DEPRECATED: exception_filter is deprecated. Please use before_notify instead. See https://docs.honeybadger.io/ruby/support/v4-upgrade#exception_filter")
|
102
101
|
self[:exception_filter] = block
|
103
102
|
end
|
104
103
|
|
@@ -107,7 +106,7 @@ module Honeybadger
|
|
107
106
|
|
108
107
|
def exception_fingerprint(&block)
|
109
108
|
if block_given?
|
110
|
-
warn(
|
109
|
+
warn("DEPRECATED: exception_fingerprint is deprecated. Please use before_notify instead. See https://docs.honeybadger.io/ruby/support/v4-upgrade#exception_fingerprint")
|
111
110
|
self[:exception_fingerprint] = block
|
112
111
|
end
|
113
112
|
|
@@ -124,28 +123,27 @@ module Honeybadger
|
|
124
123
|
|
125
124
|
DEFAULTS[key]
|
126
125
|
end
|
127
|
-
|
126
|
+
alias_method :[], :get
|
128
127
|
|
129
128
|
def set(key, value)
|
130
129
|
self.ruby = ruby.merge(key => value).freeze
|
131
130
|
@logger = @backend = nil
|
132
131
|
end
|
133
|
-
|
132
|
+
alias_method :[]=, :set
|
134
133
|
|
135
134
|
def to_hash(defaults = false)
|
136
|
-
hash = [:@ruby, :@env, :@yaml, :@framework].reverse.reduce({}) do |a,e|
|
135
|
+
hash = [:@ruby, :@env, :@yaml, :@framework].reverse.reduce({}) do |a, e|
|
137
136
|
a.merge!(instance_variable_get(e))
|
138
137
|
end
|
139
138
|
|
140
139
|
hash = DEFAULTS.merge(hash) if defaults
|
141
140
|
|
142
|
-
undotify_keys(hash.select {|k,v| DEFAULTS.has_key?(k) })
|
141
|
+
undotify_keys(hash.select { |k, v| DEFAULTS.has_key?(k) })
|
143
142
|
end
|
144
|
-
|
143
|
+
alias_method :to_h, :to_hash
|
145
144
|
|
146
145
|
# Internal Helpers
|
147
146
|
|
148
|
-
|
149
147
|
def logger
|
150
148
|
init_logging! unless @logger
|
151
149
|
@logger
|
@@ -166,7 +164,7 @@ module Honeybadger
|
|
166
164
|
end
|
167
165
|
|
168
166
|
def warn_development?
|
169
|
-
dev? && backend.
|
167
|
+
dev? && backend.is_a?(Backend::Null)
|
170
168
|
end
|
171
169
|
|
172
170
|
def public?
|
@@ -180,30 +178,30 @@ module Honeybadger
|
|
180
178
|
end
|
181
179
|
|
182
180
|
def log_debug?
|
183
|
-
return debug? if self[:
|
184
|
-
!!self[:
|
181
|
+
return debug? if self[:"logging.debug"].nil?
|
182
|
+
!!self[:"logging.debug"]
|
185
183
|
end
|
186
184
|
|
187
185
|
def ignored_classes
|
188
|
-
ignore_only = get(:
|
186
|
+
ignore_only = get(:"exceptions.ignore_only")
|
189
187
|
return ignore_only if ignore_only
|
190
|
-
return DEFAULTS[:
|
188
|
+
return DEFAULTS[:"exceptions.ignore"] unless (ignore = get(:"exceptions.ignore"))
|
191
189
|
|
192
|
-
DEFAULTS[:
|
190
|
+
DEFAULTS[:"exceptions.ignore"] | Array(ignore)
|
193
191
|
end
|
194
192
|
|
195
193
|
def raw_ignored_events
|
196
|
-
ignore_only = get(:
|
194
|
+
ignore_only = get(:"events.ignore_only")
|
197
195
|
return ignore_only if ignore_only
|
198
|
-
return DEFAULTS[:
|
196
|
+
return DEFAULTS[:"events.ignore"] unless (ignore = get(:"events.ignore"))
|
199
197
|
|
200
|
-
DEFAULTS[:
|
198
|
+
DEFAULTS[:"events.ignore"] | Array(ignore)
|
201
199
|
end
|
202
200
|
|
203
201
|
def ignored_events
|
204
202
|
@ignored_events ||= raw_ignored_events.map do |check|
|
205
203
|
if check.is_a?(String) || check.is_a?(Regexp)
|
206
|
-
{
|
204
|
+
{[:event_type] => check}
|
207
205
|
elsif check.is_a?(Hash)
|
208
206
|
flat_hash(check).transform_keys! { |key_array| key_array.map(&:to_sym) }
|
209
207
|
end
|
@@ -211,23 +209,23 @@ module Honeybadger
|
|
211
209
|
end
|
212
210
|
|
213
211
|
def ca_bundle_path
|
214
|
-
if self[:
|
212
|
+
if self[:"connection.system_ssl_cert_chain"] && File.exist?(OpenSSL::X509::DEFAULT_CERT_FILE)
|
215
213
|
OpenSSL::X509::DEFAULT_CERT_FILE
|
216
|
-
elsif self[:
|
217
|
-
self[:
|
214
|
+
elsif self[:"connection.ssl_ca_bundle_path"]
|
215
|
+
self[:"connection.ssl_ca_bundle_path"]
|
218
216
|
else
|
219
217
|
local_cert_path
|
220
218
|
end
|
221
219
|
end
|
222
220
|
|
223
221
|
def local_cert_path
|
224
|
-
File.expand_path(File.join(
|
222
|
+
File.expand_path(File.join("..", "..", "..", "resources", "ca-bundle.crt"), __FILE__)
|
225
223
|
end
|
226
224
|
|
227
225
|
def connection_port
|
228
|
-
if self[:
|
229
|
-
self[:
|
230
|
-
elsif self[:
|
226
|
+
if self[:"connection.port"]
|
227
|
+
self[:"connection.port"]
|
228
|
+
elsif self[:"connection.secure"]
|
231
229
|
443
|
232
230
|
else
|
233
231
|
80
|
@@ -235,10 +233,10 @@ module Honeybadger
|
|
235
233
|
end
|
236
234
|
|
237
235
|
def connection_protocol
|
238
|
-
if self[:
|
239
|
-
|
236
|
+
if self[:"connection.secure"]
|
237
|
+
"https"
|
240
238
|
else
|
241
|
-
|
239
|
+
"http"
|
242
240
|
end
|
243
241
|
end
|
244
242
|
|
@@ -247,35 +245,35 @@ module Honeybadger
|
|
247
245
|
end
|
248
246
|
|
249
247
|
def events_max_queue_size
|
250
|
-
self[:
|
248
|
+
self[:"events.max_queue_size"]
|
251
249
|
end
|
252
250
|
|
253
251
|
def events_batch_size
|
254
|
-
self[:
|
252
|
+
self[:"events.batch_size"]
|
255
253
|
end
|
256
254
|
|
257
255
|
def events_timeout
|
258
|
-
self[:
|
256
|
+
self[:"events.timeout"]
|
259
257
|
end
|
260
258
|
|
261
259
|
def params_filters
|
262
|
-
Array(self[:
|
260
|
+
Array(self[:"request.filter_keys"])
|
263
261
|
end
|
264
262
|
|
265
263
|
def excluded_request_keys
|
266
264
|
[].tap do |keys|
|
267
|
-
keys << :session
|
268
|
-
keys << :params
|
269
|
-
keys << :cgi_data if self[:
|
270
|
-
keys << :url
|
265
|
+
keys << :session if self[:"request.disable_session"]
|
266
|
+
keys << :params if self[:"request.disable_params"]
|
267
|
+
keys << :cgi_data if self[:"request.disable_environment"]
|
268
|
+
keys << :url if self[:"request.disable_url"]
|
271
269
|
end
|
272
270
|
end
|
273
271
|
|
274
|
-
def log_level(key = :
|
272
|
+
def log_level(key = :"logging.level")
|
275
273
|
case self[key].to_s
|
276
274
|
when /\A(0|debug)\z/i then Logger::DEBUG
|
277
|
-
when /\A(1|info)\z/i
|
278
|
-
when /\A(2|warn)\z/i
|
275
|
+
when /\A(1|info)\z/i then Logger::INFO
|
276
|
+
when /\A(2|warn)\z/i then Logger::WARN
|
279
277
|
when /\A(3|error)\z/i then Logger::ERROR
|
280
278
|
else
|
281
279
|
Logger::INFO
|
@@ -283,13 +281,13 @@ module Honeybadger
|
|
283
281
|
end
|
284
282
|
|
285
283
|
def load_plugin?(name)
|
286
|
-
return false if includes_token?(self[:
|
287
|
-
return true unless self[:plugins].
|
284
|
+
return false if includes_token?(self[:skipped_plugins], name)
|
285
|
+
return true unless self[:plugins].is_a?(Array)
|
288
286
|
includes_token?(self[:plugins], name)
|
289
287
|
end
|
290
288
|
|
291
289
|
def insights_enabled?
|
292
|
-
public? && !!self[:
|
290
|
+
public? && !!self[:"insights.enabled"]
|
293
291
|
end
|
294
292
|
|
295
293
|
def cluster_collection?(name)
|
@@ -328,19 +326,19 @@ module Honeybadger
|
|
328
326
|
return nil if @no_root
|
329
327
|
|
330
328
|
root = get(:root).to_s
|
331
|
-
@no_root = true and return nil unless root
|
329
|
+
@no_root = true and return nil unless NOT_BLANK.match?(root)
|
332
330
|
|
333
|
-
@root_regexp = Regexp.new("^#{
|
331
|
+
@root_regexp = Regexp.new("^#{Regexp.escape(root)}")
|
334
332
|
end
|
335
333
|
|
336
334
|
def detected_framework
|
337
|
-
if self[:framework]
|
335
|
+
if NOT_BLANK.match?(self[:framework])
|
338
336
|
self[:framework].to_sym
|
339
|
-
elsif defined?(::Rails::VERSION) && ::Rails::VERSION::STRING >
|
337
|
+
elsif defined?(::Rails::VERSION) && ::Rails::VERSION::STRING > "3.0"
|
340
338
|
:rails
|
341
339
|
elsif defined?(::Sinatra::VERSION)
|
342
340
|
:sinatra
|
343
|
-
elsif defined?(::Hanami::VERSION) && ::Hanami::VERSION >=
|
341
|
+
elsif defined?(::Hanami::VERSION) && ::Hanami::VERSION >= "2.0"
|
344
342
|
:hanami
|
345
343
|
elsif defined?(::Rack.release)
|
346
344
|
:rack
|
@@ -369,8 +367,8 @@ module Honeybadger
|
|
369
367
|
|
370
368
|
def log_path
|
371
369
|
return if log_stdout?
|
372
|
-
return if !self[:
|
373
|
-
locate_absolute_path(self[:
|
370
|
+
return if !self[:"logging.path"]
|
371
|
+
locate_absolute_path(self[:"logging.path"], self[:root])
|
374
372
|
end
|
375
373
|
|
376
374
|
def config_path
|
@@ -378,7 +376,7 @@ module Honeybadger
|
|
378
376
|
end
|
379
377
|
|
380
378
|
def config_paths
|
381
|
-
Array(ENV[
|
379
|
+
Array(ENV["HONEYBADGER_CONFIG_PATH"] || get(:"config.path")).map do |c|
|
382
380
|
locate_absolute_path(c, self[:root])
|
383
381
|
end
|
384
382
|
end
|
@@ -400,7 +398,7 @@ module Honeybadger
|
|
400
398
|
end
|
401
399
|
|
402
400
|
if ruby[:backend]
|
403
|
-
logger.warn(sprintf(
|
401
|
+
logger.warn(sprintf("Unknown backend: %p; default will be used. Backend must respond to #notify", self[:backend]))
|
404
402
|
end
|
405
403
|
|
406
404
|
@backend = default_backend
|
@@ -423,7 +421,7 @@ module Honeybadger
|
|
423
421
|
end
|
424
422
|
|
425
423
|
def log_stdout?
|
426
|
-
self[:
|
424
|
+
self[:"logging.path"] && self[:"logging.path"].to_s.downcase == "stdout"
|
427
425
|
end
|
428
426
|
|
429
427
|
def build_logger
|
@@ -431,7 +429,7 @@ module Honeybadger
|
|
431
429
|
|
432
430
|
return build_stdout_logger if log_stdout?
|
433
431
|
|
434
|
-
if path = log_path
|
432
|
+
if (path = log_path)
|
435
433
|
FileUtils.mkdir_p(path.dirname) unless path.dirname.writable?
|
436
434
|
return build_file_logger(path)
|
437
435
|
end
|
@@ -448,7 +446,7 @@ module Honeybadger
|
|
448
446
|
# Takes an Array and a value and returns true if the value exists in the
|
449
447
|
# array in String or Symbol form, otherwise false.
|
450
448
|
def includes_token?(obj, value)
|
451
|
-
return false unless obj.
|
449
|
+
return false unless obj.is_a?(Array)
|
452
450
|
obj.map(&:to_sym).include?(value.to_sym)
|
453
451
|
end
|
454
452
|
|
@@ -471,7 +469,7 @@ module Honeybadger
|
|
471
469
|
|
472
470
|
def undotify_keys(hash)
|
473
471
|
{}.tap do |new_hash|
|
474
|
-
hash.each_pair do |k,v|
|
472
|
+
hash.each_pair do |k, v|
|
475
473
|
if k.to_s =~ DOTTED_KEY
|
476
474
|
new_hash[$1] ||= {}
|
477
475
|
new_hash[$1] = undotify_keys(new_hash[$1].merge({$2 => v}))
|
@@ -485,9 +483,9 @@ module Honeybadger
|
|
485
483
|
# Converts a nested hash into a single layer where keys become arrays:
|
486
484
|
# ex: > flat_hash({ :nested => { :hash => "value" }})
|
487
485
|
# > { [:nested, :hash] => "value" }
|
488
|
-
def flat_hash(h,f=[],g={})
|
489
|
-
return g.update({
|
490
|
-
h.each { |k,r| flat_hash(r,f+[k],g) }
|
486
|
+
def flat_hash(h, f = [], g = {})
|
487
|
+
return g.update({f => h}) unless h.is_a? Hash
|
488
|
+
h.each { |k, r| flat_hash(r, f + [k], g) }
|
491
489
|
g
|
492
490
|
end
|
493
491
|
end
|
data/lib/honeybadger/const.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/version"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
module Rack
|
5
5
|
# Autoloading allows middleware classes to be referenced in applications
|
6
6
|
# which include the optional Rack dependency without explicitly requiring
|
7
7
|
# these files.
|
8
|
-
autoload :ErrorNotifier,
|
9
|
-
autoload :UserFeedback,
|
10
|
-
autoload :UserInformer,
|
8
|
+
autoload :ErrorNotifier, "honeybadger/rack/error_notifier"
|
9
|
+
autoload :UserFeedback, "honeybadger/rack/user_feedback"
|
10
|
+
autoload :UserInformer, "honeybadger/rack/user_informer"
|
11
11
|
end
|
12
12
|
|
13
13
|
# @api private
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/conversions"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
# @api private
|
@@ -20,7 +20,6 @@ module Honeybadger
|
|
20
20
|
|
21
21
|
# Internal helpers
|
22
22
|
|
23
|
-
|
24
23
|
def set_context(hash, &block)
|
25
24
|
local = block_given?
|
26
25
|
@mutex.synchronize do
|
@@ -2,6 +2,7 @@ module Honeybadger
|
|
2
2
|
# @api private
|
3
3
|
module Conversions
|
4
4
|
module_function
|
5
|
+
|
5
6
|
MAX_CONTEXT_DEPTH = 5
|
6
7
|
|
7
8
|
# Convert context into a Hash.
|
@@ -12,13 +13,15 @@ module Honeybadger
|
|
12
13
|
def Context(object, depth = 1)
|
13
14
|
object = object.to_honeybadger_context if object.respond_to?(:to_honeybadger_context)
|
14
15
|
object = Hash(object)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
if depth < MAX_CONTEXT_DEPTH
|
17
|
+
object = object.transform_values do |value|
|
18
|
+
if value&.respond_to?(:to_honeybadger_context)
|
19
|
+
Context(value, depth + 1)
|
20
|
+
else
|
21
|
+
value
|
22
|
+
end
|
20
23
|
end
|
21
|
-
end
|
24
|
+
end
|
22
25
|
object
|
23
26
|
end
|
24
27
|
end
|
data/lib/honeybadger/counter.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
require
|
1
|
+
require "honeybadger/metric"
|
2
2
|
|
3
3
|
module Honeybadger
|
4
4
|
class Counter < Metric
|
5
|
-
def count(by=1)
|
5
|
+
def count(by = 1)
|
6
6
|
return unless by
|
7
7
|
|
8
8
|
@samples += 1
|
9
9
|
|
10
10
|
@counter ||= 0
|
11
|
-
@counter
|
11
|
+
@counter += by
|
12
12
|
end
|
13
13
|
|
14
14
|
def payloads
|
15
|
-
[{
|
15
|
+
[{counter: @counter}]
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|