logster 2.12.2 → 2.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +5 -0
  3. data/.streerc +2 -0
  4. data/CHANGELOG.md +8 -0
  5. data/Gemfile +1 -1
  6. data/README.md +7 -6
  7. data/assets/javascript/{chunk.143.f61340b825c6a3bf6dbe.js → chunk.143.5bf090e78cbca9ee78cc.js} +4 -4
  8. data/assets/javascript/{chunk.178.6d9ae01775c898e7b748.js → chunk.178.135370942038cfbbe65e.js} +3 -3
  9. data/assets/javascript/client-app.js +103 -35
  10. data/client-app/app/controllers/show.js +17 -1
  11. data/client-app/app/templates/show.hbs +2 -0
  12. data/client-app/package.json +1 -1
  13. data/client-app/preload-json-manager.rb +10 -17
  14. data/client-app/yarn.lock +131 -44
  15. data/lib/examples/sidekiq_logster_reporter.rb +5 -7
  16. data/lib/logster/base_store.rb +26 -22
  17. data/lib/logster/cache.rb +2 -1
  18. data/lib/logster/configuration.rb +3 -3
  19. data/lib/logster/defer_logger.rb +2 -4
  20. data/lib/logster/group.rb +17 -20
  21. data/lib/logster/ignore_pattern.rb +1 -2
  22. data/lib/logster/logger.rb +18 -16
  23. data/lib/logster/message.rb +53 -57
  24. data/lib/logster/middleware/debug_exceptions.rb +12 -10
  25. data/lib/logster/middleware/reporter.rb +17 -26
  26. data/lib/logster/middleware/viewer.rb +77 -97
  27. data/lib/logster/pattern.rb +4 -7
  28. data/lib/logster/rails/railtie.rb +10 -13
  29. data/lib/logster/redis_rate_limiter.rb +2 -7
  30. data/lib/logster/redis_store.rb +79 -99
  31. data/lib/logster/scheduler.rb +1 -5
  32. data/lib/logster/suppression_pattern.rb +7 -5
  33. data/lib/logster/version.rb +1 -1
  34. data/lib/logster/web.rb +1 -1
  35. data/lib/logster.rb +15 -17
  36. data/logster.gemspec +14 -14
  37. data/test/examples/test_sidekiq_reporter_example.rb +8 -9
  38. data/test/fake_data/generate.rb +14 -3
  39. data/test/logster/middleware/test_reporter.rb +9 -7
  40. data/test/logster/middleware/test_viewer.rb +117 -101
  41. data/test/logster/test_base_store.rb +79 -58
  42. data/test/logster/test_cache.rb +5 -11
  43. data/test/logster/test_defer_logger.rb +3 -3
  44. data/test/logster/test_group.rb +14 -18
  45. data/test/logster/test_ignore_pattern.rb +2 -3
  46. data/test/logster/test_logger.rb +14 -14
  47. data/test/logster/test_message.rb +29 -31
  48. data/test/logster/test_pattern.rb +7 -15
  49. data/test/logster/test_redis_rate_limiter.rb +35 -21
  50. data/test/logster/test_redis_store.rb +239 -151
  51. data/test/test_helper.rb +9 -9
  52. metadata +19 -4
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../test_helper'
4
- require 'logster/redis_store'
5
- require 'rack'
3
+ require_relative "../test_helper"
4
+ require "logster/redis_store"
5
+ require "rack"
6
6
 
7
7
  class TestRedisStore < Minitest::Test
8
-
9
8
  def setup
10
9
  @store = Logster::RedisStore.new(Redis.new)
11
10
  @store.clear_all
@@ -28,8 +27,8 @@ class TestRedisStore < Minitest::Test
28
27
  def test_delete_with_custom_grouping_patterns
29
28
  Logster.config.enable_custom_patterns_via_ui = true
30
29
  Logster::GroupingPattern.new(/delete/, store: @store).save
31
- msg1 = @store.report(Logger::WARN, '', 'this will be deleted')
32
- msg2 = @store.report(Logger::WARN, '', 'delete this plz')
30
+ msg1 = @store.report(Logger::WARN, "", "this will be deleted")
31
+ msg2 = @store.report(Logger::WARN, "", "delete this plz")
33
32
 
34
33
  groups = @store.find_pattern_groups
35
34
  assert_equal 1, groups.size
@@ -53,7 +52,7 @@ class TestRedisStore < Minitest::Test
53
52
  keys = []
54
53
  gkeys = []
55
54
  6.times do |n|
56
- m = @store.report(Logger::WARN, '', "#{n} delete")
55
+ m = @store.report(Logger::WARN, "", "#{n} delete")
57
56
  keys << m.key
58
57
  gkeys << m.grouping_key
59
58
  end
@@ -90,15 +89,11 @@ class TestRedisStore < Minitest::Test
90
89
  end
91
90
 
92
91
  def test_latest_after
93
- 10.times do |i|
94
- @store.report(Logger::WARN, "test", "A#{i}")
95
- end
92
+ 10.times { |i| @store.report(Logger::WARN, "test", "A#{i}") }
96
93
 
