logster 2.9.2 → 2.9.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +75 -0
- data/.gitignore +0 -20
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +23 -0
- data/assets/javascript/client-app.js +65 -57
- data/client-app/app/controllers/index.js +12 -14
- data/client-app/app/lib/utilities.js +34 -0
- data/client-app/app/models/message-collection.js +13 -2
- data/client-app/app/routes/index.js +7 -1
- data/client-app/package-lock.json +25708 -356
- data/lib/logster/configuration.rb +3 -1
- data/lib/logster/message.rb +5 -3
- data/lib/logster/redis_store.rb +1 -1
- data/lib/logster/version.rb +1 -1
- data/logster.gemspec +4 -2
- data/test/logster/middleware/test_reporter.rb +3 -3
- data/test/logster/test_base_store.rb +12 -0
- data/test/logster/test_message.rb +12 -0
- data/test/logster/test_redis_store.rb +18 -0
- metadata +7 -7
- data/.travis.yml +0 -17
@@ -18,7 +18,8 @@ module Logster
|
|
18
18
|
:gems_dir,
|
19
19
|
:max_env_bytes,
|
20
20
|
:max_env_count_per_message,
|
21
|
-
:maximum_message_length
|
21
|
+
:maximum_message_length,
|
22
|
+
:use_full_hostname
|
22
23
|
)
|
23
24
|
|
24
25
|
attr_writer :subdirectory
|
@@ -39,6 +40,7 @@ module Logster
|
|
39
40
|
@enable_backtrace_links = true
|
40
41
|
@gems_dir = Gem.dir + "/gems/"
|
41
42
|
@maximum_message_length = 2000
|
43
|
+
@use_full_hostname = nil
|
42
44
|
|
43
45
|
@allow_grouping = false
|
44
46
|
|
data/lib/logster/message.rb
CHANGED
@@ -80,7 +80,8 @@ module Logster
|
|
80
80
|
end
|
81
81
|
|
82
82
|
def self.hostname
|
83
|
-
|
83
|
+
command = Logster.config.use_full_hostname ? `hostname -f` : `hostname`
|
84
|
+
@hostname ||= command.strip! rescue "<unknown>"
|
84
85
|
end
|
85
86
|
|
86
87
|
def populate_from_env(env)
|
@@ -99,7 +100,7 @@ module Logster
|
|
99
100
|
env["time"] = @timestamp || get_timestamp
|
100
101
|
end
|
101
102
|
end
|
102
|
-
|
103
|
+
self.env = Message.populate_from_env(env)
|
103
104
|
end
|
104
105
|
|
105
106
|
def self.default_env
|
@@ -113,7 +114,8 @@ module Logster
|
|
113
114
|
|
114
115
|
# in its own method so it can be overridden
|
115
116
|
def grouping_hash
|
116
|
-
|
117
|
+
message = self.message.gsub(/[0-9a-f]+/i, "X")
|
118
|
+
{ message: message, severity: self.severity, backtrace: self.backtrace }
|
117
119
|
end
|
118
120
|
|
119
121
|
# todo - memoize?
|
data/lib/logster/redis_store.rb
CHANGED
@@ -342,7 +342,7 @@ 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
|
345
|
+
limited = @redis.call([:exists, key])
|
346
346
|
if Integer === limited
|
347
347
|
limited = limited != 0
|
348
348
|
end
|
data/lib/logster/version.rb
CHANGED
data/logster.gemspec
CHANGED
@@ -15,7 +15,9 @@ Gem::Specification.new do |spec|
|
|
15
15
|
spec.homepage = "https://github.com/discourse/logster"
|
16
16
|
spec.license = "MIT"
|
17
17
|
|
18
|
-
spec.
|
18
|
+
spec.required_ruby_version = ">= 2.5.0"
|
19
|
+
|
20
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
21
|
f.start_with?("website") || f.start_with?("bin")
|
20
22
|
end
|
21
23
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
@@ -33,5 +35,5 @@ Gem::Specification.new do |spec|
|
|
33
35
|
spec.add_development_dependency "guard-minitest"
|
34
36
|
spec.add_development_dependency "timecop"
|
35
37
|
spec.add_development_dependency "byebug", "~> 11.1.0"
|
36
|
-
spec.add_development_dependency "rubocop-discourse", "~> 2.1
|
38
|
+
spec.add_development_dependency "rubocop-discourse", "~> 2.4.1"
|
37
39
|
end
|
@@ -28,19 +28,19 @@ class TestReporter < Minitest::Test
|
|
28
28
|
|
29
29
|
reporter = Logster::Middleware::Reporter.new(nil)
|
30
30
|
env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
|
31
|
-
|
31
|
+
reporter.call(env)
|
32
32
|
|
33
33
|
assert_equal(Logger::Severity::WARN, Logster.store.latest[-1].severity)
|
34
34
|
|
35
35
|
reporter = Logster::Middleware::Reporter.new(nil)
|
36
36
|
env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello&severity=invalid")
|
37
|
-
|
37
|
+
reporter.call(env)
|
38
38
|
|
39
39
|
assert_equal(Logger::Severity::WARN, Logster.store.latest[-1].severity)
|
40
40
|
|
41
41
|
reporter = Logster::Middleware::Reporter.new(nil)
|
42
42
|
env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello&severity=error")
|
43
|
-
|
43
|
+
reporter.call(env)
|
44
44
|
|
45
45
|
assert_equal(Logger::Severity::ERROR, Logster.store.latest[-1].severity)
|
46
46
|
end
|
@@ -188,4 +188,16 @@ class TestBaseStore < Minitest::Test
|
|
188
188
|
refute_includes(store.reported.first.env.keys.map(&:to_sym), :backtrace)
|
189
189
|
end
|
190
190
|
end
|
191
|
+
|
192
|
+
def test_envs_with_invalid_encoding_dont_raise_errors
|
193
|
+
msg = @store.report(
|
194
|
+
Logger::WARN,
|
195
|
+
'',
|
196
|
+
'me have invalid encoding',
|
197
|
+
env: {
|
198
|
+
axe: "a\xF1xasa"
|
199
|
+
}
|
200
|
+
)
|
201
|
+
assert_equal("a�xasa", msg.env[:axe])
|
202
|
+
end
|
191
203
|
end
|
@@ -78,6 +78,18 @@ class TestMessage < MiniTest::Test
|
|
78
78
|
Logster.config.application_version = nil
|
79
79
|
end
|
80
80
|
|
81
|
+
def test_use_full_hostname
|
82
|
+
Logster::Message.instance_variable_set(:@hostname, nil)
|
83
|
+
Logster.config.use_full_hostname = true
|
84
|
+
msg = Logster::Message.new(0, '', 'test', 10)
|
85
|
+
msg.populate_from_env({})
|
86
|
+
|
87
|
+
assert_equal(`hostname -f`.strip!, msg.env["hostname"])
|
88
|
+
ensure
|
89
|
+
Logster.config.use_full_hostname = nil
|
90
|
+
Logster::Message.instance_variable_set(:@hostname, nil)
|
91
|
+
end
|
92
|
+
|
81
93
|
def test_merging_sums_count_for_both_messages
|
82
94
|
msg1 = Logster::Message.new(0, '', 'test', 10, count: 15)
|
83
95
|
msg2 = Logster::Message.new(0, '', 'test', 20, count: 13)
|
@@ -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.9.
|
4
|
+
version: 2.9.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 2.1
|
131
|
+
version: 2.4.1
|
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: 2.1
|
138
|
+
version: 2.4.1
|
139
139
|
description: UI for viewing logs in Rack
|
140
140
|
email:
|
141
141
|
- sam.saffron@gmail.com
|
@@ -143,9 +143,9 @@ executables: []
|
|
143
143
|
extensions: []
|
144
144
|
extra_rdoc_files: []
|
145
145
|
files:
|
146
|
+
- ".github/workflows/ci.yml"
|
146
147
|
- ".gitignore"
|
147
148
|
- ".rubocop.yml"
|
148
|
-
- ".travis.yml"
|
149
149
|
- CHANGELOG.md
|
150
150
|
- Gemfile
|
151
151
|
- Guardfile
|
@@ -288,14 +288,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
288
288
|
requirements:
|
289
289
|
- - ">="
|
290
290
|
- !ruby/object:Gem::Version
|
291
|
-
version:
|
291
|
+
version: 2.5.0
|
292
292
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
293
293
|
requirements:
|
294
294
|
- - ">="
|
295
295
|
- !ruby/object:Gem::Version
|
296
296
|
version: '0'
|
297
297
|
requirements: []
|
298
|
-
rubygems_version: 3.1.
|
298
|
+
rubygems_version: 3.1.4
|
299
299
|
signing_key:
|
300
300
|
specification_version: 4
|
301
301
|
summary: UI for viewing logs in Rack
|