logster 1.4.0.pre → 2.0.0.pre

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.
@@ -14,11 +14,13 @@ class TestRedisStore < Minitest::Test
14
14
  end
15
15
 
16
16
  def test_delete
17
- msg = @store.report(Logger::WARN, "test", "testing")
17
+ env = { test_env: "this is env" }
18
+ msg = @store.report(Logger::WARN, "test", "testing", env: env)
18
19
  @store.delete(msg)
19
20
  latest = @store.latest
20
21
 
21
- assert_equal(0,latest.length)
22
+ assert_equal(0, latest.length)
23
+ assert_nil(@store.get_env(msg.key))
22
24
  end
23
25
 
24
26
  def test_latest
@@ -78,25 +80,188 @@ class TestRedisStore < Minitest::Test
78
80
  end
79
81
 
80
82
  def test_get
81
- a_message = @store.report(Logger::WARN, "test", "A")
83
+ a_env = { "a_message" => "A MESSAGE" }
84
+ a_message = @store.report(Logger::WARN, "test", "A", env: a_env)
82
85
  b_message = @store.report(Logger::WARN, "test", "B")
83
86
  @store.report(Logger::WARN, "test", "C")
84
87
 
85
- assert_equal("A", @store.get(a_message.key).message)
86
- assert_equal("B", @store.get(b_message.key).message)
88
+ a_message = @store.get(a_message.key)
89
+ assert_equal("A", a_message.message)
90
+ assert_equal("B", b_message.message)
91
+ assert(a_env <= a_message.env)
92
+
93
+ a_message = @store.get(a_message.key, load_env: false)
94
+ assert_equal("A", a_message.message)
95
+ assert_nil(a_message.env)
96
+ end
97
+
98
+ def test_save_saves_env_separately
99
+ env = { "myenv" => "thisisenv" }
100
+ message = @store.report(Logger::WARN, "test", "title", env: env)
101
+ message = @store.get(message.key, load_env: false)
102
+ assert_nil(message.env)
103
+
104
+ message = @store.get(message.key)
105
+ assert(env <= message.env)
106
+
107
+ assert(env <= @store.get_env(message.key))
108
+ end
109
+
110
+ def test_bulk_get
111
+ keys = []
112
+
113
+ 5.times do |n|
114
+ env = n == 0 ? nil : { "test_#{n}" => "envsss" }
115
+ keys << @store.report(Logger::WARN, "progname", "test_#{n}", env: env).key
116
+ end
117
+
118
+ messages = @store.bulk_get(keys)
119
+
120
+ 5.times do |n|
121
+ msg = messages[n]
122
+ assert_equal("test_#{n}", msg.message)
123
+ if n == 0
124
+ assert_equal(Logster::Message.default_env, msg.env)
125
+ else
126
+ assert({ "test_#{n}" => "envsss" } <= msg.env)
127
+ end
128
+ end
129
+ end
130
+
131
+ def test_get_env
132
+ env = { "my_little_env" => "some value" }
133
+ message = @store.report(Logger::WARN, "test", "A", env: env)
134
+ assert(env <= @store.get_env(message.key))
135
+ assert_nil(@store.get_env("nonexistentkey"))
136
+ end
137
+
138
+ def test_replace_and_bump
139
+ old_env = { "old_env" => "old value" }
140
+ message = @store.report(Logger::WARN, "test", "A", env: old_env)
141
+
142
+ unsaved_env = { "unsaved_env" => "lost value" }
143
+ message.env = unsaved_env
144
+
145
+ @store.replace_and_bump(message, save_env: false)
146
+
147
+ message = @store.get(message.key)
148
+ assert(old_env <= message.env)
149
+ refute(unsaved_env <= message.env)
150
+
151
+ saved_env = { "saved_env" => "saved value!" }
152
+ message.env = saved_env
153
+
154
+ @store.replace_and_bump(message)
155
+
156
+ message = @store.get(message.key)
157
+ assert(saved_env == message.env)
158
+ end
159
+
160
+ def test_backward_compatibility_no_loss_of_data
161
+ # previously we were storing env samples as a part of the main message json
162
+ # now we've switched to storing samples separately from the main message
163
+ # we need to make we don't lose env data of messages stored the old way
164
+ # when we migrate to the new system
165
+
166
+ # it probably makes sense to remove this test after a while (say 6-12 months)
167
+
168
+ Logster.config.allow_grouping = true
169
+ backtrace = "fake backtrace"
170
+ env = { "some_env" => "some env" }
171
+ message = Logster::Message.new(Logger::WARN, "", "title", count: 60)
172
+ message.env = env
173
+ message.backtrace = backtrace
174
+
175
+ @store.save(message)
176
+
177
+ # hack to force env to be stored with the main message json
178
+ @store.redis.hset(@store.send("hash_key"), message.key, message.to_json(exclude_env: false))
179
+
180
+ another_env = { "another_env" => "more env" }
181
+ message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: another_env)
182
+ message = @store.get(message.key)
183
+
184
+ assert(env <= message.env)
185
+ assert_equal(61, message.count)
186
+ # another_env is not merged cause count is 60, only the count is updated
187
+
188
+ # make sure we are now storing env samples separately
189
+ message = @store.get(message.key, load_env: false)
190
+ assert_nil(message.env)
191
+ ensure
192
+ Logster.config.allow_grouping = false
193
+ end
194
+
195
+ def test_backward_compatibility_no_loss_of_data_2
196
+ # same story as the test above, just a bit different
197
+
198
+ Logster.config.allow_grouping = true
199
+ backtrace = "fake backtrace"
200
+ env = { "some_env" => "some env" }
201
+ message = Logster::Message.new(Logger::WARN, "", "title")
202
+ message.env = env
203
+ message.backtrace = backtrace
204
+
205
+ @store.save(message)
206
+
207
+ # hack to force env to be stored with the main message json
208
+ @store.redis.hset(@store.send("hash_key"), message.key, message.to_json(exclude_env: false))
209
+
210
+ another_env = { "another_env" => "more env" }
211
+ message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: another_env)
212
+ message = @store.get(message.key)
213
+
214
+ assert_instance_of(Array, message.env)
215
+ assert(env <= message.env[0])
216
+ assert(another_env <= message.env[1])
217
+ assert_equal(2, message.env.size)
218
+ assert_equal(2, message.count)
219
+
220
+ # make sure we are now storing env samples separately
221
+ message = @store.get(message.key, load_env: false)
222
+ assert_nil(message.env)
223
+ ensure
224
+ Logster.config.allow_grouping = false
225
+ end
226
+
227
+ def test_merging_performance
228
+ Logster.config.allow_grouping = true
229
+ backtrace = "fake backtrace"
230
+ env = { "some_env" => "some env" }
231
+ another_env = { "another_env" => "more env" }
232
+ yet_another_env = { "moaar_env" => "more env" }
233
+
234
+ @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: env, count: 49)
235
+
236
+ message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: another_env)
237
+ assert_instance_of(Array, message.env)
238
+ assert_equal(2, message.env.size)
239
+ assert(env <= message.env[0])
240
+ assert(another_env <= message.env[1])
241
+
242
+ message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: yet_another_env)
243
+ # we don't need to load env from redis cause we don't
244
+ # need to merge new env samples if count is 50 or more
245
+ assert_nil(message.env)
246
+ ensure
247
+ Logster.config.allow_grouping = false
87
248
  end
