loga 2.7.0 → 2.8.1

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build-and-test.yml +72 -0
  3. data/.github/workflows/publish-gem.yml +28 -0
  4. data/.rubocop.yml +4 -0
  5. data/.rubocop_todo.yml +206 -0
  6. data/Appraisals +58 -46
  7. data/CHANGELOG.md +10 -0
  8. data/Gemfile +22 -0
  9. data/gemfiles/rails52.gemfile +23 -1
  10. data/gemfiles/rails60.gemfile +22 -0
  11. data/gemfiles/rails61.gemfile +22 -0
  12. data/gemfiles/rails70.gemfile +24 -0
  13. data/gemfiles/rails71.gemfile +35 -0
  14. data/gemfiles/sidekiq51.gemfile +22 -0
  15. data/gemfiles/sidekiq60.gemfile +22 -0
  16. data/gemfiles/sidekiq61.gemfile +22 -0
  17. data/gemfiles/sidekiq62.gemfile +22 -0
  18. data/gemfiles/sidekiq63.gemfile +22 -0
  19. data/gemfiles/sidekiq64.gemfile +22 -0
  20. data/gemfiles/sidekiq65.gemfile +22 -0
  21. data/gemfiles/sidekiq7.gemfile +22 -0
  22. data/gemfiles/sidekiq70.gemfile +22 -0
  23. data/gemfiles/sidekiq71.gemfile +22 -0
  24. data/gemfiles/sinatra14.gemfile +22 -0
  25. data/gemfiles/sinatra2.gemfile +33 -0
  26. data/gemfiles/sinatra3.gemfile +33 -0
  27. data/gemfiles/sinatra4.gemfile +33 -0
  28. data/gemfiles/unit.gemfile +22 -0
  29. data/lib/loga/formatters/gelf_formatter.rb +13 -6
  30. data/lib/loga/railtie.rb +2 -2
  31. data/lib/loga/version.rb +1 -1
  32. data/loga.gemspec +0 -15
  33. data/spec/fixtures/{rails50.rb → rails71.rb} +1 -1
  34. data/spec/integration/rails/action_mailer_spec.rb +2 -0
  35. data/spec/integration/rails/railtie_spec.rb +13 -3
  36. data/spec/integration/rails/request_spec.rb +4 -2
  37. data/spec/integration/sidekiq5_spec.rb +15 -13
  38. data/spec/integration/sidekiq60_spec.rb +3 -3
  39. data/spec/integration/sidekiq61_spec.rb +6 -4
  40. data/spec/integration/sidekiq65_spec.rb +1 -1
  41. data/spec/integration/sinatra_spec.rb +9 -6
  42. data/spec/loga/sidekiq5/job_logger_spec.rb +2 -0
  43. data/spec/loga/sidekiq6/job_logger_spec.rb +3 -1
  44. data/spec/loga/sidekiq7/job_logger_spec.rb +3 -1
  45. data/spec/loga/sidekiq_spec.rb +4 -2
  46. data/spec/spec_helper.rb +6 -3
  47. data/spec/support/gethostname_shared.rb +3 -1
  48. data/spec/support/helpers.rb +2 -0
  49. data/spec/support/request_spec.rb +83 -81
  50. data/spec/support/timecop_shared.rb +3 -1
  51. data/spec/unit/loga/configuration_spec.rb +11 -9
  52. data/spec/unit/loga/event_spec.rb +4 -2
  53. data/spec/unit/loga/formatters/gelf_formatter_spec.rb +38 -13
  54. data/spec/unit/loga/formatters/simple_formatter_spec.rb +7 -5
  55. data/spec/unit/loga/log_subscribers/action_mailer_spec.rb +6 -4
  56. data/spec/unit/loga/parameter_filter_spec.rb +2 -0
  57. data/spec/unit/loga/rack/logger_spec.rb +18 -16
  58. data/spec/unit/loga/rack/request_spec.rb +2 -0
  59. data/spec/unit/loga/service_version_strategies_spec.rb +2 -0
  60. data/spec/unit/loga/utilities_spec.rb +2 -0
  61. data/spec/unit/loga_spec.rb +3 -1
  62. metadata +12 -206
  63. data/.circleci/config.yml +0 -112
  64. data/gemfiles/rails42.gemfile +0 -11
  65. data/gemfiles/rails50.gemfile +0 -11
  66. data/spec/fixtures/rails42.rb +0 -80
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'timecop'
3
5
  require 'fakeredis'
