wvanbergen-request-log-analyzer 1.0.0 → 1.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.
Files changed (55) hide show
  1. data/DESIGN +14 -0
  2. data/HACKING +7 -0
  3. data/README.textile +9 -98
  4. data/Rakefile +2 -2
  5. data/bin/request-log-analyzer +1 -1
  6. data/lib/cli/bashcolorizer.rb +60 -0
  7. data/lib/cli/command_line_arguments.rb +301 -0
  8. data/lib/cli/progressbar.rb +236 -0
  9. data/lib/request_log_analyzer/aggregator/base.rb +51 -0
  10. data/lib/request_log_analyzer/aggregator/database.rb +97 -0
  11. data/lib/request_log_analyzer/aggregator/echo.rb +25 -0
  12. data/lib/request_log_analyzer/aggregator/summarizer.rb +116 -0
  13. data/lib/request_log_analyzer/controller.rb +206 -0
  14. data/lib/request_log_analyzer/file_format/merb.rb +33 -0
  15. data/lib/request_log_analyzer/file_format/rails.rb +119 -0
  16. data/lib/request_log_analyzer/file_format.rb +77 -0
  17. data/lib/request_log_analyzer/filter/base.rb +29 -0
  18. data/lib/request_log_analyzer/filter/field.rb +36 -0
  19. data/lib/request_log_analyzer/filter/timespan.rb +32 -0
  20. data/lib/request_log_analyzer/line_definition.rb +159 -0
  21. data/lib/request_log_analyzer/log_parser.rb +183 -0
  22. data/lib/request_log_analyzer/log_processor.rb +121 -0
  23. data/lib/request_log_analyzer/request.rb +115 -0
  24. data/lib/request_log_analyzer/source/base.rb +42 -0
  25. data/lib/request_log_analyzer/source/log_file.rb +180 -0
  26. data/lib/request_log_analyzer/tracker/base.rb +54 -0
  27. data/lib/request_log_analyzer/tracker/category.rb +71 -0
  28. data/lib/request_log_analyzer/tracker/duration.rb +81 -0
  29. data/lib/request_log_analyzer/tracker/hourly_spread.rb +80 -0
  30. data/lib/request_log_analyzer/tracker/timespan.rb +54 -0
  31. data/spec/file_format_spec.rb +78 -0
  32. data/spec/file_formats/spec_format.rb +26 -0
  33. data/spec/filter_spec.rb +137 -0
  34. data/spec/log_processor_spec.rb +57 -0
  35. data/tasks/rspec.rake +6 -0
  36. metadata +53 -55
  37. data/TODO +0 -58
  38. data/bin/request-log-database +0 -81
  39. data/lib/base/log_parser.rb +0 -78
  40. data/lib/base/record_inserter.rb +0 -139
  41. data/lib/command_line/arguments.rb +0 -129
  42. data/lib/command_line/flag.rb +0 -51
  43. data/lib/merb_analyzer/log_parser.rb +0 -26
  44. data/lib/rails_analyzer/log_parser.rb +0 -35
  45. data/lib/rails_analyzer/record_inserter.rb +0 -39
  46. data/tasks/test.rake +0 -8
  47. data/test/log_fragments/fragment_1.log +0 -59
  48. data/test/log_fragments/fragment_2.log +0 -5
  49. data/test/log_fragments/fragment_3.log +0 -12
  50. data/test/log_fragments/fragment_4.log +0 -10
  51. data/test/log_fragments/fragment_5.log +0 -24
  52. data/test/log_fragments/merb_1.log +0 -84
  53. data/test/merb_log_parser_test.rb +0 -39
  54. data/test/rails_log_parser_test.rb +0 -94
  55. data/test/record_inserter_test.rb +0 -45