97
94
  message = @store.latest[-1]
98
95
 
99
- 3.times do |i|
100
- @store.report(Logger::WARN, "test", i.to_s)
101
- end
96
+ 3.times { |i| @store.report(Logger::WARN, "test", i.to_s) }
102
97
 
103
98
  message = @store.latest(after: message.key, limit: 3)[0]
104
99
 
@@ -106,15 +101,9 @@ class TestRedisStore < Minitest::Test
106
101
  end
107
102
 
108
103
  def test_latest_before
109
- 10.times do
110
- @store.report(Logger::WARN, "test", "A")
111
- end
112
- 10.times do
113
- @store.report(Logger::WARN, "test", "B")
114
- end
115
- 10.times do
116
- @store.report(Logger::WARN, "test", "C")
117
- end
104
+ 10.times { @store.report(Logger::WARN, "test", "A") }
105
+ 10.times { @store.report(Logger::WARN, "test", "B") }
106
+ 10.times { @store.report(Logger::WARN, "test", "C") }
118
107
 
119
108
  messages = @store.latest(limit: 10)
120
109
  assert_equal("C", messages[0].message)
@@ -133,23 +122,21 @@ class TestRedisStore < Minitest::Test
133
122
  Logster.config.enable_custom_patterns_via_ui = true
134
123
  Logster::GroupingPattern.new(/group 1/, store: @store).save
135
124
  Logster::GroupingPattern.new(/group 2/, store: @store).save
136
- msg1 = @store.report(Logger::WARN, '', 'first message')
125
+ msg1 = @store.report(Logger::WARN, "", "first message")
137
126
  group_1_keys = []
138
- 3.times { |n| group_1_keys << @store.report(Logger::WARN, '', "group 1 #{n}").key }
139
- msg2 = @store.report(Logger::WARN, '', 'second message')
140
- group_1_keys << @store.report(Logger::WARN, '', "group 1 3").key
141
- msg3 = @store.report(Logger::WARN, '', 'third message')
127
+ 3.times { |n| group_1_keys << @store.report(Logger::WARN, "", "group 1 #{n}").key }
128
+ msg2 = @store.report(Logger::WARN, "", "second message")
129
+ group_1_keys << @store.report(Logger::WARN, "", "group 1 3").key
130
+ msg3 = @store.report(Logger::WARN, "", "third message")
142
131
  group_2_keys = []
143
- 3.times { |n| group_2_keys << @store.report(Logger::WARN, '', "group 2 #{n}").key }
144
- msg4 = @store.report(Logger::WARN, '', 'fourth message')
132
+ 3.times { |n| group_2_keys << @store.report(Logger::WARN, "", "group 2 #{n}").key }
133
+ msg4 = @store.report(Logger::WARN, "", "fourth message")
145
134
 
146
135
  results = @store.latest
147
- assert_equal [msg1.key, msg2.key, "/group 1/", msg3.key, "/group 2/", msg4.key], results.map(&:key)
136
+ assert_equal [msg1.key, msg2.key, "/group 1/", msg3.key, "/group 2/", msg4.key],
137
+ results.map(&:key)
148
138
  groups = results.select { |r| r.class == Logster::Group::GroupWeb }
149
- assert_equal(
150
- [group_1_keys.last, group_2_keys.last],
151
- groups.map(&:row_id)
152
- )
139
+ assert_equal([group_1_keys.last, group_2_keys.last], groups.map(&:row_id))
153
140
  assert_equal 4, groups[0].messages.size
154
141
  assert_equal 3, groups[1].messages.size
155
142
 
@@ -172,7 +159,7 @@ class TestRedisStore < Minitest::Test
172
159
  results = @store.latest(after: msg4.key)
173
160
  assert_equal 0, results.size
174
161
 
175
- group_2_keys << @store.report(Logger::WARN, '', "group 2 3").key
162
+ group_2_keys << @store.report(Logger::WARN, "", "group 2 3").key
176
163
  results = @store.latest(after: msg4.key)
177
164
  assert_equal ["/group 2/"], results.map(&:key)
178
165
  assert_equal group_2_keys.last, results[0].row_id
@@ -243,7 +230,7 @@ class TestRedisStore < Minitest::Test
243
230
  message = @store.report(Logger::WARN, "test", "A", env: old_env)
244
231
 
245
232
  extra_env = { "saved_env" => "saved value!" }
246
- similar = @store.report(Logger::WARN, 'test', 'A', env: extra_env)
233
+ similar = @store.report(Logger::WARN, "test", "A", env: extra_env)
247
234
  message.merge_similar_message(similar)
248
235
 
249
236
  @store.replace_and_bump(message)
@@ -256,9 +243,7 @@ class TestRedisStore < Minitest::Test
256
243
  def test_ensure_env_doesnt_exceed_50_item
257
244
  Logster.config.allow_grouping = true
258
245
  message = nil
