lenjador 1.2.1 → 1.3.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.
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Lenjador::Utils do
6
+ let(:now) { Time.utc(2015, 10, 11, 23, 10, 21, 123_456) }
7
+
8
+ before do
9
+ allow(Time).to receive(:now) { now }
10
+ end
11
+
12
+ describe '.build_event' do
13
+ subject(:event) { described_class.build_event(metadata, level, application_name) }
14
+
15
+ let(:application_name) { 'test_service' }
16
+ let(:level) { :info }
17
+ let(:metadata) { {x: 'y'} }
18
+
19
+ it 'includes it in the event as application' do
20
+ expect(event[:application]).to eq(application_name)
21
+ end
22
+
23
+ it 'includes log level' do
24
+ expect(event[:level]).to eq(:info)
25
+ end
26
+
27
+ it 'includes timestamp' do
28
+ expect(event[:@timestamp]).to eq('2015-10-11T23:10:21.123Z')
29
+ end
30
+
31
+ context 'when @timestamp provided' do
32
+ let(:metadata) { {message: 'test', :@timestamp => 'a timestamp'} }
33
+
34
+ it 'overwrites @timestamp' do
35
+ expect(event[:message]).to eq('test')
36
+ expect(event[:@timestamp]).to eq('a timestamp')
37
+ end
38
+ end
39
+
40
+ context 'when host provided' do
41
+ let(:metadata) { {message: 'test', host: 'xyz'} }
42
+
43
+ it 'overwrites host' do
44
+ expect(event[:message]).to eq('test')
45
+ expect(event[:host]).to eq('xyz')
46
+ end
47
+ end
48
+
49
+ context 'when OpenTracing is defined' do
50
+ let(:trace_id) { 'trace-id' }
51
+ let(:span_id) { 'span-id' }
52
+
53
+ it 'includes tracing data in the event when active span is present' do
54
+ span_context = double(trace_id: trace_id, span_id: span_id)
55
+ span = double(context: span_context)
56
+ open_tracing = double(active_span: span)
57
+ stub_const('OpenTracing', open_tracing)
58
+
59
+ expect(event).to include(
60
+ trace_id: trace_id,
61
+ span_id: span_id
62
+ )
63
+ end
64
+
65
+ it 'does not include tracing data if active span is not present' do
66
+ open_tracing = double(active_span: nil)
67
+ stub_const('OpenTracing', open_tracing)
68
+
69
+ expect(event).not_to include(:trace_id, :span_id)
70
+ end
71
+
72
+ it 'does not include tracing data if active span does not respond to trace_id' do
73
+ span_context = double(span_id: span_id)
74
+ span = double(context: span_context)
75
+ open_tracing = double(active_span: span)
76
+ stub_const('OpenTracing', open_tracing)
77
+
78
+ expect(event).not_to include(:trace_id, :span_id)
79
+ end
80
+
81
+ it 'does not include tracing data if active span does not respond to span_id' do
82
+ span_context = double(trace_id: trace_id)
83
+ span = double(context: span_context)
84
+ open_tracing = double(active_span: span)
85
+ stub_const('OpenTracing', open_tracing)
86
+
87
+ expect(event).not_to include(:trace_id, :span_id)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe '.serialize_time_objects!' do
93
+ let(:object) do
94
+ {
95
+ time: Time.now,
96
+ hash: {
97
+ time: Time.now
98
+ },
99
+ array: [
100
+ Time.now,
101
+ {
102
+ time: Time.now
103
+ }
104
+ ]
105
+ }
106
+ end
107
+
108
+ let(:serialized_time) { now.iso8601 }
109
+
110
+ it 'recursively serializes time objects to iso8601' do
111
+ o = object.dup
112
+ described_class.serialize_time_objects!(o)
113
+
114
+ expect(o).to eq(
115
+ time: serialized_time,
116
+ hash: {
117
+ time: serialized_time
118
+ },
119
+ array: [
120
+ serialized_time,
121
+ {
122
+ time: serialized_time
123
+ }
124
+ ]
125
+ )
126
+ end
127
+ end
128
+ end
@@ -30,7 +30,7 @@ describe Lenjador do
30
30
  end
