rack-request-object-logger 3.0.3 → 5.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f88b6570bfb9f0ce097804e7251033d148625664ed132ce82f9ed451786881b
4
- data.tar.gz: 3c3944e7642717a2e4f11cf8f4f4386fcb0e5f140cfa751ae3484cc66341aafa
3
+ metadata.gz: a41cacc30a49c5172af149d755b438f29ffb17872d55df6debf95fa74fa08cd8
4
+ data.tar.gz: 3d5c2c6f8025e378156326aa9c8432fe0034b74981b810eea30bd87829897000
5
5
  SHA512:
6
- metadata.gz: bbba4358191665de50681e94fb9e9af6406facf9388cd2065c9bb03e99c74a5716306efcbc8ea369ef0bbfee77a2159aaafd8e0041a9f5448a479f3c89b4b918
7
- data.tar.gz: 669313528821b1bc40985ae94d6eafe5d209f94c3300f09036c860fdc64c93e48b1bd6946c5f7639a8661263a762bda4dc2e57e274e7dfb16434d3cb55775b0b
6
+ metadata.gz: 91776ab809841fc6782fd5380620acb0c73dbcc8afa116d6aedaf9b8cd2e39532e682eb453a148a10a9f2ef8cafcc4e7e0c7b4b9b8846cdf99444b796ac7fb22
7
+ data.tar.gz: 6984bdd8d5456449d363c03717e84694264d2d079da72604a5b5503c435f1ca397c295a2327bb7653fd1527427417d52e1a9ffc4cf789864cdcd93832cd1b423
@@ -0,0 +1,26 @@
1
+ name: github-actions-rails
2
+
3
+ on:
4
+ pull_request:
5
+ branches: ["*"]
6
+ push:
7
+ branches: [master]
8
+ jobs:
9
+ test:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ ruby: ["2.7", "3.2", "3.3", "3.4", "4.0", head, truffleruby, truffleruby-head]
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - name: Set up Ruby ${{ matrix.ruby }}
18
+ uses: ruby/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby }}
21
+ bundler: default
22
+ bundler-cache: true
23
+ - name: Run tests
24
+ env:
25
+ RAILS_ENV: test
26
+ run: bundle exec rake
data/README.md CHANGED
@@ -1,14 +1,12 @@
1
- [![Build Status](http://img.shields.io/travis/istana/rack-request-object-logger.svg?style=flat-square)](https://travis-ci.org/istana/rack-request-object-logger)
1
+ ![example workflow](https://github.com/istana/rack-request-object-logger/actions/workflows/ruby.yml/badge.svg)
2
2
  [![Gem Version](http://img.shields.io/gem/v/rack-request-object-logger.svg?style=flat-square)](https://rubygems.org/gems/rack-request-object-logger)
3
3
  [![License](http://img.shields.io/:license-apache-blue.svg?style=flat-square)](http://www.apache.org/licenses/LICENSE-2.0.html)
4
4
 
5
5
  # rack-request-object-logger
6
6
 
7
- **Human description:** I created this to log all HTTP requests from my Rails application into MySQL database automatically. Then process and search via ElasticSearch.
7
+ The project is a Rack middleware to automatically log a HTTP request to a custom object.
8
8
 
9
- **General concept:** Log HTTP requests via Rack stack to an object. Use any object, because logger uses dependency injection in the constructor. Be independent from Rails.
10
-
11
- Don't be confused with no commits in months or years. Rack middlewares rarely change. They just work.
9
+ There might be no commits in months or years. Rack middlewares rarely change.
12
10
 
13
11
  ## Install gem
14
12
 
@@ -24,9 +22,9 @@ gem 'rack-request-object-logger'
24
22
 
25
23
  ## Rubies Support
26
24
 
27
- Tested with Matz Ruby 2.5, 2.6 and Truffleruby.
25
+ Tested with Matz Ruby 2.7, 3.2, 3.3, 3.4, 4.0, head, and ruffleruby, truffleruby-head.
28
26
 
29
- Should work with Ruby 2.1+, jRuby and Rubinius 3.69+ (is dead!) and Truffleruby.
27
+ Should work also with 3.0, 3.1, jRuby, just sqlite3 adapter supports only Rails 7-8 and tests require a more recent Rails.
30
28
 
31
29
  ## Roadmap
32
30
 
@@ -39,26 +37,13 @@ Bug: I learned at EuRuKo 2018 that my implementation of timings is wrong and not
39
37
  generate a model for storage
40
38
 
41
39
  ```bash
42
- # you need to add 'limit: 6' to application_server_request_start and application_server_request_end
43
- # to have subsecond resolution please see examples/db/migrate/
44
- $ bin/rails g model AnalyticsHttpRequest uid:string data:text status_code:integer application_server_request_start:datetime application_server_request_end:datetime
45
-
46
- ```
47
-
48
- add JSON serialization
49
-
50
- ```ruby
51
- # app/models/analytics_http_request.rb
52
- class AnalyticsHttpRequest < ApplicationRecord
53
- serialize :data, JSON
54
- end
55
-
40
+ $ bin/rails g model AnalyticsRequest uid:string data:jsonb status_code:integer application_server_request_start:datetime application_server_request_end:datetime
56
41
  ```
57
42
 
58
43
  add automatic logging via initializer
59
44
 
60
45
  ```ruby
61
- # config/initializers/rack_middlewares.rb
46
+ # config/initializers/log_requests.rb
62
47
 
63
48
  Rails.application.config.middleware.use(RackRequestObjectLogger, AnalyticsHttpRequest)
64
49
  ```
@@ -79,7 +64,7 @@ I've seen applications sending sensitive data in GET and even POST requests in a
79
64
 
80
65
  ## License & Author
81
66
 
82
- Copyright 2016-2019 Ivan Stana
67
+ Copyright 2016-2026 Ivan Stana
83
68
 
84
69
  Licensed under the Apache License, Version 2.0 (the "License");
85
70
  you may not use this file except in compliance with the License.
data/Rakefile CHANGED
@@ -1,6 +1,12 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
3
 
4
- RSpec::Core::RakeTask.new(:spec)
4
+ RSpec::Core::RakeTask.new(:spec) do |t|
5
+ t.pattern = 'spec'
6
+ end
5
7
 
6
- task :default => :spec
8
+ RSpec::Core::RakeTask.new(:spec_performance) do |t|
9
+ t.pattern = 'performance'
10
+ end
11
+
12
+ task :default => [:spec, :spec_performance]
@@ -0,0 +1,9 @@
1
+ require Rails.root.join('app', 'models', 'application_record').to_s
2
+ require Rails.root.join('app', 'models', 'analytics_request').to_s
3
+
4
+ Rails.configuration.before_initialize do
5
+ Rails.application.config.middleware.use(
6
+ RackRequestObjectLogger,
7
+ ::AnalyticsRequest
8
+ )
9
+ end
@@ -0,0 +1,14 @@
1
+ class CreateAnalyticsRequests < ActiveRecord::Migration[7.2]
2
+ def change
3
+ create_table :analytics_requests, id: :uuid do |t|
4
+ t.text :uid
5
+ t.json :data
6
+ t.integer :status_code
7
+ t.datetime :application_server_request_start
8
+ t.datetime :application_server_request_end
9
+ t.references :requestable, polymorphic: true, null: true, type: :uuid, index: true
10
+
11
+ t.timestamps
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,3 @@
1
+ class AnalyticsRequest < ::ApplicationRecord
2
+ belongs_to :requestable, polymorphic: true, required: false
3
+ end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  class RackRequestObjectLogger
3
- VERSION = "3.0.3"
3
+ VERSION = "5.0.1"
4
4
  end
@@ -17,8 +17,7 @@ class RackRequestObjectLogger
17
17
  logger_object = @model.new
18
18
  logger_object.application_server_request_start = start_time
19
19
  logger_object.application_server_request_end = end_time
20
- request = Rack::Request.new(env)
21
- logger_object.data = request.env.select do |header, value|
20
+ logger_object.data = env.select do |header, value|
22
21
  # don't bother with values other than a string
23
22
  next if !value.is_a?(String)
24
23
  # https://tools.ietf.org/html/rfc3875 CGI 1.1 spec
@@ -38,7 +37,7 @@ class RackRequestObjectLogger
38
37
  ].include?(header) || ['HTTP', 'HTTPS'].include?(header) || header =~ /\AHTTP_\w+\z/ ||
39
38
  ['REQUEST_URI', 'ORIGINAL_FULLPATH', 'ORIGINAL_SCRIPT_NAME'].include?(header)
40
39
  end
41
- logger_object.uid = request.env['action_dispatch.request_id'] || SecureRandom.uuid
40
+ logger_object.uid = env['action_dispatch.request_id'] || SecureRandom.uuid
42
41
  logger_object.status_code = app_result.first
43
42
  logger_object.save
44
43
  app_result
@@ -11,25 +11,28 @@ Gem::Specification.new do |spec|
11
11
  spec.authors = ["Ivan Stana"]
12
12
  spec.email = ["ronon@myrtana.sk"]
13
13
 
14
- spec.summary = %q{Log HTTP requests via Rack stack to an object. You can use any object.}
15
- spec.description = %q{Log HTTP requests via Rack stack to an object. You can use any object, i.e. ActiveRecord model}
16
- spec.homepage = "https://github.com/starmammoth/rack-request-object-logger"
14
+ spec.summary = %q{The project is a Rack middleware to automatically log a HTTP request to a custom object.}
15
+ spec.description = %q{The project is a Rack middleware to automatically log a HTTP request to a custom object.}
16
+ spec.homepage = "https://github.com/istana/rack-request-object-logger"
17
17
  spec.license = "Apache-2.0"
18
18
 
19
19
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f.match(%r{^(test|spec|features)/})
20
+ f.match(%r{^(test|spec|features|performance)/})
21
21
  end
22
- spec.bindir = "exe"
23
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
22
  spec.require_paths = ["lib"]
25
23
 
26
- spec.add_dependency "rack", "> 0", "< 3.0"
27
- spec.add_development_dependency "bundler", "~> 2.0"
28
- spec.add_development_dependency "rake", "~> 12.3"
29
- spec.add_development_dependency "rspec", "~> 3.8"
24
+ spec.metadata = {
25
+ "bug_tracker_uri" => "https://github.com/istana/rack-request-object-logger/issues",
26
+ "homepage_uri" => "https://github.com/istana/rack-request-object-logger",
27
+ "source_code_uri" => "https://github.com/istana/rack-request-object-logger",
28
+ }
29
+
30
+ spec.add_dependency "rack", "> 0", "< 4.0"
31
+ spec.add_development_dependency "bundler", "< 5.0"
32
+ spec.add_development_dependency "rake", "~> 13"
33
+ spec.add_development_dependency "rspec", "~> 3.13"
30
34
  spec.add_development_dependency "rspec-benchmark", "~> 0"
31
35
  spec.add_development_dependency "pry", "~> 0"
32
- spec.add_development_dependency "activerecord", '>= 6.0', "< 7.0"
33
- spec.add_development_dependency "sqlite3", "~> 1.4" unless RUBY_PLATFORM == 'java'
34
- spec.add_development_dependency "mysql2", "~> 0.5" unless RUBY_PLATFORM == 'java'
36
+ spec.add_development_dependency "activerecord", '>= 6.0', "< 9"
37
+ spec.add_development_dependency "sqlite3", "<= 3" unless RUBY_PLATFORM == "java"
35
38
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-request-object-logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.3
4
+ version: 5.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Stana
8
- autorequire:
9
- bindir: exe
8
+ bindir: bin
10
9
  cert_chain: []
11
- date: 2019-08-19 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rack
@@ -19,7 +18,7 @@ dependencies:
19
18
  version: '0'
20
19
  - - "<"
21
20
  - !ruby/object:Gem::Version
22
- version: '3.0'
21
+ version: '4.0'
23
22
  type: :runtime
24
23
  prerelease: false
25
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,49 +28,49 @@ dependencies:
29
28
  version: '0'
30
29
  - - "<"
31
30
  - !ruby/object:Gem::Version
32
- version: '3.0'
31
+ version: '4.0'
33
32
  - !ruby/object:Gem::Dependency
34
33
  name: bundler
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
- - - "~>"
36
+ - - "<"
38
37
  - !ruby/object:Gem::Version
39
- version: '2.0'
38
+ version: '5.0'
40
39
  type: :development
41
40
  prerelease: false
42
41
  version_requirements: !ruby/object:Gem::Requirement
43
42
  requirements:
44
- - - "~>"
43
+ - - "<"
45
44
  - !ruby/object:Gem::Version
46
- version: '2.0'
45
+ version: '5.0'
47
46
  - !ruby/object:Gem::Dependency
48
47
  name: rake
49
48
  requirement: !ruby/object:Gem::Requirement
50
49
  requirements:
51
50
  - - "~>"
52
51
  - !ruby/object:Gem::Version
53
- version: '12.3'
52
+ version: '13'
54
53
  type: :development
55
54
  prerelease: false
56
55
  version_requirements: !ruby/object:Gem::Requirement
57
56
  requirements:
58
57
  - - "~>"
59
58
  - !ruby/object:Gem::Version
60
- version: '12.3'
59
+ version: '13'
61
60
  - !ruby/object:Gem::Dependency
62
61
  name: rspec
63
62
  requirement: !ruby/object:Gem::Requirement
64
63
  requirements:
65
64
  - - "~>"
66
65
  - !ruby/object:Gem::Version
67
- version: '3.8'
66
+ version: '3.13'
68
67
  type: :development
69
68
  prerelease: false
70
69
  version_requirements: !ruby/object:Gem::Requirement
71
70
  requirements:
72
71
  - - "~>"
73
72
  - !ruby/object:Gem::Version
74
- version: '3.8'
73
+ version: '3.13'
75
74
  - !ruby/object:Gem::Dependency
76
75
  name: rspec-benchmark
77
76
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +108,7 @@ dependencies:
109
108
  version: '6.0'
110
109
  - - "<"
111
110
  - !ruby/object:Gem::Version
112
- version: '7.0'
111
+ version: '9'
113
112
  type: :development
114
113
  prerelease: false
115
114
  version_requirements: !ruby/object:Gem::Requirement
@@ -119,46 +118,32 @@ dependencies:
119
118
  version: '6.0'
120
119
  - - "<"
121
120
  - !ruby/object:Gem::Version
122
- version: '7.0'
121
+ version: '9'
123
122
  - !ruby/object:Gem::Dependency
124
123
  name: sqlite3
125
124
  requirement: !ruby/object:Gem::Requirement
126
125
  requirements:
127
- - - "~>"
126
+ - - "<="
128
127
  - !ruby/object:Gem::Version
129
- version: '1.4'
128
+ version: '3'
130
129
  type: :development
131
130
  prerelease: false
132
131
  version_requirements: !ruby/object:Gem::Requirement
133
132
  requirements:
134
- - - "~>"
135
- - !ruby/object:Gem::Version
136
- version: '1.4'
137
- - !ruby/object:Gem::Dependency
138
- name: mysql2
139
- requirement: !ruby/object:Gem::Requirement
140
- requirements:
141
- - - "~>"
142
- - !ruby/object:Gem::Version
143
- version: '0.5'
144
- type: :development
145
- prerelease: false
146
- version_requirements: !ruby/object:Gem::Requirement
147
- requirements:
148
- - - "~>"
133
+ - - "<="
149
134
  - !ruby/object:Gem::Version
150
- version: '0.5'
151
- description: Log HTTP requests via Rack stack to an object. You can use any object,
152
- i.e. ActiveRecord model
135
+ version: '3'
136
+ description: The project is a Rack middleware to automatically log a HTTP request
137
+ to a custom object.
153
138
  email:
154
139
  - ronon@myrtana.sk
155
140
  executables: []
156
141
  extensions: []
157
142
  extra_rdoc_files: []
158
143
  files:
144
+ - ".github/workflows/ruby.yml"
159
145
  - ".gitignore"
160
146
  - ".rspec"
161
- - ".travis.yml"
162
147
  - CODE_OF_CONDUCT.md
163
148
  - Gemfile
164
149
  - LICENSE
@@ -166,20 +151,19 @@ files:
166
151
  - Rakefile
167
152
  - bin/console
168
153
  - bin/setup
169
- - examples/rails5/app/models/http_request.rb
170
- - examples/rails5/config/log_http_request.rb
171
- - examples/rails5/db/migrate/20170211004327_create_http_requests.rb
154
+ - examples/rails7/config/initializers/log_http_request.rb
155
+ - examples/rails7/db/migrate/20240917151639_create_analytics_requests.rb
156
+ - examples/rails7/models/analytics_request.rb
172
157
  - lib/rack-request-object-logger.rb
173
158
  - lib/rack-request-object-logger/version.rb
174
- - performance/active_record_model_spec.rb
175
- - performance/in_memory_model_spec.rb
176
- - performance/performance_helper.rb
177
159
  - rack-request-object-logger.gemspec
178
- homepage: https://github.com/starmammoth/rack-request-object-logger
160
+ homepage: https://github.com/istana/rack-request-object-logger
179
161
  licenses:
180
162
  - Apache-2.0
181
- metadata: {}
182
- post_install_message:
163
+ metadata:
164
+ bug_tracker_uri: https://github.com/istana/rack-request-object-logger/issues
165
+ homepage_uri: https://github.com/istana/rack-request-object-logger
166
+ source_code_uri: https://github.com/istana/rack-request-object-logger
183
167
  rdoc_options: []
184
168
  require_paths:
185
169
  - lib
@@ -194,8 +178,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
178
  - !ruby/object:Gem::Version
195
179
  version: '0'
196
180
  requirements: []
197
- rubygems_version: 3.0.3
198
- signing_key:
181
+ rubygems_version: 3.6.7
199
182
  specification_version: 4
200
- summary: Log HTTP requests via Rack stack to an object. You can use any object.
183
+ summary: The project is a Rack middleware to automatically log a HTTP request to a
184
+ custom object.
201
185
  test_files: []
data/.travis.yml DELETED
@@ -1,18 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- services:
4
- - mysql
5
- rvm:
6
- - 2.5.4
7
- - 2.6.3
8
- - truffleruby
9
- before_install:
10
- - gem update --system
11
- - gem install bundler
12
- cache: bundler
13
- matrix:
14
- include:
15
- - rvm: ruby-head
16
- allow_failures:
17
- - rvm: ruby-head
18
- fast_finish: true
@@ -1,3 +0,0 @@
1
- class AnaylticsHttpRequest < ApplicationRecord
2
- serialize :data, JSON
3
- end
@@ -1 +0,0 @@
1
- Rails.application.config.middleware.use "RackRequestObjectLogger", AnalyticsHttpRequest
@@ -1,15 +0,0 @@
1
- class CreateAnalyticsHttpRequests < ActiveRecord::Migration[5.0]
2
- def change
3
- create_table :analytics_http_requests do |t|
4
- t.string :uid
5
- t.text :data
6
- t.integer :status_code
7
- # with limit: 6 we will store nanosecond resolution
8
- # for statistics and performance monitoring sub-second resolution is a must
9
- t.datetime :application_server_request_start, limit: 6
10
- t.datetime :application_server_request_end, limit: 6
11
-
12
- t.timestamps
13
- end
14
- end
15
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'performance_helper'
3
- require_relative '../spec/spec_data'
4
- require 'active_record'
5
-
6
- RSpec.describe "Performance testing with an ActiveRecord class and SQLite3 database", performance: true do
7
- include RSpec::Benchmark::Matchers
8
- include_context 'spec_data'
9
-
10
- class RequestActiveRecordLog < ActiveRecord::Base
11
- serialize :headers, JSON
12
- end
13
-
14
- class CreateRequestActiveRecordLog < ActiveRecord::Migration[4.2]
15
- def change
16
- create_table :request_active_record_logs do |t|
17
- t.integer :uid
18
- t.text :data
19
- t.time :application_server_request_start
20
- t.time :application_server_request_end
21
- end
22
- end
23
- end
24
-
25
- let(:app) { proc{ [200, {}, ['Hello, world.']] } }
26
- let(:stack) { RackRequestObjectLogger.new(app, RequestActiveRecordLog) }
27
- let(:request) { Rack::MockRequest.new(stack) }
28
-
29
- after { File.unlink 'active_record_performance.sqlite3' }
30
-
31
- it 'much fast. wow' do
32
- set_headers(rails5_puma_headers)
33
-
34
- ActiveRecord::Base.establish_connection(
35
- adapter: 'sqlite3',
36
- database: 'active_record_performance.sqlite3'
37
- )
38
- CreateRequestActiveRecordLog.migrate(:up)
39
- expect { request.get('http://localhost:4000/doge') }.to perform_at_least(500).ips
40
- end
41
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
- require_relative 'performance_helper'
3
- require_relative '../spec/spec_data'
4
-
5
- RSpec.describe "Performance testing with a dummy class", performance: true do
6
- include RSpec::Benchmark::Matchers
7
- include_context 'spec_data'
8
-
9
- let(:app) { proc{ [200, {}, ['Hello, world.']] } }
10
- let(:stack) { RackRequestObjectLogger.new(app, RequestDummyLog) }
11
- let(:request) { Rack::MockRequest.new(stack) }
12
-
13
- let(:logger_object) { RequestDummyLog.new }
14
- before { allow(RequestDummyLog).to receive(:new).and_return(logger_object) }
15
-
16
- it 'much fast. wow' do
17
- set_headers(rails5_puma_headers)
18
- expect { request.get('http://localhost:4000/doge') }.to perform_at_least(5000).ips
19
- end
20
- end
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'bundler/setup'
3
- require 'rspec-benchmark'
4
- $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
5
- require "rack-request-object-logger"