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.
@@ -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
- @filter.filter(data)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lapsoss
4
- VERSION = "0.4.10"
4
+ VERSION = "1.0.0"
5
5
  end
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.10
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: '7.2'
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: '7.2'
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: 3.6.9
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: []