31
31
 
32
32
  it 'creates preprocessor when preprocessor defined' do
33
- expect(described_class).to receive(:new) do |adapters, preprocessors|
33
+ expect(described_class).to receive(:new) do |_adapters, preprocessors|
34
34
  expect(preprocessors.count).to be(1)
35
35
  expect(preprocessors.first).to be_a(described_class::Preprocessors::Blacklist)
36
36
  end
@@ -104,7 +104,7 @@ describe Lenjador do
104
104
  end
105
105
  end
106
106
 
107
- context 'log level queries' do
107
+ context 'with log level' do
108
108
  context 'when adapter has debug level' do
109
109
  let(:logger) do
110
110
  described_class.build('test_service', stdout: {level: 'debug'})
@@ -133,10 +133,4 @@ describe Lenjador do
133
133
  end
134
134
  end
135
135
  end
136
-
137
- it 'has the same interface as Ruby logger' do
138
- skip "https://salemove.atlassian.net/browse/INF-464"
139
- logger = described_class.build('test_service', stdout: {level: 'debug'})
140
- expect(logger).to implement_interface(Logger)
141
- end
142
136
  end
@@ -5,7 +5,7 @@ Bundler.setup
5
5
 
6
6
  require 'lenjador'
7
7
 
8
- Dir[File.dirname(__FILE__) + '/support/*.rb'].each {|f| require f}
8
+ Dir[File.dirname(__FILE__) + '/support/*.rb'].each { |f| require f }
9
9
 
10
10
  RSpec.configure do |config|
11
11
  config.run_all_when_everything_filtered = true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lenjador
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Salemove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-28 00:00:00.000000000 Z
11
+ date: 2018-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lru_redux
@@ -38,6 +38,34 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ruby-prof
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: benchmark-ips
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: bundler
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,20 @@ dependencies:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
82
  version: '1.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: rake
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -67,7 +109,7 @@ dependencies:
67
109
  - !ruby/object:Gem::Version
68
110
  version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
- name: bunny
112
+ name: rspec
71
113
  requirement: !ruby/object:Gem::Requirement
72
114
  requirements:
73
115
  - - ">="
@@ -81,7 +123,7 @@ dependencies:
81
123
  - !ruby/object:Gem::Version
82
124
  version: '0'
83
125
  - !ruby/object:Gem::Dependency
84
- name: benchmark-ips
126
+ name: rubocop-salemove
85
127
  requirement: !ruby/object:Gem::Requirement
86
128
  requirements:
87
129
  - - ">="
@@ -103,6 +145,7 @@ extra_rdoc_files: []
103
145
  files:
104
146
  - ".gitignore"
105
147
  - ".rspec"
148
+ - ".rubocop.yml"
106
149
  - ".ruby-gemset"
107
150
  - ".ruby-version"
108
151
  - ".travis.yml"
@@ -123,15 +166,16 @@ files:
123
166
  - lib/lenjador/preprocessors/strategies/prune.rb
124
167
  - lib/lenjador/preprocessors/whitelist.rb
125
168
  - lib/lenjador/utils.rb
126
- - spec/adapters/stdout_adapter_spec.rb
127
- - spec/adapters/stdout_json_adapter_spec.rb
169
+ - profiler/logs.rb
170
+ - spec/lenjador/adapters/stdout_adapter_spec.rb
171
+ - spec/lenjador/adapters/stdout_json_adapter_spec.rb
172
+ - spec/lenjador/preprocessors/blacklist_spec.rb
173
+ - spec/lenjador/preprocessors/json_pointer_trie_spec.rb
174
+ - spec/lenjador/preprocessors/whitelist_spec.rb
175
+ - spec/lenjador/utils_spec.rb
128
176
  - spec/lenjador_spec.rb
