dontbugme 0.1.6 → 0.1.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f71bd0ef418ea0d47ca94a5242d3677a00d82cf36e2fd0d8b69f3f4ce323f9c
4
- data.tar.gz: c9692d06855f24fc322e218588958881a0a8d9ee4b278125961143b7527fdf3a
3
+ metadata.gz: 9433798398dd8fdefaec811b7f52b310fcbb57febcc03a44fc2eaf94acd4ab2c
4
+ data.tar.gz: a513ab24f0d08c91ffa941dbbc81b326a6c240052fbac9b1c8b4a0111a0d4257
5
5
  SHA512:
6
- metadata.gz: 85e2c35aa316839754b10c22353ef1b89970c893f78f537708fce9a5af7653c4532219a98bd035c833bfdc9e3f3d4fbd3c61a6ad8fb9f60a6d8bff2f1a301511
7
- data.tar.gz: 646af28b63c0f177fcc68b48c0892f3a92c0b1dd102aad33b70d2c54915b85fa325bdcf5b6661c4e2b8c5b13af735d10a6b088643df9335f8967ab8569e918b9
6
+ metadata.gz: 10dd8c9e2263610d647a66d92eabb0d56760f524e684b7f9c9984465b398f48391d43caac9ff7caba3684a5d3e22bf0b3fa1f14fa65f2afba45ddc7ec7114360
7
+ data.tar.gz: 9dc17d45129c997152ac4d842b337a813a3ed184dea61598ecb496cbd9a732c391e6c2424a32e94dfdae221eafff208c1899560f27f326982477907ed9726c85
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dontbugme
4
+ module Store
5
+ # Sanitizes data for JSON encoding by replacing invalid UTF-8 sequences.
6
+ # Trace data can contain binary from SQL binds, HTTP bodies, Redis, etc.
7
+ module JsonSafe
8
+ REPLACEMENT = "\uFFFD".freeze
9
+
10
+ module_function
11
+
12
+ def sanitize(obj)
13
+ case obj
14
+ when String
15
+ sanitize_string(obj)
16
+ when Hash
17
+ obj.transform_values { |v| sanitize(v) }
18
+ when Array
19
+ obj.map { |v| sanitize(v) }
20
+ when Symbol
21
+ sanitize_string(obj.to_s)
22
+ when Numeric, TrueClass, FalseClass, NilClass
23
+ obj
24
+ when Time
25
+ obj.respond_to?(:iso8601) ? obj.iso8601(3) : obj.to_s
26
+ else
27
+ sanitize_string(obj.to_s)
28
+ end
29
+ end
30
+
31
+ def sanitize_string(str)
32
+ return str if str.nil?
33
+ return str if str.encoding == Encoding::UTF_8 && str.valid_encoding?
34
+
35
+ str.encode('UTF-8', invalid: :replace, undef: :replace, replace: REPLACEMENT)
36
+ rescue StandardError
37
+ REPLACEMENT
38
+ end
39
+ end
40
+ end
41
+ end
@@ -17,14 +17,14 @@ module Dontbugme
17
17
  params = [
18
18
  data[:id],
19
19
  data[:kind].to_s,
20
- data[:identifier],
20
+ JsonSafe.sanitize_string(data[:identifier].to_s),
21
21
  data[:status].to_s,
22
22
  data[:started_at],
23
23
  data[:duration_ms],
24
24
  correlation_id,
25
- data[:metadata].to_json,
26
- data[:spans].to_json,
27
- data[:error]&.to_json
25
+ JsonSafe.sanitize(data[:metadata]).to_json,
26
+ JsonSafe.sanitize(data[:spans]).to_json,
27
+ data[:error] ? JsonSafe.sanitize(data[:error]).to_json : nil
28
28
  ]
29
29
  exec_params(<<~SQL, params)
30
30
  INSERT INTO dontbugme_traces
@@ -15,18 +15,21 @@ module Dontbugme
15
15
  def save_trace(trace)
16
16
  data = trace.to_h
17
17
  correlation_id = data[:correlation_id] || data[:metadata]&.dig(:correlation_id)
18
+ metadata_json = json_safe(data[:metadata])
19
+ spans_json = json_safe(data[:spans])
20
+ error_json = data[:error] ? json_safe(data[:error]) : nil
18
21
  db.execute(
19
22
  'INSERT OR REPLACE INTO traces (id, kind, identifier, status, started_at, duration_ms, correlation_id, metadata_json, spans_json, error_json) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
20
23
  data[:id],
21
24
  data[:kind].to_s,
22
- data[:identifier],
25
+ sanitize_identifier(data[:identifier]),
23
26
  data[:status].to_s,
24
27
  data[:started_at],
25
28
  data[:duration_ms],
26
29
  correlation_id,
27
- data[:metadata].to_json,
28
- data[:spans].to_json,
29
- data[:error]&.to_json
30
+ metadata_json,
31
+ spans_json,
32
+ error_json
30
33
  )
31
34
  end
32
35
 
@@ -108,6 +111,16 @@ module Dontbugme
108
111
  db.execute('CREATE INDEX IF NOT EXISTS idx_traces_correlation_id ON traces(correlation_id)')
109
112
  end
110
113
 
114
+ def json_safe(obj)
115
+ JsonSafe.sanitize(obj).to_json
116
+ end
117
+
118
+ def sanitize_identifier(str)
119
+ return str if str.nil?
120
+
121
+ JsonSafe.sanitize_string(str.to_s)
122
+ end
123
+
111
124
  def migrate_add_correlation_id
112
125
  return if db.execute("PRAGMA table_info(traces)").any? { |col| col[1] == 'correlation_id' }
113
126
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dontbugme
4
- VERSION = '0.1.6'
4
+ VERSION = '0.1.7'
5
5
  end
data/lib/dontbugme.rb CHANGED
@@ -160,6 +160,7 @@ require 'dontbugme/subscribers/cache'
160
160
  require 'dontbugme/subscribers/action_mailer'
161
161
  require 'dontbugme/subscribers/active_job'
162
162
  require 'dontbugme/store/base'
163
+ require 'dontbugme/store/json_safe'
163
164
  require 'dontbugme/store/memory'
164
165
  require 'dontbugme/store/sqlite'
165
166
  require 'dontbugme/store/postgresql'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dontbugme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inspector Contributors
@@ -149,6 +149,7 @@ files:
149
149
  - lib/dontbugme/span_collection.rb
150
150
  - lib/dontbugme/store/async.rb
151
151
  - lib/dontbugme/store/base.rb
152
+ - lib/dontbugme/store/json_safe.rb
152
153
  - lib/dontbugme/store/memory.rb
153
154
  - lib/dontbugme/store/postgresql.rb
154
155
  - lib/dontbugme/store/sqlite.rb