259
- 52.times do |n|
260
- message = @store.report(Logger::WARN, "", "mssage", env: { a: n })
261
- end
246
+ 52.times { |n| message = @store.report(Logger::WARN, "", "mssage", env: { a: n }) }
262
247
  message = @store.get(message.key)
263
248
  assert_equal(52, message.count)
264
249
  assert_equal(50, message.env.size)
@@ -337,17 +322,15 @@ class TestRedisStore < Minitest::Test
337
322
  def test_clear
338
323
  env = { "clear_env" => "cllleear" }
339
324
  @store.max_backlog = 25
340
- a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24 * 60 * 60), env: env)
325
+ a_message =
326
+ @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24 * 60 * 60), env: env)
341
327
  @store.protect a_message.key
342
- 20.times do
343
- @store.report(Logger::WARN, "test", "B", env: env)
344
- end
345
- c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24 * 60 * 60), env: env)
328
+ 20.times { @store.report(Logger::WARN, "test", "B", env: env) }
329
+ c_message =
330
+ @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24 * 60 * 60), env: env)
346
331
  @store.protect c_message.key
347
332
  d_message = @store.report(Logger::WARN, "test", "D", env: env)
348
- 10.times do
349
- @store.report(Logger::WARN, "test", "E", env: env)
350
- end
333
+ 10.times { @store.report(Logger::WARN, "test", "E", env: env) }
351
334
 
352
335
  latest = @store.latest
353
336
  assert_equal(25, latest.length)
@@ -376,9 +359,9 @@ class TestRedisStore < Minitest::Test
376
359
  Logster.config.allow_grouping = true
377
360
  Logster::GroupingPattern.new(/discourse/, store: @store).save
378
361
  Logster::GroupingPattern.new(/logster/, store: @store).save
379
- msg = @store.report(Logger::WARN, '', 'discourse')
362
+ msg = @store.report(Logger::WARN, "", "discourse")
380
363
  @store.protect(msg.key)
381
- @store.report(Logger::WARN, '', 'logster')
364
+ @store.report(Logger::WARN, "", "logster")
382
365
  groups = @store.find_pattern_groups
383
366
  assert_equal 2, groups.size
384
367
 
@@ -386,7 +369,7 @@ class TestRedisStore < Minitest::Test
386
369
  groups = @store.find_pattern_groups
387
370
  assert_equal 1, groups.size
388
371
  assert_equal msg.key, groups[0].messages_keys[0]
389
- assert_equal '/discourse/', groups[0].key
372
+ assert_equal "/discourse/", groups[0].key
390
373
 
391
374
  @store.unprotect(msg.key)
392
375
  @store.clear
@@ -416,13 +399,9 @@ class TestRedisStore < Minitest::Test
416
399
  messages = @store.latest(after: messages.last.key)
417
400
  assert_equal(0, messages.length)
418
401
 
419
- 10.times do
420
- @store.report(Logger::INFO, "test", "A")
421
- end
402
+ 10.times { @store.report(Logger::INFO, "test", "A") }
422
403
  @store.report(Logger::ERROR, "test", "C")
423
- 10.times do
424
- @store.report(Logger::INFO, "test", "A")
425
- end
404
+ 10.times { @store.report(Logger::INFO, "test", "A") }
426
405
 
427
406
  latest = @store.latest(severity: [Logger::ERROR, Logger::WARN], limit: 2)
428
407
 
@@ -524,8 +503,8 @@ class TestRedisStore < Minitest::Test
524
503
  m1 = @store.get(m1_key)
525
504
  m2 = @store.get(m2_key)
526
505
  # original env should preserved in redis memory
527
- assert_equal(["business5", "standard3"], m1.env.map { |env| env["cluster"] })
528
- assert_equal(["business2", "standard7"], m2.env.map { |env| env["cluster"] })
506
+ assert_equal(%w[business5 standard3], m1.env.map { |env| env["cluster"] })
507
+ assert_equal(%w[business2 standard7], m2.env.map { |env| env["cluster"] })
529
508
  end
530
509
 
531
510
  def test_both_env_and_title_match_search
@@ -543,12 +522,27 @@ class TestRedisStore < Minitest::Test
543
522
  begin
544
523
  Logster.config.allow_grouping = true
545
524
  backtrace = caller
546
- message = @store.report(Logger::WARN, "", "my error", env: { whatever: "something", backtrace: backtrace })
525
+ message =
526
+ @store.report(
527
+ Logger::WARN,
528
+ "",
529
+ "my error",
530
+ env: {
531
+ whatever: "something",
532
+ backtrace: backtrace,
533
+ },
534
+ )
547
535
 
548
- @store.ignore = [
549
- Logster::IgnorePattern.new("business")
550
- ]
551
- @store.report(Logger::WARN, "", "my error", env: { cluster: "business17", backtrace: backtrace })
536
+ @store.ignore = [Logster::IgnorePattern.new("business")]
537
+ @store.report(
538
+ Logger::WARN,
539
+ "",
540
+ "my error",
541
+ env: {
542
+ cluster: "business17",
543
+ backtrace: backtrace,
544
+ },
545
+ )
552
546
 