129
- - spec/preprocessors/blacklist_spec.rb
130
- - spec/preprocessors/json_pointer_trie.rb
131
- - spec/preprocessors/whitelist_spec.rb
132
177
  - spec/spec_helper.rb
133
178
  - spec/support/implement_interface.rb
134
- - spec/utils_spec.rb
135
179
  homepage:
136
180
  licenses:
137
181
  - MIT
@@ -157,12 +201,12 @@ signing_key:
157
201
  specification_version: 4
158
202
  summary: What description said
159
203
  test_files:
160
- - spec/adapters/stdout_adapter_spec.rb
161
- - spec/adapters/stdout_json_adapter_spec.rb
204
+ - spec/lenjador/adapters/stdout_adapter_spec.rb
205
+ - spec/lenjador/adapters/stdout_json_adapter_spec.rb
206
+ - spec/lenjador/preprocessors/blacklist_spec.rb
207
+ - spec/lenjador/preprocessors/json_pointer_trie_spec.rb
208
+ - spec/lenjador/preprocessors/whitelist_spec.rb
209
+ - spec/lenjador/utils_spec.rb
162
210
  - spec/lenjador_spec.rb
163
- - spec/preprocessors/blacklist_spec.rb
164
- - spec/preprocessors/json_pointer_trie.rb
165
- - spec/preprocessors/whitelist_spec.rb
166
211
  - spec/spec_helper.rb
167
212
  - spec/support/implement_interface.rb
