logster 2.1.2 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ });