logster 2.1.2 → 2.2.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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +224 -172
  6. data/Gemfile +4 -4
  7. data/Guardfile +8 -8
  8. data/LICENSE.txt +22 -22
  9. data/README.md +99 -99
  10. data/Rakefile +21 -21
  11. data/assets/fonts/FontAwesome.otf +0 -0
  12. data/assets/fonts/fontawesome-webfont.eot +0 -0
  13. data/assets/fonts/fontawesome-webfont.svg +639 -639
  14. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff +0 -0
  16. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  17. data/assets/images/Icon-144_rounded.png +0 -0
  18. data/assets/images/Icon-144_square.png +0 -0
  19. data/assets/images/icon_144x144.png +0 -0
  20. data/assets/images/icon_64x64.png +0 -0
  21. data/assets/javascript/client-app.js +115 -106
  22. data/assets/stylesheets/client-app.css +1 -1
  23. data/build_client_app.sh +0 -0
  24. data/client-app/.editorconfig +20 -20
  25. data/client-app/.ember-cli +9 -9
  26. data/client-app/.eslintignore +19 -19
  27. data/client-app/.eslintrc.js +46 -46
  28. data/client-app/.gitignore +23 -23
  29. data/client-app/.travis.yml +27 -27
  30. data/client-app/.watchmanconfig +3 -3
  31. data/client-app/README.md +57 -57
  32. data/client-app/app/app.js +0 -0
  33. data/client-app/app/components/actions-menu.js +43 -43
  34. data/client-app/app/components/env-tab.js +80 -80
  35. data/client-app/app/components/message-info.js +0 -0
  36. data/client-app/app/components/message-row.js +0 -0
  37. data/client-app/app/components/panel-resizer.js +0 -0
  38. data/client-app/app/components/patterns-list.js +109 -0
  39. data/client-app/app/components/tab-contents.js +27 -27
  40. data/client-app/app/components/tabbed-section.js +0 -0
  41. data/client-app/app/components/time-formatter.js +0 -0
  42. data/client-app/app/components/update-time.js +0 -0
  43. data/client-app/app/controllers/index.js +22 -6
  44. data/client-app/app/controllers/show.js +0 -0
  45. data/client-app/app/helpers/logster-url.js +12 -0
  46. data/client-app/app/helpers/or.js +7 -0
  47. data/client-app/app/index.html +30 -29
  48. data/client-app/app/initializers/app-init.js +67 -67
  49. data/client-app/app/lib/preload.js +20 -20
  50. data/client-app/app/lib/utilities.js +150 -149
  51. data/client-app/app/models/message-collection.js +0 -0
  52. data/client-app/app/models/message.js +100 -100
  53. data/client-app/app/models/pattern-item.js +25 -0
  54. data/client-app/app/resolver.js +0 -0
  55. data/client-app/app/router.js +1 -0
  56. data/client-app/app/routes/index.js +2 -9
  57. data/client-app/app/routes/settings.js +15 -0
  58. data/client-app/app/routes/show.js +0 -0
  59. data/client-app/app/styles/app.css +633 -527
  60. data/client-app/app/templates/application.hbs +2 -2
  61. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  62. data/client-app/app/templates/components/env-tab.hbs +10 -10
  63. data/client-app/app/templates/components/message-info.hbs +41 -41
  64. data/client-app/app/templates/components/message-row.hbs +15 -15
  65. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  66. data/client-app/app/templates/components/patterns-list.hbs +25 -0
  67. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  68. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  69. data/client-app/app/templates/index.hbs +65 -58
  70. data/client-app/app/templates/settings.hbs +26 -0
  71. data/client-app/app/templates/show.hbs +7 -7
  72. data/client-app/config/environment.js +51 -51
  73. data/client-app/config/optional-features.json +3 -3
  74. data/client-app/config/targets.js +18 -18
  75. data/client-app/ember-cli-build.js +29 -29
  76. data/client-app/package-lock.json +11357 -11365
  77. data/client-app/package.json +57 -56
  78. data/client-app/public/assets/images/icon_144x144.png +0 -0
  79. data/client-app/public/assets/images/icon_64x64.png +0 -0
  80. data/client-app/testem.js +25 -25
  81. data/client-app/tests/index.html +34 -34
  82. data/client-app/tests/integration/components/env-tab-test.js +134 -123
  83. data/client-app/tests/integration/components/message-info-test.js +111 -111
  84. data/client-app/tests/integration/components/patterns-list-test.js +56 -0
  85. data/client-app/tests/test-helper.js +8 -8
  86. data/client-app/tests/unit/controllers/index-test.js +12 -12
  87. data/client-app/tests/unit/controllers/show-test.js +12 -12
  88. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  89. data/client-app/tests/unit/routes/index-test.js +11 -11
  90. data/client-app/tests/unit/routes/show-test.js +11 -11
  91. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  92. data/lib/logster.rb +59 -54
  93. data/lib/logster/base_store.rb +169 -141
  94. data/lib/logster/cache.rb +20 -0
  95. data/lib/logster/configuration.rb +27 -26
  96. data/lib/logster/defer_logger.rb +14 -14
  97. data/lib/logster/ignore_pattern.rb +65 -65
  98. data/lib/logster/logger.rb +113 -113
  99. data/lib/logster/message.rb +212 -212
  100. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  101. data/lib/logster/middleware/reporter.rb +55 -55
  102. data/lib/logster/middleware/viewer.rb +297 -222
  103. data/lib/logster/pattern.rb +95 -0
  104. data/lib/logster/rails/railtie.rb +63 -63
  105. data/lib/logster/redis_store.rb +584 -566
  106. data/lib/logster/scheduler.rb +54 -54
  107. data/lib/logster/suppression_pattern.rb +17 -0
  108. data/lib/logster/version.rb +3 -3
  109. data/lib/logster/web.rb +14 -14
  110. data/logster.gemspec +35 -35
  111. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  112. data/test/fake_data/Gemfile +4 -4
  113. data/test/fake_data/generate.rb +10 -10
  114. data/test/logster/middleware/test_reporter.rb +19 -19
  115. data/test/logster/middleware/test_viewer.rb +267 -96
  116. data/test/logster/test_base_store.rb +147 -147
  117. data/test/logster/test_cache.rb +38 -0
  118. data/test/logster/test_defer_logger.rb +34 -34
  119. data/test/logster/test_ignore_pattern.rb +41 -41
  120. data/test/logster/test_logger.rb +100 -86
  121. data/test/logster/test_message.rb +119 -119
  122. data/test/logster/test_pattern.rb +152 -0
  123. data/test/logster/test_redis_rate_limiter.rb +230 -230
  124. data/test/logster/test_redis_store.rb +689 -720
  125. data/test/test_helper.rb +38 -38
  126. data/vendor/assets/javascripts/logster.js.erb +39 -39
  127. metadata +24 -7