@@ -27,8 +29,8 @@ describe 'Sidekiq client logger' do
27
29
  attr_reader :latest_error, :mutex, :cond
28
30
 
29
31
  def initialize
30
- @mutex = ::Mutex.new
31
- @cond = ::ConditionVariable.new
32
+ @mutex = Mutex.new
33
+ @cond = ConditionVariable.new
32
34
  end
33
35
 
34
36
  def processor_died(_inst, err)
@@ -46,7 +48,7 @@ describe 'Sidekiq client logger' do
46
48
  concurrency: 3,
47
49
  queues: ['default'],
48
50
  job_logger: Loga::Sidekiq6::JobLogger,
49
- }.tap { |opts| opts[:fetch] = ::Sidekiq::BasicFetch.new(opts) }
51
+ }.tap { |opts| opts[:fetch] = Sidekiq::BasicFetch.new(opts) }
50
52
  end
51
53
  end
52
54
  end
@@ -87,7 +89,7 @@ describe 'Sidekiq client logger' do
87
89
  aggregate_failures do
88
90
  expect(last_element['class']).to eq 'MySidekiqWorker'
89
91
  expect(last_element['args']).to eq ['Bob']
90
- expect(last_element['retry']).to eq true
92
+ expect(last_element['retry']).to be true
91
93
  expect(last_element['queue']).to eq 'default'
92
94
  end
93
95
  end
@@ -75,7 +75,7 @@ describe 'Sidekiq client logger' do
75
75
  aggregate_failures do
76
76
  expect(last_element['class']).to eq 'MySidekiqWorker'
77
77
  expect(last_element['args']).to eq ['Bob']
78
- expect(last_element['retry']).to eq true
78
+ expect(last_element['retry']).to be true
79
79
  expect(last_element['queue']).to eq 'default'
80
80
  end
81
81
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  class MySinatraApp < Sinatra::Base
@@ -21,7 +23,7 @@ class MySinatraApp < Sinatra::Base
21
23
  end
22
24
  end
23
25
 
24
- RSpec.describe 'Structured logging with Sinatra', :with_hostname, :timecop do
26
+ RSpec.describe 'Structured logging with Sinatra', :timecop, :with_hostname do
25
27
  let(:io) { StringIO.new }
26
28
  let(:format) {}
27
29
  let(:last_log_entry) do
@@ -69,12 +71,12 @@ RSpec.describe 'Structured logging with Sinatra', :with_hostname, :timecop do
69
71
  let(:data) do
70
72
  {
71
73
  'method' => 'GET',
72
- 'path' => '/ok',
74
+ 'path' => '/ok',
73
75
  'params' => { 'username'=>'yoshi' },
74
76
  'request_id' => '700a6a01',
75
77
  'request_ip' => '127.0.0.1',
76
78
  'user_agent' => nil,
77
- 'duration' => 0,
79
+ 'duration' => 0,
78
80
  'status' => 200,
79
81
  }
80
82
  end
@@ -97,7 +99,7 @@ RSpec.describe 'Structured logging with Sinatra', :with_hostname, :timecop do
97
99
  let(:data) do
98
100
  super().merge(
99
101
  'status' => 302,
100
- 'path' => '/new',
102
+ 'path' => '/new',
101
103
  'params' => {},
102
104
  )
103
105
  end