88
249
 
89
250
  def test_backlog
251
+ env = { "backlog_test" => "BACKLOG" }
90
252
  @store.max_backlog = 1
253
+ deleted_msg = @store.report(Logger::WARN, "test", "A")
91
254
  @store.report(Logger::WARN, "test", "A")
92
255
  @store.report(Logger::WARN, "test", "A")
93
- @store.report(Logger::WARN, "test", "A")
94
- @store.report(Logger::WARN, "test", "B")
256
+ @store.report(Logger::WARN, "test", "B", env: env)
95
257
 
96
258
  latest = @store.latest
97
259
 
98
260
  assert_equal(1, latest.length)
99
261
  assert_equal("B", latest[0].message)
262
+ assert(env <= latest[0].env)
263
+ assert_nil(@store.get(deleted_msg.key))
264
+ assert_nil(@store.get_env(deleted_msg.key))
100
265
  end
101
266
 
102
267
  def test_save_unsave
@@ -127,17 +292,18 @@ class TestRedisStore < Minitest::Test
127
292
  end
128
293
 
129
294
  def test_clear
295
+ env = { "clear_env" => "cllleear" }
130
296
  @store.max_backlog = 25
131
- a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24*60*60))
297
+ a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24 * 60 * 60), env: env)
132
298
  @store.protect a_message.key
