logster 2.8.0 → 2.9.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -24,18 +24,18 @@
24
24
  "@fortawesome/free-regular-svg-icons": "^5.13.0",
25
25
  "@fortawesome/free-solid-svg-icons": "^5.13.0",
26
26
  "@glimmer/component": "^1.0.0",
27
- "babel-eslint": "^10.0.3",
27
+ "babel-eslint": "^10.1.0",
28
28
  "broccoli-asset-rev": "^3.0.0",
29
29
  "ember-auto-import": "^1.5.3",
30
30
  "ember-cli": "^3.15.0",
31
31
  "ember-cli-app-version": "^3.2.0",
32
- "ember-cli-babel": "^7.13.0",
32
+ "ember-cli-babel": "^7.19.0",
33
33
  "ember-cli-dependency-checker": "^3.2.0",
34
34
  "ember-cli-eslint": "^5.1.0",
35
- "ember-cli-htmlbars": "^4.2.0",
35
+ "ember-cli-htmlbars": "^4.3.1",
36
36
  "ember-cli-inject-live-reload": "^2.0.1",
37
37
  "ember-cli-sri": "^2.1.1",
38
- "ember-cli-template-lint": "^1.0.0-beta.3",
38
+ "ember-cli-template-lint": "^1.0.0",
39
39
  "ember-cli-uglify": "^3.0.0",
40
40
  "ember-export-application-global": "^2.0.1",
41
41
  "ember-load-initializers": "^2.1.1",
@@ -43,7 +43,7 @@
43
43
  "ember-qunit": "^4.6.0",
44
44
  "ember-resolver": "^7.0.0",
45
45
  "ember-source": "^3.15.0",
46
- "eslint-plugin-ember": "^7.7.1",
46
+ "eslint-plugin-ember": "^7.13.0",
47
47
  "eslint-plugin-node": "^10.0.0",
48
48
  "loader.js": "^4.7.0",
49
49
  "prettier": "^1.19.1",