@@ -112,14 +114,15 @@ RSpec.describe 'Structured logging with Sinatra', :with_hostname, :timecop do
112
114
  let(:data) do
113
115
  super().merge(
114
116
  'status' => 500,
115
- 'path' => '/error',
117
+ 'path' => '/error',
116
118
  'params' => {},
117
119
  )
118
120
  end
119
121
 
120
122
  it 'logs the request with the exception' do
121
123
  get '/error', {}, 'HTTP_X_REQUEST_ID' => '700a6a01'
122
- expect(last_log_entry).to eql("E, #{time_pid_tags} GET /error 500 in 0ms type=request #{data_as_text} exception=undefined method `name' for nil:NilClass\n")
124
+
125
+ expect(last_log_entry).to start_with("E, #{time_pid_tags} GET /error 500 in 0ms type=request #{data_as_text} exception=undefined method `name' for nil")
123
126
  end
124
127
  end
125
128
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'loga/sidekiq5/job_logger'
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'loga/sidekiq6/job_logger'
3
5
 
@@ -24,7 +26,7 @@ RSpec.describe Loga::Sidekiq6::JobLogger do
24
26
 
25
27
  # https://github.com/mperham/sidekiq/blob/v6.1.2/lib/sidekiq/job_logger.rb
26
28
  it 'inherits from ::Sidekiq::JobLogger' do
27
- expect(subject).to be_a(::Sidekiq::JobLogger)
29
+ expect(subject).to be_a(Sidekiq::JobLogger)
28
30
  end
29
31
 
30
32
  describe '#call' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'loga/sidekiq7/job_logger'
3
5
 
@@ -26,7 +28,7 @@ RSpec.describe Loga::Sidekiq7::JobLogger do
26
28
 
27
29
  # https://github.com/mperham/sidekiq/blob/v6.1.2/lib/sidekiq/job_logger.rb
28
30
  it 'inherits from ::Sidekiq::JobLogger' do
29
- expect(subject).to be_a(::Sidekiq::JobLogger)
31
+ expect(subject).to be_a(Sidekiq::JobLogger)
30
32
  end
31
33
 
32
34
  describe '#call' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe Loga::Sidekiq do
@@ -32,9 +34,9 @@ RSpec.describe Loga::Sidekiq do
32
34
 
33
35
  case m['version']
34
36
  when '51'
35
- expect(::Sidekiq.options[:job_logger]).to eq(Loga::Sidekiq5::JobLogger)
37
+ expect(Sidekiq.options[:job_logger]).to eq(Loga::Sidekiq5::JobLogger)
36
38
  when '6'
37
- expect(::Sidekiq.options[:job_logger]).to eq(Loga::Sidekiq6::JobLogger)
39
+ expect(Sidekiq.options[:job_logger]).to eq(Loga::Sidekiq6::JobLogger)
38
40
  end
39
41
  end
40
42
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'byebug'
2
4
  require 'pry'
3
5
  require 'support/gethostname_shared'
@@ -8,16 +10,17 @@ require 'rack/test'
8
10
  require 'simplecov'
9
11
 
10
12
  SimpleCov.start do
11
- command_name "ruby-#{RUBY_VERSION}-#{File.basename(ENV['BUNDLE_GEMFILE'], '.gemfile')}"
13
+ command_name "ruby-#{RUBY_VERSION}-#{File.basename(ENV.fetch('BUNDLE_GEMFILE', nil),
14
+ '.gemfile')}"
12
15
 
13
16
  # Exclude specs from showing up in the code coverage report.
14
17
  add_filter 'spec/'
15
18
  end
16
19
 
17
- case ENV['BUNDLE_GEMFILE']
20
+ case ENV.fetch('BUNDLE_GEMFILE', nil)
18
21
  when /rails/
19
22
  rspec_pattern = 'integration/rails/**/*_spec.rb'
