logster 2.20.1 → 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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +23 -92
  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/group.rb +2 -2
  12. data/lib/logster/message.rb +4 -4
  13. data/lib/logster/middleware/reporter.rb +34 -3
  14. data/lib/logster/middleware/viewer.rb +205 -33
  15. data/lib/logster/rails/railtie.rb +4 -20
  16. data/lib/logster/redis_store.rb +0 -2
  17. data/lib/logster/version.rb +1 -1
  18. data/lib/logster.rb +1 -1
  19. metadata +17 -186
  20. data/.github/workflows/ci.yml +0 -140
  21. data/.gitignore +0 -3
  22. data/.rubocop.yml +0 -8
  23. data/.streerc +0 -2
  24. data/Gemfile +0 -10
  25. data/Guardfile +0 -10
  26. data/Rakefile +0 -27
  27. data/assets/javascript/.gitkeep +0 -0
  28. data/assets/javascript/chunk.524.c3042190e39d148beaf9.js +0 -22
  29. data/assets/javascript/chunk.582.695dcbfb11a784b110cd.js +0 -22
  30. data/assets/javascript/chunk.747.a730c497582bb6742a6e.js +0 -579
  31. data/assets/javascript/chunk.761.64949d89942c829e5c1b.js +0 -1213
  32. data/assets/javascript/client-app.js +0 -1390
  33. data/assets/stylesheets/.gitkeep +0 -0
  34. data/assets/stylesheets/client-app.css +0 -1
  35. data/assets/stylesheets/vendor.css +0 -1
  36. data/build_client_app.sh +0 -10
  37. data/client-app/.editorconfig +0 -19
  38. data/client-app/.ember-cli +0 -9
  39. data/client-app/.eslintignore +0 -20
  40. data/client-app/.eslintrc +0 -10
  41. data/client-app/.gitignore +0 -23
  42. data/client-app/.prettierignore +0 -21
  43. data/client-app/.prettierrc +0 -1
  44. data/client-app/.template-lintrc.js +0 -10
  45. data/client-app/.watchmanconfig +0 -3
  46. data/client-app/README.md +0 -56
  47. data/client-app/app/app.js +0 -12
  48. data/client-app/app/components/actions-menu.js +0 -50
  49. data/client-app/app/components/back-to-site-link.js +0 -9
  50. data/client-app/app/components/back-trace.js +0 -153
  51. data/client-app/app/components/env-tab.js +0 -68
  52. data/client-app/app/components/message-info.js +0 -151
  53. data/client-app/app/components/message-row.js +0 -46
  54. data/client-app/app/components/page-nav.js +0 -42
  55. data/client-app/app/components/panel-resizer.js +0 -108
  56. data/client-app/app/components/patterns-list.js +0 -142
  57. data/client-app/app/components/tab-contents.js +0 -23
  58. data/client-app/app/components/tabbed-section.js +0 -45
  59. data/client-app/app/components/time-formatter.js +0 -36
  60. data/client-app/app/controllers/index.js +0 -269
  61. data/client-app/app/controllers/show.js +0 -39
  62. data/client-app/app/helpers/logster-url.js +0 -12
  63. data/client-app/app/helpers/or.js +0 -7
  64. data/client-app/app/index.html +0 -31
  65. data/client-app/app/initializers/app-init.js +0 -71
  66. data/client-app/app/lib/decorators.js +0 -13
  67. data/client-app/app/lib/preload.js +0 -43
  68. data/client-app/app/lib/utilities.js +0 -230
  69. data/client-app/app/models/group.js +0 -34
  70. data/client-app/app/models/message-collection.js +0 -303
  71. data/client-app/app/models/message.js +0 -128
  72. data/client-app/app/models/pattern-item.js +0 -32
  73. data/client-app/app/resolver.js +0 -3
  74. data/client-app/app/router.js +0 -13
  75. data/client-app/app/routes/index.js +0 -64
  76. data/client-app/app/routes/settings.js +0 -32
  77. data/client-app/app/routes/show.js +0 -16
  78. data/client-app/app/services/events.js +0 -4
  79. data/client-app/app/styles/app.css +0 -829
  80. data/client-app/app/templates/application.hbs +0 -1
  81. data/client-app/app/templates/components/actions-menu.hbs +0 -31
  82. data/client-app/app/templates/components/back-to-site-link.hbs +0 -8
  83. data/client-app/app/templates/components/back-trace.hbs +0 -15
  84. data/client-app/app/templates/components/env-tab.hbs +0 -10
  85. data/client-app/app/templates/components/message-info.hbs +0 -86
  86. data/client-app/app/templates/components/message-row.hbs +0 -32
  87. data/client-app/app/templates/components/page-nav.hbs +0 -37
  88. data/client-app/app/templates/components/panel-resizer.hbs +0 -3
  89. data/client-app/app/templates/components/patterns-list.hbs +0 -78
  90. data/client-app/app/templates/components/tabbed-section.hbs +0 -18
  91. data/client-app/app/templates/components/time-formatter.hbs +0 -1
  92. data/client-app/app/templates/index.hbs +0 -165
  93. data/client-app/app/templates/settings.hbs +0 -47
  94. data/client-app/app/templates/show.hbs +0 -13
  95. data/client-app/config/ember-cli-update.json +0 -18
  96. data/client-app/config/environment.js +0 -51
  97. data/client-app/config/icons.js +0 -28
  98. data/client-app/config/optional-features.json +0 -6
  99. data/client-app/config/targets.js +0 -26
  100. data/client-app/ember-cli-build.js +0 -28
  101. data/client-app/package.json +0 -76
  102. data/client-app/preload-json-manager.rb +0 -35
  103. data/client-app/public/assets/images/icon_144x144.png +0 -0
  104. data/client-app/public/assets/images/icon_64x64.png +0 -0
  105. data/client-app/testem.js +0 -23
  106. data/client-app/tests/index.html +0 -41
  107. data/client-app/tests/integration/components/back-to-site-link-test.js +0 -20
  108. data/client-app/tests/integration/components/back-trace-test.js +0 -138
  109. data/client-app/tests/integration/components/env-tab-test.js +0 -220
  110. data/client-app/tests/integration/components/message-info-test.js +0 -122
  111. data/client-app/tests/integration/components/patterns-list-test.js +0 -76
  112. data/client-app/tests/test-helper.js +0 -12
  113. data/client-app/tests/unit/controllers/index-test.js +0 -77
  114. data/client-app/tests/unit/controllers/show-test.js +0 -12
  115. data/client-app/tests/unit/routes/index-test.js +0 -11
  116. data/client-app/tests/unit/routes/show-test.js +0 -11
  117. data/client-app/yarn.lock +0 -9905
  118. data/gemfiles/rails_6.1.gemfile +0 -12
  119. data/gemfiles/rails_7.0.gemfile +0 -12
  120. data/gemfiles/rails_7.1.gemfile +0 -9
  121. data/gemfiles/rails_7.2.gemfile +0 -9
  122. data/logster.gemspec +0 -43
  123. data/test/dummy/config/application.rb +0 -31
  124. data/test/dummy/config/boot.rb +0 -6
  125. data/test/dummy/config/environment.rb +0 -6
  126. data/test/examples/test_sidekiq_reporter_example.rb +0 -47
  127. data/test/fake_data/Gemfile +0 -6
  128. data/test/fake_data/generate.rb +0 -23
  129. data/test/logster/middleware/test_reporter.rb +0 -84
  130. data/test/logster/middleware/test_viewer.rb +0 -495
  131. data/test/logster/test_base_store.rb +0 -224
  132. data/test/logster/test_cache.rb +0 -39
  133. data/test/logster/test_defer_logger.rb +0 -36
  134. data/test/logster/test_group.rb +0 -92
  135. data/test/logster/test_ignore_pattern.rb +0 -42
  136. data/test/logster/test_logger.rb +0 -177
  137. data/test/logster/test_message.rb +0 -269
  138. data/test/logster/test_pattern.rb +0 -144
  139. data/test/logster/test_railtie.rb +0 -21
  140. data/test/logster/test_redis_rate_limiter.rb +0 -246
  141. data/test/logster/test_redis_store.rb +0 -1165
  142. data/test/test_helper.rb +0 -44
