logster 2.9.2 → 2.9.7
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.
- 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
|