553
547
  message = @store.get(message.key)
554
548
  assert(Array === message.env)
@@ -565,8 +559,20 @@ class TestRedisStore < Minitest::Test
565
559
  end
566
560
 
567
561
  def test_array_env_negative_search
568
- @store.report(Logger::INFO, "test", "message ABCD", env: [{ cluster: "business5" }, { cluster: "standard3" }], count: 2)
569
- @store.report(Logger::INFO, "test", "message WXYZ", env: [{ cluster: "business2" }, { cluster: "standard7" }], count: 2)
562
+ @store.report(
563
+ Logger::INFO,
564
+ "test",
565
+ "message ABCD",
566
+ env: [{ cluster: "business5" }, { cluster: "standard3" }],
567
+ count: 2,
568
+ )
569
+ @store.report(
570
+ Logger::INFO,
571
+ "test",
572
+ "message WXYZ",
573
+ env: [{ cluster: "business2" }, { cluster: "standard7" }],
574
+ count: 2,
575
+ )
570
576
 
571
577
  messages = @store.latest
572
578
  assert_equal(2, messages.length)
@@ -581,14 +587,26 @@ class TestRedisStore < Minitest::Test
581
587
  end
582
588
 
583
589
  def test_negative_search_MUST_not_match_title_in_order_to_include_message
584
- @store.report(Logger::INFO, "test", "message ABCD", env: [{ cluster: "business5" }, { cluster: "standard3" }], count: 2)
590
+ @store.report(
591
+ Logger::INFO,
592
+ "test",
593
+ "message ABCD",
594
+ env: [{ cluster: "business5" }, { cluster: "standard3" }],
595
+ count: 2,
596
+ )
585
597
 
586
598
  messages = @store.latest(search: "-ABCD")
587
599
  assert_equal(0, messages.size) # cause title has ABCD
588
600
  end
589
601
 
590
602
  def test_positive_search_looks_at_title_OR_env
591
- @store.report(Logger::INFO, "test", "message", env: [{ cluster: "business5 ABCDEFG" }, { cluster: "standard3" }], count: 2)
603
+ @store.report(
604
+ Logger::INFO,
605
+ "test",
606
+ "message",
607
+ env: [{ cluster: "business5 ABCDEFG" }, { cluster: "standard3" }],
608
+ count: 2,
609
+ )
592
610
 
593
611
  messages = @store.latest(search: "ABCDEFG")
594
612
  assert_equal(1, messages.size)
@@ -624,34 +642,82 @@ class TestRedisStore < Minitest::Test
624
642
  assert_equal(1, @store.latest.count)
625
643
 
626
644
  @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1")
627
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
645
+ @store.report(
646
+ Logger::WARN,
647
+ "application",
648
+ "test error1",
649
+ backtrace: "backtrace1",
650
+ env: {
651
+ "application_version" => "xyz",
652
+ },
653
+ )
628
654
 
629
655
  assert_equal(2, @store.latest.count)
630
-
631
656
  ensure
632
657
  Logster.config.application_version = nil
633
658
  end
634
659
 
635
660
  def test_solve_grouped
636
661
  Logster.config.allow_grouping = true
637
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
638
- m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg" })
662
+ @store.report(
663
+ Logger::WARN,
664
+ "application",
665
+ "test error1",
666
+ backtrace: "backtrace1",
667
+ env: {
668
+ "application_version" => "xyz",
669
+ },
670
+ )
671
+ m =
672
+ @store.report(
673
+ Logger::WARN,
674
+ "application",
675
+ "test error1",
676
+ backtrace: "backtrace1",
677
+ env: {
678
+ "application_version" => "efg",
679
+ },
680
+ )
639
681
 
640
682
  assert_equal(1, @store.latest.count)
641
683
 
642
684
  @store.solve(m.key)
643
685
 
644
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
645
- @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg" })
686
+ @store.report(
687
+ Logger::WARN,
688
+ "application",
689
+ "test error1",
690
+ backtrace: "backtrace1",
691
+ env: {
692
+ "application_version" => "xyz",
693
+ },
694
+ )
695
+ @store.report(
696
+ Logger::WARN,
697
+ "application",
698
+ "test error1",
699
+ backtrace: "backtrace1",
700
+ env: {
701
+ "application_version" => "efg",
702
+ },
703
+ )
646
704
 
647
705
  assert_equal(0, @store.latest.count)
648
-
649
706
  ensure
650
707
  Logster.config.allow_grouping = false
651
708
  end
652
709
 
653
710
  def test_clears_solved
654
- m = @store.report(Logger::WARN, "application", "test error2", backtrace: "backtrace1", env: { "application_version" => "abc" })
711
+ m =
712
+ @store.report(
713
+ Logger::WARN,
714
+ "application",
715
+ "test error2",
716
+ backtrace: "backtrace1",
717
+ env: {
718
+ "application_version" => "abc",
719
+ },
720
+ )
655
721
  @store.solve(m.key)
656
722
 
657
723
  assert_equal(1, @store.solved.length)
