logster 2.21.0 → 3.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.
Files changed (140) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/README.md +29 -14
  4. data/assets/javascript/main-B82IoCiW.js +1 -0
  5. data/assets/javascript/modules-4-12-BHA4lR2U.js +1 -0
  6. data/assets/javascript/vendor.js +11 -5260
  7. data/assets/logster-config.json +18 -0
  8. data/assets/manifest.json +23 -0
  9. data/assets/stylesheets/main-CgAFFyi8.css +1 -0
  10. data/lib/logster/configuration.rb +1 -0
  11. data/lib/logster/middleware/reporter.rb +34 -3
  12. data/lib/logster/middleware/viewer.rb +204 -32
  13. data/lib/logster/rails/railtie.rb +4 -20
  14. data/lib/logster/redis_store.rb +0 -2
  15. data/lib/logster/version.rb +1 -1
  16. data/lib/logster.rb +1 -1
  17. metadata +17 -186
  18. data/.github/workflows/ci.yml +0 -140
  19. data/.gitignore +0 -3
  20. data/.rubocop.yml +0 -12
  21. data/.streerc +0 -2
  22. data/Gemfile +0 -10
  23. data/Guardfile +0 -10
  24. data/Rakefile +0 -24
  25. data/assets/javascript/.gitkeep +0 -0
  26. data/assets/javascript/chunk.524.b7d0b89d25457a72409c.js +0 -22
  27. data/assets/javascript/chunk.582.5a04ae4713e692cd335a.js +0 -22
  28. data/assets/javascript/chunk.747.a730c497582bb6742a6e.js +0 -579
  29. data/assets/javascript/chunk.761.64949d89942c829e5c1b.js +0 -1213
  30. data/assets/javascript/client-app.js +0 -1389
  31. data/assets/stylesheets/.gitkeep +0 -0
  32. data/assets/stylesheets/client-app.css +0 -1
  33. data/assets/stylesheets/vendor.css +0 -1
  34. data/build_client_app.sh +0 -10
  35. data/client-app/.editorconfig +0 -19
  36. data/client-app/.ember-cli +0 -9
  37. data/client-app/.eslintignore +0 -20
  38. data/client-app/.eslintrc +0 -10
  39. data/client-app/.gitignore +0 -23
  40. data/client-app/.prettierignore +0 -21
  41. data/client-app/.prettierrc +0 -1
  42. data/client-app/.template-lintrc.js +0 -10
  43. data/client-app/.watchmanconfig +0 -3
  44. data/client-app/README.md +0 -56
  45. data/client-app/app/app.js +0 -12
  46. data/client-app/app/components/actions-menu.js +0 -50
  47. data/client-app/app/components/back-to-site-link.js +0 -9
  48. data/client-app/app/components/back-trace.js +0 -153
  49. data/client-app/app/components/env-tab.js +0 -68
  50. data/client-app/app/components/message-info.js +0 -151
  51. data/client-app/app/components/message-row.js +0 -46
  52. data/client-app/app/components/page-nav.js +0 -42
  53. data/client-app/app/components/panel-resizer.js +0 -108
  54. data/client-app/app/components/patterns-list.js +0 -142
  55. data/client-app/app/components/tab-contents.js +0 -23
  56. data/client-app/app/components/tabbed-section.js +0 -45
  57. data/client-app/app/components/time-formatter.js +0 -36
  58. data/client-app/app/controllers/index.js +0 -288
  59. data/client-app/app/controllers/show.js +0 -39
  60. data/client-app/app/helpers/logster-url.js +0 -12
  61. data/client-app/app/helpers/or.js +0 -7
  62. data/client-app/app/index.html +0 -31
  63. data/client-app/app/initializers/app-init.js +0 -71
  64. data/client-app/app/lib/decorators.js +0 -13
  65. data/client-app/app/lib/preload.js +0 -43
  66. data/client-app/app/lib/utilities.js +0 -230
  67. data/client-app/app/models/group.js +0 -34
  68. data/client-app/app/models/message-collection.js +0 -303
  69. data/client-app/app/models/message.js +0 -128
  70. data/client-app/app/models/pattern-item.js +0 -32
  71. data/client-app/app/resolver.js +0 -3
  72. data/client-app/app/router.js +0 -13
  73. data/client-app/app/routes/index.js +0 -64
  74. data/client-app/app/routes/settings.js +0 -32
  75. data/client-app/app/routes/show.js +0 -16
  76. data/client-app/app/services/events.js +0 -4
  77. data/client-app/app/styles/app.css +0 -898
  78. data/client-app/app/templates/application.hbs +0 -1
  79. data/client-app/app/templates/components/actions-menu.hbs +0 -31
  80. data/client-app/app/templates/components/back-to-site-link.hbs +0 -8
  81. data/client-app/app/templates/components/back-trace.hbs +0 -15
  82. data/client-app/app/templates/components/env-tab.hbs +0 -10
  83. data/client-app/app/templates/components/message-info.hbs +0 -86
  84. data/client-app/app/templates/components/message-row.hbs +0 -32
  85. data/client-app/app/templates/components/page-nav.hbs +0 -37
  86. data/client-app/app/templates/components/panel-resizer.hbs +0 -3
  87. data/client-app/app/templates/components/patterns-list.hbs +0 -78
  88. data/client-app/app/templates/components/tabbed-section.hbs +0 -18
  89. data/client-app/app/templates/components/time-formatter.hbs +0 -1
  90. data/client-app/app/templates/index.hbs +0 -192
  91. data/client-app/app/templates/settings.hbs +0 -47
  92. data/client-app/app/templates/show.hbs +0 -13
  93. data/client-app/config/ember-cli-update.json +0 -18
  94. data/client-app/config/environment.js +0 -51
  95. data/client-app/config/icons.js +0 -28
  96. data/client-app/config/optional-features.json +0 -6
  97. data/client-app/config/targets.js +0 -26
  98. data/client-app/ember-cli-build.js +0 -34
  99. data/client-app/package.json +0 -76
  100. data/client-app/preload-json-manager.rb +0 -35
  101. data/client-app/public/assets/images/icon_144x144.png +0 -0
  102. data/client-app/public/assets/images/icon_64x64.png +0 -0
  103. data/client-app/testem.js +0 -23
  104. data/client-app/tests/index.html +0 -41
  105. data/client-app/tests/integration/components/back-to-site-link-test.js +0 -20
  106. data/client-app/tests/integration/components/back-trace-test.js +0 -138
  107. data/client-app/tests/integration/components/env-tab-test.js +0 -220
  108. data/client-app/tests/integration/components/message-info-test.js +0 -122
  109. data/client-app/tests/integration/components/patterns-list-test.js +0 -76
  110. data/client-app/tests/test-helper.js +0 -12
  111. data/client-app/tests/unit/controllers/index-test.js +0 -77
  112. data/client-app/tests/unit/controllers/show-test.js +0 -12
  113. data/client-app/tests/unit/routes/index-test.js +0 -11
  114. data/client-app/tests/unit/routes/show-test.js +0 -11
  115. data/client-app/yarn.lock +0 -9905
  116. data/gemfiles/rails_6.1.gemfile +0 -12
  117. data/gemfiles/rails_7.0.gemfile +0 -12
  118. data/gemfiles/rails_7.1.gemfile +0 -9
  119. data/gemfiles/rails_7.2.gemfile +0 -9
  120. data/logster.gemspec +0 -43
  121. data/test/dummy/config/application.rb +0 -31
  122. data/test/dummy/config/boot.rb +0 -6
  123. data/test/dummy/config/environment.rb +0 -6
  124. data/test/examples/test_sidekiq_reporter_example.rb +0 -47
  125. data/test/fake_data/Gemfile +0 -6
  126. data/test/fake_data/generate.rb +0 -23
  127. data/test/logster/middleware/test_reporter.rb +0 -84
  128. data/test/logster/middleware/test_viewer.rb +0 -495
  129. data/test/logster/test_base_store.rb +0 -224
  130. data/test/logster/test_cache.rb +0 -39
  131. data/test/logster/test_defer_logger.rb +0 -36
  132. data/test/logster/test_group.rb +0 -92
  133. data/test/logster/test_ignore_pattern.rb +0 -42
  134. data/test/logster/test_logger.rb +0 -177
  135. data/test/logster/test_message.rb +0 -269
  136. data/test/logster/test_pattern.rb +0 -144
  137. data/test/logster/test_railtie.rb +0 -21
  138. data/test/logster/test_redis_rate_limiter.rb +0 -246
  139. data/test/logster/test_redis_store.rb +0 -1165
  140. data/test/test_helper.rb +0 -66
