rack-logstasher 1.0.2 → 1.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c284226cd552c5f8ad2a0fde3bbc33ff6798a58806b401b915b4530d50ae5067
4
- data.tar.gz: 5c80aa54ba69f36bb904b6c71cd9166a2d27025b0887042fa2c2b1ab6ee0d732
3
+ metadata.gz: 0d877ce60ae84d0a7532df7b8e89c8947fc7fcb4d6bd3733894c5761bc877a7c
4
+ data.tar.gz: 19b5da86c58508f8031737a65f4244ae7f1d91c4451a0587ae7559d0fa43b3d3
5
5
  SHA512:
6
- metadata.gz: a2150a7ccd858ae23a984c746bfb552a887295cd01d36e3ff3ac7f5c0171294f3b8f107ebe4183fa08901765278270a48c5d7795b2e5cee540fa6faa92e977b3
7
- data.tar.gz: 17877af0bb475ec61202a79f8191463f6611c51ec8fc2aa5b3b9833a1a5c05525b7c419511b59bc373c272138ac4b54f8c9e6e19c4292145385f90e014ae0043
6
+ metadata.gz: 4607fc05644c2a62c82f326aa933f832f11f788a1ba462f5cd4aa48beb721544347d9f9ea3d2f59969769a1c2403da6fdbdfaa35da0238e9c24f6fcb951c0b00
7
+ data.tar.gz: d47fe6f832f458d24e4ad6cf91d3235a93ccd5e3c311c6d16d8af3e13a64bf6abe08ee359e5c90a57d1419965e8517fd26b57c0fd1c5dab4906a99f0a66bb6fa
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: bundler
4
+ directory: "/"
5
+ schedule:
6
+ interval: daily
7
+ - package-ecosystem: "github-actions"
8
+ directory: "/"
9
+ schedule:
10
+ interval: daily
@@ -0,0 +1,35 @@
1
+ on: [push, pull_request]
2
+
3
+ jobs:
4
+ test_matrix:
5
+ strategy:
6
+ fail-fast: false
7
+ matrix:
8
+ # Due to https://github.com/actions/runner/issues/849, we have to use quotes for '3.0'
9
+ ruby: [ 2.7, '3.0', 3.1 ]
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v3
13
+ - uses: ruby/setup-ruby@v1
14
+ with:
15
+ ruby-version: ${{ matrix.ruby }}
16
+ bundler-cache: true
17
+ - run: bundle exec rake
18
+
19
+ # Branch protection rules cannot directly depend on status checks from matrix jobs.
20
+ # So instead we define `test` as a dummy job which only runs after the preceding `test_matrix` checks have passed.
21
+ # Solution inspired by: https://github.community/t/status-check-for-a-matrix-jobs/127354/3
22
+ test:
23
+ needs: test_matrix
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - run: echo "All matrix tests have passed 🚀"
27
+
28
+ publish:
29
+ needs: test
30
+ if: ${{ github.ref == 'refs/heads/main' }}
31
+ permissions:
32
+ contents: write
33
+ uses: alphagov/govuk-infrastructure/.github/workflows/publish-rubygem.yaml@main
34
+ secrets:
35
+ GEM_HOST_API_KEY: ${{ secrets.ALPHAGOV_RUBYGEMS_API_KEY }}
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format progress
2
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,19 @@
1
+ inherit_gem:
2
+ rubocop-govuk:
3
+ - config/default.yml
4
+ - config/rake.yml
5
+ - config/rspec.yml
6
+
7
+ inherit_mode:
8
+ merge:
9
+ - Exclude
10
+
11
+ # **************************************************************
12
+ # TRY NOT TO ADD OVERRIDES IN THIS FILE
13
+ #
14
+ # This repo is configured to follow the RuboCop GOV.UK styleguide.
15
+ # Any rules you override here will cause this repo to diverge from
16
+ # the way we write code in all other GOV.UK repos.
17
+ #
18
+ # See https://github.com/alphagov/rubocop-govuk/blob/main/CONTRIBUTING.md
19
+ # **************************************************************
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.1
1
+ 2.7.6
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ # 1.1.0
2
+
3
+ - Require Ruby 2.7 and greater
4
+
1
5
  # 1.0.2