@@ -661,8 +727,16 @@ class TestRedisStore < Minitest::Test
661
727
  end
662
728
 
663
729
  def test_solving_with_some_missing_version
664
-
665
- m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
730
+ m =
731
+ @store.report(
732
+ Logger::WARN,
733
+ "application",
734
+ "test error1",
735
+ backtrace: "backtrace1",
736
+ env: {
737
+ "application_version" => "xyz",
738
+ },
739
+ )
666
740
  @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1")
667
741
 
668
742
  @store.solve(m.key)
@@ -671,27 +745,20 @@ class TestRedisStore < Minitest::Test
671
745
  end
672
746
 
673
747
  def test_env
674
- env = Rack::MockRequest.env_for("/test").merge(
675
- "HTTP_HOST" => "www.site.com",
676
- "HTTP_USER_AGENT" => "SOME WHERE"
677
- )
748
+ env =
749
+ Rack::MockRequest.env_for("/test").merge(
750
+ "HTTP_HOST" => "www.site.com",
751
+ "HTTP_USER_AGENT" => "SOME WHERE",
752
+ )
678
753
  orig = env.dup
679
754
  orig["test"] = "tests"
680
755
  orig["test1"] = "tests1"
681
756
  Logster.add_to_env(env, "test", "tests")
682
757
  Logster.add_to_env(env, "test1", "tests1")
683
758
 
684
- orig.delete_if do |k, v|
685
- !%w{
686
- HTTP_HOST
687
- REQUEST_METHOD
688
- HTTP_USER_AGENT
689
- test
690
- test1
691
- }.include? k
692
- end
759
+ orig.delete_if { |k, v| !%w[HTTP_HOST REQUEST_METHOD HTTP_USER_AGENT test test1].include? k }
693
760
 
694
- @store.report(Logger::INFO, "test", "test", env: env)
761
+ @store.report(Logger::INFO, "test", "test", env: env)
695
762
 
696
763
  env = @store.latest.last.env
697
764
 
@@ -717,7 +784,11 @@ class TestRedisStore < Minitest::Test
717
784
  end
718
785
 
719
786
  def test_suppressed_logs_are_counted
720
- @store.ignore = [/store ignore/, Logster::IgnorePattern.new(/ignore pattern/), "an ignore string"]
787
+ @store.ignore = [
788
+ /store ignore/,
789
+ Logster::IgnorePattern.new(/ignore pattern/),
790
+ "an ignore string",
791
+ ]
721
792
  @store.allow_custom_patterns = true
722
793
  Logster::SuppressionPattern.new(/sup pattern/, store: @store).save
723
794
 
@@ -741,7 +812,7 @@ class TestRedisStore < Minitest::Test
741
812
  end
742
813
 
743
814
  def test_rate_limits
744
- %w{minute hour}.each do |duration|
815
+ %w[minute hour].each do |duration|
745
816
  begin
746
817
  called = false
747
818
 
@@ -749,7 +820,7 @@ class TestRedisStore < Minitest::Test
749
820
  Logster::RedisRateLimiter,
750
821
  @store.public_send("register_rate_limit_per_#{duration}", Logger::WARN, 0) do
751
822
  called = true
752
- end
823
+ end,
753
824
  )
754
825
 
755
826
  @store.report(Logger::WARN, "test", "test")
@@ -762,25 +833,25 @@ class TestRedisStore < Minitest::Test
762
833
 
763
834
  def test_rate_limits_only_checks_when_message_is_bumped_or_saved
764
835
  Logster.config.allow_grouping = true
765
- Logster.config.application_version = 'abc'
836
+ Logster.config.application_version = "abc"
766
837
 
767
838
  @store.ignore = [/^ActiveRecord::RecordNotFound/]
768
839
  rate_limit = @store.register_rate_limit_per_minute(Logger::WARN, 0)
769
840
 
770
- message = @store.report(Logger::WARN, 'message 1', "Error!", backtrace: 'here')
841
+ message = @store.report(Logger::WARN, "message 1", "Error!", backtrace: "here")
771
842
  assert_equal(1, rate_limit.retrieve_rate)
772
843
 
773
- @store.report(Logger::WARN, 'message 1', "Error!", backtrace: 'here')
844
+ @store.report(Logger::WARN, "message 1", "Error!", backtrace: "here")
774
845
  assert_equal(2, rate_limit.retrieve_rate)
775
846
 
776
847
  @store.solve(message.key)
777
- @store.report(Logger::WARN, 'message 1', "Error!", backtrace: 'here')
848
+ @store.report(Logger::WARN, "message 1", "Error!", backtrace: "here")
778
849
  assert_equal(2, rate_limit.retrieve_rate)
779
850
 
780
- @store.report(Logger::WARN, 'message 2', "Error!")
851
+ @store.report(Logger::WARN, "message 2", "Error!")
781
852
  assert_equal(3, rate_limit.retrieve_rate)
782
853
 
783
- @store.report(Logger::WARN, 'message 3', "ActiveRecord::RecordNotFound")
854
+ @store.report(Logger::WARN, "message 3", "ActiveRecord::RecordNotFound")
784
855
  assert_equal(3, rate_limit.retrieve_rate)