20
- /(?<appraisal>rails\d{2})\.gemfile/ =~ ENV['BUNDLE_GEMFILE']
23
+ /(?<appraisal>rails\d{2})\.gemfile/ =~ ENV.fetch('BUNDLE_GEMFILE', nil)
21
24
  require 'rails'
22
25
  require 'action_mailer'
23
26
  require File.expand_path("../fixtures/#{appraisal}.rb", __FILE__)
@@ -1,4 +1,6 @@
1
- shared_context 'gethostname', with_hostname: true do
1
+ # frozen_string_literal: true
2
+
3
+ shared_context 'gethostname', :with_hostname do
2
4
  let(:hostname) { 'bird.example.com' }
3
5
 
4
6
  before do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bigdecimal'
2
4
 
3
5
  module Helpers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.shared_examples 'request logger' do
2
4
  describe 'get request' do
3
5
  it 'logs the request' do
@@ -6,23 +8,23 @@ RSpec.shared_examples 'request logger' do
6
8
  'HTTP_USER_AGENT' => 'Chrome', 'HTTP_X_REQUEST_ID' => '471a34dc'
7
9
 
8
10
  expect(last_log_entry).to include(
9
- 'version' => '1.1',
10
- 'host' => 'bird.example.com',
11
- 'short_message' => 'GET /ok?username=yoshi 200 in 0ms',
12
- 'timestamp' => 1_450_150_205.123,
13
- 'level' => 6,
14
- '_type' => 'request',
15
- '_service.name' => 'hello_world_app',
16
- '_service.version' => '1.0',
17
- '_request.method' => 'GET',
18
- '_request.path' => '/ok',
19
- '_request.params' => { 'username' => 'yoshi' },
11
+ 'version' => '1.1',
12
+ 'host' => 'bird.example.com',
13
+ 'short_message' => 'GET /ok?username=yoshi 200 in 0ms',
14
+ 'timestamp' => 1_450_150_205.123,
15
+ 'level' => 6,
16
+ '_type' => 'request',
17
+ '_service.name' => 'hello_world_app',
18
+ '_service.version' => '1.0',
19
+ '_request.method' => 'GET',
20
+ '_request.path' => '/ok',
21
+ '_request.params' => { 'username' => 'yoshi' },
20
22
  '_request.request_ip' => '127.0.0.1',
21
23
  '_request.user_agent' => 'Chrome',
22
- '_request.status' => 200,
24
+ '_request.status' => 200,
23
25
  '_request.request_id' => '471a34dc',
24
- '_request.duration' => 0,
25
- '_tags' => '471a34dc TEST_TAG',
26
+ '_request.duration' => 0,
27
+ '_tags' => '471a34dc TEST_TAG',
26
28
  )
27
29
  end
28
30
  end
@@ -36,23 +38,23 @@ RSpec.shared_examples 'request logger' do
36
38
  'HTTP_USER_AGENT' => 'Chrome', 'HTTP_X_REQUEST_ID' => '471a34dc'
37
39
 
38
40
  expect(last_log_entry).to include(
39
- 'version' => '1.1',
40
- 'host' => 'bird.example.com',
41
- 'short_message' => 'POST /users?username=yoshi 200 in 0ms',
42
- 'timestamp' => 1_450_150_205.123,
43
- 'level' => 6,
44
- '_type' => 'request',
45
- '_service.name' => 'hello_world_app',
46
- '_service.version' => '1.0',
47
- '_request.method' => 'POST',
48
- '_request.path' => '/users',
49
- '_request.params' => { 'username' => 'yoshi', 'email' => 'hello@world.com' },
41
+ 'version' => '1.1',
42
+ 'host' => 'bird.example.com',
43
+ 'short_message' => 'POST /users?username=yoshi 200 in 0ms',
44
+ 'timestamp' => 1_450_150_205.123,
45
+ 'level' => 6,
46
+ '_type' => 'request',
47
+ '_service.name' => 'hello_world_app',
48
+ '_service.version' => '1.0',
49
+ '_request.method' => 'POST',
50
+ '_request.path' => '/users',
51
+ '_request.params' => { 'username' => 'yoshi', 'email' => 'hello@world.com' },
50
52
  '_request.request_ip' => '127.0.0.1',
51
53
  '_request.user_agent' => 'Chrome',
52
- '_request.status' => 200,
54
+ '_request.status' => 200,
53
55
  '_request.request_id' => '471a34dc',
54
- '_request.duration' => 0,
55
- '_tags' => '471a34dc TEST_TAG',
56
+ '_request.duration' => 0,
57
+ '_tags' => '471a34dc TEST_TAG',
56
58
  )