@@ -1,111 +1,111 @@
1
- import { module, test } from "qunit";
2
- import { setupRenderingTest } from "ember-qunit";
3
- import { render, find, findAll, click } from "@ember/test-helpers";
4
- import hbs from "htmlbars-inline-precompile";
5
- import Message from "client-app/models/message";
6
-
7
- const backtrace = "test backtrace:26";
8
- const messageTitle = "This Is Title";
9
-
10
- const message = Message.create({
11
- backtrace,
12
- message: messageTitle,
13
- env: { c: "cc", d: "dd" }
14
- });
15
-
16
- module("Integration | Component | message-info", function(hooks) {
17
- setupRenderingTest(hooks);
18
-
19
- test("it renders", async function(assert) {
20
- this.setProperties({
21
- actionsInMenu: true,
22
- showTitle: false,
23
- message
24
- });
25
-
26
- await render(
27
- hbs`{{message-info currentMessage=message showTitle=showTitle actionsInMenu=actionsInMenu}}`
28
- );
29
- let activeTab = find(".message-info .content.active pre");
30
- assert.equal(
31
- activeTab.textContent,
32
- backtrace,
33
- "default active tab is backtrace"
34
- );
35
- assert.dom(".message-info .content h3").doesNotExist("no titles are shown");
36
- assert.equal(findAll(".tabs a").length, 3, "3 tabs shown");
37
- assert.equal(
38
- find(".tabs a.active").textContent.trim(),
39
- "backtrace",
40
- "default active tab is backtrace"
41
- );
42
- assert.equal(
43
- findAll(".message-actions button").length,
44
- 2,
45
- "2 buttons shown when `actionsInMenu` is true"
46
- );
47
- assert
48
- .dom(".message-actions button.expand.no-text")
49
- .exists("menu expand button is shown");
50
- assert.dom(".message-actions button.share").exists("share button is shown");
51
-
52
- await click(find(".message-actions button.expand.no-text"));
53
- assert.equal(
54
- findAll(".actions-menu button").length,
55
- 2,
56
- "extra buttons shown inside a menu"
57
- );
58
- assert
59
- .dom(".actions-menu button.remove")
60
- .exists("remove button inside the menu");
61
- assert
62
- .dom(".actions-menu button.protect")
63
- .exists("protect button inside the menu");
64
-
65
- this.setProperties({
66
- showTitle: true,
67
- actionsInMenu: false
68
- });
69
-
70
- assert.equal(
71
- findAll(".message-info .content h3").length,
72
- 3,
73
- "titles are shown"
74
- );
75
- assert
76
- .dom(".message-actions button.expand.no-text")
77
- .doesNotExist("menu expand button is not shown");
78
- assert.equal(
79
- findAll(".message-actions button").length,
80
- 3,
81
- "all actions buttons are shown inline when `actionsInMenu` is false"
82
- );
83
-
84
- await click(findAll(".tabs a")[0]);
85
- activeTab = find(".message-info .content.active pre");
86
- assert.equal(activeTab.textContent, messageTitle, "can switch tabs");
87
-
88
- assert
89
- .dom(".message-actions button.solve")
90
- .doesNotExist(
91
- "no solve button when there is no application_version in env"
92
- );
93
-
94
- message.set("env.application_version", "fddfsdfdsf");
95
- this.set("message", message);
96
- assert
97
- .dom(".message-actions button.solve")
98
- .exists("solve button is shown when there is application_version in env");
99
-
100
- message.set("env", [
101
- { sd: "dx", application_version: "fsfdsf" },
102
- { vcv: "dxc" }
103
- ]);
104
- this.set("message", message);
105
- assert
106
- .dom(".message-actions button.solve")
107
- .exists(
108
- "solve button is shown when there is application_version in env (array)"
109
- );
110
- });
111
- });
1
+ import { module, test } from "qunit";
2
+ import { setupRenderingTest } from "ember-qunit";
3
+ import { render, find, findAll, click } from "@ember/test-helpers";
4
+ import hbs from "htmlbars-inline-precompile";
5
+ import Message from "client-app/models/message";
6
+
7
+ const backtrace = "test backtrace:26";
8
+ const messageTitle = "This Is Title";
9
+
10
+ const message = Message.create({
11
+ backtrace,
12
+ message: messageTitle,
13
+ env: { c: "cc", d: "dd" }
14
+ });
15
+
16
+ module("Integration | Component | message-info", function(hooks) {
17
+ setupRenderingTest(hooks);
18
+
19
+ test("it renders", async function(assert) {
20
+ this.setProperties({
21
+ actionsInMenu: true,
22
+ showTitle: false,
23
+ message
24
+ });
25
+
26
+ await render(
27
+ hbs`{{message-info currentMessage=message showTitle=showTitle actionsInMenu=actionsInMenu}}`
28
+ );
29
+ let activeTab = find(".message-info .content.active pre");
30
+ assert.equal(
31
+ activeTab.textContent,
32
+ backtrace,
33
+ "default active tab is backtrace"
34
+ );
35
+ assert.dom(".message-info .content h3").doesNotExist("no titles are shown");
36
+ assert.equal(findAll(".tabs a").length, 3, "3 tabs shown");
37
+ assert.equal(
38
+ find(".tabs a.active").textContent.trim(),
39
+ "backtrace",
40
+ "default active tab is backtrace"
41
+ );
42
+ assert.equal(
43
+ findAll(".message-actions button").length,
44
+ 2,
45
+ "2 buttons shown when `actionsInMenu` is true"
46
+ );
47
+ assert
48
+ .dom(".message-actions button.expand.no-text")
49
+ .exists("menu expand button is shown");
50
+ assert.dom(".message-actions button.share").exists("share button is shown");
51
+
52
+ await click(find(".message-actions button.expand.no-text"));
53
+ assert.equal(
54
+ findAll(".actions-menu button").length,
55
+ 2,
56
+ "extra buttons shown inside a menu"
57
+ );
58
+ assert
59
+ .dom(".actions-menu button.remove")
60
+ .exists("remove button inside the menu");
61
+ assert
62
+ .dom(".actions-menu button.protect")
63
+ .exists("protect button inside the menu");
64
+
65
+ this.setProperties({
66
+ showTitle: true,
67
+ actionsInMenu: false
68
+ });
69
+
70
+ assert.equal(
71
+ findAll(".message-info .content h3").length,
72
+ 3,
73
+ "titles are shown"
74
+ );
75
+ assert
76
+ .dom(".message-actions button.expand.no-text")
77
+ .doesNotExist("menu expand button is not shown");
78
+ assert.equal(
79
+ findAll(".message-actions button").length,
80
+ 3,
81
+ "all actions buttons are shown inline when `actionsInMenu` is false"
82
+ );
83
+
84
+ await click(findAll(".tabs a")[0]);
85
+ activeTab = find(".message-info .content.active pre");
86
+ assert.equal(activeTab.textContent, messageTitle, "can switch tabs");
87
+
88
+ assert
89
+ .dom(".message-actions button.solve")
90
+ .doesNotExist(
91
+ "no solve button when there is no application_version in env"
92
+ );
93
+
94
+ message.set("env.application_version", "fddfsdfdsf");
95
+ this.set("message", message);
96
+ assert
97
+ .dom(".message-actions button.solve")
98
+ .exists("solve button is shown when there is application_version in env");
99
+
100
+ message.set("env", [
101
+ { sd: "dx", application_version: "fsfdsf" },
102
+ { vcv: "dxc" }
103
+ ]);
104
+ this.set("message", message);
105
+ assert
106
+ .dom(".message-actions button.solve")
107
+ .exists(
108
+ "solve button is shown when there is application_version in env (array)"
109
+ );
110
+ });
111
+ });
@@ -0,0 +1,56 @@
1
+ import { module, test } from "qunit";
2
+ import { setupRenderingTest } from "ember-qunit";
3
+ import hbs from "htmlbars-inline-precompile";
4
+ import { fillIn, render, findAll } from "@ember/test-helpers";
5
+
6
+ module("Integration | Component | patterns-list", function(hooks) {
7
+ setupRenderingTest(hooks);
8
+
9
+ test("it renders", async function(assert) {
10
+ this.setProperties({
11
+ mutable: true,
12
+ patterns: []
13
+ });
14
+ await render(hbs`{{patterns-list patterns=patterns mutable=mutable}}`);
15
+ assert
16
+ .dom(".pattern-input")
17
+ .exists("It shows an input when patterns are emtpy");
18
+ assert
19
+ .dom(".btn.new-pattern")
20
+ .exists("It shows a create button when mutable");
21
+
22
+ this.set("patterns", ["/somepattern/", "/anotherpattern/"]);
23
+ assert.equal(
24
+ findAll(".pattern-input").length,
25
+ 3,
26
+ "It correctly displays patterns"
27
+ );
28
+ assert
29
+ .dom(".btn.save")
30
+ .doesNotExist("No save buttons are shown when there is 0 buffer");
31
+
32
+ let inputs = findAll(".pattern-input");
33
+ await fillIn(inputs[0], "/newpattern/");
34
+ await fillIn(inputs[2], "/anothernewpattern/");
35
+
36
+ assert
37
+ .dom(".btn.save")
38
+ .exists("Save buttons are shown when there is buffer");
39
+ assert.dom(".btn.trash").exists("Trash buttons are shown");
40
+
41
+ let disabled = inputs.every(inp => inp.disabled);
42
+ assert.notOk(
43
+ disabled,
44
+ "All inputs are not disabled when the list is mutable"
45
+ );
46
+
47
+ this.set("mutable", false);
48
+
49
+ inputs = findAll(".pattern-input");
50
+ disabled = inputs.every(inp => inp.disabled);
51
+ assert.ok(disabled, "All inputs are disabled when the list is immutable");
52
+ assert
53
+ .dom(".btn.trash")
54
+ .doesNotExist("Trash buttons are not shown when the list is immutable");
55
+ });
56
+ });
@@ -1,8 +1,8 @@
1
- import Application from '../app';
2
- import config from '../config/environment';
3
- import { setApplication } from '@ember/test-helpers';
4
- import { start } from 'ember-qunit';
5
-
6
- setApplication(Application.create(config.APP));
7
-
8
- start();
1
+ import Application from '../app';
2
+ import config from '../config/environment';
3
+ import { setApplication } from '@ember/test-helpers';
4
+ import { start } from 'ember-qunit';
5
+
6
+ setApplication(Application.create(config.APP));
7
+
8
+ start();
@@ -1,12 +1,12 @@
1
- import { module, test } from 'qunit';
2
- import { setupTest } from 'ember-qunit';
3
-
4
- module('Unit | Controller | index', function(hooks) {
5
- setupTest(hooks);
6
-
7
- // Replace this with your real tests.
8
- test('it exists', function(assert) {
9
- let controller = this.owner.lookup('controller:index');
10
- assert.ok(controller);
11
- });
12
- });
1
+ import { module, test } from 'qunit';
2
+ import { setupTest } from 'ember-qunit';
3
+
4
+ module('Unit | Controller | index', function(hooks) {
5
+ setupTest(hooks);
6
+
7
+ // Replace this with your real tests.
8
+ test('it exists', function(assert) {
9
+ let controller = this.owner.lookup('controller:index');
10
+ assert.ok(controller);
11
+ });
12
+ });
@@ -1,12 +1,12 @@
1
- import { module, test } from 'qunit';
2
- import { setupTest } from 'ember-qunit';
3
-
4
- module('Unit | Controller | show', function(hooks) {
5
- setupTest(hooks);
6
-
7
- // Replace this with your real tests.
8
- test('it exists', function(assert) {
9
- let controller = this.owner.lookup('controller:show');
10
- assert.ok(controller);
11
- });
12
- });
1
+ import { module, test } from 'qunit';
2
+ import { setupTest } from 'ember-qunit';
3
+
4
+ module('Unit | Controller | show', function(hooks) {
5
+ setupTest(hooks);
6
+
7
+ // Replace this with your real tests.
8
+ test('it exists', function(assert) {
9
+ let controller = this.owner.lookup('controller:show');
10
+ assert.ok(controller);
11
+ });
12
+ });
@@ -1,31 +1,31 @@
1
- import Application from '@ember/application';
2
-
3
- import { initialize } from 'client-app/initializers/app-init';
4
- import { module, test } from 'qunit';
5
- import { setupTest } from 'ember-qunit';
6
- import { run } from '@ember/runloop';
7
-
8
- module('Unit | Initializer | app-init', function(hooks) {
9
- setupTest(hooks);
10
-
11
- hooks.beforeEach(function() {
12
- this.TestApplication = Application.extend();
13
- this.TestApplication.initializer({
14
- name: 'initializer under test',
15
- initialize
16
- });
17
-
18
- this.application = this.TestApplication.create({ autoboot: false });
19
- });
20
-
21
- hooks.afterEach(function() {
22
- run(this.application, 'destroy');
23
- });
24
-
25
- // Replace this with your real tests.
26
- test('it works', async function(assert) {
27
- await this.application.boot();
28
-
29
- assert.ok(true);
30
- });
31
- });
1
+ import Application from '@ember/application';
2
+
3
+ import { initialize } from 'client-app/initializers/app-init';
4
+ import { module, test } from 'qunit';
5
+ import { setupTest } from 'ember-qunit';
6
+ import { run } from '@ember/runloop';
7
+
8
+ module('Unit | Initializer | app-init', function(hooks) {
9
+ setupTest(hooks);
10
+
11
+ hooks.beforeEach(function() {
12
+ this.TestApplication = Application.extend();
13
+ this.TestApplication.initializer({
14
+ name: 'initializer under test',
15
+ initialize
16
+ });
17
+
18
+ this.application = this.TestApplication.create({ autoboot: false });
19
+ });
20
+
21
+ hooks.afterEach(function() {
22
+ run(this.application, 'destroy');
23
+ });
24
+
25
+ // Replace this with your real tests.
26
+ test('it works', async function(assert) {
27
+ await this.application.boot();
28
+
29
+ assert.ok(true);
30
+ });
31
+ });
@@ -1,11 +1,11 @@
1
- import { module, test } from 'qunit';
2
- import { setupTest } from 'ember-qunit';
3
-
4
- module('Unit | Route | index', function(hooks) {
5
- setupTest(hooks);
6
-
7
- test('it exists', function(assert) {
8
- let route = this.owner.lookup('route:index');
9
- assert.ok(route);
10
- });
11
- });
1
+ import { module, test } from 'qunit';
2
+ import { setupTest } from 'ember-qunit';
3
+
4
+ module('Unit | Route | index', function(hooks) {
5
+ setupTest(hooks);
6
+
7
+ test('it exists', function(assert) {
8
+ let route = this.owner.lookup('route:index');
9
+ assert.ok(route);
10
+ });
11
+ });
@@ -1,11 +1,11 @@
1
- import { module, test } from 'qunit';
2
- import { setupTest } from 'ember-qunit';
3
-
4
- module('Unit | Route | show', function(hooks) {
5
- setupTest(hooks);
6
-
7
- test('it exists', function(assert) {
8
- let route = this.owner.lookup('route:show');
9
- assert.ok(route);
10
- });
11
- });
1
+ import { module, test } from 'qunit';
2
+ import { setupTest } from 'ember-qunit';
3
+
4
+ module('Unit | Route | show', function(hooks) {
5
+ setupTest(hooks);
6
+
7
+ test('it exists', function(assert) {
8
+ let route = this.owner.lookup('route:show');
9
+ assert.ok(route);
10
+ });
11
+ });