785
856
  ensure
786
857
  Logster.config.allow_grouping = false
@@ -792,7 +863,7 @@ class TestRedisStore < Minitest::Test
792
863
  begin
793
864
  time = Time.now
794
865
  Timecop.freeze(time)
795
- current_namespace = 'first'
866
+ current_namespace = "first"
796
867
  @store.redis_prefix = Proc.new { current_namespace }
797
868
 
798
869
  called_first = 0
@@ -802,14 +873,14 @@ class TestRedisStore < Minitest::Test
802
873
  @store.report(Logger::WARN, "test", "test")
803
874
  assert_equal(1, called_first)
804
875
 
805
- current_namespace = 'second'
876
+ current_namespace = "second"
806
877
  @store.register_rate_limit_per_minute(Logger::WARN, 0) { called_second += 1 }
807
878
  @store.report(Logger::WARN, "test", "test")
808
879
  assert_equal(1, called_first)
809
880
  assert_equal(1, called_second)
810
881
 
811
882
  Timecop.freeze(time + 10) do
812
- current_namespace = 'first'
883
+ current_namespace = "first"
813
884
  @store.report(Logger::WARN, "test", "test")
814
885
 
815
886
  assert_equal(2, called_first)
@@ -845,10 +916,18 @@ class TestRedisStore < Minitest::Test
845
916
  config_reset(
846
917
  maximum_message_size_bytes: 300,
847
918
  max_env_bytes: 30,
848
- max_env_count_per_message: 5
919
+ max_env_count_per_message: 5,
849
920
  ) do
850
921
  env = [{ aaa: 111, bbb: 222, ccc: 333, ddd: 444 }] * 7
851
- message = @store.report(Logger::WARN, '', 'test', backtrace: "aa\n" * 100, env: env.dup, timestamp: 777)
922
+ message =
923
+ @store.report(
924
+ Logger::WARN,
925
+ "",
926
+ "test",
927
+ backtrace: "aa\n" * 100,
928
+ env: env.dup,
929
+ timestamp: 777,
930
+ )
852
931
  message = @store.get(message.key)
853
932
  assert_operator(message.to_json(exclude_env: true).bytesize, :<, 300)
854
933
  assert_equal(5, message.env.size)
@@ -860,34 +939,43 @@ class TestRedisStore < Minitest::Test
860
939
  end
861
940
 
862
941
  def test_ensure_messages_meet_config_size_limits_when_merged_together
863
-
864
- config_reset(
865
- max_env_bytes: 30,
866
- max_env_count_per_message: 5,
867
- allow_grouping: true
868
- ) do
942
+ config_reset(max_env_bytes: 30, max_env_count_per_message: 5, allow_grouping: true) do
869
943
  env = [{ a: 1, aa: 22, aaa: 333, aaaa: 4444 }] * 3
870
944
  env_2 = [{ b: 1, bb: 22, bbb: 333, bbbb: 4444 }] * 3
871
- @store.report(Logger::WARN, '', 'test', backtrace: "aa\n" * 100, env: env.dup, timestamp: 777)
872
- message = @store.report(Logger::WARN, '', 'test', backtrace: "aa\n" * 100, env: env_2.dup, timestamp: 777)
945
+ @store.report(Logger::WARN, "", "test", backtrace: "aa\n" * 100, env: env.dup, timestamp: 777)
946
+ message =
947
+ @store.report(
948
+ Logger::WARN,
949
+ "",
950
+ "test",
951
+ backtrace: "aa\n" * 100,
952
+ env: env_2.dup,
953
+ timestamp: 777,
954
+ )
873
955
  message = @store.get(message.key)
874
956
  assert_equal(5, message.env.size)
875
- message.env.first(3).each do |e|
876
- assert_operator(e.to_json.bytesize, :<=, 30)
877
- assert_equal({ "b" => 1, "bb" => 22, "time" => 777 }, e)
878
- end
879
- message.env.last(2).each do |e|
880
- assert_operator(e.to_json.bytesize, :<=, 30)
881
- assert_equal({ "a" => 1, "aa" => 22, "time" => 777 }, e)
882
- end
957
+ message
958
+ .env
959
+ .first(3)
960
+ .each do |e|
961
+ assert_operator(e.to_json.bytesize, :<=, 30)
962
+ assert_equal({ "b" => 1, "bb" => 22, "time" => 777 }, e)
963
+ end
964
+ message
965
+ .env
966
+ .last(2)
967
+ .each do |e|
968
+ assert_operator(e.to_json.bytesize, :<=, 30)
969
+ assert_equal({ "a" => 1, "aa" => 22, "time" => 777 }, e)
970
+ end
883
971
  end
884
972
  end
885
973
 
886
974
  def test_custom_grouping_patterns
887
975
  Logster.config.enable_custom_patterns_via_ui = true
888
976
  Logster::GroupingPattern.new(/delete/, store: @store).save