57
59
  end
58
60
 
@@ -68,23 +70,23 @@ RSpec.shared_examples 'request logger' do
68
70
  get '/new', {}, 'HTTP_USER_AGENT' => 'Chrome', 'HTTP_X_REQUEST_ID' => '471a34dc'
69
71
 
70
72
  expect(last_log_entry).to include(
71
- 'version' => '1.1',
72
- 'host' => 'bird.example.com',
73
- 'short_message' => 'GET /new 302 in 0ms',
74
- 'timestamp' => 1_450_150_205.123,
75
- 'level' => 6,
76
- '_type' => 'request',
77
- '_service.name' => 'hello_world_app',
78
- '_service.version' => '1.0',
79
- '_request.method' => 'GET',
80
- '_request.path' => '/new',
81
- '_request.params' => {},
73
+ 'version' => '1.1',
74
+ 'host' => 'bird.example.com',
75
+ 'short_message' => 'GET /new 302 in 0ms',
76
+ 'timestamp' => 1_450_150_205.123,
77
+ 'level' => 6,
78
+ '_type' => 'request',
79
+ '_service.name' => 'hello_world_app',
80
+ '_service.version' => '1.0',
81
+ '_request.method' => 'GET',
82
+ '_request.path' => '/new',
83
+ '_request.params' => {},
82
84
  '_request.request_ip' => '127.0.0.1',
83
85
  '_request.user_agent' => 'Chrome',
84
- '_request.status' => 302,
86
+ '_request.status' => 302,
85
87
  '_request.request_id' => '471a34dc',
86
- '_request.duration' => 0,
87
- '_tags' => '471a34dc TEST_TAG',
88
+ '_request.duration' => 0,
89
+ '_tags' => '471a34dc TEST_TAG',
88
90
  )
89
91
  end
90
92
  end
@@ -96,26 +98,26 @@ RSpec.shared_examples 'request logger' do
96
98
  'HTTP_USER_AGENT' => 'Chrome', 'HTTP_X_REQUEST_ID' => '471a34dc'
97
99
 
98
100
  expect(last_log_entry).to include(
99
- 'version' => '1.1',
100
- 'host' => 'bird.example.com',
101
- 'short_message' => 'GET /error?username=yoshi 500 in 0ms',
102
- 'timestamp' => 1_450_150_205.123,
103
- 'level' => 3,
104
- '_type' => 'request',
105
- '_service.name' => 'hello_world_app',
106
- '_service.version' => '1.0',
107
- '_request.method' => 'GET',
108
- '_request.path' => '/error',
109
- '_request.params' => { 'username' => 'yoshi' },
110
- '_request.request_ip' => '127.0.0.1',
111
- '_request.user_agent' => 'Chrome',
112
- '_request.status' => 500,
113
- '_request.request_id' => '471a34dc',
114
- '_request.duration' => 0,
115
- '_exception.klass' => 'NoMethodError',
116
- '_exception.message' => "undefined method `name' for nil:NilClass",
101
+ 'version' => '1.1',
102
+ 'host' => 'bird.example.com',
103
+ 'short_message' => 'GET /error?username=yoshi 500 in 0ms',
104
+ 'timestamp' => 1_450_150_205.123,
105
+ 'level' => 3,
106
+ '_type' => 'request',
107
+ '_service.name' => 'hello_world_app',
108
+ '_service.version' => '1.0',
109
+ '_request.method' => 'GET',
110
+ '_request.path' => '/error',
111
+ '_request.params' => { 'username' => 'yoshi' },
112
+ '_request.request_ip' => '127.0.0.1',
113
+ '_request.user_agent' => 'Chrome',
114
+ '_request.status' => 500,
115
+ '_request.request_id' => '471a34dc',
116
+ '_request.duration' => 0,
117
+ '_exception.klass' => 'NoMethodError',
118
+ '_exception.message' => start_with("undefined method `name' for nil"),
117
119
  '_exception.backtrace' => be_a(String),
118
- '_tags' => '471a34dc TEST_TAG',
120
+ '_tags' => '471a34dc TEST_TAG',
119
121
  )