133
299
  20.times do
134
- @store.report(Logger::WARN, "test", "B")
300
+ @store.report(Logger::WARN, "test", "B", env: env)
135
301
  end
136
- c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24*60*60))
302
+ c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24 * 60 * 60), env: env)
137
303
  @store.protect c_message.key
138
- d_message = @store.report(Logger::WARN, "test", "D")
304
+ d_message = @store.report(Logger::WARN, "test", "D", env: env)
139
305
  10.times do
140
- @store.report(Logger::WARN, "test", "E")
306
+ @store.report(Logger::WARN, "test", "E", env: env)
141
307
  end
142
308
 
143
309
  latest = @store.latest
@@ -147,8 +313,10 @@ class TestRedisStore < Minitest::Test
147
313
 
148
314
  # Protected messages are still accessible by their key
149
315
  assert_equal("C", @store.get(c_message.key).message)
316
+ assert(env <= @store.get_env(c_message.key))
150
317
  # Unprotected messages are gone
151
318
  assert_nil(@store.get(d_message.key))
319
+ assert_nil(@store.get_env(d_message.key))
152
320
 
153
321
  # The latest list is rebuilt with protected messages, earliest first
154
322
  # Including messages that previously fell off (A)
@@ -156,6 +324,8 @@ class TestRedisStore < Minitest::Test
156
324
  assert_equal(2, latest.length)
157
325
  assert_equal("A", latest[0].message)
158
326
  assert_equal("C", latest[1].message)
327
+ assert(env <= latest[0].env)
328
+ assert(env <= latest[1].env)
159
329
  end
160
330
 
161
331
  def test_hash_cleanup
@@ -194,7 +364,7 @@ class TestRedisStore < Minitest::Test
194
364
  @store.report(Logger::ERROR, "test", "E")
195
365
  # respects after
196
366
  latest = @store.latest(severity: [Logger::ERROR, Logger::WARN], limit: 2, after: latest[1].key)
197
- assert_equal(1, latest.length);
367
+ assert_equal(1, latest.length)
198
368
  end
199
369
 
200
370
  def test_search
@@ -277,9 +447,9 @@ class TestRedisStore < Minitest::Test
277
447
  # any hashes that don't match should be stripped from the env
278
448
  # array but only temporarily until it's sent to the client
279
449
  # env array should remain untouched in redis memory
280
- assert_equal(["business5"], messages[0].env.map { |env| env["cluster"]})
450
+ assert_equal(["business5"], messages[0].env.map { |env| env["cluster"] })
281
451
  assert_equal(1, messages[0].count)
282
- assert_equal(["business2"], messages[1].env.map { |env| env["cluster"]})
452
+ assert_equal(["business2"], messages[1].env.map { |env| env["cluster"] })
283
453
  assert_equal(1, messages[1].count)
284
454
 
285
455
  m1 = @store.get(m1_key)
@@ -309,7 +479,7 @@ class TestRedisStore < Minitest::Test
309
479
  @store.ignore = [
310
480
  Logster::IgnorePattern.new("business")
311
481
  ]
312
- message2 = @store.report(Logger::WARN, "", "my error", env: { cluster: "business17", backtrace: backtrace })
482
+ @store.report(Logger::WARN, "", "my error", env: { cluster: "business17", backtrace: backtrace })
313
483
 
314
484
  message = @store.get(message.key)
