wvanbergen-request-log-analyzer 0.3.3 → 0.3.4

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,26 @@
1
+ module MerbAnalyzer
2
+
3
+ class LogParser < Base::LogParser
4
+ LOG_LINES = {
5
+ # ~ Started request handling: Fri Aug 29 11:10:23 +0200 2008
6
+ :started => {
7
+ :teaser => /Started/,
8
+ :regexp => /Started request handling\:\ (.+)/,
9
+ :params => [{:timestamp => :timestamp}]
10
+ },
11
+ # ~ Params: {"action"=>"create", "controller"=>"session"}
12
+ # ~ Params: {"_method"=>"delete", "authenticity_token"=>"[FILTERED]", "action"=>"d}
13
+ :params => {
14
+ :teaser => /Params/,
15
+ :regexp => /Params\:\ \{(.+)\}/,
16
+ :params => [{:raw_hash => :string}]
17
+ },
18
+ # ~ {:dispatch_time=>0.006117, :after_filters_time=>6.1e-05, :before_filters_time=>0.000712, :action_time=>0.005833}
19
+ :completed => {
20
+ :teaser => /\{:dispatch_time/,
21
+ :regexp => /\{\:dispatch_time=>(.+), (?:\:after_filters_time=>(.+), )?(?:\:before_filters_time=>(.+), )?\:action_time=>(.+)\}/,
22
+ :params => [ {:dispatch_time => :sec}, {:after_filters_time => :sec}, {:before_filters_time => :sec}, {:action_time => :sec} ]
23
+ }
24
+ }
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module RailsAnalyzer
2
+
3
+ class LogParser < Base::LogParser
4
+
5
+ # Completed in 0.21665 (4 reqs/sec) | Rendering: 0.00926 (4%) | DB: 0.00000 (0%) | 200 OK [http://demo.nu/employees]
6
+ RAILS_21_COMPLETED = /Completed in (\d+\.\d{5}) \(\d+ reqs\/sec\) (?:\| Rendering: (\d+\.\d{5}) \(\d+\%\) )?(?:\| DB: (\d+\.\d{5}) \(\d+\%\) )?\| (\d\d\d).+\[(http.+)\]/
7
+
8
+ # Completed in 614ms (View: 120, DB: 31) | 200 OK [http://floorplanner.local/demo]
9
+ RAILS_22_COMPLETED = /Completed in (\d+)ms \((?:View: (\d+), )?DB: (\d+)\) \| (\d\d\d).+\[(http.+)\]/
10
+
11
+
12
+ LOG_LINES = {
13
+ # Processing EmployeeController#index (for 123.123.123.123 at 2008-07-13 06:00:00) [GET]
14
+ :started => {
15
+ :teaser => /Processing/,
16
+ :regexp => /Processing ((?:\w+::)?\w+)#(\w+)(?: to (\w+))? \(for (\d+\.\d+\.\d+\.\d+) at (\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)\) \[([A-Z]+)\]/,
17
+ :params => [{:controller => :string}, {:action => :string}, {:format => :string}, {:ip => :string}, {:timestamp => :timestamp}, {:method => :string}]
18
+ },
19
+ # RuntimeError (Cannot destroy employee): /app/models/employee.rb:198:in `before_destroy'
20
+ :failed => {
21
+ :teaser => /Error/,
22
+ :regexp => /(\w+)(?:Error|Invalid) \((.*)\)\:(.*)/,
23
+ :params => [{:error => :string}, {:exception_string => :string}, {:stack_trace => :string}]
24
+ },
25
+
26
+ :completed => {
27
+ :teaser => /Completed in /,
28
+ :regexp => Regexp.new("(?:#{RAILS_21_COMPLETED}|#{RAILS_22_COMPLETED})"),
29
+ :params => [{:duration => :sec}, {:rendering => :sec}, {:db => :sec}, {:status => :int}, {:url => :string}, # 2.1 variant
30
+ {:duration => :msec}, {:rendering => :msec}, {:db => :msec}, {:status => :int}, {:url => :string}] # 2.2 variant
31
+
32
+ }
33
+ }
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ require 'rubygems'
2
+ require 'sqlite3'
3
+
4
+ module RailsAnalyzer
5
+
6
+ # Set of functions that can be used to easily log requests into a SQLite3 Database.
7
+ class RecordInserter < Base::RecordInserter
8
+
9
+ # Insert a request into the database.
10
+ # <tt>request</tt> The request to insert.
11
+ # <tt>close_statements</tt> Close prepared statements (default false)
12
+ def insert(request, close_statements = false)
13
+ unless @insert_statements
14
+ prepare_statements!
15
+ close_statements = true
16
+ end
17
+
18
+ if request[:type] && @insert_statements.has_key?(request[:type])
19
+ if request[:type] == :started
20
+ insert_warning(request[:line], "Unclosed request encountered on line #{request[:line]} (request started on line #{@current_request})") unless @current_request.nil?
21
+ @current_request = request[:line]
22
+ elsif [:failed, :completed].include?(request[:type])
23
+ @current_request = nil
24
+ end
25
+
26
+ begin
27
+ @insert_statements[request.delete(:type)].execute(request)
28
+ rescue SQLite3::Exception => e
29
+ insert_warning(request[:line], "Could not save log line to database: " + e.message.to_s)
30
+ end
31
+ else
32
+ insert_warning(request[:line], "Ignored unknown statement type")
33
+ end
34
+
35
+ close_prepared_statements! if close_statements
36
+ end
37
+
38
+ end
39
+ end
@@ -1,5 +1,161 @@
1
- require File.dirname(__FILE__) + '/request_log_analyzer/file_format'
2
- require File.dirname(__FILE__) + '/request_log_analyzer/request'
3
- require File.dirname(__FILE__) + '/request_log_analyzer/log_parser'
4
- require File.dirname(__FILE__) + '/request_log_analyzer/aggregator/base'
5
- require File.dirname(__FILE__) + '/request_log_analyzer/controller'
1
+ require File.dirname(__FILE__) + '/../lib/base/log_parser'
2
+ require File.dirname(__FILE__) + '/../lib/base/summarizer'
3
+ require File.dirname(__FILE__) + '/../lib/rails_analyzer/log_parser'
4
+ require File.dirname(__FILE__) + '/../lib/rails_analyzer/summarizer'
5
+ require File.dirname(__FILE__) + '/../lib/rails_analyzer/virtual_mongrel.rb'
6
+ require File.dirname(__FILE__) + '/../lib/merb_analyzer/log_parser'
7
+ require File.dirname(__FILE__) + '/../lib/merb_analyzer/summarizer'
8
+ require File.dirname(__FILE__) + '/../lib/bashcolorizer'
9
+ require File.dirname(__FILE__) + '/../lib/ruby-progressbar/progressbar.rb'
10
+
11
+ # Can calculate request counts, duratations, mean times etc. of all the requests given.
12
+ class RequestLogAnalyzer
13
+ attr_reader :log_parser_class
14
+ attr_reader :summerizer
15
+ attr_reader :arguments
16
+ attr_reader :line_types
17
+ attr_reader :amount
18
+ attr_reader :fast
19
+
20
+ # Initializer. Sets global variables
21
+ # Options
22
+ # *<tt>:fast</tt> Only look at request initializers. Faster, but not not all outputs are shown.
23
+ # *<tt>:guess_database_time</tt> Guess database time if it it not in the log (default for Rails produciton).
24
+ # *<tt>:merb</tt> Use merb summarizer and parser classes instead of rails.
25
+ # *<tt>:output_reports</tt> Comma separated string of requested output reports
26
+ # *<tt>:amount</tt> Amount of lines shown for each result table. Defaults to 10.
27
+ def initialize(options = {})
28
+ @fast = options[:fast] || false
29
+ @guess_database_time = options[:guess_database_time] || false
30
+
31
+ if options[:merb]
32
+ @summarizer = MerbAnalyzer::Summarizer.new(:calculate_database => @guess_database_time)
33
+ @log_parser_class = MerbAnalyzer::LogParser
34
+ else
35
+ @summarizer = RailsAnalyzer::Summarizer.new(:calculate_database => @guess_database_time)
36
+ @log_parser_class = RailsAnalyzer::LogParser
37
+ end
38
+
39
+ @output_reports = options[:output].split(', ') rescue [:timespan, :most_requested, :total_time, :mean_time, :total_db_time, :mean_db_time, :mean_rendering_time, :blockers, :hourly_spread, :errors]
40
+ @amount = options[:amount] || 10
41
+
42
+ @line_types = @log_parser_class::LOG_LINES.keys
43
+ @line_types = [:completed] if @fast
44
+ end
45
+
46
+
47
+ # Substitutes variable elements in a url (like the id field) with a fixed string (like ":id")
48
+ # This is used to aggregate simular requests.
49
+ # <tt>request</tt> The request to evaluate.
50
+ # Returns uniformed url string.
51
+ # Raises on mailformed request.
52
+ def request_hasher(request)
53
+ if request[:url]
54
+ url = request[:url].downcase.split(/^http[s]?:\/\/[A-z0-9\.-]+/).last.split('?').first # only the relevant URL part
55
+ url << '/' if url[-1] != '/'[0] && url.length > 1 # pad a trailing slash for consistency
56
+
57
+ url.gsub!(/\/\d+-\d+-\d+(\/|$)/, '/:date') # Combine all (year-month-day) queries
58
+ url.gsub!(/\/\d+-\d+(\/|$)/, '/:month') # Combine all date (year-month) queries
59
+ url.gsub!(/\/\d+[\w-]*/, '/:id') # replace identifiers in URLs
60
+
61
+ return url
62
+ elsif request[:controller] && request[:action]
63
+ return "#{request[:controller]}##{request[:action]}"
64
+ else
65
+ raise 'Cannot hash this request! ' + request.inspect
66
+ end
67
+ end
68
+
69
+ # Print results using a ASCII table.
70
+ # <tt>summarizer</tt> The summarizer containg information to draw the table.
71
+ # <tt>field</tt> The field containing the data to be printed
72
+ # <tt>amount</tt> The length of the table (defaults to 20)
73
+ def print_table(summarizer, field, amount = @amount)
74
+ summarizer.sort_actions_by(field).reverse[0, amount.to_i].each do |a|
75
+ # As we show count by default, show totaltime if we sort by count
76
+ field = :total_time if field == :count
77
+
78
+ puts "%-50s: %10.03fs [#{green("%d requests")}]" % [a[0], a[1][field], a[1][:count]]
79
+ end
80
+ end
81
+
82
+ # Execute the analyze
83
+ def analyze_this(files = [])
84
+ # Walk through al the files given via the arguments.
85
+ files.each do |log_file|
86
+ puts "Processing #{@line_types.join(', ')} log lines from #{log_file}..."
87
+
88
+ parser = @log_parser_class.new(log_file)
89
+
90
+ # add progress bar
91
+ unless @fast
92
+ pbar = ProgressBar.new(green(log_file), File.size(log_file))
93
+ parser.progress { |pos, total| (pos == :finished) ? pbar.finish : pbar.set(pos) }
94
+ end
95
+
96
+ parser.each(*line_types) do |request|
97
+ @summarizer.group(request) { |r| request_hasher(r) }
98
+ end
99
+ end
100
+
101
+ # Select the reports to output and generate them.
102
+ @output_reports.each do |report|
103
+ report_location = "#{File.dirname(__FILE__)}/../output/#{report}.rb"
104
+
105
+ if File.exist?(report_location)
106
+ eval File.read(report_location)
107
+ else
108
+ puts "\nERROR: Output report #{report} not found!"
109
+ end
110
+ end
111
+ end
112
+
113
+ def analyze_with_virtual_mongrels(files = [])
114
+ # Walk through al the files given via the arguments.
115
+ files.each do |log_file|
116
+ puts "Processing #{@line_types.join(', ')} log lines from #{log_file}..."
117
+
118
+ parser = @log_parser_class.new(log_file)
119
+
120
+ virtual_mongrels = []
121
+
122
+ line = 0
123
+
124
+ parser.each(*line_types) do |request|
125
+ line += 1
126
+
127
+ puts "Number of mongrels: #{virtual_mongrels.length}"
128
+ puts "Line number: #{line}"
129
+
130
+ case request[:type]
131
+ when :started
132
+ puts 'Spawned new virtual mongrel'
133
+ new_mongrel = VirtualMongrel.new(:start_line => line, :calculate_database => @guess_database_time, :running_mongrels => virtual_mongrels.length + 1)
134
+ new_mongrel.group(request)
135
+ virtual_mongrels << new_mongrel
136
+ else
137
+ completed_mongrel = virtual_mongrels.first
138
+ completed_mongrel.group(request)
139
+ completed_mongrel.update_running_mongrels(virtual_mongrels.length)
140
+ completed_mongrel.save
141
+ end
142
+
143
+ keep_virtual_mongrels = []
144
+
145
+ virtual_mongrels.each do |mongrel|
146
+ if mongrel.die_line >= line && mongrel.status == :started
147
+ keep_virtual_mongrels << mongrel
148
+ else
149
+ puts 'Destroyed virtual mongrel!'
150
+ puts ""
151
+
152
+ end
153
+ end
154
+
155
+ virtual_mongrels = keep_virtual_mongrels
156
+
157
+ end
158
+ end
159
+
160
+ end
161
+ end
data/tasks/test.rake ADDED
@@ -0,0 +1,8 @@
1
+ require 'rake/testtask'
2
+
3
+ desc 'Unit test request-log-analyzer.'
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.pattern = 'test/**/*_test.rb'
6
+ t.verbose = true
7
+ t.libs << 'test'
8
+ end
@@ -0,0 +1,59 @@
1
+ Processing DashboardController#index (for 130.89.162.199 at 2008-08-14 21:16:25) [GET]
2
+ Session ID: BAh7CToMcmVmZXJlciIbL3ByaXNjaWxsYS9wZW9wbGUvMjM1MCIKZmxhc2hJ
3
+ QzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVz
4
+ ZWR7ADoNbGFuZ3VhZ2VvOhNMb2NhbGU6Ok9iamVjdBI6CUB3aW4wOg1AY291
5
+ bnRyeSIHTkw6CkBoYXNoaf3L2Js6DkBvcmlnX3N0ciIKbmwtTkw6DUBpc28z
6
+ MDY2MDoNQGNoYXJzZXQiClVURi04Og5AbGFuZ3VhZ2UiB25sOg5AbW9kaWZp
7
+ ZXIwOgtAcG9zaXgiCm5sX05MOg1AZ2VuZXJhbCIKbmxfTkw6DUB2YXJpYW50
8
+ MDoOQGZhbGxiYWNrMDoMQHNjcmlwdDA6DnBlcnNvbl9pZGkCMgc=--7918aed37151c13360cd370c37b541f136146fbd
9
+ Parameters: {"action"=>"index", "controller"=>"dashboard"}
10
+ Set language to: nl_NL
11
+ Rendering template within layouts/priscilla
12
+ Rendering dashboard/index
13
+ Completed in 0.22699 (4 reqs/sec) | Rendering: 0.02667 (11%) | DB: 0.03057 (13%) | 200 OK [https://www.example.com/]
14
+
15
+
16
+ Processing PeopleController#index (for 130.89.162.199 at 2008-08-14 21:16:30) [GET]
17
+ Session ID: BAh7CSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo
18
+ SGFzaHsABjoKQHVzZWR7ADoMcmVmZXJlciIQL3ByaXNjaWxsYS86DnBlcnNv
19
+ bl9pZGkCMgc6DWxhbmd1YWdlbzoTTG9jYWxlOjpPYmplY3QSOg1AY291bnRy
20
+ eSIHTkw6CUB3aW4wOg5Ab3JpZ19zdHIiCm5sLU5MOgpAaGFzaGn9y9ibOg5A
21
+ bGFuZ3VhZ2UiB25sOg1AY2hhcnNldCIKVVRGLTg6DUBpc28zMDY2MDoOQG1v
22
+ ZGlmaWVyMDoLQHBvc2l4IgpubF9OTDoNQHZhcmlhbnQwOg1AZ2VuZXJhbCIK
23
+ bmxfTkw6DEBzY3JpcHQwOg5AZmFsbGJhY2sw--48cbe3788ef27f6005f8e999610a42af6e90ffb3
24
+ Parameters: {"commit"=>"Zoek", "action"=>"index", "q"=>"gaby", "controller"=>"people"}
25
+ Set language to: nl_NL
26
+ Redirected to https://www.example.com/people/2545
27
+ Completed in 0.04759 (21 reqs/sec) | DB: 0.03719 (78%) | 302 Found [https://www.example.com/people?q=gaby&commit=Zoek]
28
+
29
+
30
+ Processing PeopleController#show (for 130.89.162.199 at 2008-08-14 21:16:30) [GET]
31
+ Session ID: BAh7CToMcmVmZXJlciIpL3ByaXNjaWxsYS9wZW9wbGU/cT1nYWJ5JmNvbW1p
32
+ dD1ab2VrIgpmbGFzaElDOidBY3Rpb25Db250cm9sbGVyOjpGbGFzaDo6Rmxh
33
+ c2hIYXNoewAGOgpAdXNlZHsAOg1sYW5ndWFnZW86E0xvY2FsZTo6T2JqZWN0
34
+ EjoJQHdpbjA6DUBjb3VudHJ5IgdOTDoKQGhhc2hp/cvYmzoOQG9yaWdfc3Ry
35
+ IgpubC1OTDoNQGlzbzMwNjYwOg1AY2hhcnNldCIKVVRGLTg6DkBsYW5ndWFn
36
+ ZSIHbmw6DkBtb2RpZmllcjA6C0Bwb3NpeCIKbmxfTkw6DUBnZW5lcmFsIgpu
37
+ bF9OTDoNQHZhcmlhbnQwOg5AZmFsbGJhY2swOgxAc2NyaXB0MDoOcGVyc29u
38
+ X2lkaQIyBw==--3ad1948559448522a49d289a2a89dc7ccbe8847a
39
+ Parameters: {"action"=>"show", "id"=>"2545", "controller"=>"people"}
40
+ Set language to: nl_NL
41
+ Rendering template within layouts/priscilla
42
+ Rendering people/show
43
+ person: Gaby Somers, study_year: 2008/2009
44
+ Completed in 0.29077 (3 reqs/sec) | Rendering: 0.24187 (83%) | DB: 0.04030 (13%) | 200 OK [https://www.example.com/people/2545]
45
+
46
+
47
+ Processing PeopleController#picture (for 130.89.162.199 at 2008-08-14 21:16:35) [GET]
48
+ Session ID: BAh7CSIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo
49
+ SGFzaHsABjoKQHVzZWR7ADoMcmVmZXJlciIbL3ByaXNjaWxsYS9wZW9wbGUv
50
+ MjU0NToOcGVyc29uX2lkaQIyBzoNbGFuZ3VhZ2VvOhNMb2NhbGU6Ok9iamVj
51
+ dBI6DUBjb3VudHJ5IgdOTDoJQHdpbjA6DkBvcmlnX3N0ciIKbmwtTkw6CkBo
52
+ YXNoaf3L2Js6DkBsYW5ndWFnZSIHbmw6DUBjaGFyc2V0IgpVVEYtODoNQGlz
53
+ bzMwNjYwOg5AbW9kaWZpZXIwOgtAcG9zaXgiCm5sX05MOg1AdmFyaWFudDA6
54
+ DUBnZW5lcmFsIgpubF9OTDoMQHNjcmlwdDA6DkBmYWxsYmFjazA=--797a33f280a482647111397d138d0918f2658167
55
+ Parameters: {"action"=>"picture", "id"=>"2545", "controller"=>"people"}
56
+ Set language to: nl_NL
57
+ Rendering template within layouts/priscilla
58
+ Rendering people/picture
59
+ Completed in 0.05383 (18 reqs/sec) | Rendering: 0.04622 (85%) | DB: 0.00206 (3%) | 200 OK [https://www.example.com/people/2545/picture]
@@ -0,0 +1,5 @@
1
+ Jul 13 06:25:58 10.1.1.32 app_p [1957]: Processing EmployeeController#index (for 10.1.1.33 at 2008-07-13 06:25:58) [GET]
2
+ Jul 13 06:25:58 10.1.1.32 app_p [1957]: Session ID: bd1810833653be11c38ad1e5675635bd
3
+ Jul 13 06:25:58 10.1.1.32 app_p [1957]: Parameters: {"format"=>"xml", "action"=>"index}
4
+ Jul 13 06:25:58 10.1.1.32 app_p [1957]: Rendering employees
5
+ Jul 13 06:25:58 10.1.1.32 app_p [1957]: Completed in 0.21665 (4 reqs/sec) | Rendering: 0.00926 (4%) | DB: 0.00000 (0%) | 200 OK [http://example.com/employee.xml]
@@ -0,0 +1,12 @@
1
+ Processing PageController#demo (for 127.0.0.1 at 2008-12-10 16:28:09) [GET]
2
+ Parameters: {"action"=>"demo", "controller"=>"page"}
3
+ Logging in from session data...
4
+ Logged in as willem@depillem.com
5
+ Using locale: en-US, http-accept: ["en-US"], session: , det browser: en-US, det domain:
6
+ Rendering template within layouts/demo
7
+ Rendering page/demo
8
+ Rendered shared/_analytics (0.2ms)
9
+ Rendered layouts/_actions (0.6ms)
10
+ Rendered layouts/_menu (2.2ms)
11
+ Rendered layouts/_tabbar (0.5ms)
12
+ Completed in 614ms (View: 120, DB: 31) | 200 OK [http://floorplanner.local/demo]
@@ -0,0 +1,10 @@
1
+ Processing CachedController#cached (for 1.1.1.1 at 2008-12-24 07:36:53) [GET]
2
+ Parameters: {"action"=>"cached", "controller"=>"cached"}
3
+ Logging in from session data...
4
+ Logging in using cookie...
5
+ Using locale: zh-Hans, http-accept: ["zh-CN", "zh-HK", "zh-TW", "en-US"], session: , det browser: zh-Hans, det domain: , user pref locale:
6
+ Referer: http://www.example.com/referer
7
+ Cached fragment hit: views/zh-Hans-www-cached-cached-all-CN--- (0.0ms)
8
+ Filter chain halted as [#<ActionController::Caching::Actions::ActionCacheFilter:0x2a999ad620 @check=nil, @options={:store_options=>{}, :layout=>nil, :cache_path=>#<Proc:0x0000002a999b8890@/app/controllers/cached_controller.rb:8>}>] rendered_or_redirected.
9
+ Filter chain halted as [#<ActionController::Filters::AroundFilter:0x2a999ad120 @identifier=nil, @kind=:filter, @options={:only=>#<Set: {"cached"}>, :if=>:not_logged_in?, :unless=>nil}, @method=#<ActionController::Caching::Actions::ActionCacheFilter:0x2a999ad620 @check=nil, @options={:store_options=>{}, :layout=>nil, :cache_path=>#<Proc:0x0000002a999b8890@/app/controllers/cached_controller.rb:8>}>>] did_not_yield.
10
+ Completed in 3ms (View: 0, DB: 0) | 200 OK [http://www.example.com/cached/cached/]
@@ -0,0 +1,24 @@
1
+ Processing AccountController#dashboard (for 1.1.1.1 at 2008-12-24 07:36:49) [GET]
2
+ Parameters: {"action"=>"dashboard", "controller"=>"account", "first_use"=>"true"}
3
+ Logging in from session data...
4
+
5
+
6
+ Processing ProjectsController#new (for 1.1.1.1 at 2008-12-24 07:36:49) [GET]
7
+ Parameters: {"action"=>"new", "controller"=>"projects"}
8
+ Rendering template within layouts/default
9
+ Rendering account/dashboard
10
+ Logging in from session data...
11
+ Logging in using cookie...
12
+ Using locale: en-US, http-accept: [], session: , det browser: , det domain: , user pref locale:
13
+ Rendered shared/_maintenance (0.6ms)
14
+ Rendering template within layouts/templates/general_default/index.html.erb
15
+ Rendered projects/_recent_designs (4.3ms)
16
+ Rendered projects/_project (13.6ms)
17
+ Rendered projects/_projects (18.7ms)
18
+ Rendered layouts/_menu (1.4ms)
19
+ Completed in 36ms (View: 30, DB: 3) | 200 OK [http://www.example.com/projects/new]
20
+ Rendered layouts/_actions (0.3ms)
21
+ Rendered layouts/_menu (1.6ms)
22
+ Rendered layouts/_tabbar (1.9ms)
23
+ Rendered layouts/_footer (3.2ms)
24
+ Completed in 50ms (View: 41, DB: 4) | 200 OK [http://www.example.com/dashboard?first_use=true]
@@ -0,0 +1,84 @@
1
+ ~ Loaded DEVELOPMENT Environment...
2
+ ~ Connecting to database...
3
+ ~ loading gem 'merb_datamapper' ...
4
+ ~ loading gem 'gettext' ...
5
+ ~ loading gem 'merb_helpers' ...
6
+ ~ loading gem 'merb-assets' ...
7
+ ~ loading gem 'merb-action-args' ...
8
+ ~ loading gem 'merb-mailer' ...
9
+ ~ loading gem 'merb_param_protection' ...
10
+ ~ loading gem 'merb_has_flash' ...
11
+ ~ loading gem 'merb_forgery_protection' ...
12
+ ~ loading gem 'dm-validations' ...
13
+ ~ loading gem 'dm-timestamps' ...
14
+ ~ loading gem 'dm-migrations' ...
15
+ ~ loading gem 'dm-aggregates' ...
16
+ ~ loading gem 'dm-adjust' ...
17
+ ~ loading gem 'dm-serializer' ...
18
+ ~ loading gem 'dm-constraints' ...
19
+ ~ loading gem 'dm-timeline' ...
20
+ ~ loading gem 'dm-searchable' ...
21
+ ~ loading gem 'dm-audited' ...
22
+ ~ loading gem 'lib/extensions' ...
23
+ ~ loading gem 'lib/authenticated_system/authenticated_dependencies' ...
24
+ ~ Compiling routes...
25
+ ~ Using 'share-nothing' cookie sessions (4kb limit per client)
26
+ ~ Using Mongrel adapter
27
+ ~ Started request handling: Fri Aug 29 11:10:23 +0200 2008
28
+ ~ Params: {"_method"=>"delete", "authenticity_token"=>"[FILTERED]", "action"=>"destroy", "method"=>"delete", "controller"=>"session"}
29
+ ~ Cookie deleted: auth_token => nil
30
+ ~ Redirecting to: / (302)
31
+ ~ {:dispatch_time=>0.243424, :after_filters_time=>6.9e-05, :before_filters_time=>0.213213, :action_time=>0.241652}
32
+ ~
33
+
34
+ ~ Started request handling: Fri Aug 29 11:10:23 +0200 2008
35
+ ~ Params: {"action"=>"index", "controller"=>"dashboard"}
36
+ ~ Redirecting to: /login (302)
37
+ ~ {:dispatch_time=>0.002649, :after_filters_time=>7.4e-05, :action_time=>0.001951}
38
+ ~
39
+
40
+ ~ Started request handling: Fri Aug 29 11:10:23 +0200 2008
41
+ ~ Params: {"action"=>"create", "controller"=>"session"}
42
+ ~ {:dispatch_time=>0.006117, :after_filters_time=>6.1e-05, :before_filters_time=>0.000712, :action_time=>0.005833}
43
+ ~
44
+
45
+ ~ Started request handling: Fri Aug 29 11:10:27 +0200 2008
46
+ ~ Params: {"authenticity_token"=>"[FILTERED]", "action"=>"create", "controller"=>"session", "login"=>"username", "password"=>"[FILTERED]", "remember_me"=>"0"}
47
+ ~ Redirecting to: / (302)
48
+ ~ {:dispatch_time=>0.006652, :after_filters_time=>0.000143, :before_filters_time=>0.000861, :action_time=>0.006171}
49
+ ~
50
+
51
+ ~ Started request handling: Fri Aug 29 11:10:27 +0200 2008
52
+ ~ Params: {"action"=>"index", "controller"=>"dashboard"}
53
+ ~ Redirecting to: /dashboard (302)
54
+ ~ {:dispatch_time=>0.008241, :after_filters_time=>0.000126, :before_filters_time=>0.002632, :action_time=>0.007711}
55
+ ~
56
+
57
+ ~ Started request handling: Fri Aug 29 11:10:27 +0200 2008
58
+ ~ Params: {"action"=>"index", "namespace"=>"dashboard", "controller"=>"dashboard"}
59
+ ~ {:dispatch_time=>0.009458, :after_filters_time=>0.000103, :before_filters_time=>0.00266, :action_time=>0.008742}
60
+ ~
61
+
62
+ ~ Started request handling: Fri Aug 29 11:10:29 +0200 2008
63
+ ~ Params: {"format"=>nil, "action"=>"index", "namespace"=>"dashboard", "controller"=>"employees"}
64
+ ~ {:dispatch_time=>0.102725, :after_filters_time=>0.000115, :before_filters_time=>0.00411, :action_time=>0.101836}
65
+ ~
66
+
67
+ ~ Started request handling: Fri Aug 29 11:10:30 +0200 2008
68
+ ~ Params: {"format"=>nil, "action"=>"index", "namespace"=>"dashboard", "controller"=>"organisations"}
69
+ ~ {:dispatch_time=>0.042575, :after_filters_time=>8.9e-05, :before_filters_time=>0.004267, :action_time=>0.041762}
70
+ ~
71
+
72
+ ~ Started request handling: Fri Aug 29 11:10:31 +0200 2008
73
+ ~ Params: {"action"=>"index", "namespace"=>"dashboard", "controller"=>"dashboard"}
74
+ ~ {:dispatch_time=>0.010311, :after_filters_time=>8.0e-05, :before_filters_time=>0.003195, :action_time=>0.009567}
75
+ ~
76
+
77
+ ~ Started request handling: Fri Aug 29 11:10:33 +0200 2008
78
+ ~ Params: {"format"=>nil, "action"=>"index", "namespace"=>"dashboard", "controller"=>"employees"}
79
+ ~ {:dispatch_time=>0.012913, :after_filters_time=>7.1e-05, :before_filters_time=>0.004422, :action_time=>0.012141}
80
+ ~
81
+
82
+ ~ Started request handling: Fri Aug 29 11:10:35 +0200 2008
83
+ ~ Params: {"action"=>"new", "namespace"=>"dashboard", "controller"=>"employees"}
84
+ ~ {:dispatch_time=>0.013051, :after_filters_time=>7.8e-05, :before_filters_time=>0.003576, :action_time=>0.011773}