@@ -1,495 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "../../test_helper"
4
- require "rack"
5
- require "logster/redis_store"
6
- require "logster/middleware/viewer"
7
-
8
- class TestViewer < Minitest::Test
9
- class BrokenApp
10
- def call(env)
11
- [500, {}, ["broken"]]
12
- end
13
- end
14
-
15
- def setup
16
- Logster.config.subdirectory = "/logsie"
17
- Logster.store = Logster::RedisStore.new
18
- Logster.store.clear_all
19
- end
20
-
21
- def teardown
22
- Logster.config.subdirectory = nil
23
- Logster.store.clear_all
24
- Logster.store = nil
25
- end
26
-
27
- def viewer
28
- @viewer ||= Logster::Middleware::Viewer.new(nil)
29
- end
30
-
31
- def request
32
- @request ||= Rack::MockRequest.new(Rack::Lint.new(viewer))
33
- end
34
-
35
- def test_path_resolution
36
- assert_nil(viewer.send(:resolve_path, "/logs"))
37
- assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
38
- assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
39
- assert_equal("/", viewer.send(:resolve_path, "/logsie"))
40
- assert_equal("/", viewer.send(:resolve_path, "/logsie/"))
41
- assert_equal("/hello/world", viewer.send(:resolve_path, "/logsie/hello/world"))
42
- end
43
-
44
- def test_search_raceguard_s
45
- response = request.post("/logsie/messages.json?search=searchkey")
46
- result = JSON.parse(response.body)
47
- assert_equal("searchkey", result["search"])
48
- end
49
-
50
- def test_search_raceguard_sr
51
- response = request.post("/logsie/messages.json?search=/regex/&regex_search=true")
52
- result = JSON.parse(response.body)
53
- assert_equal("/regex/", result["search"])
54
- end
55
-
56
- def test_search_raceguard_f
57
- response = request.post("/logsie/messages.json?filter=0_1_2_3_4")
58
- result = JSON.parse(response.body)
59
- assert_equal([0, 1, 2, 3, 4], result["filter"])
60
- end
61
-
62
- def test_search_does_not_respond_to_get_requests
63
- response = request.get("/logsie/messages.json?filter=0_1_2_3_4")
64
- assert_equal(404, response.status)
65
- assert_equal("Not found", response.body)
66
- end
67
-
68
- def test_regex_parse
69
- assert_equal(/hello/i, viewer.send(:parse_regex, "/hello/i"))
70
- end
71
-
72
- def test_settings_page_responds_with_json
73
- Logster.store.ignore = [/somepattern/, /anotherpattern/]
74
- record = Logster::SuppressionPattern.new("custompattern")
75
- record.save
76
-
77
- Logster.store.report(Logger::INFO, "test", "somepattern")
78
- response = request.get("/logsie/settings.json")
79
- assert_equal(200, response.status)
80
- assert_includes(response.content_type, "application/json")
81
-
82
- json = JSON.parse(response.body)
83
- suppression = json["suppression"]
84
- custom_patterns = suppression.reject { |p| p["hard"] }.map { |p| p["value"] }
85
- coded_patterns = suppression.select { |p| p["hard"] }.map { |p| p["value"] }
86
- assert_includes(custom_patterns, "/custompattern/")
87
- assert_includes(coded_patterns, "/somepattern/")
88
- assert_includes(coded_patterns, "/anotherpattern/")
89
-
90
- Logster.store.ignore = nil
91
- record.destroy
92
-
93
- response = request.get("/logsie/settings.json")
94
- assert_equal(200, response.status)
95
- json = JSON.parse(response.body)
96
- assert_equal([], json["suppression"])
97
- ensure
98
- Logster.store.ignore = nil
99
- end
100
-
101
- def test_settings_page_responds_with_html
102
- response = request.get("/logsie/settings")
103
- assert_equal(200, response.status)
104
- assert_includes(response.content_type, "text/html")
105
- end
106
-
107
- def test_patterns_endpoint_doesnt_accept_GETs
108
- Logster.config.enable_custom_patterns_via_ui = true
109
-
110
- response =
111
- request.get("/logsie/patterns/suppression.json", params: { pattern: "patternfromuser" })
112
- assert_equal(405, response.status)
113
- assert_equal(0, Logster::SuppressionPattern.find_all.size)
114
- ensure
115
- Logster.config.enable_custom_patterns_via_ui = false
116
- end
117
-
118
- def test_patterns_endpoint_doesnt_work_when_its_disabled_from_config
119
- Logster.config.enable_custom_patterns_via_ui = false
120
-
121
- response =
122
- request.post("/logsie/patterns/suppression.json", params: { pattern: "patternfromuser" })
123
- assert_equal(403, response.status)
124
- assert_equal(0, Logster::SuppressionPattern.find_all.size)
125
- end
126
-
127
- def test_patterns_endpoint_doesnt_work_with_undefined_set
128
- Logster.config.enable_custom_patterns_via_ui = true
129
-
130
- response =
131
- request.post("/logsie/patterns/weirdset.json", params: { pattern: "disallowedpattern" })
132
- assert_equal(404, response.status)
133
- Logster::Pattern.child_classes.each { |klass| assert_equal(0, klass.find_all.size) }
134
- ensure
135
- Logster.config.enable_custom_patterns_via_ui = false
136
- end
137
-
138
- def test_creating_patterns_works
139
- Logster.config.enable_custom_patterns_via_ui = true
140
-
141
- response = request.post("/logsie/patterns/suppression.json", params: { pattern: "newpattern" })
142
- assert_equal(200, response.status)
143
- assert_equal(/newpattern/, Logster::SuppressionPattern.find_all.first)
144
-
145
- json = JSON.parse(response.body)
146
- assert_equal("/newpattern/", json["pattern"])
147
- ensure
148
- Logster.config.enable_custom_patterns_via_ui = false
149
- end
150
-
151
- def test_suppression_patterns_have_optional_retroactive_effect
152
- Logster.config.enable_custom_patterns_via_ui = true
153
-
154
- Logster.store.report(Logger::INFO, "test", "non-matching message")
155
- Logster.store.report(Logger::INFO, "test", "apple orange")
156
- Logster.store.report(Logger::INFO, "test", "apples oranges")
157
-
158
- request.post("/logsie/patterns/suppression.json", params: { pattern: "apple" })
159
- messages = Logster.store.latest
160
- assert_includes(messages.map(&:message), "apple orange")
161
- assert_includes(messages.map(&:message), "apples oranges")
162
- assert_includes(messages.map(&:message), "non-matching message")
163
-
164
- request.post(
165
- "/logsie/patterns/suppression.json",
166
- params: {
167
- pattern: "orange",
168
- retroactive: true,
169
- },
170
- )
171
- messages = Logster.store.latest
172
- assert_equal(1, messages.size)
173
- assert_equal("non-matching message", messages.first.message)
174
-
175
- response =
176
- request.post(
177
- "/logsie/patterns/suppression.json",
178
- params: {
179
- pattern: "doesntmatchanything",
180
- retroactive: true,
181
- },
182
- )
183
- # assert no error occures if it doesn't delete anything retroactively
184
- assert_equal(200, response.status)
185
- ensure
186
- Logster.config.enable_custom_patterns_via_ui = false
187
- end
188
-
189
- def test_modifying_patterns_returns_404_for_non_existing_patterns
190
- Logster.config.enable_custom_patterns_via_ui = true
191
-
192
- response =
193
- request.put(
194
- "/logsie/patterns/suppression.json",
195
- params: {
196
- new_pattern: "doesntexists",
197
- pattern: "doesntexisttoo",
198
- },
199
- )
200
-
201
- assert_equal(404, response.status)
202
- assert_equal(0, Logster::SuppressionPattern.find_all.size)
203
- ensure
204
- Logster.config.enable_custom_patterns_via_ui = false
205
- end
206
-
207
- def test_modifying_doesnt_accept_empty_regexp
208
- Logster.config.enable_custom_patterns_via_ui = true
209
- Logster::SuppressionPattern.new("goodcitizen").save
210
-
211
- response =
212
- request.put(
213
- "/logsie/patterns/suppression.json",
214
- params: {
215
- new_pattern: "",
216
- pattern: "goodcitizen",
217
- },
218
- )
219
-
220
- assert_equal(400, response.status)
221
- patterns = Logster::SuppressionPattern.find_all
222
- assert_equal(1, patterns.size)
223
- assert_equal(/goodcitizen/, patterns.first)
224
- ensure
225
- Logster.config.enable_custom_patterns_via_ui = false
226
- end
227
-
228
- def test_modifying_patterns_works
229
- Logster.config.enable_custom_patterns_via_ui = true
230
- Logster::SuppressionPattern.new("oldpattern").save
231
- Logster::SuppressionPattern.new("notgoinganywhere").save
232
-
233
- response =
234
- request.put(
235
- "/logsie/patterns/suppression.json",
236
- params: {
237
- pattern: "oldpattern",
238
- new_pattern: "brandnewpattern",
239
- },
240
- )
241
-
242
- assert_equal(200, response.status)
243
- patterns = Logster::SuppressionPattern.find_all
244
- assert_equal(2, patterns.size)
245
- assert_includes(patterns, /brandnewpattern/)
246
- assert_includes(patterns, /notgoinganywhere/)
247
-
248
- json = JSON.parse(response.body)
249
- assert_equal("/brandnewpattern/", json["pattern"])
250
- ensure
251
- Logster.config.enable_custom_patterns_via_ui = false
252
- end
253
-
254
- def test_removing_patterns_works
255
- Logster.config.enable_custom_patterns_via_ui = true
256
- Logster::SuppressionPattern.new("tobedeleted").save
257
- Logster::SuppressionPattern.new("notgoinganywhere").save
258
-
259
- response =
260
- request.delete("/logsie/patterns/suppression.json", params: { pattern: "tobedeleted" })
261
- assert_equal(200, response.status)
262
-
263
- response =
264
- request.delete("/logsie/patterns/suppression.json", params: { pattern: "doesntexistanymore" })
265
- assert_equal(404, response.status)
266
-
267
- patterns = Logster::SuppressionPattern.find_all
268
- assert_equal(1, patterns.size)
269
- assert_includes(patterns, /notgoinganywhere/)
270
- ensure
271
- Logster.config.enable_custom_patterns_via_ui = false
272
- end
273
-
274
- def test_clear_all_button_shouldnt_clear_custom_patterns
275
- Logster::SuppressionPattern.new("testpattern").save
276
-
277
- Logster.store.report(Logger::INFO, "test", "mysmalltest")
278
- Logster.store.report(Logger::INFO, "test", "another test")
279
-
280
- response = request.post("/logsie/clear")
281
-
282
- assert_equal(200, response.status)
283
- assert_equal(0, Logster.store.latest.size)
284
- records = Logster::SuppressionPattern.find_all
285
- assert_equal(1, records.size)
286
- assert_equal(/testpattern/, records.first)
287
- end
288
-
289
- def test_reset_ignore_count_works
290
- Logster.store.ignore = [/whatever store/]
291
- Logster.store.allow_custom_patterns = true
292
- Logster::SuppressionPattern.new(/custom pattern/).save
293
-
294
- Logster.store.report(Logger::INFO, "test", "something whatever store")
295
- Logster.store.report(Logger::INFO, "test", "this is for custom pattern")
296
-
297
- response = request.get("/logsie/settings.json")
298
- assert_equal(200, response.status)
299
- json = JSON.parse(response.body)
300
- suppression = json["suppression"]
301
- assert_equal("1", suppression.find { |p| p["value"] == "/whatever store/" }["count"])
302
- assert_equal("1", suppression.find { |p| p["value"] == "/custom pattern/" }["count"])
303
-
304
- response =
305
- request.put("/logsie/reset-count.json", params: { pattern: "/whatever store/", hard: true })
306
- assert_equal(200, response.status)
307
-
308
- response =
309
- request.put("/logsie/reset-count.json", params: { pattern: "/custom pattern/", hard: false })
310
- assert_equal(200, response.status)
311
-
312
- hash = Logster.store.get_all_ignore_count
313
- assert_equal({}, hash)
314
- end
315
-
316
- def test_linking_to_a_valid_js_files
317
- %w[/logsie/javascript/client-app.js /logsie/javascript/vendor.js].each do |path|
318
- response = request.get(path)
319
- assert_equal(200, response.status)
320
- assert %w[text/javascript application/javascript].include?(response.headers["content-type"])
321
- end
322
- end
323
-
324
- def test_linking_to_a_valid_css_files
325
- %w[/logsie/stylesheets/client-app.css /logsie/stylesheets/vendor.css].each do |path|
326
- response = request.get(path)
327
- assert_equal(200, response.status)
328
- assert_equal("text/css", response.headers["content-type"])
329
- end
330
- end
331
-
332
- def test_linking_to_an_invalid_ember_component_or_template
333
- %w[
334
- /logsie/javascript/templates/application.hbs
335
- /logsie/javascript/templates/does_not_exist.js
336
- /logsie/javascript/components/does_not_exist.js
337
- /logsie/javascript/templates/../../app.js
338
- ].each do |path|
339
- response = request.get(path)
340
- assert_equal(404, response.status, "#{path} should have 404'ed")
341
- end
342
- end
343
-
344
- def test_messages_endpoint_doesnt_include_envs_when_search_term_absent
345
- Logster.store.clear_all
346
- env = { "b" => 1, "c" => 2 }
347
- msg = Logster.store.report(Logger::INFO, "test", "something hello", env: env)
348
- response = request.post("/logsie/messages.json")
349
- assert_equal(200, response.status)
350
- messages = JSON.parse(response.body)["messages"]
351
- assert_equal(1, messages.size)
352
- msg = messages.first
353
- assert_equal("something hello", msg["message"])
354
- assert_nil(msg["env"])
355
- end
356
-
357
- def test_messages_endpoint_includes_env_when_there_is_search_term
358
- Logster.store.clear_all
359
- env = { "b" => 1, "c" => 2 }
360
- msg = Logster.store.report(Logger::INFO, "test", "something hello", env: env)
361
- response = request.post("/logsie/messages.json?search=something")
362
- assert_equal(200, response.status)
363
- messages = JSON.parse(response.body)["messages"]
364
- assert_equal(1, messages.size)
365
- msg = messages.first
366
- assert_equal("something hello", msg["message"])
367
- assert_includes(msg["env"].values, 1, 2)
368
- end
369
-
370
- def test_fetch_env_returns_env_associated_with_message
371
- env = { "b" => 1, "c" => 2 }
372
- msg = Logster.store.report(Logger::INFO, "test", "something whatever store", env: env)
373
- response = request.get("/logsie/fetch-env/#{msg.key}.json")
374
- assert_equal(200, response.status)
375
- res = JSON.parse(response.body)
376
- assert_includes(res.values, 1, 2)
377
- end
378
-
379
- def test_fetch_env_returns_404_when_invalid_key
380
- response = request.get("/logsie/fetch-env/123456abc.json")
381
- assert_equal(404, response.status)
382
- end
383
-
384
- def test_solve_group_api_requires_post_request
385
- Logster.config.enable_custom_patterns_via_ui = true
386
- Logster::GroupingPattern.new(/gotta be post/).save
387
- msg =
388
- Logster.store.report(
389
- Logger::WARN,
390
- "",
391
- "gotta be post 22",
392
- env: {
393
- "application_version" => "abc",
394
- },
395
- backtrace: "aa",
396
- )
397
- latest = Logster.store.latest
398
- assert_equal(1, latest.size)
399
- assert_equal(msg.key, latest.first["messages"].first.key)
400
- %i[get head options].each do |m|
401
- response = request.public_send(m, "/logsie/solve-group", params: { regex: "/gotta be post/" })
402
- assert_equal(405, response.status)
403
- assert_equal("POST", response.headers["allow"])
404
- end
405
- latest = Logster.store.latest
406
- assert_equal(1, latest.size)
407
- assert_equal(msg.key, latest.first["messages"].first.key)
408
- ensure
409
- Logster.config.enable_custom_patterns_via_ui = false
410
- end
411
-
412
- def test_solve_group_returns_404_when_pattern_doesnt_exist
413
- Logster.config.enable_custom_patterns_via_ui = true
414
- Logster::GroupingPattern.new(/some pattern/).save
415
- msg =
416
- Logster.store.report(
417
- Logger::WARN,
418
- "",
419
- "some pattern 22",
420
- env: {
421
- "application_version" => "abc",
422
- },
423
- backtrace: "aa",
424
- )
425
- latest = Logster.store.latest
426
- assert_equal(1, latest.size)
427
- assert_equal(msg.key, latest.first["messages"].first.key)
428
- response = request.post("/logsie/solve-group", params: { regex: "/i dont exist/" })
429
- assert_equal(404, response.status)
430
- latest = Logster.store.latest
431
- assert_equal(1, latest.size)
432
- assert_equal(msg.key, latest.first["messages"].first.key)
433
- ensure
434
- Logster.config.enable_custom_patterns_via_ui = false
435
- end
436
-
437
- def test_solving_grouped_messages
438
- Logster.config.enable_custom_patterns_via_ui = true
439
- backtrace = "a b c d"
440
- Logster::GroupingPattern.new(/test pattern/).save
441
- msg1 = Logster.store.report(Logger::WARN, "", "test pattern 1", backtrace: backtrace)
442
- msg2 =
443
- Logster.store.report(
444
- Logger::WARN,
445
- "",
446
- "test pattern 2",
447
- env: {
448
- "application_version" => "abc",
449
- },
450
- backtrace: backtrace,
451
- )
452
- msg3 =
453
- Logster.store.report(
454
- Logger::WARN,
455
- "",
456
- "test pattern 3",
457
- env: [{ "application_version" => "def" }, { "application_version" => "ghi" }],
458
- backtrace: backtrace,
459
- )
460
- group = Logster.store.find_pattern_groups { |p| p == /test pattern/ }.first
461
- assert_equal([msg3, msg2, msg1].map(&:key), group.messages_keys)
462
-
463
- latest = Logster.store.latest
464
- assert_equal(1, latest.size)
465
- assert_equal([msg1, msg2, msg3].map(&:key).sort, latest.first["messages"].map(&:key).sort)
466
-
467
- response = request.post("/logsie/solve-group", params: { regex: "/test pattern/" })
468
- group = Logster.store.find_pattern_groups { |p| p == /test pattern/ }.first
469
- assert_equal([msg1.key], group.messages_keys)
470
- assert_equal(200, response.status)
471
-
472
- latest = Logster.store.latest
473
- # msg1 remains cause it doesn't have application_version
474
- assert_equal([msg1.key], latest.first["messages"].map(&:key))
475
- assert_equal(1, latest.size)
476
-
477
- msg4 = Logster.store.report(Logger::WARN, "", "test pattern 4", backtrace: backtrace)
478
- %w[abc def ghi].each do |version|
479
- Logster.store.report(
480
- Logger::WARN,
481
- "",
482
- "test pattern 5",
483
- env: {
484
- "application_version" => version,
485
- },
486
- backtrace: backtrace,
487
- )
488
- end
489
- latest = Logster.store.latest
490
- assert_equal([msg1.key, msg4.key].sort, latest.first["messages"].map(&:key).sort)
491
- assert_equal(1, latest.size)
492
- ensure
493
- Logster.config.enable_custom_patterns_via_ui = false
494
- end
495
- end