lapsoss 0.4.10 → 1.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/README.md +125 -3
- data/lib/lapsoss/adapters/concerns/http_delivery.rb +19 -7
- data/lib/lapsoss/adapters/concerns/level_mapping.rb +10 -0
- data/lib/lapsoss/adapters/concerns/stacktrace_builder.rb +70 -0
- data/lib/lapsoss/adapters/concerns/trace_context.rb +52 -0
- data/lib/lapsoss/adapters/openobserve_adapter.rb +156 -0
- data/lib/lapsoss/adapters/otlp_adapter.rb +231 -0
- data/lib/lapsoss/adapters/rollbar_adapter.rb +4 -2
- data/lib/lapsoss/adapters/sentry_adapter.rb +2 -2
- data/lib/lapsoss/adapters/telebugs_adapter.rb +4 -4
- data/lib/lapsoss/client.rb +31 -8
- data/lib/lapsoss/configuration.rb +36 -1
- data/lib/lapsoss/current.rb +1 -0
- data/lib/lapsoss/middleware/sample_filter.rb +32 -0
- data/lib/lapsoss/middleware/user_context_enhancer.rb +44 -0
- data/lib/lapsoss/rails_event_subscriber.rb +41 -0
- data/lib/lapsoss/railtie.rb +13 -0
- data/lib/lapsoss/router.rb +3 -2
- data/lib/lapsoss/scrubber.rb +90 -2
- data/lib/lapsoss/version.rb +1 -1
- data/lib/lapsoss.rb +32 -0
- metadata +11 -4
data/lib/lapsoss/scrubber.rb
CHANGED
|
@@ -10,7 +10,13 @@ module Lapsoss
|
|
|
10
10
|
passw email secret token _key crypt salt certificate otp ssn cvv cvc
|
|
11
11
|
].freeze
|
|
12
12
|
|
|
13
|
+
MASK = "[FILTERED]"
|
|
14
|
+
|
|
13
15
|
def initialize(config = {})
|
|
16
|
+
@scrub_all = !!config[:scrub_all]
|
|
17
|
+
@whitelist_fields = Array(config[:whitelist_fields]).map(&:to_s)
|
|
18
|
+
@randomize_scrub_length = !!config[:randomize_scrub_length]
|
|
19
|
+
|
|
14
20
|
# Combine: Rails filter parameters + custom fields (if provided)
|
|
15
21
|
base_params = if defined?(Rails) && Rails.respond_to?(:application) && Rails.application
|
|
16
22
|
Rails.application.config.filter_parameters.presence || DEFAULT_SCRUB_FIELDS
|
|
@@ -24,12 +30,94 @@ module Lapsoss
|
|
|
24
30
|
base_params
|
|
25
31
|
end
|
|
26
32
|
|
|
27
|
-
@filter = ActiveSupport::ParameterFilter.new(filter_params)
|
|
33
|
+
@filter = ActiveSupport::ParameterFilter.new(filter_params, mask: MASK)
|
|
28
34
|
end
|
|
29
35
|
|
|
30
36
|
def scrub(data)
|
|
31
37
|
return data if data.nil?
|
|
32
|
-
|
|
38
|
+
|
|
39
|
+
if @scrub_all
|
|
40
|
+
deep_scrub_all(data)
|
|
41
|
+
else
|
|
42
|
+
filtered = @filter.filter(data)
|
|
43
|
+
filtered = restore_whitelisted_values(data, filtered) if @whitelist_fields.any?
|
|
44
|
+
@randomize_scrub_length ? randomize_masks(filtered) : filtered
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
private
|
|
49
|
+
|
|
50
|
+
def deep_scrub_all(value)
|
|
51
|
+
case value
|
|
52
|
+
when Hash
|
|
53
|
+
value.each_with_object(value.class.new) do |(key, val), result|
|
|
54
|
+
if whitelisted?(key)
|
|
55
|
+
result[key] = val
|
|
56
|
+
else
|
|
57
|
+
result[key] = structure_preserving_mask(val)
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
when Array
|
|
61
|
+
value.map { |item| deep_scrub_all(item) }
|
|
62
|
+
else
|
|
63
|
+
mask_value(value)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def structure_preserving_mask(value)
|
|
68
|
+
case value
|
|
69
|
+
when Hash, Array
|
|
70
|
+
deep_scrub_all(value)
|
|
71
|
+
else
|
|
72
|
+
mask_value(value)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def mask_value(value)
|
|
77
|
+
@randomize_scrub_length ? random_mask(value) : MASK
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def random_mask(value)
|
|
81
|
+
length = [ [ value.to_s.length, 3 ].max, 32 ].min
|
|
82
|
+
"*" * length
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def whitelisted?(key)
|
|
86
|
+
@whitelist_fields.include?(key.to_s)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def restore_whitelisted_values(original, filtered)
|
|
90
|
+
case filtered
|
|
91
|
+
when Hash
|
|
92
|
+
filtered.each_with_object(filtered.class.new) do |(key, val), result|
|
|
93
|
+
if whitelisted?(key)
|
|
94
|
+
result[key] = original.is_a?(Hash) ? original[key] : original
|
|
95
|
+
else
|
|
96
|
+
next_original = original.is_a?(Hash) ? original[key] : nil
|
|
97
|
+
result[key] = restore_whitelisted_values(next_original, val)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
when Array
|
|
101
|
+
filtered.each_with_index.map do |val, idx|
|
|
102
|
+
next_original = original.is_a?(Array) ? original[idx] : nil
|
|
103
|
+
restore_whitelisted_values(next_original, val)
|
|
104
|
+
end
|
|
105
|
+
else
|
|
106
|
+
filtered
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def randomize_masks(value)
|
|
111
|
+
case value
|
|
112
|
+
when Hash
|
|
113
|
+
value.transform_values { |v| randomize_masks(v) }
|
|
114
|
+
when Array
|
|
115
|
+
value.map { |v| randomize_masks(v) }
|
|
116
|
+
when String
|
|
117
|
+
value == MASK ? random_mask(value) : value
|
|
118
|
+
else
|
|
119
|
+
value
|
|
120
|
+
end
|
|
33
121
|
end
|
|
34
122
|
end
|
|
35
123
|
end
|
data/lib/lapsoss/version.rb
CHANGED
data/lib/lapsoss.rb
CHANGED
|
@@ -69,6 +69,20 @@ module Lapsoss
|
|
|
69
69
|
capture_exception(exception, **context.merge(handled: handled))
|
|
70
70
|
end
|
|
71
71
|
|
|
72
|
+
# Suppress all event capture for the duration of the block (thread-local).
|
|
73
|
+
# Breadcrumbs and scope still accumulate; only delivery is skipped.
|
|
74
|
+
def silence
|
|
75
|
+
previous = Current.silenced
|
|
76
|
+
Current.silenced = true
|
|
77
|
+
yield
|
|
78
|
+
ensure
|
|
79
|
+
Current.silenced = previous
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def silenced?
|
|
83
|
+
Current.silenced
|
|
84
|
+
end
|
|
85
|
+
|
|
72
86
|
def add_breadcrumb(message, type: :default, **metadata)
|
|
73
87
|
client.add_breadcrumb(message, type: type, **metadata)
|
|
74
88
|
end
|
|
@@ -83,6 +97,24 @@ module Lapsoss
|
|
|
83
97
|
client.flush(timeout: timeout)
|
|
84
98
|
end
|
|
85
99
|
|
|
100
|
+
def call_error_handler(adapter:, event:, error:)
|
|
101
|
+
handler = configuration.error_handler
|
|
102
|
+
return unless handler
|
|
103
|
+
|
|
104
|
+
case handler.arity
|
|
105
|
+
when 3
|
|
106
|
+
handler.call(adapter, event, error)
|
|
107
|
+
when 2
|
|
108
|
+
handler.call(event, error)
|
|
109
|
+
when 1, 0, -1
|
|
110
|
+
handler.call(error)
|
|
111
|
+
else
|
|
112
|
+
handler.call(adapter, event, error)
|
|
113
|
+
end
|
|
114
|
+
rescue => handler_error
|
|
115
|
+
configuration.logger&.error("[LAPSOSS] Error handler failed: #{handler_error.message}")
|
|
116
|
+
end
|
|
117
|
+
|
|
86
118
|
delegate :shutdown, to: :client
|
|
87
119
|
end
|
|
88
120
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lapsoss
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 1.0.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Abdelkader Boudih
|
|
@@ -15,7 +15,7 @@ dependencies:
|
|
|
15
15
|
requirements:
|
|
16
16
|
- - ">="
|
|
17
17
|
- !ruby/object:Gem::Version
|
|
18
|
-
version: '
|
|
18
|
+
version: '8.1'
|
|
19
19
|
- - "<"
|
|
20
20
|
- !ruby/object:Gem::Version
|
|
21
21
|
version: '9.0'
|
|
@@ -25,7 +25,7 @@ dependencies:
|
|
|
25
25
|
requirements:
|
|
26
26
|
- - ">="
|
|
27
27
|
- !ruby/object:Gem::Version
|
|
28
|
-
version: '
|
|
28
|
+
version: '8.1'
|
|
29
29
|
- - "<"
|
|
30
30
|
- !ruby/object:Gem::Version
|
|
31
31
|
version: '9.0'
|
|
@@ -221,8 +221,12 @@ files:
|
|
|
221
221
|
- lib/lapsoss/adapters/concerns/envelope_builder.rb
|
|
222
222
|
- lib/lapsoss/adapters/concerns/http_delivery.rb
|
|
223
223
|
- lib/lapsoss/adapters/concerns/level_mapping.rb
|
|
224
|
+
- lib/lapsoss/adapters/concerns/stacktrace_builder.rb
|
|
225
|
+
- lib/lapsoss/adapters/concerns/trace_context.rb
|
|
224
226
|
- lib/lapsoss/adapters/insight_hub_adapter.rb
|
|
225
227
|
- lib/lapsoss/adapters/logger_adapter.rb
|
|
228
|
+
- lib/lapsoss/adapters/openobserve_adapter.rb
|
|
229
|
+
- lib/lapsoss/adapters/otlp_adapter.rb
|
|
226
230
|
- lib/lapsoss/adapters/rollbar_adapter.rb
|
|
227
231
|
- lib/lapsoss/adapters/sentry_adapter.rb
|
|
228
232
|
- lib/lapsoss/adapters/telebugs_adapter.rb
|
|
@@ -247,11 +251,14 @@ files:
|
|
|
247
251
|
- lib/lapsoss/middleware/metrics_collector.rb
|
|
248
252
|
- lib/lapsoss/middleware/rate_limiter.rb
|
|
249
253
|
- lib/lapsoss/middleware/release_tracker.rb
|
|
254
|
+
- lib/lapsoss/middleware/sample_filter.rb
|
|
255
|
+
- lib/lapsoss/middleware/user_context_enhancer.rb
|
|
250
256
|
- lib/lapsoss/pipeline.rb
|
|
251
257
|
- lib/lapsoss/pipeline_builder.rb
|
|
252
258
|
- lib/lapsoss/rails_controller_context.rb
|
|
253
259
|
- lib/lapsoss/rails_controller_transaction.rb
|
|
254
260
|
- lib/lapsoss/rails_error_subscriber.rb
|
|
261
|
+
- lib/lapsoss/rails_event_subscriber.rb
|
|
255
262
|
- lib/lapsoss/railtie.rb
|
|
256
263
|
- lib/lapsoss/registry.rb
|
|
257
264
|
- lib/lapsoss/release_tracker.rb
|
|
@@ -287,7 +294,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
287
294
|
- !ruby/object:Gem::Version
|
|
288
295
|
version: '0'
|
|
289
296
|
requirements: []
|
|
290
|
-
rubygems_version:
|
|
297
|
+
rubygems_version: 4.0.10
|
|
291
298
|
specification_version: 4
|
|
292
299
|
summary: Modern error reporting with pluggable adapters for Rails applications
|
|
293
300
|
test_files: []
|