logster 1.3.1 → 1.3.2

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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -18
  3. data/.travis.yml +15 -15
  4. data/CHANGELOG.md +140 -137
  5. data/Gemfile +4 -4
  6. data/Guardfile +8 -8
  7. data/LICENSE.txt +22 -22
  8. data/README.md +99 -99
  9. data/Rakefile +24 -24
  10. data/assets/fonts/FontAwesome.otf +0 -0
  11. data/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/assets/fonts/fontawesome-webfont.svg +639 -639
  13. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/assets/images/Icon-144_rounded.png +0 -0
  17. data/assets/images/Icon-144_square.png +0 -0
  18. data/assets/images/icon_144x144.png +0 -0
  19. data/assets/images/icon_64x64.png +0 -0
  20. data/assets/javascript/client-app.js +92 -81
  21. data/assets/stylesheets/client-app.css +1 -1
  22. data/build_client_app.sh +0 -0
  23. data/client-app/.editorconfig +20 -20
  24. data/client-app/.ember-cli +9 -9
  25. data/client-app/.eslintignore +19 -19
  26. data/client-app/.eslintrc.js +46 -46
  27. data/client-app/.gitignore +23 -23
  28. data/client-app/.travis.yml +27 -27
  29. data/client-app/.watchmanconfig +3 -3
  30. data/client-app/README.md +57 -57
  31. data/client-app/app/app.js +14 -14
  32. data/client-app/app/components/actions-menu.js +37 -0
  33. data/client-app/app/components/message-info.js +65 -18
  34. data/client-app/app/components/message-row.js +45 -45
  35. data/client-app/app/components/panel-resizer.js +75 -75
  36. data/client-app/app/components/tab-contents.js +27 -27
  37. data/client-app/app/components/tab-link.js +5 -5
  38. data/client-app/app/components/tabbed-section.js +32 -32
  39. data/client-app/app/components/time-formatter.js +25 -25
  40. data/client-app/app/components/update-time.js +21 -21
  41. data/client-app/app/controllers/index.js +92 -83
  42. data/client-app/app/controllers/show.js +13 -13
  43. data/client-app/app/index.html +29 -29
  44. data/client-app/app/initializers/app-init.js +72 -55
  45. data/client-app/app/lib/preload.js +14 -14
  46. data/client-app/app/lib/utilities.js +140 -140
  47. data/client-app/app/models/message-collection.js +158 -158
  48. data/client-app/app/models/message.js +99 -99
  49. data/client-app/app/resolver.js +3 -3
  50. data/client-app/app/router.js +14 -14
  51. data/client-app/app/routes/index.js +57 -53
  52. data/client-app/app/routes/show.js +14 -14
  53. data/client-app/app/styles/app.css +497 -387
  54. data/client-app/app/templates/application.hbs +2 -2
  55. data/client-app/app/templates/components/actions-menu.hbs +12 -0
  56. data/client-app/app/templates/components/message-info.hbs +41 -44
  57. data/client-app/app/templates/components/message-row.hbs +17 -17
  58. data/client-app/app/templates/components/panel-resizer.hbs +3 -0
  59. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  60. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  61. data/client-app/app/templates/index.hbs +65 -57
  62. data/client-app/app/templates/show.hbs +7 -4
  63. data/client-app/config/environment.js +51 -51
  64. data/client-app/config/optional-features.json +3 -3
  65. data/client-app/config/targets.js +18 -18
  66. data/client-app/ember-cli-build.js +29 -29
  67. data/client-app/package-lock.json +11365 -11365
  68. data/client-app/package.json +56 -56
  69. data/client-app/testem.js +25 -25
  70. data/client-app/tests/index.html +34 -34
  71. data/client-app/tests/integration/components/actions-menu-test.js +26 -0
  72. data/client-app/tests/integration/components/message-info-test.js +26 -26
  73. data/client-app/tests/integration/components/message-row-test.js +26 -26
  74. data/client-app/tests/integration/components/panel-resizer-test.js +26 -26
  75. data/client-app/tests/integration/components/tab-contents-test.js +26 -26
  76. data/client-app/tests/integration/components/tab-link-test.js +26 -26
  77. data/client-app/tests/integration/components/tabbed-section-test.js +26 -26
  78. data/client-app/tests/integration/components/time-formatter-test.js +26 -26
  79. data/client-app/tests/integration/components/update-time-test.js +26 -26
  80. data/client-app/tests/test-helper.js +8 -8
  81. data/client-app/tests/unit/controllers/index-test.js +12 -12
  82. data/client-app/tests/unit/controllers/show-test.js +12 -12
  83. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  84. data/client-app/tests/unit/routes/index-test.js +11 -11
  85. data/client-app/tests/unit/routes/show-test.js +11 -11
  86. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  87. data/lib/logster.rb +54 -54
  88. data/lib/logster/base_store.rb +130 -130
  89. data/lib/logster/configuration.rb +25 -25
  90. data/lib/logster/ignore_pattern.rb +65 -65
  91. data/lib/logster/logger.rb +108 -108
  92. data/lib/logster/message.rb +227 -227
  93. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  94. data/lib/logster/middleware/reporter.rb +56 -56
  95. data/lib/logster/middleware/viewer.rb +221 -220
  96. data/lib/logster/rails/railtie.rb +58 -58
  97. data/lib/logster/redis_store.rb +481 -481
  98. data/lib/logster/version.rb +3 -3
  99. data/lib/logster/web.rb +14 -14
  100. data/logster.gemspec +34 -34
  101. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  102. data/test/fake_data/Gemfile +4 -4
  103. data/test/fake_data/generate.rb +10 -10
  104. data/test/logster/middleware/test_reporter.rb +21 -21
  105. data/test/logster/middleware/test_viewer.rb +96 -96
  106. data/test/logster/test_base_store.rb +147 -147
  107. data/test/logster/test_ignore_pattern.rb +41 -41
  108. data/test/logster/test_logger.rb +80 -80
  109. data/test/logster/test_message.rb +34 -34
  110. data/test/logster/test_redis_rate_limiter.rb +230 -230
  111. data/test/logster/test_redis_store.rb +427 -427
  112. data/test/test_helper.rb +38 -38
  113. data/vendor/assets/javascripts/logster.js.erb +39 -39
  114. metadata +6 -2