168
- - spec/utils_spec.rb
@@ -1,335 +0,0 @@
1
- require 'spec_helper'
2
- require_relative '../../lib/lenjador/preprocessors/whitelist'
3
-
4
- RSpec.describe Lenjador::Preprocessors::Whitelist, 'when :action is :mask or omitted' do
5
- subject(:processed_data) { described_class.new(config).process(data) }
6
-
7
- let(:config) { { pointers: pointers } }
8
- let(:pointers) { [] }
9
- let(:data) do
10
- {
11
- field: 'secret',
12
- data: {
13
- field: 'secret'
14
- },
15
- array: [{ field: 'secret' }]
16
- }
17
- end
18
-
19
- it 'masks all non-whitelisted fields' do
20
- expect(processed_data).to eq(
21
- field: '*****',
22
- data: '*****',
23
- array: '*****'
24
- )
25
- end
26
-
27
- context 'when pointer has trailing slash' do
28
- let(:pointers) { ['/field/'] }
29
-
30
- it 'throws exception' do
31
- expect { processed_data }.to raise_exception(Lenjador::Preprocessors::Whitelist::InvalidPointerFormatException)
32
- end
33
- end
34
-
35
- context 'with whitelisted field' do
36
- let(:pointers) { ['/field'] }
37
-
38
- it 'includes the field' do
39
- expect(processed_data).to eq(
40
- field: 'secret',
41
- data: '*****',
42
- array: '*****'
43
- )
44
- end
45
- end
46
-
47
- context 'with whitelisted nested field' do
48
- let(:pointers) { ['/data/field'] }
49
-
50
- it 'includes nested field' do
51
- expect(processed_data).to eq(
52
- field: '*****',
53
- data: {
54
- field: 'secret'
55
- },
56
- array: '*****'
57
- )
58
- end
59
- end
60
-
61
- context 'with whitelisted array element field' do
62
- let(:pointers) { ['/array/0/field'] }
63
-
64
- it 'includes array element' do
65
- expect(processed_data).to eq(
66
- field: '*****',
67
- data: '*****',
68
- array: [{ field: 'secret' }]
69
- )
70
- end
71
- end
72
-
73
- context 'with whitelisted hash' do
74
- it 'includes all whitelisted hash elements' do
75
- source = { foo: { bar: 'baz' } }
76
- target = { foo: { bar: 'baz' } }
77
- expect(process(['/foo/~'], source)).to eq(target)
78
- end
79
-
80
- it 'does not include nested elements' do
81
- source = { foo: { bar: { baz: 'asd' } } }
82
- target = { foo: { bar: { baz: '*****' } } }
83
- expect(process(['/foo/~'], source)).to eq(target)
84
- end
85
- end
86
-
87
- context 'with whitelisted array elements field with wildcard' do
88
- let(:data) do
89
- {
90
- array: [
91
- { field: 'data1', secret: 'secret1' },
92
- { field: 'data2', secret: 'secret2' }
93
- ]
94
- }
95
- end
96
- let(:pointers) { ['/array/~/field'] }
97
-
98
- it 'includes array elements field' do
99
- expect(processed_data).to include(
100
- array: [
101
- { field: 'data1', secret: '*****' },
102
- { field: 'data2', secret: '*****' }
103
- ]
104
- )
105
- end
106
- end
107
-
108
- context 'with whitelisted string array elements with wildcard' do
109
- let(:data) do
110
- { array: %w[secret secret] }
111
- end
112
- let(:pointers) { ['/array/~'] }
113
-
114
- it 'includes array elements' do
115
- expect(processed_data).to include(array: %w[secret secret])
116
- end
117
- end
118
-
119
- context 'with whitelisted string array elements in an array with wildcard' do
120
- let(:data) do
121
- {
122
- nested: [{ array: %w[secret secret] }]
123
- }
124
- end
125
- let(:pointers) { ['/nested/~/array/~'] }
126
-
127
- it 'includes array elements' do
128
- expect(processed_data).to include(nested: [{ array: %w[secret secret] }])
129
- end
130
- end
131
-
132
-
133
- context 'with whitelisted array element' do
134
- let(:pointers) { ['/array/0'] }
135
-
136
- it 'masks array element' do
137
- expect(processed_data).to include(array: [{ field: '*****' }])
138
- end
139
- end
140
-
141
- context 'with whitelisted array' do
142
- let(:pointers) { ['/array'] }
143
-
144
- it 'masks array' do
145
- expect(processed_data).to include(array: ['*****'])
146
- end
147
- end
148
-
149
- context 'with whitelisted hash' do
150
- let(:pointers) { ['/data'] }
151
-
152
- it 'masks hash' do
153
- expect(processed_data).to include(data: { field: '*****' })
154
- end
155
- end
156
-
157
- context 'when boolean present' do
158
- let(:data) { { bool: true } }
159
-
160
- it 'masks it with asteriks' do
161
- expect(processed_data).to eq(bool: '*****')
162
- end
163
- end
164
-
165
- context 'when field has slash in the name' do
166
- let(:data) do
167
- { 'field_with_/' => 'secret' }
168
- end
169
- let(:pointers) { ['/field_with_~1'] }
170
-
171
- it 'includes field' do
172
- expect(processed_data).to include('field_with_/'=> 'secret')
173
- end
174
- end
175
-
176
- context 'when field has tilde in the name' do
177
- let(:data) do
178
- { 'field_with_~' => 'secret' }
179
- end
180
- let(:pointers) { ['/field_with_~0'] }
181
-
182
- it 'includes field' do
183
- expect(processed_data).to include('field_with_~'=> 'secret')
184
- end
185
- end
186
-
187
- context 'when field has tilde and 1' do
188
- let(:data) do
189
- { 'field_with_~1' => 'secret' }
190
- end
191
- let(:pointers) { ['/field_with_~01'] }
192
-
193
- it 'includes field' do
194
- expect(processed_data).to include('field_with_~1'=> 'secret')
195
- end
196
- end
197
-
198
- def process(pointers, data)
199
- described_class.new(pointers: pointers).process(data)
200
- end
201
- end
202
-
203
- RSpec.describe Lenjador::Preprocessors::Whitelist, 'when :action is :exclude or :prune' do
204
- subject(:processed_data) { described_class.new(config).process(data) }
205
-
206
- let(:config) { { pointers: pointers, action: :prune } }
207
- let(:pointers) { [] }
208
- let(:data) do
209
- {
210
- field: 'secret',
211
- data: {
212
- field: 'secret'
213
- },
214
- array: [{ field: 'secret' }, { field2: 'secret' }]
215
- }
216
- end
217
-
218
- context 'when pointers is empty' do
219
- it 'prunes all fields from the input' do
220
- expect(processed_data).to eq({})
221
- end
222
- end
223
-
224
- context 'with whitelisted field' do
225
- let(:pointers) { ['/field'] }
226
-
227
- it 'includes the field' do
228
- expect(processed_data).to eq(field: 'secret')
229
- end
230
- end
231
-
232
- context 'with whitelisted nested field' do
233
- let(:pointers) { ['/data/field'] }
234
-
235
- it 'includes nested field' do
236
- expect(processed_data).to eq(data: { field: 'secret' })
237
- end
238
- end
239
-
240
- context 'with whitelisted array element field' do
241
- let(:pointers) { ['/array/0/field'] }
242
-
243
- it 'includes array element' do
244
- expect(processed_data).to eq(array: [{ field: 'secret' }])
245
- end
246
- end
247
-
248
- context 'with whitelisted hash' do
249
- it 'includes all whitelisted hash elements' do
250
- source = { foo: { bar: 'baz' } }
251
- target = { foo: { bar: 'baz' } }
252
- expect(process(['/foo/~'], source)).to eq(target)
253
- end
254
-
255
- it 'does not include nested elements' do
256
- source = { foo: { bar: { baz: 'asd' } } }
257
- target = { foo: { bar: {} } }
258
- expect(process(['/foo/~'], source)).to eq(target)
259
- end
260
- end
261
-
262
- context 'with whitelisted array elements field with wildcard' do
263
- let(:data) do
264
- {
265
- array: [
266
- { field: 'data1', secret: 'secret1' },
267
- { field: 'data2', secret: 'secret2' }
268
- ]
269
- }
270
- end
271
- let(:pointers) { ['/array/~/field'] }
272
-
273
- it 'includes array elements field' do
274
- expect(processed_data).to include(
275
- array: [
276
- { field: 'data1' },
277
- { field: 'data2' }
278
- ]
279
- )
280
- end
281
- end
282
-
283
- context 'with whitelisted string array elements with wildcard' do
284
- let(:data) do
285
- { array: %w[secret1 secret2] }
286
- end
287
- let(:pointers) { ['/array/~'] }
288
-
289
- it 'includes array elements' do
290
- expect(processed_data).to include(array: %w[secret1 secret2])
291
- end
292
- end
293
-
294
- context 'with whitelisted string array elements in an array with wildcard' do
295
- let(:data) do
296
- {
297
- nested: [{ array: %w[secret1 secret2] }]
298
- }
299
- end
300
- let(:pointers) { ['/nested/~/array/~'] }
301
-
302
- it 'includes array elements' do
303
- expect(processed_data).to include(nested: [{ array: %w[secret1 secret2] }])
304
- end
305
- end
306
-
307
-
308
- context 'with whitelisted array element' do
309
- let(:pointers) { ['/array/0'] }
310
-
311
- it 'masks array element' do
312
- expect(processed_data).to eq(array: [{}])
313
- end
314
- end
315
-
316
- context 'with whitelisted array' do
317
- let(:pointers) { ['/array'] }
318
-
319
- it 'masks array' do
320
- expect(processed_data).to include(array: [])
321
- end
322
- end
323
-
324
- context 'with whitelisted hash' do
325
- let(:pointers) { ['/data'] }
326
-
327
- it 'masks hash' do
328
- expect(processed_data).to include(data: {})
329
- end
330
- end
331
-
332
- def process(pointers, data)
333
- described_class.new(pointers: pointers, action: :prune).process(data)
334
- end
335
- end