2
6
 
3
7
  - Fix logging error where Rack uses the system monotonic clock.
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in rack-logstasher.gemspec
4
4
  gemspec
@@ -1,6 +1,6 @@
1
- Copyright (c) 2013 Alex Tomlins
1
+ The MIT License (MIT)
2
2
 
3
- MIT License
3
+ Copyright (C) 2013 Crown Copyright (Government Digital Service)
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -29,3 +29,7 @@ Add this to the middleware stack. e.g.
29
29
  3. Commit your changes (`git commit -am 'Add some feature'`)
30
30
  4. Push to the branch (`git push origin my-new-feature`)
31
31
  5. Create new Pull Request
32
+
33
+ ## Licence
34
+
35
+ [MIT License](LICENCE)
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
-
3
2
  require "rspec/core/rake_task"
3
+ require "rubocop/rake_task"
4
+
4
5
  RSpec::Core::RakeTask.new(:spec)
6
+ RuboCop::RakeTask.new
5
7
 
6
- task :default => :spec
8
+ task default: %i[rubocop spec]
@@ -1,5 +1,5 @@
1
- require 'rack/common_logger'
2
- require 'logstash/event'
1
+ require "rack/common_logger"
2
+ require "logstash/event"
3
3
 
4
4
  module Rack
5
5
  module Logstasher
@@ -10,20 +10,20 @@ module Rack
10
10
  @extra_response_headers = opts[:extra_response_headers] || {}
11
11
  end
12
12
 
13
- private
13
+ private
14
14
 
15
15
  def log(env, status, response_headers, began_at)
16
16
  now = Utils.clock_time
17
17
 
18
18
  data = {
19
- :method => env["REQUEST_METHOD"],
20
- :path => env["PATH_INFO"],
21
- :query_string => env["QUERY_STRING"],
22
- :status => status.to_i,
23
- :duration => duration_in_ms(began_at, now).round(2),
24
- :remote_addr => env['REMOTE_ADDR'],
25
- :request => request_line(env),
26
- :length => extract_content_length(response_headers)
19
+ method: env["REQUEST_METHOD"],
20
+ path: env["PATH_INFO"],
21
+ query_string: env["QUERY_STRING"],
22
+ status: status.to_i,
23
+ duration: duration_in_ms(began_at, now).round(2),
24
+ remote_addr: env["REMOTE_ADDR"],
25
+ request: request_line(env),
26
+ length: extract_content_length(response_headers),
27
27
  }
28
28
 
29
29
  @extra_request_headers.each do |header, log_key|
@@ -39,8 +39,8 @@ module Rack
39
39
  end
40
40
  end
41
41
 
42
- event = LogStash::Event.new(data.merge('tags' => ['request']))
43
- msg = event.to_json + "\n"
42
+ event = LogStash::Event.new(data.merge("tags" => %w[request]))
43
+ msg = "#{event.to_json}\n"
44
44
  if @logger.respond_to?(:write)
45
45
  @logger.write(msg)
46
46
  else
@@ -53,12 +53,11 @@ module Rack
53
53
  end
54
54
 
55
55
  def request_line(env)
56
- line = "#{env["REQUEST_METHOD"]} #{env["SCRIPT_NAME"]}#{env['PATH_INFO']}"
57
- line << "?#{env["QUERY_STRING"]}" if env["QUERY_STRING"] and ! env["QUERY_STRING"].empty?
58
- line << " #{env["SERVER_PROTOCOL"]}"
56
+ line = "#{env['REQUEST_METHOD']} #{env['SCRIPT_NAME']}#{env['PATH_INFO']}"
57
+ line << "?#{env['QUERY_STRING']}" if env["QUERY_STRING"] && !env["QUERY_STRING"].empty?
58
+ line << " #{env['SERVER_PROTOCOL']}"
59
59
  line
60
60
  end
61
-
62
- end # Logger
61
+ end
63
62
  end