@@ -148,7 +148,7 @@ module("Integration | Component | env-tab", function(hooks) {
148
148
 
149
149
  assert.equal(
150
150
  defaultExpanded.children[1].textContent.trim(),
151
- "[vvv1, vvv2]",
151
+ "vvv1, [vvv2]",
152
152
  "list is expanded by default when its length is 3 or less"
153
153
  );
154
154
 
@@ -165,7 +165,7 @@ module("Integration | Component | env-tab", function(hooks) {
165
165
  const expanded = find(".env-table tr");
166
166
  assert.equal(
167
167
  expanded.children[1].textContent.trim(),
168
- "[value1, value2, value3, value4]",
168
+ "value1, [value2, value3, value4]",
169
169
  "expanded env keys shown correctly"
170
170
  );
171
171
 
@@ -113,7 +113,8 @@ module Logster
113
113
 
114
114
  # in its own method so it can be overridden
115
115
  def grouping_hash
116
- { message: self.message, severity: self.severity, backtrace: self.backtrace }
116
+ message = self.message.gsub(/[0-9a-f]+/i, "X")
117
+ { message: message, severity: self.severity, backtrace: self.backtrace }
117
118
  end
118
119
 
119
120
  # todo - memoize?
@@ -137,10 +138,6 @@ module Logster
137
138
  end
138
139
  end
139
140
 
140
- def is_similar?(other)
141
- self.grouping_key == other.grouping_key
142
- end
143
-
144
141
  def merge_similar_message(other)
145
142
  self.first_timestamp ||= self.timestamp
146
143
  self.timestamp = [self.timestamp, other.timestamp].max
@@ -306,7 +303,7 @@ module Logster
306
303
  end
307
304
 
308
305
  def get_timestamp
309
- (Time.new.to_f * 1000).to_i
306
+ (Time.now.to_f * 1000).to_i
310
307
  end
311
308
  end
312
309
  end
@@ -14,13 +14,11 @@ class Logster::Middleware::DebugExceptions < ActionDispatch::DebugExceptions
14
14
  exception = wrapper.exception
15
15
 
16
16
  Logster.config.current_context.call(env) do
17
- location = exception.backtrace[0]
18
-
19
17
  Logster.logger.add_with_opts(
20
18
  ::Logger::Severity::FATAL,
21
- "#{exception.class} (#{exception})\n#{location}",
19
+ "#{exception.class} (#{exception})\n#{wrapper.application_trace.join("\n")}",
22
20
  "web-exception",
23
- backtrace: exception.backtrace.join("\n"),
21
+ backtrace: wrapper.full_trace.join("\n"),
24
22
  env: env
25
23
  )
26
24
  end
@@ -57,7 +57,14 @@ module Logster
57
57
  message << "\nWindow Location: " << params["window_location"] if params["window_location"]
58
58
 
59
59
  backtrace = params["stacktrace"] || ""
60
- Logster.store.report(::Logger::Severity::WARN,
60
+
61
+ severity = ::Logger::Severity::WARN
62
+ if params["severity"] &&
63
+ ::Logger::Severity.const_defined?(params["severity"].upcase)
64
+ severity = ::Logger::Severity.const_get(params["severity"].upcase)
65
+ end
66
+
67
+ Logster.store.report(severity,
61
68
  "javascript",
62
69
  message,
63
70
  backtrace: backtrace,
@@ -48,7 +48,7 @@ module Logster
48
48
  end
49
49
 
50
50
  Logster.store.delete(message)
51
- return [301, { "Location" => "#{@logs_path}/" }, []]
51
+ [301, { "Location" => "#{@logs_path}/" }, []]
52
52
 
53
53
  elsif resource =~ /\/(un)?protect\/([0-9a-f]+)$/
54
54
  off = $1 == "un"
@@ -61,15 +61,15 @@ module Logster
61
61
 
62
62
  if off
63
63
  if Logster.store.unprotect(key)
64
- return [301, { "Location" => "#{@logs_path}/show/#{key}?protected=false" }, []]
64
+ [301, { "Location" => "#{@logs_path}/show/#{key}?protected=false" }, []]
65
65
  else
66
- return [500, {}, ["Failed"]]
66
+ [500, {}, ["Failed"]]
67
67
  end
68
68
  else
69
69
  if Logster.store.protect(key)
70
- return [301, { "Location" => "#{@logs_path}/show/#{key}?protected=true" }, []]
70
+ [301, { "Location" => "#{@logs_path}/show/#{key}?protected=true" }, []]
71
71
  else
72
- return [500, {}, ["Failed"]]
72
+ [500, {}, ["Failed"]]
73
73
  end
74
74
  end
75
75
 
@@ -83,14 +83,14 @@ module Logster
83
83
 
84
84
  Logster.store.solve(key)
85
85
 
86
- return [301, { "Location" => "#{@logs_path}" }, []]
86
+ [301, { "Location" => "#{@logs_path}" }, []]
87
87
 
88
88
  elsif resource =~ /\/clear$/
89
89
  if env[REQUEST_METHOD] != "POST"
90
90
  return method_not_allowed("POST")
91
91
  end
92
92
  Logster.store.clear
93
- return [200, {}, ["Messages cleared"]]
93
+ [200, {}, ["Messages cleared"]]
94
94
 
95
95
  elsif resource =~ /\/show\/([0-9a-f]+)(\.json)?$/
96
96
  key = $1
@@ -179,7 +179,7 @@ module Logster
179
179
  end.first
180
180
  return not_found("No such pattern group exists") if !group
181
181
  group.messages_keys.each { |k| Logster.store.solve(k) }
182
- return [200, {}, []]
182
+ [200, {}, []]
183
183
  elsif resource == '/development-preload.json' && ENV["LOGSTER_ENV"] == "development"
184
184
  [200, { "Content-Type" => "application/json; charset=utf-8" }, [JSON.generate(preloaded_data)]]
185
185
  else
@@ -342,7 +342,10 @@ module Logster
342
342
  def rate_limited?(ip_address, perform: false, limit: 60)
343
343
  key = ip_rate_limit_key(ip_address)
344
344
 
345
- limited = @redis.exists(key)
345
+ limited = @redis.call([:exists, key])
346
+ if Integer === limited
347
+ limited = limited != 0
348
+ end
346
349
 
347
350
  if perform && !limited
348
351
  @redis.setex key, limit, ""
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Logster
4
- VERSION = "2.8.0"
4
+ VERSION = "2.9.4"
5
5
  end
@@ -8,7 +8,7 @@ require 'logster/version'
8
8
  Gem::Specification.new do |spec|
9
9
  spec.name = "logster"
10
10
  spec.version = Logster::VERSION
11
- spec.authors = ["UI for viewing logs in Rack"]
11
+ spec.authors = ["Sam Saffron"]
12
12
  spec.email = ["sam.saffron@gmail.com"]
13
13
  spec.summary = %q{UI for viewing logs in Rack}
14
14
  spec.description = %q{UI for viewing logs in Rack}
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.license = "MIT"
17
17
 
18
18
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
- f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
19
+ f.start_with?("website") || f.start_with?("bin")
20
20
  end
21
21
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
22
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
@@ -32,7 +32,6 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "guard"
33
33
  spec.add_development_dependency "guard-minitest"
34
34
  spec.add_development_dependency "timecop"
35
- spec.add_development_dependency "byebug", "~> 11.0.0"
36
- spec.add_development_dependency "rubocop", "~> 0.69.0"
37
- spec.add_development_dependency "rubocop-discourse"
35
+ spec.add_development_dependency "byebug", "~> 11.1.0"
36
+ spec.add_development_dependency "rubocop-discourse", "~> 2.1.2"
38
37
  end
@@ -11,6 +11,7 @@ class TestReporter < Minitest::Test
11
11
  Logster.store = Logster::RedisStore.new
12
12
  Logster.store.clear_all
13
13
  Logster.config.enable_js_error_reporting = true
14
+ Logster.config.rate_limit_error_reporting = true
14
15
  end
15
16
 
16
17
  def test_logs_errors
@@ -22,6 +23,28 @@ class TestReporter < Minitest::Test
22
23
  assert_equal(1, Logster.store.count)
23
24
  end
24
25
 
26
+ def test_logs_severity_of_errors
27
+ Logster.config.rate_limit_error_reporting = false
28
+
29
+ reporter = Logster::Middleware::Reporter.new(nil)
30
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
31
+ reporter.call(env)
32
+
33
+ assert_equal(Logger::Severity::WARN, Logster.store.latest[-1].severity)
34
+
35
+ reporter = Logster::Middleware::Reporter.new(nil)
36
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello&severity=invalid")
37
+ reporter.call(env)
38
+
39
+ assert_equal(Logger::Severity::WARN, Logster.store.latest[-1].severity)
40
+
41
+ reporter = Logster::Middleware::Reporter.new(nil)
42
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello&severity=error")
43
+ reporter.call(env)
44
+
45
+ assert_equal(Logger::Severity::ERROR, Logster.store.latest[-1].severity)
46
+ end
47
+
25
48
  def test_respects_ban_on_errors
26
49
  Logster.config.enable_js_error_reporting = false
27
50
 
@@ -10,7 +10,7 @@ class TestGroup < MiniTest::Test
10
10
  end
11
11
 
12
12
  def test_from_json_works_correctly
13
- time = (Time.new.to_f * 1000).to_i - 5000
13
+ time = (Time.now.to_f * 1000).to_i - 5000
14
14
  json = JSON.generate(
15
15
  key: '/somekey/',
16
16
  messages_keys: [111, 222, 333].map(&:to_s),
@@ -20,7 +20,7 @@ class TestMessage < MiniTest::Test
20
20
  end
21
21
 
22
22
  def test_populate_from_env_will_add_time_to_env_unless_it_already_exists
23
- t = (Time.new.to_f * 1000).to_i
23
+ t = (Time.now.to_f * 1000).to_i
24
24
  msg = Logster::Message.new(0, '', 'test', t)
25
25
  msg.populate_from_env({})
26
26
  assert_equal(t, msg.env["time"])
@@ -1044,6 +1044,24 @@ class TestRedisStore < Minitest::Test
1044
1044
  end
1045
1045
  end
1046
1046
 
1047
+ def test_messages_that_differ_only_by_numbers_or_hashes_are_merged
1048
+ config_reset(allow_grouping: true) do
1049
+ first_message = <<~TEXT
1050
+ DistributedMutex("download_20450e291e8f1e5ba03ca7f20fb7d9da570c94a6"):
1051
+ held for too long, expected max: 60 secs, took an extra 73 secs
1052
+ TEXT
1053
+ msg = @store.report(Logger::WARN, '', first_message, backtrace: caller)
1054
+
1055
+ second_message = <<~TEXT
1056
+ DistributedMutex("download_e09ae082c60a351dedec67ed869652862b232a0b"):
1057
+ held for too long, expected max: 60 secs, took an extra 287 secs
1058
+ TEXT
1059
+ msg2 = @store.report(Logger::WARN, '', second_message, backtrace: caller)
1060
+
1061
+ assert_equal(msg.key, msg2.key)
1062
+ end
1063
+ end
1064
+
1047
1065
  private
1048
1066
 
1049
1067
  def config_reset(configs)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.9.4
5
5
  platform: ruby
6
6
  authors:
7
- - UI for viewing logs in Rack
7
+ - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-30 00:00:00.000000000 Z
11
+ date: 2020-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -114,42 +114,28 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 11.0.0
117
+ version: 11.1.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 11.0.0
124
+ version: 11.1.0
125
125
  - !ruby/object:Gem::Dependency
126
- name: rubocop
126
+ name: rubocop-discourse
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.69.0
131
+ version: 2.1.2
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.69.0
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop-discourse
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
138
+ version: 2.1.2
153
139
  description: UI for viewing logs in Rack
154
140
  email:
155
141
  - sam.saffron@gmail.com