rack-slow-log 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,2 @@
1
+ require_relative 'rack/slow_log/version'
2
+ require_relative 'rack/slow_log'
@@ -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,5 @@
1
+ module Rack
2
+ class SlowLog
3
+ VERSION = '0.0.1'
4
+ end
5
+ 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
@@ -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