889
- msg1 = @store.report(Logger::WARN, '', 'delete this plz', timestamp: 1)
890
- msg2 = @store.report(Logger::WARN, '', 'delete that plz', timestamp: 2)
977
+ msg1 = @store.report(Logger::WARN, "", "delete this plz", timestamp: 1)
978
+ msg2 = @store.report(Logger::WARN, "", "delete that plz", timestamp: 2)
891
979
  group = @store.find_pattern_groups(load_messages: true)[0]
892
980
  assert_equal 2, group.count
893
981
  assert_equal "/delete/", group.key
@@ -902,9 +990,9 @@ class TestRedisStore < Minitest::Test
902
990
  Logster.config.allow_grouping = true
903
991
  Logster::GroupingPattern.new(/delete/, store: @store).save
904
992
  backtrace = caller
905
- @store.report(Logger::WARN, '', 'delete this plz', backtrace: backtrace, timestamp: 1)
906
- msg2 = @store.report(Logger::WARN, '', 'delete that plz', backtrace: backtrace, timestamp: 2)
907
- msg3 = @store.report(Logger::WARN, '', 'delete this plz', backtrace: backtrace, timestamp: 3)
993
+ @store.report(Logger::WARN, "", "delete this plz", backtrace: backtrace, timestamp: 1)
994
+ msg2 = @store.report(Logger::WARN, "", "delete that plz", backtrace: backtrace, timestamp: 2)
995
+ msg3 = @store.report(Logger::WARN, "", "delete this plz", backtrace: backtrace, timestamp: 3)
908
996
  group = @store.find_pattern_groups(load_messages: false)[0]
909
997
  assert_equal 2, group.count
910
998
  assert_equal [msg3.key, msg2.key], group.messages_keys
@@ -918,10 +1006,10 @@ class TestRedisStore < Minitest::Test
918
1006
  Logster.config.enable_custom_patterns_via_ui = true
919
1007
  Logster::GroupingPattern.new(/delete/, store: @store).save
920
1008
  Logster::GroupingPattern.new(/env/, store: @store).save
921
- @store.report(Logger::WARN, '', 'delete and env')
1009
+ @store.report(Logger::WARN, "", "delete and env")
922
1010
  groups = @store.find_pattern_groups
923
1011
  assert_equal 1, groups.size
924
- assert_includes ["/delete/", "/env/"], groups[0].key
1012
+ assert_includes %w[/delete/ /env/], groups[0].key
925
1013
  ensure
926
1014
  Logster.config.enable_custom_patterns_via_ui = false
927
1015
  end
@@ -936,8 +1024,8 @@ class TestRedisStore < Minitest::Test
936
1024
  assert_equal 0, groups.size # because there are no messages yet
937
1025
 
938
1026
  2.times do |n|
939
- @store.report(Logger::WARN, '', "with search #{n}")
940
- @store.report(Logger::WARN, '', "pattern group #{n}")
1027
+ @store.report(Logger::WARN, "", "with search #{n}")
1028
+ @store.report(Logger::WARN, "", "pattern group #{n}")
941
1029
  end
942
1030
  groups = @store.find_pattern_groups
943
1031
  assert_equal 2, groups.size
@@ -968,9 +1056,7 @@ class TestRedisStore < Minitest::Test
968
1056
  Logster.config.enable_custom_patterns_via_ui = true
969
1057
  Logster::GroupingPattern.new(/trim/, store: @store).save
970
1058
  keys = []
971
- 5.times do |n|
972
- keys << @store.report(Logger::WARN, '', "trim backlog #{n}").key
973
- end
1059
+ 5.times { |n| keys << @store.report(Logger::WARN, "", "trim backlog #{n}").key }
974
1060
  groups = @store.find_pattern_groups
975
1061
  assert_equal 1, groups.size
976
1062
  assert_equal 4, groups[0].messages_keys.size
@@ -983,14 +1069,14 @@ class TestRedisStore < Minitest::Test
983
1069
 
984
1070
  def test_adding_grouping_pattern_works_retroactively
985
1071
  Logster.config.enable_custom_patterns_via_ui = true
986
- @store.report(Logger::WARN, '', 'trim this plz')
987
- @store.report(Logger::WARN, '', 'trim that plz')
1072
+ @store.report(Logger::WARN, "", "trim this plz")
1073
+ @store.report(Logger::WARN, "", "trim that plz")
988
1074
  Logster::GroupingPattern.new(/trim/, store: @store).save
989
1075
  results = @store.latest
990
1076
  assert_equal 1, results.size
991
1077
  assert_equal 2, results[0].messages.size
992
1078
 
993
- @store.report(Logger::WARN, '', 'trim this more plz')
1079
+ @store.report(Logger::WARN, "", "trim this more plz")
994
1080
  results = @store.latest
995
1081
  assert_equal 1, results.size
996
1082
  assert_equal 3, results[0].messages.size
@@ -1000,8 +1086,8 @@ class TestRedisStore < Minitest::Test
1000
1086
 
1001
1087
  def test_adding_grouping_pattern_doesnt_add_a_message_to_more_than_one_group