120
122
  end
121
123
  end
@@ -125,23 +127,23 @@ RSpec.shared_examples 'request logger' do
125
127
  get '/not_found', {}, 'HTTP_X_REQUEST_ID' => '471a34dc'
126
128
 
127
129
  expect(last_log_entry).to include(
128
- 'version' => '1.1',
129
- 'host' => 'bird.example.com',
130
- 'short_message' => 'GET /not_found 404 in 0ms',
131
- 'timestamp' => 1_450_150_205.123,
132
- 'level' => 6,
133
- '_type' => 'request',
134
- '_service.name' => 'hello_world_app',
135
- '_service.version' => '1.0',
136
- '_request.method' => 'GET',
137
- '_request.path' => '/not_found',
138
- '_request.params' => {},
139
- '_request.request_ip' => '127.0.0.1',
140
- '_request.user_agent' => nil,
141
- '_request.status' => 404,
142
- '_request.request_id' => '471a34dc',
143
- '_request.duration' => 0,
144
- '_tags' => '471a34dc TEST_TAG',
130
+ 'version' => '1.1',
131
+ 'host' => 'bird.example.com',
132
+ 'short_message' => 'GET /not_found 404 in 0ms',
133
+ 'timestamp' => 1_450_150_205.123,
134
+ 'level' => 6,
135
+ '_type' => 'request',
136
+ '_service.name' => 'hello_world_app',
137
+ '_service.version' => '1.0',
138
+ '_request.method' => 'GET',
139
+ '_request.path' => '/not_found',
140
+ '_request.params' => {},
141
+ '_request.request_ip' => '127.0.0.1',
142
+ '_request.user_agent' => nil,
143
+ '_request.status' => 404,
144
+ '_request.request_id' => '471a34dc',
145
+ '_request.duration' => 0,
146
+ '_tags' => '471a34dc TEST_TAG',
145
147
  )
146
148
  end
147
149
  end
@@ -188,9 +190,9 @@ RSpec.shared_examples 'request logger' do
188
190
  bob_file: Rack::Test::UploadedFile.new('spec/fixtures/random_bin')
189
191
 