@@ -1,3 +1,3 @@
1
- module Logster
2
- VERSION = "1.3.1"
3
- end
1
+ module Logster
2
+ VERSION = "1.3.2"
3
+ end
@@ -1,14 +1,14 @@
1
- require 'logster/middleware/viewer'
2
-
3
- class Logster::Web
4
- class FourOhFour
5
- def call(env)
6
- [404, {}, ["not found"]]
7
- end
8
- end
9
-
10
- def self.call(env)
11
- @middleware ||= Logster::Middleware::Viewer.new(FourOhFour.new)
12
- @middleware.call(env)
13
- end
14
- end
1
+ require 'logster/middleware/viewer'
2
+
3
+ class Logster::Web
4
+ class FourOhFour
5
+ def call(env)
6
+ [404, {}, ["not found"]]
7
+ end
8
+ end
9
+
10
+ def self.call(env)
11
+ @middleware ||= Logster::Middleware::Viewer.new(FourOhFour.new)
12
+ @middleware.call(env)
13
+ end
14
+ end
@@ -1,34 +1,34 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'logster/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "logster"
8
- spec.version = Logster::VERSION
9
- spec.authors = ["UI for viewing logs in Rack"]
10
- spec.email = ["sam.saffron@gmail.com"]
11
- spec.summary = %q{UI for viewing logs in Rack}
12
- spec.description = %q{UI for viewing logs in Rack}
13
- spec.homepage = "https://github.com/discourse/logster"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
- f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
18
- end
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
- spec.require_paths = ["lib"]
22
-
23
- # NOTE dependency on rack is not explicit, this enables us to use
24
- # logster outside of rack (for reporting)
25
-
26
- spec.add_development_dependency "bundler", "~> 1.6"
27
- spec.add_development_dependency "rake"
28
- spec.add_development_dependency "rack"
29
- spec.add_development_dependency "redis"
30
- spec.add_development_dependency "guard"
31
- spec.add_development_dependency "guard-minitest"
32
- spec.add_development_dependency "timecop"
33
- spec.add_development_dependency "byebug"
34
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'logster/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "logster"
8
+ spec.version = Logster::VERSION
9
+ spec.authors = ["UI for viewing logs in Rack"]
10
+ spec.email = ["sam.saffron@gmail.com"]
11
+ spec.summary = %q{UI for viewing logs in Rack}
12
+ spec.description = %q{UI for viewing logs in Rack}
13
+ spec.homepage = "https://github.com/discourse/logster"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
18
+ end
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+
23
+ # NOTE dependency on rack is not explicit, this enables us to use
24
+ # logster outside of rack (for reporting)
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.6"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "rack"
29
+ spec.add_development_dependency "redis"
30
+ spec.add_development_dependency "guard"
31
+ spec.add_development_dependency "guard-minitest"
32
+ spec.add_development_dependency "timecop"
33
+ spec.add_development_dependency "byebug"
34
+ end
@@ -1,46 +1,46 @@
1
- require_relative '../test_helper'
2
- require 'logster/logger'
3
- require 'logster/redis_store'
4
- require 'logger'
5
- require 'examples/sidekiq_logster_reporter'
6
-
7
- class TestSidekiqReporter < MiniTest::Test
8
-
9
- def setup
10
- Logster.store = @store = Logster::RedisStore.new(Redis.new)
11
- Logster.logger = @logger = Logster::Logger.new(Logster.store)
12
- @store.clear_all
13
- end
14
-
15
- def teardown
16
- @store.clear_all
17
- end
18
-
19
- def test_sidekiq_handler_example
20
- handler = SidekiqLogsterReporter.new
21
- error = nil
22
- begin
23
- raise TypeError.new
24
- rescue => e
25
- error = e
26
- end
27
- trace = error.backtrace
28
-
29
- handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
30
-
31
- report = @store.latest[0]
32
-
33
- # Message is right format
34
- assert_equal("Job exception: TypeError\n", report.message)
35
-
36
- # A backtrace is joined()
37
- assert_equal(trace.join("\n"), report.backtrace)
38
- # The backtrace is deleted from the env
39
- assert_nil(report.env['backtrace'])
40
- assert_nil(report.env[:backtrace])
41
-
42
- # The env is in the report
43
- assert_equal("Test", report.env['code'])
44
- assert_equal(20, report.env['params']['article_id'])
45
- end
46
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/logger'
3
+ require 'logster/redis_store'
4
+ require 'logger'
5
+ require 'examples/sidekiq_logster_reporter'
6
+
7
+ class TestSidekiqReporter < MiniTest::Test
8
+
9
+ def setup
10
+ Logster.store = @store = Logster::RedisStore.new(Redis.new)
11
+ Logster.logger = @logger = Logster::Logger.new(Logster.store)
12
+ @store.clear_all
13
+ end
14
+
15
+ def teardown
16
+ @store.clear_all
17
+ end
18
+
19
+ def test_sidekiq_handler_example
20
+ handler = SidekiqLogsterReporter.new
21
+ error = nil
22
+ begin
23
+ raise TypeError.new
24
+ rescue => e
25
+ error = e
26
+ end
27
+ trace = error.backtrace
28
+
29
+ handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
30
+
31
+ report = @store.latest[0]
32
+
33
+ # Message is right format
34
+ assert_equal("Job exception: TypeError\n", report.message)
35
+
36
+ # A backtrace is joined()
37
+ assert_equal(trace.join("\n"), report.backtrace)
38
+ # The backtrace is deleted from the env
39
+ assert_nil(report.env['backtrace'])
40
+ assert_nil(report.env[:backtrace])
41
+
42
+ # The env is in the report
43
+ assert_equal("Test", report.env['code'])
44
+ assert_equal(20, report.env['params']['article_id'])
45
+ end
46
+ end
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'redis'
4
- gem 'logster', path: '../../'
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'redis'
4
+ gem 'logster', path: '../../'
@@ -1,10 +1,10 @@
1
- require 'redis'
2
- require 'logster'
3
-
4
- Logster.config.allow_grouping = true
5
- Logster.config.application_version = "ABC123"
6
- Logster.store = Logster::RedisStore.new
7
-
8
- 10.times do
9
- Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
10
- end
1
+ require 'redis'
2
+ require 'logster'
3
+
4
+ Logster.config.allow_grouping = true
5
+ Logster.config.application_version = "ABC123"
6
+ Logster.store = Logster::RedisStore.new
7
+
8
+ 10.times do
9
+ Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
10
+ end
@@ -1,21 +1,21 @@
1
- require_relative '../../test_helper'
2
- require 'rack'
3
- require 'logster/redis_store'
4
- require 'logster/middleware/reporter'
5
-
6
-
7
- class TestReporter < Minitest::Test
8
-
9
- def test_logs_errors
10
- Logster.store = Logster::TestStore.new
11
-
12
- reporter = Logster::Middleware::Reporter.new(nil)
13
- env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
14
- status, = reporter.call(env)
15
-
16
- assert_equal(200, status)
17
- assert_equal(1, Logster.store.count)
18
- end
19
-
20
- end
21
-
1
+ require_relative '../../test_helper'
2
+ require 'rack'
3
+ require 'logster/redis_store'
4
+ require 'logster/middleware/reporter'
5
+
6
+
7
+ class TestReporter < Minitest::Test
8
+
9
+ def test_logs_errors
10
+ Logster.store = Logster::TestStore.new
11
+
12
+ reporter = Logster::Middleware::Reporter.new(nil)
13
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
14
+ status, = reporter.call(env)
15
+
16
+ assert_equal(200, status)
17
+ assert_equal(1, Logster.store.count)
18
+ end
19
+
20
+ end
21
+
@@ -1,96 +1,96 @@
1
- require_relative '../../test_helper'
2
- require 'rack'
3
- require 'logster/redis_store'
4
- require 'logster/middleware/viewer'
5
-
6
- class TestViewer < Minitest::Test
7
-
8
- class BrokenApp
9
- def call(env)
10
- [500, {}, ["broken"]]
11
- end
12
- end
13
-
14
- def setup
15
- Logster.config.subdirectory = "/logsie"
16
- Logster.store = Logster::RedisStore.new
17
- end
18
-
19
- def teardown
20
- Logster.config.subdirectory = nil
21
- Logster.store = nil
22
- end
23
-
24
- def viewer
25
- @viewer ||= Logster::Middleware::Viewer.new(nil)
26
- end
27
-
28
- def request
29
- @request ||= Rack::MockRequest.new(Rack::Lint.new(viewer))
30
- end
31
-
32
- def test_path_resolution
33
- assert_nil(viewer.send(:resolve_path, "/logs"))
34
- assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
35
- assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
36
- assert_equal("/",viewer.send(:resolve_path, "/logsie"))
37
- assert_equal("/",viewer.send(:resolve_path, "/logsie/"))
38
- assert_equal("/hello/world",viewer.send(:resolve_path, "/logsie/hello/world"))
39
- end
40
-
41
- def test_search_raceguard_s
42
- response = request.get('/logsie/messages.json?search=searchkey')
43
- result = JSON.parse(response.body)
44
- assert_equal('searchkey', result['search'])
45
- end
46
-
47
- def test_search_raceguard_sr
48
- response = request.get('/logsie/messages.json?search=/regex/&regex_search=true')
49
- result = JSON.parse(response.body)
50
- assert_equal('/regex/', result['search'])
51
- end
52
-
53
- def test_search_raceguard_f
54
- response = request.get("/logsie/messages.json?filter=0_1_2_3_4")
55
- result = JSON.parse(response.body)
56
- assert_equal([0,1,2,3,4], result['filter'])
57
- end
58
-
59
- def test_regex_parse
60
- assert_equal(/hello/i, viewer.send(:parse_regex, '/hello/i'))
61
- end
62
-
63
- def test_linking_to_a_valid_js_files
64
- %w(
65
- /logsie/javascript/client-app.js
66
- /logsie/javascript/vendor.js
67
- ).each do |path|
68
- response = request.get(path)
69
- assert_equal(200, response.status)
70
- assert_equal('application/javascript', response.headers['Content-Type'])
71
- end
72
- end
73
-
74
- def test_linking_to_a_valid_css_files
75
- %w(
76
- /logsie/stylesheets/client-app.css
77
- /logsie/stylesheets/vendor.css
78
- ).each do |path|
79
- response = request.get(path)
80
- assert_equal(200, response.status)
81
- assert_equal('text/css', response.headers['Content-Type'])
82
- end
83
- end
84
-
85
- def test_linking_to_an_invalid_ember_component_or_template
86
- %w(
87
- /logsie/javascript/templates/application.hbs
88
- /logsie/javascript/templates/does_not_exist.js
89
- /logsie/javascript/components/does_not_exist.js
90
- /logsie/javascript/templates/../../app.js
91
- ).each do |path|
92
- response = request.get(path)
93
- assert_equal(404, response.status, "#{path} should have 404'ed")
94
- end
95
- end
96
- end
1
+ require_relative '../../test_helper'
2
+ require 'rack'
3
+ require 'logster/redis_store'
4
+ require 'logster/middleware/viewer'
5
+
6
+ class TestViewer < Minitest::Test
7
+
8
+ class BrokenApp
9
+ def call(env)
10
+ [500, {}, ["broken"]]
11
+ end
12
+ end
13
+
14
+ def setup
15
+ Logster.config.subdirectory = "/logsie"
16
+ Logster.store = Logster::RedisStore.new
17
+ end
18
+
19
+ def teardown
20
+ Logster.config.subdirectory = nil
21
+ Logster.store = nil
22
+ end
23
+
24
+ def viewer
25
+ @viewer ||= Logster::Middleware::Viewer.new(nil)
26
+ end
27
+
28
+ def request
29
+ @request ||= Rack::MockRequest.new(Rack::Lint.new(viewer))
30
+ end
31
+
32
+ def test_path_resolution
33
+ assert_nil(viewer.send(:resolve_path, "/logs"))
34
+ assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
35
+ assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
36
+ assert_equal("/",viewer.send(:resolve_path, "/logsie"))
37
+ assert_equal("/",viewer.send(:resolve_path, "/logsie/"))
38
+ assert_equal("/hello/world",viewer.send(:resolve_path, "/logsie/hello/world"))
39
+ end
40
+
41
+ def test_search_raceguard_s
42
+ response = request.get('/logsie/messages.json?search=searchkey')
43
+ result = JSON.parse(response.body)
44
+ assert_equal('searchkey', result['search'])
45
+ end
46
+
47
+ def test_search_raceguard_sr
48
+ response = request.get('/logsie/messages.json?search=/regex/&regex_search=true')
49
+ result = JSON.parse(response.body)
50
+ assert_equal('/regex/', result['search'])
51
+ end
52
+
53
+ def test_search_raceguard_f
54
+ response = request.get("/logsie/messages.json?filter=0_1_2_3_4")
55
+ result = JSON.parse(response.body)
56
+ assert_equal([0,1,2,3,4], result['filter'])
57
+ end
58
+
59
+ def test_regex_parse
60
+ assert_equal(/hello/i, viewer.send(:parse_regex, '/hello/i'))
61
+ end
62
+
63
+ def test_linking_to_a_valid_js_files
64
+ %w(
65
+ /logsie/javascript/client-app.js
66
+ /logsie/javascript/vendor.js
67
+ ).each do |path|
68
+ response = request.get(path)
69
+ assert_equal(200, response.status)
70
+ assert_equal('application/javascript', response.headers['Content-Type'])
71
+ end
72
+ end
73
+
74
+ def test_linking_to_a_valid_css_files
75
+ %w(
76
+ /logsie/stylesheets/client-app.css
77
+ /logsie/stylesheets/vendor.css
78
+ ).each do |path|
79
+ response = request.get(path)
80
+ assert_equal(200, response.status)
81
+ assert_equal('text/css', response.headers['Content-Type'])
82
+ end
83
+ end
84
+
85
+ def test_linking_to_an_invalid_ember_component_or_template
86
+ %w(
87
+ /logsie/javascript/templates/application.hbs
88
+ /logsie/javascript/templates/does_not_exist.js
89
+ /logsie/javascript/components/does_not_exist.js
90
+ /logsie/javascript/templates/../../app.js
91
+ ).each do |path|
92
+ response = request.get(path)
93
+ assert_equal(404, response.status, "#{path} should have 404'ed")
94
+ end
95
+ end
96
+ end