rack-slow-log 0.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 +15 -0
- data/lib/rack-slow-log.rb +2 -0
- data/lib/rack/slow_log.rb +31 -0
- data/lib/rack/slow_log/logger.rb +59 -0
- data/lib/rack/slow_log/version.rb +5 -0
- data/spec/lib/rack/slow_log_spec.rb +77 -0
- data/spec/spec_helper.rb +24 -0
- metadata +124 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
---
|
|
2
|
+
!binary "U0hBMQ==":
|
|
3
|
+
metadata.gz: !binary |-
|
|
4
|
+
NjVlNGFmNjg4MjVkYWE5NGM0ODg3MmU2MDI4MmM4NTg2OGM2ZTRkMQ==
|
|
5
|
+
data.tar.gz: !binary |-
|
|
6
|
+
OGU4MmMzMmIwYzJjM2VlYjUzYmI3YzhiMTUzZTIyZDg5NTg0YWY3NA==
|
|
7
|
+
SHA512:
|
|
8
|
+
metadata.gz: !binary |-
|
|
9
|
+
OTJjMDZjNTM4Yzk4NDNkOWMzMzE4MWU1N2U0MDJlYzQwYjdlNmY0OWFkYWZm
|
|
10
|
+
YzUyMDI4ZDUzOWFjMjU0NjBkZDY2NWVhNTYxMWZhMzQyZWIzYWQ4NzgyNGM2
|
|
11
|
+
ODJhMzZhZGJkNTJmNDA4ZGE4ODg3NGZiZDJiMjE4MjM0ZTBhMzA=
|
|
12
|
+
data.tar.gz: !binary |-
|
|
13
|
+
ZGRlYjZhY2M1MTk0ODZlMDBjNTYyMzEyZmZmZmM2ZTdjODc0MTI5MzJlYTRj
|
|
14
|
+
MDVkN2ZjMTYxMmQwYzY1NWQ3NTM2NmZjMjhlNTc1ZGRmNTVkZjFhNzQ3Nzg2
|
|
15
|
+
NjkwNmI0NWQwZDNjNWFkOTBkZjU1MTNlMjA5ZjlhZTllYTRlYmI=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require_relative 'slow_log/logger'
|
|
2
|
+
|
|
3
|
+
module Rack
|
|
4
|
+
class SlowLog
|
|
5
|
+
|
|
6
|
+
def initialize(app, options = {})
|
|
7
|
+
@app = app
|
|
8
|
+
@long_request_time = options.fetch(:long_request_time, 5)
|
|
9
|
+
@slow_log = options.fetch(:slow_log, 'log/slow.log')
|
|
10
|
+
@one_log_per_request = options.fetch(:one_log_per_request, false)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def call(env)
|
|
14
|
+
dup._call(env)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def _call(env)
|
|
18
|
+
logger = Logger.new(@long_request_time, @slow_log, @one_log_per_request)
|
|
19
|
+
|
|
20
|
+
logger.request_start!
|
|
21
|
+
env['rack.slow_log'] = logger
|
|
22
|
+
app_response = @app.call(env)
|
|
23
|
+
logger.request_end!
|
|
24
|
+
|
|
25
|
+
logger.save
|
|
26
|
+
|
|
27
|
+
app_response
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Rack
|
|
2
|
+
class SlowLog
|
|
3
|
+
class Logger
|
|
4
|
+
|
|
5
|
+
def initialize(long_request_time, slow_log, one_log_per_request)
|
|
6
|
+
@long_request_time = long_request_time
|
|
7
|
+
@slow_log = slow_log
|
|
8
|
+
@one_log_per_request = one_log_per_request
|
|
9
|
+
|
|
10
|
+
@lines = []
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def log(line)
|
|
14
|
+
@lines << [Time.now, line]
|
|
15
|
+
end
|
|
16
|
+
alias_method :<<, :log
|
|
17
|
+
|
|
18
|
+
def save
|
|
19
|
+
if long_request?
|
|
20
|
+
write_log
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def request_start!
|
|
25
|
+
@start_time = Time.now
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def request_end!
|
|
29
|
+
@end_time = Time.now
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def long_request?
|
|
35
|
+
(@end_time - @start_time) > @long_request_time
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def write_log
|
|
39
|
+
log_file = ::File.open(log_file_name, 'a')
|
|
40
|
+
|
|
41
|
+
log_file.write("[#{@start_time}] >>>>>>>>>> START <<<<<<<<<<\n")
|
|
42
|
+
@lines.each { |timestamp, line| log_file.write("[#{timestamp}] #{line}\n") }
|
|
43
|
+
log_file.write("[#{@end_time}] >>>>>>>>>> END <<<<<<<<<<\n")
|
|
44
|
+
|
|
45
|
+
log_file.close
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def log_file_name
|
|
49
|
+
if @one_log_per_request
|
|
50
|
+
time_stamp = @start_time.strftime('%Y-%m-%d-%H_%M_%S.%3N')
|
|
51
|
+
"#{@slow_log}_#{time_stamp}"
|
|
52
|
+
else
|
|
53
|
+
@slow_log
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
require 'rack/test'
|
|
4
|
+
|
|
5
|
+
require 'rack-slow-log'
|
|
6
|
+
|
|
7
|
+
describe Rack::SlowLog do
|
|
8
|
+
include Rack::Test::Methods
|
|
9
|
+
|
|
10
|
+
let(:application_class) {
|
|
11
|
+
Class.new do
|
|
12
|
+
def initialize(sleep_time)
|
|
13
|
+
@sleep_time = sleep_time
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call(env)
|
|
17
|
+
sleep(@sleep_time)
|
|
18
|
+
|
|
19
|
+
env['rack.slow_log'].log('First log line.')
|
|
20
|
+
env['rack.slow_log'] << ('Second log line.')
|
|
21
|
+
|
|
22
|
+
[200, {}, 'success']
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let(:long_request_time) { 0.5 }
|
|
28
|
+
let(:log_path) { '/tmp/log' }
|
|
29
|
+
|
|
30
|
+
let(:options) { { :long_request_time => long_request_time, :slow_log => "#{log_path}/slow.log" } }
|
|
31
|
+
|
|
32
|
+
def app
|
|
33
|
+
Rack::SlowLog.new(application_class.new(sleep_time), options)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
before do
|
|
37
|
+
FileUtils.mkdir_p(log_path)
|
|
38
|
+
FileUtils.rm_rf(Dir.glob("#{log_path}/*"))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe '#call' do
|
|
42
|
+
|
|
43
|
+
context 'when the request takes less than required' do
|
|
44
|
+
let(:sleep_time) { long_request_time - 0.2 }
|
|
45
|
+
|
|
46
|
+
it 'does not generate the slow log' do
|
|
47
|
+
get '/'
|
|
48
|
+
|
|
49
|
+
File.exists?("#{log_path}/slow.log").should be_false
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
context 'when the request takes more than required' do
|
|
54
|
+
let(:sleep_time) { long_request_time + 0.2 }
|
|
55
|
+
|
|
56
|
+
it 'generates the slow log' do
|
|
57
|
+
get '/'
|
|
58
|
+
|
|
59
|
+
File.exists?("#{log_path}/slow.log").should be_true
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context 'when one_log_per_request is true' do
|
|
63
|
+
|
|
64
|
+
before { options[:one_log_per_request] = true }
|
|
65
|
+
|
|
66
|
+
it 'generates one log file per slow request' do
|
|
67
|
+
get '/'
|
|
68
|
+
get '/'
|
|
69
|
+
|
|
70
|
+
Dir["#{log_path}/*"].should have(2).elements
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'bundler/setup'
|
|
2
|
+
|
|
3
|
+
require 'simplecov'
|
|
4
|
+
SimpleCov.start
|
|
5
|
+
|
|
6
|
+
require 'rspec'
|
|
7
|
+
|
|
8
|
+
require 'fakefs/safe'
|
|
9
|
+
|
|
10
|
+
RSpec.configure do |config|
|
|
11
|
+
|
|
12
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
|
13
|
+
config.run_all_when_everything_filtered = true
|
|
14
|
+
config.filter_run :focus
|
|
15
|
+
|
|
16
|
+
config.order = 'random'
|
|
17
|
+
|
|
18
|
+
config.around(:each) do |example|
|
|
19
|
+
FakeFS.activate!
|
|
20
|
+
example.run
|
|
21
|
+
FakeFS.deactivate!
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: rack-slow-log
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Adrian Gomez
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2014-04-07 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rack
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ! '>='
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ! '>='
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: rspec
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - ! '>='
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0'
|
|
34
|
+
type: :development
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - ! '>='
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: simplecov
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ! '>='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ! '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rack-test
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ! '>='
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ! '>='
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: fakefs
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ! '>='
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ! '>='
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
83
|
+
description: ! " Allows for setting the maximum request time before it get logged
|
|
84
|
+
also provides a custom\n log to data relevant to the slow request and can even
|
|
85
|
+
provide a different log for each slow\n request for easy debugging.\n"
|
|
86
|
+
email:
|
|
87
|
+
- adrian.gomez@moove-it.com
|
|
88
|
+
executables: []
|
|
89
|
+
extensions: []
|
|
90
|
+
extra_rdoc_files: []
|
|
91
|
+
files:
|
|
92
|
+
- lib/rack-slow-log.rb
|
|
93
|
+
- lib/rack/slow_log.rb
|
|
94
|
+
- lib/rack/slow_log/logger.rb
|
|
95
|
+
- lib/rack/slow_log/version.rb
|
|
96
|
+
- spec/lib/rack/slow_log_spec.rb
|
|
97
|
+
- spec/spec_helper.rb
|
|
98
|
+
homepage: https://github.com/Moove-it/rack-slow-log
|
|
99
|
+
licenses:
|
|
100
|
+
- MIT
|
|
101
|
+
metadata: {}
|
|
102
|
+
post_install_message:
|
|
103
|
+
rdoc_options: []
|
|
104
|
+
require_paths:
|
|
105
|
+
- lib
|
|
106
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ! '>='
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0'
|
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
|
+
requirements:
|
|
113
|
+
- - ! '>='
|
|
114
|
+
- !ruby/object:Gem::Version
|
|
115
|
+
version: '0'
|
|
116
|
+
requirements: []
|
|
117
|
+
rubyforge_project:
|
|
118
|
+
rubygems_version: 2.2.0
|
|
119
|
+
signing_key:
|
|
120
|
+
specification_version: 4
|
|
121
|
+
summary: Slow request logger for rack applications.
|
|
122
|
+
test_files:
|
|
123
|
+
- spec/lib/rack/slow_log_spec.rb
|
|
124
|
+
- spec/spec_helper.rb
|