315
485
  assert(Array === message.env)
@@ -335,9 +505,9 @@ class TestRedisStore < Minitest::Test
335
505
  messages = @store.latest(search: "-business")
336
506
  assert_equal(2, messages.size)
337
507
 
338
- assert_equal(["standard3"], messages[0].env.map { |env| env["cluster"]})
508
+ assert_equal(["standard3"], messages[0].env.map { |env| env["cluster"] })
339
509
  assert_equal(1, messages[0].count)
340
- assert_equal(["standard7"], messages[1].env.map { |env| env["cluster"]})
510
+ assert_equal(["standard7"], messages[1].env.map { |env| env["cluster"] })
341
511
  assert_equal(1, messages[1].count)
342
512
  end
343
513
 
@@ -385,7 +555,7 @@ class TestRedisStore < Minitest::Test
385
555
  assert_equal(1, @store.latest.count)
386
556
 
387
557
  @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1")
388
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
558
+ @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
389
559
 
390
560
  assert_equal(2, @store.latest.count)
391
561
 
@@ -395,15 +565,15 @@ class TestRedisStore < Minitest::Test
395
565
 
396
566
  def test_solve_grouped
397
567
  Logster.config.allow_grouping = true
398
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
399
- m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg"})
568
+ @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
569
+ m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg" })
400
570
 
401
571
  assert_equal(1, @store.latest.count)
402
572
 
403
573
  @store.solve(m.key)
404
574
 
405
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
406
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg"})
575
+ @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
576
+ @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg" })
407
577
 
408
578
  assert_equal(0, @store.latest.count)
409
579
 
@@ -412,7 +582,7 @@ class TestRedisStore < Minitest::Test
412
582
  end
413
583
 
414
584
  def test_clears_solved
415
- m = @store.report(Logger::WARN, "application", "test error2", backtrace: "backtrace1", env: {"application_version" => "abc"})
585
+ m = @store.report(Logger::WARN, "application", "test error2", backtrace: "backtrace1", env: { "application_version" => "abc" })
416
586
  @store.solve(m.key)
417
587
 
418
588
  assert_equal(1, @store.solved.length)
@@ -423,7 +593,7 @@ class TestRedisStore < Minitest::Test
423
593
 
424
594
  def test_solving_with_some_missing_version
425
595
 
426
- m=@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
596
+ m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
427
597
  @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1")
428
598
 
429
599
  @store.solve(m.key)
@@ -432,17 +602,17 @@ class TestRedisStore < Minitest::Test
432
602
  end
433
603
 
434
604
  def test_env
435
- env = Rack::MockRequest.env_for("/test").merge({
605
+ env = Rack::MockRequest.env_for("/test").merge(
436
606
  "HTTP_HOST" => "www.site.com",
437
607
  "HTTP_USER_AGENT" => "SOME WHERE"
438
- })
608
+ )
439
609
  orig = env.dup
440
610
  orig["test"] = "tests"
441
611
  orig["test1"] = "tests1"
442
- Logster.add_to_env(env,"test","tests")
443
- Logster.add_to_env(env,"test1","tests1")
612
+ Logster.add_to_env(env, "test", "tests")
613
+ Logster.add_to_env(env, "test1", "tests1")
444
614
 
445
- orig.delete_if do |k,v|
615
+ orig.delete_if do |k, v|
446
616
  !%w{
447
617
  HTTP_HOST
448
618
  REQUEST_METHOD
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0.pre
4
+ version: 2.0.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - UI for viewing logs in Rack
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-09 00:00:00.000000000 Z
11
+ date: 2019-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.61.1
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.61.1
125
139
  description: UI for viewing logs in Rack
126
140
  email:
127
141
  - sam.saffron@gmail.com
@@ -130,6 +144,7 @@ extensions: []
130
144
  extra_rdoc_files: []
131
145
  files:
132
146
  - ".gitignore"
147
+ - ".rubocop.yml"
133
148
  - ".travis.yml"
134
149
  - CHANGELOG.md
135
150
  - Gemfile