@@ -1,139 +0,0 @@
1
- require 'rubygems'
2
- require 'sqlite3'
3
-
4
- module Base
5
-
6
- # Set of functions that can be used to easily log requests into a SQLite3 Database.
7
- class RecordInserter
8
-
9
- attr_reader :database
10
- attr_reader :current_request
11
- attr_reader :warning_count
12
-
13
- # Initializer
14
- # <tt>db_file</tt> The file which will be used for the SQLite3 Database storage.
15
- def initialize(db_file, options = {})
16
- @database = SQLite3::Database.new(db_file)
17
- @insert_statements = nil
18
- @warning_count = 0
19
- create_tables_if_needed!
20
-
21
- self.initialize_hook(options) if self.respond_to?(:initialize_hook)
22
- end
23
-
24
- # Calculate the database durations of the requests currenty in the database.
25
- # Used if a logfile does contain any database durations.
26
- def calculate_db_durations!
27
- @database.execute('UPDATE "completed_queries" SET "database" = "duration" - "rendering" WHERE "database" IS NULL OR "database" = 0.0')
28
- end
29
-
30
- # Insert a batch of loglines into the database.
31
- # Function prepares insert statements, yeilds and then closes and commits.
32
- def insert_batch(&block)
33
- @database.transaction
34
- prepare_statements!
35
- block.call(self)
36
- close_prepared_statements!
37
- @database.commit
38
- rescue Exception => e
39
- puts e.message
40
- @database.rollback
41
- end
42
-
43
- def insert_warning(line, warning)
44
- @database.execute("INSERT INTO parse_warnings (line, warning) VALUES (:line, :warning)", :line => line, :warning => warning)
45
- @warning_count += 1
46
- end
47
-
48
- # Insert a request into the database.
49
- # def insert(request, close_statements = false)
50
- # raise 'No insert defined for this log file type'
51
- # end
52
-
53
- # Insert a batch of files into the database.
54
- # <tt>db_file</tt> The filename of the database file to use.
55
- # Returns the created database.
56
- def self.insert_batch_into(db_file, options = {}, &block)
57
- db = self.new(db_file)
58
- db.insert_batch(&block)
59
- return db
60
- end
61
-
62
- def count(type)
63
- @database.get_first_value("SELECT COUNT(*) FROM \"#{type}_requests\"").to_i
64
- end
65
-
66
- protected
67
-
68
- # Prepare insert statements.
69
- def prepare_statements!
70
- @insert_statements = {
71
- :started => @database.prepare("
72
- INSERT INTO started_requests ( line, timestamp, ip, method, controller, action)
73
- VALUES (:line, :timestamp, :ip, :method, :controller, :action)"),
74
-
75
- :failed => @database.prepare("
76
- INSERT INTO failed_requests ( line, exception_string, stack_trace, error)
77
- VALUES (:line, :exception_string, :stack_trace, :error)"),
78
-
79
- :completed => @database.prepare("
80
- INSERT INTO completed_requests ( line, url, status, duration, rendering_time, database_time)
81
- VALUES (:line, :url, :status, :duration, :rendering, :db)")
82
- }
83
- end
84
-
85
- # Close all prepared statments
86
- def close_prepared_statements!
87
- @insert_statements.each { |key, stmt| stmt.close }
88
- end
89
-
90
- # Create the needed database tables if they don't exist.
91
- def create_tables_if_needed!
92
-
93
- @database.execute("
94
- CREATE TABLE IF NOT EXISTS started_requests (
95
- id INTEGER PRIMARY KEY AUTOINCREMENT,
96
- line INTEGER NOT NULL,
97
- timestamp DATETIME NOT NULL,
98
- controller VARCHAR(255) NOT NULL,
99
- action VARCHAR(255) NOT NULL,
100
- method VARCHAR(6) NOT NULL,
101
- ip VARCHAR(6) NOT NULL
102
- )
103
- ");
104
-
105
- @database.execute("
106
- CREATE TABLE IF NOT EXISTS failed_requests (
107
- id INTEGER PRIMARY KEY AUTOINCREMENT,
108
- line INTEGER NOT NULL,
109
- started_request_id INTEGER,
110
- error VARCHAR(255),
111
- exception_string VARCHAR(255),
112
- stack_trace TEXT
113
- )
114
- ");
115
-
116
- @database.execute("
117
- CREATE TABLE IF NOT EXISTS completed_requests (
118
- id INTEGER PRIMARY KEY AUTOINCREMENT,
119
- line INTEGER NOT NULL,
120
- started_request_id INTEGER,
121
- url VARCHAR(255) NOT NULL,
122
- hashed_url VARCHAR(255),
123
- status INTEGER NOT NULL,
124
- duration FLOAT,
125
- rendering_time FLOAT,
126
- database_time FLOAT
127
- )
128
- ");
129
-
130
- @database.execute("CREATE TABLE IF NOT EXISTS parse_warnings (
131
- id INTEGER PRIMARY KEY AUTOINCREMENT,
132
- line INTEGER NOT NULL,
133
- warning VARCHAR(255) NOT NULL
134
- )
135
- ");
136
- end
137
-
138
- end
139
- end
@@ -1,129 +0,0 @@
1
- require "#{File.dirname(__FILE__)}/flag"
2
- require "#{File.dirname(__FILE__)}/exceptions"
3
-
4
- # Module used to parse commandline arguments
5
- module CommandLine
6
-
7
- # Parse argument lists and return an argument object containing all set flags and switches.
8
- class Arguments
9
-
10
- FLAG_REGEXP = /^--?[A-z0-9]/
11
-
12
- attr_reader :flag_definitions
13
-
14
- attr_reader :flags
15
- attr_reader :files
16
- attr_reader :command
17
-
18
- attr_accessor :required_files
19
-
20
- # Initializer.
21
- # <tt>arguments</tt> The arguments which are going to be parsed (defaults to $*).
22
- def initialize(arguments = $*, &block)
23
- @arguments = arguments
24
- @flag_definitions = {}
25
- @begins_with_command = false
26
- end
27
-
28
- # Parse a list of arguments. Intatiates a Argument object with the given arguments and yeilds
29
- # it so that flags and switches can be set by the application.
30
- # <tt>arguments</tt> The arguments which are going to be parsed (defaults to $*).
31
- # Returns the arguments object.parse!
32
- def self.parse(arguments = $*, &block)
33
- cla = Arguments.new(arguments)
34
- yield(cla)
35
- return cla.parse!
36
- end
37
-
38
- # Handle argument switches for the application
39
- # <tt>switch</tt> A switch symbol like :fast
40
- # <tt>switch_alias</tt> An short alias for the same switch (:f).
41
- def switch(switch, switch_alias = nil)
42
- return self.flag(switch, :alias => switch_alias, :expects => nil)
43
- end
44
-
45
- # Handle argument flags for the application
46
- # <tt>flag</tt> A flag symbol like :fast
47
- # Options
48
- # * <tt>:expects</tt> Expects a value after the flag
49
- def flag(flag, options)
50
- options[:expects] = String unless options.has_key?(:expects)
51
- argument = Flag.new(flag, options)
52
- @flag_definitions[argument.to_argument] = argument
53
- @flag_definitions[argument.to_alias] = argument if argument.has_alias?
54
- return argument
55
- end
56
-
57
- # If called argument list must begin with a command.
58
- # <tt>begins_w_command</tt> Defaults to true.
59
- def begins_with_command!(begins_w_command=true)
60
- @begins_with_command = begins_w_command
61
- end
62
-
63
- # Unknown flags will be silently ignored.
64
- # <tt>ignore</tt> Defaults to true.
65
- def ignore_unknown_flags!(ignore = true)
66
- @ignore_unknown_flags = ignore
67
- end
68
-
69
- def [](name)
70
- return flags[name.to_s.gsub(/_/, '-').to_sym]
71
- end
72
-
73
- # Parse the flags and switches set by the application.
74
- # Returns an arguments object containing the flags and switches found in the commandline.
75
- def parse!
76
- @flags = {}
77
- @files = []
78
-
79
- i = 0
80
- while @arguments.length > i do
81
- arg = @arguments[i]
82
- if FLAG_REGEXP =~ arg
83
- if @flag_definitions.has_key?(arg)
84
- flag = @flag_definitions[arg]
85
- if flag.expects_argument?
86
-
87
- if @arguments.length > (i + 1) && @arguments[i + 1]
88
- @flags[flag.name] = @arguments[i + 1]
89
- i += 1
90
- else
91
- raise CommandLine::FlagExpectsArgument.new(arg)
92
- end
93
-
94
- else
95
- @flags[flag.name] = true
96
- end
97
- else
98
- raise CommandLine::UnknownFlag.new(arg) unless @ignore_unknown_flags
99
- end
100
- else
101
- if @begins_with_command && @command.nil?
102
- @command = arg
103
- else
104
- @files << arg
105
- end
106
- end
107
- i += 1
108
- end
109
-
110
- check_parsed_arguments!
111
-
112
- return self
113
- end
114
-
115
- # Check if the parsed arguments meet their requirements.
116
- # Raises CommandLineexception on error.
117
- def check_parsed_arguments!
118
- if @begins_with_command && @command.nil?
119
- raise CommandLine::CommandMissing.new
120
- end
121
-
122
- if @required_files && @files.length < @required_files
123
- raise CommandLine::FileMissing.new("You need at least #{@required_files} files")
124
- end
125
-
126
- end
127
- end
128
-
129
- end
@@ -1,51 +0,0 @@
1
- module CommandLine
2
-
3
- # Argument flag handling.
4
- class Flag
5
-
6
- attr_reader :name
7
- attr_reader :alias
8
- attr_reader :argument
9
-
10
- # Initialize new Flag
11
- # <tt>name</tt> The name of the flag
12
- # <tt>definition</tt> The definition of the flag.
13
- def initialize(name, definition)
14
- @name = name.to_s.gsub(/_/, '-').to_sym
15
- @alias = definition[:alias].to_sym if definition[:alias]
16
- @required = definition.has_key?(:required) && definition[:required] == true
17
- @argument = definition[:expects] if definition[:expects]
18
- end
19
-
20
- # Argument representation of the flag (--fast)
21
- def to_argument
22
- "--#{@name}"
23
- end
24
-
25
- # Argument alias representation of the flag (-f)
26
- def to_alias
27
- "-#{@alias}"
28
- end
29
-
30
- # Check if flag has an alias
31
- def has_alias?
32
- !@alias.nil?
33
- end
34
-
35
- # Check if flag is optional
36
- def optional?
37
- !@required
38
- end
39
-
40
- # Check if flag is required
41
- def required?
42
- @required
43
- end
44
-
45
- # Check if flag expects an argument (Are you talking to me?)
46
- def expects_argument?
47
- !@argument.nil?
48
- end
49
- end
50
-
51
- end
@@ -1,26 +0,0 @@
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
@@ -1,35 +0,0 @@
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
@@ -1,39 +0,0 @@
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
data/tasks/test.rake DELETED
@@ -1,8 +0,0 @@
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
@@ -1,59 +0,0 @@
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]
@@ -1,5 +0,0 @@
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]
@@ -1,12 +0,0 @@
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]
@@ -1,10 +0,0 @@
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/]
@@ -1,24 +0,0 @@
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]
@@ -1,84 +0,0 @@
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}
@@ -1,39 +0,0 @@
1
- require 'test/unit'
2
-
3
- require "#{File.dirname(__FILE__)}/../lib/base/log_parser"
4
- require "#{File.dirname(__FILE__)}/../lib/merb_analyzer/log_parser"
5
-
6
- class MerbLogParserTest < Test::Unit::TestCase
7
-
8
- def fragment_file(number)
9
- "#{File.dirname(__FILE__)}/log_fragments/merb_#{number}.log"
10
- end
11
-
12
- def test_parse_started_merb_fragment
13
- requests = []
14
- parser = MerbAnalyzer::LogParser.new(fragment_file(1)).each(:started) do |request|
15
- requests << request
16
- end
17
- assert_equal requests[0][:timestamp], "Fri Aug 29 11:10:23 +0200 2008"
18
- end
19
-
20
- def test_parse_completed_merb_fragment
21
- requests = []
22
- parser = MerbAnalyzer::LogParser.new(fragment_file(1)).each(:completed) do |request|
23
- requests << request
24
- end
25
-
26
- assert_equal requests[0][:action_time], 0.241652
27
- end
28
-
29
- def test_parse_params_merb_fragment
30
- requests = []
31
- parser = MerbAnalyzer::LogParser.new(fragment_file(1)).each(:params) do |request|
32
- requests << request
33
- end
34
-
35
- assert_match '"controller"=>"session"', requests[0][:raw_hash]
36
- assert_match '"action"=>"destroy"', requests[0][:raw_hash]
37
- end
38
-
39
- end