64
63
  end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Logstasher
3
- VERSION = "1.0.2"
3
+ VERSION = "1.1.0".freeze
4
4
  end
5
5
  end
@@ -1,28 +1,29 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path("lib", __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'rack/logstasher/version'
3
+ require "rack/logstasher/version"
5
4
 
6
5
  Gem::Specification.new do |spec|
7
6
  spec.name = "rack-logstasher"
8
7
  spec.version = Rack::Logstasher::VERSION
9
8
  spec.authors = ["GOV.UK Dev"]
10
9
  spec.email = ["govuk-dev@digital.cabinet-office.gov.uk"]
11
- spec.description = %q{Rack middleware to log requests in logstash json event format. Like the logstasher gem, but for rack apps.}
12
- spec.summary = %q{Rack middleware to log requests in logstash json event format}
10
+ spec.description = "Rack middleware to log requests in logstash json event format. Like the logstasher gem, but for rack apps."
11
+ spec.summary = "Rack middleware to log requests in logstash json event format"
13
12
  spec.homepage = "https://github.com/alphagov/rack-logstasher"
14
13
  spec.license = "MIT"
15
14
 
16
- spec.files = `git ls-files`.split($/)
15
+ spec.required_ruby_version = ">= 2.7"
16
+
17
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
+ spec.require_paths = %w[lib]
20
21
 
22
+ spec.add_dependency "logstash-event", "~> 1.2"
21
23
  spec.add_dependency "rack", "~> 2.0"
22
- spec.add_dependency "logstash-event"
23
24
 
24
- spec.add_development_dependency "bundler"
25
+ spec.add_development_dependency "rack-test", "~> 2"
25
26
  spec.add_development_dependency "rake"
26
- spec.add_development_dependency "rack-test"
27
- spec.add_development_dependency "rspec"
27
+ spec.add_development_dependency "rspec", "~> 3"
28
+ spec.add_development_dependency "rubocop-govuk", "4.8.0"
28
29
  end
@@ -0,0 +1,151 @@
1
+ require "spec_helper"
2
+ require "rack/test"
3
+ require "logger"
4
+
5
+ require "rack/logstasher"
6
+
7
+ describe Rack::Logstasher::Logger do
8
+ include Rack::Test::Methods
9
+
10
+ describe "parameters" do
11
+ def app
12
+ Rack::Logstasher::Logger.new(
13
+ proc { |_env| [200, {}, ["Inner app response"]] },
14
+ Logger.new(tmp_logfile_path),
15
+ )
16
+ end
17
+
18
+ it "adds request details to the logfile" do
19
+ get "/foo?bar=baz"
20
+
21
+ log_details = JSON.parse(last_log_line)
22
+
23
+ expect(log_details["method"]).to eq("GET")
24
+ expect(log_details["path"]).to eq("/foo")
25
+ expect(log_details["query_string"]).to eq("bar=baz")
26
+ expect(log_details["request"]).to eq("GET /foo?bar=baz HTTP/1.0")
27
+ end
28
+
29
+ it "adds a tag of 'request'" do
30
+ get "/foo?bar=baz"
31
+
32
+ log_details = JSON.parse(last_log_line)
33
+ expect(log_details["tags"]).to eq(%w[request])
34
+ end
35
+ end
36
+
37
+ describe "duration" do
38
+ def app
39
+ Rack::Logstasher::Logger.new(
40
+ proc do |_env|
41
+ sleep 0.1
42
+ [200, {}, ["Inner app response"]]
43
+ end,
44
+ Logger.new(tmp_logfile_path),
45
+ )
46
+ end
47
+
48
+ it "logs request duration" do
49
+ get "/foo"
50
+
51
+ log_details = JSON.parse(last_log_line)
52
+ expect(log_details["duration"]).to be_within(5).of(100)
53
+ end
54
+ end
55
+
56
+ describe "HTTP headers" do
57
+ context "when there are extra request headers" do
58
+ let(:extra_request_headers) { {} }
59
+
60
+ def app
61
+ Rack::Logstasher::Logger.new(
62
+ proc { |_env| [200, {}, ["Inner app response"]] },
63
+ Logger.new(tmp_logfile_path),
64
+ extra_request_headers: extra_request_headers,
65
+ )
66
+ end
67
+
68
+ it "adds specified extra request headers to the log under the given key" do
69
+ extra_request_headers["foo"] = "header_foo"
70
+ get "/something", {}, { "HTTP_FOO" => "bar" }
71
+
72
+ log_details = JSON.parse(last_log_line)
73
+
74
+ expect(log_details["header_foo"]).to eq("bar")
75
+ end
76
+
77
+ it "does not add the key if the header is missing" do
78
+ extra_request_headers["foo"] = "header_foo"
79
+ get "/something"
80
+
81
+ log_details = JSON.parse(last_log_line)
82
+
83
+ expect(log_details).not_to have_key("header_foo")
84
+ end
85
+
86
+ it "handles dashes in header name" do
87
+ extra_request_headers["Varnish-Id"] = "varnish_id"
88
+ get "/something", {}, { "HTTP_VARNISH_ID" => "1234" }
89
+
90
+ log_details = JSON.parse(last_log_line)
91
+
92
+ expect(log_details["varnish_id"]).to eq("1234")
93
+ end
94
+ end
95
+
96
+ context "when there are extra response headers" do
97
+ let(:extra_response_headers) { {} }
98
+ let(:inner_response_headers) { {} }
99
+
100
+ def app
101
+ Rack::Logstasher::Logger.new(
102
+ proc do |_env|
103
+ headers = inner_response_headers
104
+ [200, headers, ["Inner app response"]]
105
+ end,
106
+ Logger.new(tmp_logfile_path),
107
+ extra_response_headers: extra_response_headers,
108
+ )
109
+ end
110
+
111
+ it "adds specified extra response headers to the log under the given key" do
112
+ extra_response_headers["foo"] = "header_foo"
113
+ inner_response_headers["Foo"] = "bar"
114
+ get "/something"
115
+
116
+ log_details = JSON.parse(last_log_line)
117
+
118
+ expect(log_details["header_foo"]).to eq("bar")
119
+ end
120
+
121
+ it "does not add the key if the header is missing" do
122
+ extra_response_headers["foo"] = "header_foo"
123
+ get "/something"
124
+
125
+ log_details = JSON.parse(last_log_line)
126
+
127
+ expect(log_details).not_to have_key("header_foo")
128
+ end
129
+
130
+ it "handles dashes in header name" do
131
+ extra_response_headers["X-Cache"] = "cache_status"
132
+ inner_response_headers["X-Cache"] = "MISS"
133
+ get "/something"
134
+
135
+ log_details = JSON.parse(last_log_line)
136
+
137
+ expect(log_details["cache_status"]).to eq("MISS")
138
+ end
139
+
140
+ it "matches header in a case-insensitive fashion" do
141
+ extra_response_headers["X-CacHe"] = "cache_status"
142
+ inner_response_headers["x-cAche"] = "MISS"
143
+ get "/something"
144
+
145
+ log_details = JSON.parse(last_log_line)
146
+
147
+ expect(log_details["cache_status"]).to eq("MISS")
148
+ end
149
+ end
150
+ end
151
+ end
data/spec/spec_helper.rb CHANGED
@@ -3,10 +3,9 @@
3
3
  # Require this file using `require "spec_helper"` to ensure that it is only
4
4
  # loaded once.
5
5
 
6
-
7
6
  # Requires supporting ruby files with custom matchers and macros, etc,
8
7
  # in spec/support/ and its subdirectories.
9
- Dir[File.expand_path("../support/**/*.rb", __FILE__)].each { |f| require f }
8
+ Dir[File.expand_path("support/**/*.rb", __dir__)].sort.each { |f| require f }
10
9
 
11
10
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
12
11
  RSpec.configure do |config|
@@ -17,5 +16,5 @@ RSpec.configure do |config|
17
16
  # order dependency and want to debug it, you can fix the order by providing
18
17
  # the seed, which is printed after each run.
19
18
  # --seed 1234
20
- config.order = 'random'
19
+ config.order = "random"
21
20
  end
@@ -1,7 +1,7 @@
1
- require 'tempfile'
1
+ require "tempfile"
2
2
 
3
3
  module LogfileHelper
4
- TMP_LOGFILE = Tempfile.new('rack-logstasher-tmp-log')
4
+ TMP_LOGFILE = Tempfile.new("rack-logstasher-tmp-log")
5
5
 
6
6
  def reset_tmp_log
7
7
  TMP_LOGFILE.rewind
@@ -18,6 +18,6 @@ module LogfileHelper
18
18
  end
19
19
 
20
20
  RSpec.configuration.include(LogfileHelper)
21
- RSpec.configuration.before :each do
21
+ RSpec.configuration.before do
22
22
  reset_tmp_log
23
23
  end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-logstasher
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-15 00:00:00.000000000 Z
11
+ date: 2022-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rack
14
+ name: logstash-event
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '1.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '1.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: logstash-event
28
+ name: rack
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: rack-test
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '2'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '2'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -67,33 +67,33 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rack-test
70
+ name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '3'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '3'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rspec
84
+ name: rubocop-govuk
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: 4.8.0
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: 4.8.0
97
97
  description: Rack middleware to log requests in logstash json event format. Like
98
98
  the logstasher gem, but for rack apps.
99
99
  email:
@@ -102,20 +102,22 @@ executables: []
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
+ - ".github/dependabot.yml"
106
+ - ".github/workflows/ci.yml"
105
107
  - ".gitignore"
106
108
  - ".rspec"
109
+ - ".rubocop.yml"
107
110
  - ".ruby-version"
108
111
  - CHANGELOG.md
109
112
  - Gemfile
110
- - Jenkinsfile
111
- - LICENSE.txt
113
+ - LICENCE
112
114
  - README.md
113
115
  - Rakefile
114
116
  - lib/rack/logstasher.rb
115
117
  - lib/rack/logstasher/logger.rb
116
118
  - lib/rack/logstasher/version.rb
117
119
  - rack-logstasher.gemspec
118
- - spec/logger_spec.rb
120
+ - spec/rack/logstasher/logger_spec.rb
119
121
  - spec/spec_helper.rb
120
122
  - spec/support/logfile_helper.rb
121
123
  homepage: https://github.com/alphagov/rack-logstasher
@@ -130,18 +132,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
132
  requirements:
131
133
  - - ">="
132
134
  - !ruby/object:Gem::Version
133
- version: '0'
135
+ version: '2.7'
134
136
  required_rubygems_version: !ruby/object:Gem::Requirement
135
137
  requirements:
136
138
  - - ">="
137
139
  - !ruby/object:Gem::Version
138
140
  version: '0'
139
141
  requirements: []
140
- rubygems_version: 3.0.3
142
+ rubygems_version: 3.3.24
141
143
  signing_key:
142
144
  specification_version: 4
143
145
  summary: Rack middleware to log requests in logstash json event format
144
146
  test_files:
145
- - spec/logger_spec.rb
147
+ - spec/rack/logstasher/logger_spec.rb
146
148
  - spec/spec_helper.rb
147
149
  - spec/support/logfile_helper.rb
data/Jenkinsfile DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env groovy
2
-
3
- library("govuk")
4
-
5
- node {
6
- govuk.buildProject()
7
- }
data/spec/logger_spec.rb DELETED
@@ -1,136 +0,0 @@
1
- require 'spec_helper'
2
- require 'rack/test'
3
- require 'logger'
4
-
5
- require 'rack/logstasher'
6
-
7
- describe "Logger" do
8
- include Rack::Test::Methods
9
-
10
- describe "adding request details to the logfile" do
11
- def app
12
- Rack::Logstasher::Logger.new(
13
- proc {|env|
14
- sleep @sleep_time if @sleep_time
15
- [200, {}, ["Inner app response"]]
16
- },
17
- Logger.new(tmp_logfile_path)
18
- )
19
- end
20
-
21
- it "should add request details to the logfile" do
22
- get "/foo?bar=baz"
23
-
24
- log_details = JSON.parse(last_log_line)
25
-
26
- expect(log_details['method']).to eq('GET')
27
- expect(log_details['path']).to eq('/foo')
28
- expect(log_details['query_string']).to eq('bar=baz')
29
- expect(log_details['request']).to eq('GET /foo?bar=baz ') # env['SERVER_PROTOCOL'] is not set under rack-test
30
- end
31
-
32
- it "should add request duration" do
33
- @sleep_time = 0.1
34
- get "/foo"
35
-
36
- log_details = JSON.parse(last_log_line)
37
-
38
- expect(log_details['duration']).to be_within(5).of(100)
39
- end
40
-
41
- it "should add a tag of 'request'" do
42
- get "/foo?bar=baz"
43
-
44
- log_details = JSON.parse(last_log_line)
45
- expect(log_details['tags']).to eq(['request'])
46
- end
47
-
48
- describe "adding extra headers to the log" do
49
- before :each do
50
- @extra_request_headers = {}
51
- @extra_response_headers = {}
52
- end
53
- def app
54
- Rack::Logstasher::Logger.new(
55
- proc {|env|
56
- headers = @inner_response_headers || {}
57
- [200, headers, ["Inner app response"]]
58
- },
59
- Logger.new(tmp_logfile_path),
60
- :extra_request_headers => @extra_request_headers,
61
- :extra_response_headers => @extra_response_headers
62
- )
63
- end
64
-
65
- context "extra request headers" do
66
- it "should add specified extra request headers to the log under the given key" do
67
- @extra_request_headers["foo"] = "header_foo"
68
- get "/something", {}, {"HTTP_FOO" => "bar"}
69
-
70
- log_details = JSON.parse(last_log_line)
71
-
72
- expect(log_details['header_foo']).to eq('bar')
73
- end
74
-
75
- it "should not add the key if the header is missing" do
76
- @extra_request_headers["foo"] = "header_foo"
77
- get "/something"
78
-
79
- log_details = JSON.parse(last_log_line)
80
-
81
- expect(log_details).not_to have_key('header_foo')
82
- end
83
-
84
- it "should handle dashes in header name" do
85
- @extra_request_headers["Varnish-Id"] = "varnish_id"
86
- get "/something", {}, {"HTTP_VARNISH_ID" => "1234"}
87
-
88
- log_details = JSON.parse(last_log_line)
89
-
90
- expect(log_details['varnish_id']).to eq('1234')
91
- end
92
- end
93
-
94
- context "extra response headers" do
95
- it "should add specified extra response headers to the log under the given key" do
96
- @extra_response_headers["foo"] = "header_foo"
97
- @inner_response_headers = {"Foo" => "bar"}
98
- get "/something"
99
-
100
- log_details = JSON.parse(last_log_line)
101
-
102
- expect(log_details['header_foo']).to eq('bar')
103
- end
104
-
105
- it "should not add the key if the header is missing" do
106
- @extra_response_headers["foo"] = "header_foo"
107
- get "/something"
108
-
109
- log_details = JSON.parse(last_log_line)
110
-
111
- expect(log_details).not_to have_key('header_foo')
112
- end
113
-
114
- it "should handle dashes in header name" do
115
- @extra_response_headers["X-Cache"] = "cache_status"
116
- @inner_response_headers = {"X-Cache" => "MISS"}
117
- get "/something"
118
-
119
- log_details = JSON.parse(last_log_line)
120
-
121
- expect(log_details['cache_status']).to eq('MISS')
122
- end
123
-
124
- it "should match header in a case-insensitive fashion" do
125
- @extra_response_headers["X-CacHe"] = "cache_status"
126
- @inner_response_headers = {"x-cAche" => "MISS"}
127
- get "/something"
128
-
129
- log_details = JSON.parse(last_log_line)
130
-
131
- expect(log_details['cache_status']).to eq('MISS')
132
- end
133
- end
134
- end
135
- end
136
- end