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.
@@ -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