logster 2.9.2 → 2.9.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
 
@@ -80,7 +80,8 @@ module Logster
80
80
  end
81
81
 
82
82
  def self.hostname
83
- @hostname ||= `hostname`.strip! rescue "<unknown>"
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
- @env = Message.populate_from_env(env)
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
- { message: self.message, severity: self.severity, backtrace: self.backtrace }
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?
@@ -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(key)
345
+ limited = @redis.call([:exists, key])
346
346
  if Integer === limited
347
347
  limited = limited != 0
348
348
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Logster
4
- VERSION = "2.9.2"
4
+ VERSION = "2.9.7"
5
5
  end
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.files = `git ls-files -z`.split("\x0").reject do |f|
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.2"
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
- status, = reporter.call(env)
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
- status, = reporter.call(env)
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
- status, = reporter.call(env)
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.2
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: 2020-08-11 00:00:00.000000000 Z
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.2
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.2
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: '0'
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.2
298
+ rubygems_version: 3.1.4
299
299
  signing_key:
300
300
  specification_version: 4
301
301
  summary: UI for viewing logs in Rack
data/.travis.yml DELETED
@@ -1,17 +0,0 @@
1
- language: ruby
2
-
3
- matrix:
4
- fast_finish: true
5
-
6
- rvm:
7
- - 2.5.3
8
- - 2.6.5
9
- - 2.7.0
10
-
11
- services:
12
- - redis-server
13
-
14
- before_install:
15
- - gem install bundler -v 1.17.2
16
-
17
- sudo: false