1002
1088
  Logster.config.enable_custom_patterns_via_ui = true
1003
- @store.report(Logger::WARN, '', 'trim this plz')
1004
- @store.report(Logger::WARN, '', 'trim this plz 2')
1089
+ @store.report(Logger::WARN, "", "trim this plz")
1090
+ @store.report(Logger::WARN, "", "trim this plz 2")
1005
1091
  Logster::GroupingPattern.new(/trim/, store: @store).save
1006
1092
  Logster::GroupingPattern.new(/this/, store: @store).save
1007
1093
  groups = @store.find_pattern_groups
@@ -1014,18 +1100,18 @@ class TestRedisStore < Minitest::Test
1014
1100
  def test_latest_doesnt_include_rows_that_are_removed_from_grouping_patterns_due_to_max_size
1015
1101
  Logster.config.enable_custom_patterns_via_ui = true
1016
1102
  Logster::Group.instance_variable_set(:@max_size, 5)
1017
- msg1 = @store.report(Logger::WARN, '', 'first message')
1018
- msg2 = @store.report(Logger::WARN, '', 'second message')
1103
+ msg1 = @store.report(Logger::WARN, "", "first message")
1104
+ msg2 = @store.report(Logger::WARN, "", "second message")
1019
1105
  Logster::GroupingPattern.new(/noisy/, store: @store).save
1020
1106
 
1021
1107
  grouped = []
1022
1108
  7.times do |n|
1023
- grouped << @store.report(Logger::WARN, '', "noisy message #{n}", timestamp: n).key
1109
+ grouped << @store.report(Logger::WARN, "", "noisy message #{n}", timestamp: n).key
1024
1110
  end
1025
- msg3 = @store.report(Logger::WARN, '', 'third message')
1111
+ msg3 = @store.report(Logger::WARN, "", "third message")
1026
1112
  results = @store.latest
1027
1113
 
1028
- assert_equal [msg1.key, msg2.key, '/noisy/', msg3.key], results.map(&:key)
1114
+ assert_equal [msg1.key, msg2.key, "/noisy/", msg3.key], results.map(&:key)
1029
1115
  assert_equal grouped.reverse.first(5), results[2].messages.map(&:key)
1030
1116
  ensure
1031
1117
  Logster.config.enable_custom_patterns_via_ui = false
@@ -1036,10 +1122,14 @@ class TestRedisStore < Minitest::Test
1036
1122
  config_reset(allow_grouping: true) do
1037
1123
  backtrace = "a" * Logster.config.maximum_message_size_bytes
1038
1124
  title = "sasasas"
1039
- msg = @store.report(Logger::WARN, '', title, backtrace: backtrace.dup)
1040
- msg2 = @store.report(Logger::WARN, '', title, backtrace: backtrace.dup)
1125
+ msg = @store.report(Logger::WARN, "", title, backtrace: backtrace.dup)
1126
+ msg2 = @store.report(Logger::WARN, "", title, backtrace: backtrace.dup)
1041
1127
  assert_equal(msg.key, msg2.key)
1042
- assert_operator(msg.to_json(exclude_env: true).bytesize, :<=, Logster.config.maximum_message_size_bytes)
1128
+ assert_operator(
1129
+ msg.to_json(exclude_env: true).bytesize,
1130
+ :<=,
1131
+ Logster.config.maximum_message_size_bytes,
1132
+ )
1043
1133
  assert_operator(msg.backtrace.size, :<, backtrace.size)
1044
1134
  end
1045
1135
  end
@@ -1050,13 +1140,13 @@ class TestRedisStore < Minitest::Test
1050
1140
  DistributedMutex("download_20450e291e8f1e5ba03ca7f20fb7d9da570c94a6"):
1051
1141
  held for too long, expected max: 60 secs, took an extra 73 secs
1052
1142
  TEXT
1053
- msg = @store.report(Logger::WARN, '', first_message, backtrace: caller)
1143
+ msg = @store.report(Logger::WARN, "", first_message, backtrace: caller)
1054
1144
 
1055
1145
  second_message = <<~TEXT
1056
1146
  DistributedMutex("download_e09ae082c60a351dedec67ed869652862b232a0b"):
1057
1147
  held for too long, expected max: 60 secs, took an extra 287 secs
1058
1148
  TEXT
1059
- msg2 = @store.report(Logger::WARN, '', second_message, backtrace: caller)
1149
+ msg2 = @store.report(Logger::WARN, "", second_message, backtrace: caller)
1060
1150
 
1061
1151
  assert_equal(msg.key, msg2.key)
1062
1152
  end
@@ -1072,9 +1162,7 @@ class TestRedisStore < Minitest::Test
1072
1162
  end
1073
1163
  yield
1074
1164
  ensure
1075
- defaults.each do |k, v|
1076
- Logster.config.public_send("#{k}=", v)
1077
- end
1165
+ defaults.each { |k, v| Logster.config.public_send("#{k}=", v) }
1078
1166
  end
1079
1167
 
1080
1168
  def reset_redis