failbot 2.0.1 → 2.2.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/lib/failbot.rb +14 -7
- data/lib/failbot/console_backend.rb +9 -0
- data/lib/failbot/sensitive_data_scrubber.rb +68 -0
- data/lib/failbot/version.rb +1 -1
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8f7925c230c8a2bb881cc98d04f0fbc0af41406
|
4
|
+
data.tar.gz: 4f2645f74f1599a3e28be1b336c483ca53d46ff0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f212fdec123d2cabdf55b2e772e0df63e9fdb454b8aab68de06f47c46c7c1cb7cf6bdf9106dee5235e065e813cbf83b45e0cc2f28c1d583ed8bd02285bb8f968
|
7
|
+
data.tar.gz: c0272fd6b9275406eea6d403866e38e3755600985c22fffd772f8ec846311165c43a9fc608122541212049bc078fda7166a91f0fe9a5f52b6654f73026ca71d6
|
data/lib/failbot.rb
CHANGED
@@ -8,6 +8,7 @@ require "uri"
|
|
8
8
|
|
9
9
|
require 'failbot/version'
|
10
10
|
require "failbot/compat"
|
11
|
+
require "failbot/sensitive_data_scrubber"
|
11
12
|
|
12
13
|
# Failbot asynchronously takes exceptions and reports them to the
|
13
14
|
# exception logger du jour. Keeps the main app from failing or lagging if
|
@@ -16,10 +17,11 @@ module Failbot
|
|
16
17
|
# Interface for posting exception data to haystack.
|
17
18
|
autoload :Haystack, 'failbot/haystack'
|
18
19
|
|
19
|
-
autoload :
|
20
|
-
autoload :
|
21
|
-
autoload :
|
22
|
-
autoload :
|
20
|
+
autoload :ConsoleBackend, 'failbot/console_backend'
|
21
|
+
autoload :FileBackend, 'failbot/file_backend'
|
22
|
+
autoload :HTTPBackend, 'failbot/http_backend'
|
23
|
+
autoload :MemoryBackend, 'failbot/memory_backend'
|
24
|
+
autoload :JSONBackend, 'failbot/json_backend'
|
23
25
|
|
24
26
|
# Public: Set an instrumenter to be called when exceptions are reported.
|
25
27
|
#
|
@@ -79,6 +81,8 @@ module Failbot
|
|
79
81
|
Failbot::HTTPBackend.new(URI(settings["FAILBOT_HAYSTACK_URL"]))
|
80
82
|
when 'json'
|
81
83
|
Failbot::JSONBackend.new(settings["FAILBOT_BACKEND_JSON_HOST"], settings["FAILBOT_BACKEND_JSON_PORT"])
|
84
|
+
when 'console'
|
85
|
+
Failbot::ConsoleBackend.new
|
82
86
|
else
|
83
87
|
raise ArgumentError, "Unknown backend: #{name.inspect}"
|
84
88
|
end
|
@@ -93,6 +97,8 @@ module Failbot
|
|
93
97
|
|
94
98
|
# Bring in deprecated methods
|
95
99
|
extend Failbot::Compat
|
100
|
+
# Bring in sensitive data scrubber specific methods
|
101
|
+
extend Failbot::SensitiveDataScrubber
|
96
102
|
|
97
103
|
# Stack of context information to include in the next failbot report. These
|
98
104
|
# hashes are condensed down into one and included in the next report. Don't
|
@@ -109,7 +115,7 @@ module Failbot
|
|
109
115
|
#
|
110
116
|
# Returns the value returned by the block when given; otherwise, returns nil.
|
111
117
|
def push(info={})
|
112
|
-
context.push(info)
|
118
|
+
context.push(scrub(info))
|
113
119
|
yield if block_given?
|
114
120
|
ensure
|
115
121
|
pop if block_given?
|
@@ -218,11 +224,12 @@ module Failbot
|
|
218
224
|
#
|
219
225
|
# Returns nothing.
|
220
226
|
def report(e, other = {})
|
227
|
+
scrubbed_other = scrub(other)
|
221
228
|
if @raise_errors
|
222
|
-
squash_contexts(context, exception_info(e),
|
229
|
+
squash_contexts(context, exception_info(e), scrubbed_other) # surface problems squashing
|
223
230
|
raise e
|
224
231
|
else
|
225
|
-
report!(e,
|
232
|
+
report!(e, scrubbed_other)
|
226
233
|
end
|
227
234
|
end
|
228
235
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Failbot
|
2
|
+
module SensitiveDataScrubber
|
3
|
+
FILTERED = '****'.freeze
|
4
|
+
BASIC_AUTH_REGEX = /:\/\/(.+:.*)(?=@)/
|
5
|
+
MAX_DEPTH = 100
|
6
|
+
|
7
|
+
def scrub(hash)
|
8
|
+
transform_values(hash) do |value|
|
9
|
+
scrub_urls(value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def scrub_urls(value, max_depth=MAX_DEPTH)
|
14
|
+
return value if max_depth <= 0
|
15
|
+
|
16
|
+
case value
|
17
|
+
when String
|
18
|
+
scrub_url(value)
|
19
|
+
when Array
|
20
|
+
value.map do |element|
|
21
|
+
scrub_urls(element, max_depth - 1)
|
22
|
+
end
|
23
|
+
when Hash
|
24
|
+
transform_values(value) do |nested_value|
|
25
|
+
scrub_urls(nested_value, max_depth - 1)
|
26
|
+
end
|
27
|
+
else
|
28
|
+
value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def scrub_url(url)
|
33
|
+
uri = URI(url)
|
34
|
+
|
35
|
+
uri.query = scrub_request_params(uri.query) if uri.query
|
36
|
+
|
37
|
+
uri.to_s.gsub(BASIC_AUTH_REGEX, "://#{FILTERED}:#{FILTERED}")
|
38
|
+
rescue
|
39
|
+
url
|
40
|
+
end
|
41
|
+
|
42
|
+
# Took this from ruby 2.4+ because we do not want to rely on
|
43
|
+
# specific ruby versions.
|
44
|
+
#
|
45
|
+
def transform_values(hash)
|
46
|
+
return {} if hash.empty?
|
47
|
+
result = Hash.new
|
48
|
+
hash.each do |key, value|
|
49
|
+
result[key] = yield(value)
|
50
|
+
end
|
51
|
+
result
|
52
|
+
end
|
53
|
+
|
54
|
+
def scrub_request_params(query)
|
55
|
+
# We can do this with Rack query builder but we do not want to have a dependency on Rack
|
56
|
+
params = Hash[query.split('&').map { |el| el.split('=') }]
|
57
|
+
|
58
|
+
params.each do |attr, _|
|
59
|
+
if attr.include?('token') ||
|
60
|
+
!!attr.match(/oauth_\w+/) # this is for Oauth 1.0
|
61
|
+
params[attr] = FILTERED
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
params.map { |el| el.join('=') }.join('&')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/failbot/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: failbot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "@rtomayko"
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2019-10-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rake
|
@@ -68,6 +68,20 @@ dependencies:
|
|
68
68
|
- - ">="
|
69
69
|
- !ruby/object:Gem::Version
|
70
70
|
version: '5.0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: minitest-stub-const
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0.6'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0.6'
|
71
85
|
description: "..."
|
72
86
|
email:
|
73
87
|
- github+failbot@lists.github.com
|
@@ -77,6 +91,7 @@ extra_rdoc_files: []
|
|
77
91
|
files:
|
78
92
|
- lib/failbot.rb
|
79
93
|
- lib/failbot/compat.rb
|
94
|
+
- lib/failbot/console_backend.rb
|
80
95
|
- lib/failbot/exit_hook.rb
|
81
96
|
- lib/failbot/failbot.yml
|
82
97
|
- lib/failbot/file_backend.rb
|
@@ -86,6 +101,7 @@ files:
|
|
86
101
|
- lib/failbot/memory_backend.rb
|
87
102
|
- lib/failbot/middleware.rb
|
88
103
|
- lib/failbot/resque_failure_backend.rb
|
104
|
+
- lib/failbot/sensitive_data_scrubber.rb
|
89
105
|
- lib/failbot/version.rb
|
90
106
|
homepage: http://github.com/github/failbot#readme
|
91
107
|
licenses:
|
@@ -107,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
123
|
version: 1.3.6
|
108
124
|
requirements: []
|
109
125
|
rubyforge_project:
|
110
|
-
rubygems_version: 2.5.2
|
126
|
+
rubygems_version: 2.5.2.3
|
111
127
|
signing_key:
|
112
128
|
specification_version: 4
|
113
129
|
summary: Deliver exceptions to Haystack
|