190
192
  expect(last_log_entry).to include(
191
- 'short_message' => 'POST /users?username=yoshi 200 in 0ms',
192
- 'level' => 6,
193
- '_request.params' => {
193
+ 'short_message' => 'POST /users?username=yoshi 200 in 0ms',
194
+ 'level' => 6,
195
+ '_request.params' => {
194
196
  'username' => 'yoshi',
195
197
  'bob_file' => include(
196
198
  'filename' => 'random_bin',
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'timecop'
2
4
 
3
- shared_context 'timecop', timecop: true do
5
+ shared_context 'timecop', :timecop do
4
6
  # Allows fixed timestamps
5
7
  before(:all) { Timecop.freeze(time_anchor) }
6
8
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Loga::Configuration do
@@ -20,8 +22,8 @@ describe Loga::Configuration do
20
22
  allow(Loga::ServiceVersionStrategies).to receive(:call).and_return('unknown.sha')
21
23
  end
22
24
 
23
- context 'defaults', with_hostname: true do
24
- specify { expect(subject.device).to eq(STDOUT) }
25
+ context 'defaults', :with_hostname do
26
+ specify { expect(subject.device).to eq($stdout) }
25
27
  specify { expect(subject.filter_exceptions).to eq(framework_exceptions) }
26
28
  specify { expect(subject.filter_parameters).to eq([]) }
27
29
  specify { expect(subject.format).to eq(:simple) }
@@ -29,7 +31,7 @@ describe Loga::Configuration do
29
31
  specify { expect(subject.level).to eq(:info) }
30
32
  specify { expect(subject.service_name).to eq('hello_world_app') }
31
33
  specify { expect(subject.service_version).to eq('unknown.sha') }
32
- specify { expect(subject.sync).to eq(true) }
34
+ specify { expect(subject.sync).to be(true) }
33
35
  specify { expect(subject.tags).to eq([]) }
34
36
  end
35
37
 
@@ -174,11 +176,11 @@ describe Loga::Configuration do
174
176
  let(:logdev) { subject.logger.instance_variable_get(:@logdev) }
175
177
 
176
178
  {
177
- debug: 0,
178
- info: 1,
179
- warn: 2,
180
- error: 3,
181
- fatal: 4,
179
+ debug: 0,
180
+ info: 1,
181
+ warn: 2,
182
+ error: 3,
183
+ fatal: 4,
182
184
  unknown: 5,
183
185
  }.each do |sym, level|
184
186
  context "when log level is #{sym}" do
@@ -194,7 +196,7 @@ describe Loga::Configuration do
194
196
  let(:options) { super().merge(sync: false) }
195
197
 
196
198
  it 'uses warn log level' do
197
- expect(logdev.dev.sync).to eq(false)
199
+ expect(logdev.dev.sync).to be(false)
198
200
  end
199
201
  end
200
202
  end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- RSpec.describe Loga::Event, timecop: true do
5
+ RSpec.describe Loga::Event, :timecop do
4
6
  describe 'initialize' do
5
7
  context 'when no message is passed' do
6
8
  it 'sets message to an empty string' do
@@ -9,7 +11,7 @@ RSpec.describe Loga::Event, timecop: true do
9
11
  end
10
12
 
11
13
  context 'when message is passed' do
12
- let(:message) { "stuff \xC2".force_encoding 'ASCII-8BIT' }
14
+ let(:message) { "stuff \xC2".dup.force_encoding 'ASCII-8BIT' }
13
15
  let(:subject) { described_class.new message: message }
14
16
 
15
17
  it 'sanitizes the input to be UTF-8 convertable' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe Loga::Formatters::GELFFormatter do
@@ -8,25 +10,25 @@ describe Loga::Formatters::GELFFormatter do
8
10
  let(:host) { 'www.example.com' }
9
11
  let(:params) do
10
12
  {
11
- service_name: service_name,
13
+ service_name: service_name,
12
14
  service_version: service_version,
13
- host: host,
15
+ host: host,
14
16
  }
15
17
  end
16
18
 
17
19
  shared_examples 'valid GELF message' do
18
20
  it 'includes the required fields' do
19
- expect(json).to include('version' => '1.1',
20
- 'host' => host,
21
+ expect(json).to include('version' => '1.1',
22
+ 'host' => host,
21
23
  'short_message' => be_a(String),
22
- 'timestamp' => be_a(Float),
23
- 'level' => 6)
24
+ 'timestamp' => be_a(Float),
25
+ 'level' => 6)
24
26
  end
25
27
 
26
28
  it 'includes Loga additional fields' do
27
- expect(json).to include('_service.name' => service_name,
29
+ expect(json).to include('_service.name' => service_name,
28
30
  '_service.version' => service_version,
29
- '_tags' => '')
31
+ '_tags' => '')
30
32
  end
31
33
 
32
34
  it 'outputs the timestamp in seconds since UNIX epoch' do
@@ -209,12 +211,35 @@ describe Loga::Formatters::GELFFormatter do
209
211
  end
210
212
  end
211
213
 
214
+ context 'when working with additional fields via otel' do
215
+ let(:options) { { message: 'Wooden house' } }
216
+ let(:message) { Loga::Event.new(options) }
217
+ let(:trace_context) { { hex_trace_id: '123', hex_span_id: '456' } }
218
+
219
+ before do
220
+ klass = Class.new do
221
+ class << self
222
+ attr_accessor :current_span
223
+ end
224
+ end
225
+ klass.current_span = OpenStruct.new(context: OpenStruct.new(trace_context))
226
+ stub_const('::OpenTelemetry::Trace', klass)
227
+ end
228
+
229
+ it 'includes the trace_id and span_id' do
230
+ expect(json['_trace_id']).to eq('123')
231
+ expect(json['_span_id']).to eq('456')
232
+ end
233
+
234
+ include_examples 'valid GELF message'
235
+ end
236
+
212
237
  {
213
- 'DEBUG' => 7,
214
- 'INFO' => 6,
215
- 'WARN' => 4,
216
- 'ERROR' => 3,
217
- 'FATAL' => 2,
238
+ 'DEBUG' => 7,
239
+ 'INFO' => 6,
240
+ 'WARN' => 4,
241
+ 'ERROR' => 3,
242
+ 'FATAL' => 2,
218
243
  'UNKNOWN' => 1,
219
244
  }.each do |ruby_severity, syslog_level|
220
245
  context "with severity #{ruby_severity}" do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'loga/formatters/simple_formatter'
3
5
 
@@ -112,11 +114,11 @@ describe Loga::Formatters::SimpleFormatter do
112
114
  end
113
115
 
114
116
  {
115
- 'DEBUG' => 'D',
116
- 'INFO' => 'I',
117
- 'WARN' => 'W',
118
- 'ERROR' => 'E',
119
- 'FATAL' => 'F',
117
+ 'DEBUG' => 'D',
118
+ 'INFO' => 'I',
119
+ 'WARN' => 'W',
120
+ 'ERROR' => 'E',
121
+ 'FATAL' => 'F',
120
122
  'UNKNOWN' => 'U',
121
123
  }.each do |ruby_severity, formatted_severity|
122
124
  context "with severity #{ruby_severity}" do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
  require 'active_support'
3
5
  require 'loga/log_subscribers/action_mailer'
@@ -9,7 +11,7 @@ RSpec.describe Loga::LogSubscribers::ActionMailer do
9
11
 
10
12
  let(:event) do
11
13
  instance_double(
12
- 'ActiveSupport::Notifications::Event',
14
+ ActiveSupport::Notifications::Event,
13
15
  payload: payload,
14
16
  duration: 0.0001,
15
17
  time: Time.now,
@@ -21,7 +23,7 @@ RSpec.describe Loga::LogSubscribers::ActionMailer do
21
23
  let(:payload) do
22
24
  {
23
25
  mailer: 'FakeMailer',
24
- to: ['user@example.com'],
26
+ to: ['user@example.com'],
25
27
  }
26
28
  end
27
29
  let(:config) { instance_double Loga::Configuration, hide_pii: hide_pii }
@@ -82,8 +84,8 @@ RSpec.describe Loga::LogSubscribers::ActionMailer do
82
84
  context 'when an email is sent' do
83
85
  let(:payload) do
84
86
  {
85
- mailer: 'FakeMailer',
86
- from: 'loremipsum@example.com',
87
+ mailer: 'FakeMailer',
88
+ from: 'loremipsum@example.com',
87
89
  subject: 'Lorem ipsum',
88
90
  }
89
91
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe Loga::ParameterFilter do