@@ -1,269 +0,0 @@
1
- import classic from "ember-classic-decorator";
2
- import { debounce } from "@ember/runloop";
3
- import { action, computed } from "@ember/object";
4
- import Controller from "@ember/controller";
5
- import {
6
- ajax,
7
- getLocalStorage,
8
- setLocalStorage,
9
- } from "client-app/lib/utilities";
10
- import Preload from "client-app/lib/preload";
11
- import { tracked } from "@glimmer/tracking";
12
-
13
- @classic
14
- export default class IndexController extends Controller {
15
- @tracked loading = false;
16
- @tracked buildingGroupingPattern = false;
17
- @tracked rowMessagesForGroupingPattern = [];
18
-
19
- showDebug = getLocalStorage("showDebug", false);
20
- showInfo = getLocalStorage("showInfo", false);
21
- showWarn = getLocalStorage("showWarn", true);
22
- showErr = getLocalStorage("showErr", true);
23
- showFatal = getLocalStorage("showFatal", true);
24
- search = null;
25
- queryParams = ["search"];
26
-
27
- @computed
28
- get showSettings() {
29
- return Preload.get("patterns_enabled");
30
- }
31
-
32
- @computed
33
- get backToSiteLinkText() {
34
- return Preload.get("back_to_site_link_text");
35
- }
36
-
37
- @computed
38
- get backToSiteLinkPath() {
39
- return Preload.get("back_to_site_link_path");
40
- }
41
-
42
- @computed
43
- get hasTopMenu() {
44
- return this.backToSiteLinkText && this.backToSiteLinkPath;
45
- }
46
-
47
- get actionsInMenu() {
48
- return (
49
- /mobile/i.test(navigator.userAgent) && !/iPad/.test(navigator.userAgent)
50
- );
51
- }
52
-
53
- get showCreateGroupingPattern() {
54
- return (
55
- this.buildingGroupingPattern &&
56
- this.rowMessagesForGroupingPattern.length > 1
57
- );
58
- }
59
-
60
- @computed("search")
61
- get searchTerm() {
62
- if (this.search) {
63
- this.doSearch(this.search);
64
- return this.search;
65
- }
66
- return null;
67
- }
68
-
69
- async doSearch(term) {
70
- this.model.set("search", term);
71
- this.loading = true;
72
- await this.model.reload();
73
- this.loading = false;
74
- this.model.updateSelectedRow();
75
- }
76
-
77
- resizePanels(amount) {
78
- const bottomPanel = document.getElementById("bottom-panel");
79
- const topPanel = document.getElementById("top-panel");
80
- bottomPanel.style.height = `${amount - 13}px`;
81
- topPanel.style.bottom = `${amount + 12}px`;
82
- }
83
-
84
- @action
85
- expandMessage(message) {
86
- message.expand();
87
- }
88
-
89
- @action
90
- selectRowAction(row, opts = {}) {
91
- this.model.selectRow(row, opts);
92
- }
93
-
94
- @action
95
- handleCheckboxChange(row, event) {
96
- if (event.target.checked) {
97
- this.rowMessagesForGroupingPattern = [
98
- ...this.rowMessagesForGroupingPattern,
99
- row.message,
100
- ];
101
- } else {
102
- this.rowMessagesForGroupingPattern =
103
- this.rowMessagesForGroupingPattern.filter((i) => i !== row.message);
104
- }
105
- }
106
-
107
- @action
108
- tabChangedAction(newTab) {
109
- this.model.tabChanged(newTab);
110
- }
111
-
112
- @action
113
- showMoreBefore() {
114
- this.model.showMoreBefore();
115
- }
116
-
117
- @action
118
- loadMore() {
119
- return this.model.loadMore();
120
- }
121
-
122
- @action
123
- async clear() {
124
- // eslint-disable-next-line no-alert
125
- if (confirm("Clear the logs?\n\nCancel = No, OK = Clear")) {
126
- await ajax("/clear", { type: "POST" });
127
- this.model.reload();
128
- this.loading = false;
129
- }
130
- }
131
-
132
- @action
133
- removeMessage(msg) {
134
- const group = this.model.currentRow.group ? this.model.currentRow : null;
135
- const rows = this.model.rows;
136
- const idx = group ? rows.indexOf(group) : rows.indexOf(msg);
137
-
138
- msg.destroy();
139
- msg.set("selected", false);
140
- this.model.set("total", this.model.total - 1);
141
- let removedRow = false;
142
- let messageIndex = 0;
143
-
144
- if (group) {
145
- messageIndex = group.messages.indexOf(msg);
146
- group.messages.removeObject(msg);
147
- messageIndex = Math.min(messageIndex, group.messages.length - 1);
148
- if (group.messages.length === 0) {
149
- rows.removeObject(group);
150
- removedRow = true;
151
- }
152
- } else {
153
- rows.removeObject(msg);
154
- removedRow = true;
155
- }
156
-
157
- if (removedRow) {
158
- if (idx > 0) {
159
- this.model.selectRow(rows[idx - 1]);
160
- } else if (this.model.total > 0) {
161
- this.model.selectRow(rows[0]);
162
- } else {
163
- this.model.reload();
164
- }
165
- } else if (group) {
166
- this.model.selectRow(rows[idx], { messageIndex });
167
- }
168
- }
169
-
170
- @action
171
- solveMessage(msg) {
172
- this.model.solve(msg);
173
- }
174
-
175
- @action
176
- groupedMessageChangedAction(newPosition) {
177
- this.model.groupedMessageChanged(newPosition);
178
- }
179
-
180
- @action
181
- envChangedAction(newPosition) {
182
- this.model.envChanged(newPosition);
183
- }
184
-
185
- @action
186
- async updateFilter(name) {
187
- this.toggleProperty(name);
188
- this.model.set(name, this[name]);
189
- setLocalStorage(name, this[name]);
190
- this.loading = true;
191
- await this.model.reload();
192
- this.loading = false;
193
- this.model.updateSelectedRow();
194
- }
195
-
196
- @action
197
- updateSearch(event) {
198
- const term = event.target.value;
199
-
200
- if (term === this.search) {
201
- return;
202
- }
203
-
204
- if (term && term.length === 1) {
205
- return;
206
- }
207
-
208
- debounce(this, this.doSearch, term, 250);
209
- }
210
-
211
- @action
212
- toggleGroupingPatternFromSelectedRows() {
213
- this.buildingGroupingPattern = !this.buildingGroupingPattern;
214
- this.rowMessagesForGroupingPattern = [];
215
- }
216
-
217
- @action
218
- async createGroupingPatternFromSelectedRows() {
219
- let match = this.findLongestMatchingPrefix(
220
- this.rowMessagesForGroupingPattern
221
- );
222
- match = this.escapeRegExp(match);
223
-
224
- if (
225
- match.trim().length &&
226
- // eslint-disable-next-line no-alert
227
- confirm(
228
- `Do you want to create the grouping pattern\n\n"${match}"\n\nCancel = No, OK = Create`
229
- )
230
- ) {
231
- await ajax("/patterns/grouping.json", {
232
- method: "POST",
233
- data: {
234
- pattern: match,
235
- },
236
- });
237
- this.rowMessagesForGroupingPattern = [];
238
- this.buildingGroupingPattern = false;
239
- this.model.reload();
240
- } else if (!match.trim().length) {
241
- // eslint-disable-next-line no-alert
242
- alert("Can not create a grouping pattern with the given rows");
243
- }
244
- }
245
-
246
- findLongestMatchingPrefix(strings) {
247
- const shortestString = strings.reduce(
248
- (shortest, str) => (str.length < shortest.length ? str : shortest),
249
- strings[0]
250
- );
251
-
252
- let longestMatchingSubstring = "";
253
- for (let i = 0; i < shortestString.length; i++) {
254
- const currentSubstring = shortestString.substring(0, i + 1);
255
-
256
- if (strings.every((str) => str.includes(currentSubstring))) {
257
- longestMatchingSubstring = currentSubstring;
258
- } else {
259
- break;
260
- }
261
- }
262
-
263
- return longestMatchingSubstring;
264
- }
265
-
266
- escapeRegExp(string) {
267
- return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
268
- }
269
- }
@@ -1,39 +0,0 @@
1
- import classic from "ember-classic-decorator";
2
- import Controller, { inject as controller } from "@ember/controller";
3
- import { action } from "@ember/object";
4
- import { inject as service } from "@ember/service";
5
-
6
- @classic
7
- export default class ShowController extends Controller {
8
- @service router;
9
- @controller("index") indexController;
10
-
11
- envPosition = 0;
12
-
13
- @action
14
- protect() {
15
- this.model.protect();
16
- }
17
-
18
- @action
19
- unprotect() {
20
- this.model.unprotect();
21
- }
22
-
23
- @action
24
- async solveMessage(msg) {
25
- await msg.solve();
26
- this.router.transitionTo("index");
27
- }
28
-
29
- @action
30
- async removeMessage(msg) {
31
- await msg.destroy();
32
- this.router.transitionTo("index");
33
- }
34
-
35
- @action
36
- envChanged(newPosition) {
37
- this.set("envPosition", newPosition);
38
- }
39
- }
@@ -1,12 +0,0 @@
1
- import { helper } from "@ember/component/helper";
2
- import { getRootPath } from "client-app/lib/preload";
3
-
4
- export function logsterUrl(arr) {
5
- let url = arr[0];
6
- if (url[0] !== "/") {
7
- url = `/${url}`;
8
- }
9
- return getRootPath() + url;
10
- }
11
-
12
- export default helper(logsterUrl);
@@ -1,7 +0,0 @@
1
- import { helper } from "@ember/component/helper";
2
-
3
- export function or(params) {
4
- return params.some((p) => p);
5
- }
6
-
7
- export default helper(or);
@@ -1,31 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
- <title>ClientApp</title>
7
- <meta name="description" content="">
8
- <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0, user-scalable=yes">
9
- <meta id="preloaded-data" data-root-path="/logs">
10
- <meta name="color-scheme" content="dark light">
11
-
12
- {{content-for "head"}}
13
-
14
- <link integrity="" rel="stylesheet" href="{{rootURL}}assets/vendor.css">
15
- <link integrity="" rel="stylesheet" href="{{rootURL}}assets/client-app.css">
16
- <link rel="shortcut icon" href="{{rootURL}}assets/images/icon_64x64.png">
17
-
18
- <link href='//fonts.googleapis.com/css?family=Roboto' rel='stylesheet' type='text/css'>
19
- <link href='//fonts.googleapis.com/css?family=Roboto+Mono' rel='stylesheet' type='text/css'>
20
-
21
- {{content-for "head-footer"}}
22
- </head>
23
- <body>
24
- {{content-for "body"}}
25
-
26
- <script src="{{rootURL}}assets/vendor.js"></script>
27
- <script src="{{rootURL}}assets/client-app.js"></script>
28
-
29
- {{content-for "body-footer"}}
30
- </body>
31
- </html>
@@ -1,71 +0,0 @@
1
- import {
2
- ajax,
3
- resetTitleCount,
4
- updateHiddenProperty,
5
- } from "client-app/lib/utilities";
6
- import { setRootPath } from "client-app/lib/preload";
7
-
8
- export async function initialize(app) {
9
- const config = app.resolveRegistration("config:environment");
10
- setRootPath(config.rootURL.replace(/\/$/, ""));
11
-
12
- if (config.environment === "development") {
13
- app.deferReadiness();
14
-
15
- try {
16
- const data = await ajax("/development-preload.json");
17
- const elem = document.getElementById("preloaded-data");
18
- elem.setAttribute("data-preloaded", JSON.stringify(data));
19
- } catch (xhr) {
20
- console.error("Fetching preload data failed.", xhr); // eslint-disable-line no-console
21
- } finally {
22
- app.advanceReadiness();
23
- }
24
- }
25
-
26
- // config for moment.js
27
- moment.updateLocale("en", {
28
- relativeTime: {
29
- future: "in %s",
30
- past: "%s ago",
31
- s: "secs",
32
- m: "a min",
33
- mm: "%d mins",
34
- h: "an hr",
35
- hh: "%d hrs",
36
- d: "a day",
37
- dd: "%d days",
38
- M: "a mth",
39
- MM: "%d mths",
40
- y: "a yr",
41
- yy: "%d yrs",
42
- },
43
- });
44
-
45
- // setup event for updating document title and title count
46
- let hiddenProperty;
47
- let visibilitychange;
48
-
49
- for (const prefix of ["", "webkit", "ms", "moz", "ms"]) {
50
- const check = prefix + (prefix === "" ? "hidden" : "Hidden");
51
-
52
- if (document[check] !== undefined) {
53
- hiddenProperty = check;
54
- visibilitychange = prefix + "visibilitychange";
55
- break;
56
- }
57
- }
58
-
59
- updateHiddenProperty(hiddenProperty);
60
- document.addEventListener(visibilitychange, resetTitleCount, false);
61
-
62
- const isMobile =
63
- /mobile/i.test(navigator.userAgent) && !/iPad/.test(navigator.userAgent);
64
- if (isMobile) {
65
- document.body.classList.add("mobile");
66
- }
67
- }
68
-
69
- export default {
70
- initialize,
71
- };
@@ -1,13 +0,0 @@
1
- export function bound(target, key, desc) {
2
- const orig = desc.value;
3
- const boundKey = `_${key}Bound`;
4
- return {
5
- get() {
6
- if (this[boundKey]) {
7
- return this[boundKey];
8
- }
9
- this.set(boundKey, orig.bind(this));
10
- return this[boundKey];
11
- },
12
- };
13
- }
@@ -1,43 +0,0 @@
1
- import { set } from "@ember/object";
2
-
3
- let CONTAINER = {};
4
- let isInitialized = false;
5
- let rootPath;
6
-
7
- export function setRootPath(path) {
8
- rootPath = path;
9
- }
10
-
11
- export function getRootPath() {
12
- return rootPath;
13
- }
14
-
15
- // exported so that it can be used in tests
16
- export function init() {
17
- const dataset = document.getElementById("preloaded-data").dataset;
18
- CONTAINER = dataset.preloaded ? JSON.parse(dataset.preloaded) : {};
19
- CONTAINER.rootPath = rootPath;
20
- isInitialized = true;
21
- }
22
-
23
- export default {
24
- get(key) {
25
- if (!isInitialized) {
26
- init();
27
- }
28
- return CONTAINER[key];
29
- },
30
- };
31
-
32
- // used in tests
33
- export function mutatePreload(key, value) {
34
- if (!isInitialized) {
35
- init();
36
- }
37
-
38
- set(CONTAINER, key, value);
39
- }
40
-
41
- export function uninitialize() {
42
- isInitialized = false;
43
- }