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,39 @@
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
@@ -0,0 +1,99 @@
1
+ require 'test/unit'
2
+
3
+ require "#{File.dirname(__FILE__)}/../lib/request_log_analyzer"
4
+
5
+ class RailsLogParserTest < Test::Unit::TestCase
6
+
7
+ def fragment_file(number)
8
+ "#{File.dirname(__FILE__)}/log_fragments/fragment_#{number}.log"
9
+ end
10
+
11
+
12
+ def test_rails_22_log_format
13
+ count = 0
14
+ parser = RailsAnalyzer::LogParser.new(fragment_file(3)).each(:completed) do |request|
15
+ count += 1
16
+ assert_equal 0.614, request[:duration] # should be 0.614
17
+ end
18
+ assert_equal 1, count
19
+ end
20
+
21
+ def test_progress_messages
22
+ log_file = fragment_file(1)
23
+
24
+ finished_encountered = false
25
+ file_size = File.size(log_file)
26
+
27
+ previous_pos = -1
28
+ parser = RailsAnalyzer::LogParser.new(log_file)
29
+ parser.progress do |pos, total|
30
+ assert_equal file_size, total
31
+ if pos == :finished
32
+ finished_encountered = true
33
+ else
34
+ assert pos <= total
35
+ assert pos > previous_pos
36
+ previous_pos = pos
37
+ end
38
+ end
39
+
40
+ # now parse the file
41
+ parser.each(:started) { }
42
+
43
+ assert finished_encountered, "A finished event should have been fired"
44
+ end
45
+
46
+ def test_parse_mongrel_log_fragment
47
+ count = 0
48
+ parser = RailsAnalyzer::LogParser.new(fragment_file(1)).each(:started) { count += 1 }
49
+ assert_equal 4, count
50
+
51
+ count = 0
52
+ parser = RailsAnalyzer::LogParser.new(fragment_file(1)).each(:completed) { count += 1 }
53
+ assert_equal 4, count
54
+
55
+ count = 0
56
+ parser = RailsAnalyzer::LogParser.new(fragment_file(1)).each(:started, :completed) { count += 1 }
57
+ assert_equal 8, count
58
+ end
59
+
60
+ def test_parse_syslog_fragment
61
+ count = 0
62
+ parser = RailsAnalyzer::LogParser.new(fragment_file(2)).each(:started) { count += 1 }
63
+ assert_equal 1, count
64
+
65
+ count = 0
66
+ parser = RailsAnalyzer::LogParser.new(fragment_file(2)).each(:completed) { count += 1 }
67
+ assert_equal 1, count
68
+
69
+ count = 0
70
+ parser = RailsAnalyzer::LogParser.new(fragment_file(2)).each(:started, :completed) { count += 1 }
71
+ assert_equal 2, count
72
+ end
73
+
74
+ def test_parse_syslog_fragment_content
75
+ # this test only works because there is only one requests in the fragment
76
+ parser = RailsAnalyzer::LogParser.new(fragment_file(2)).each(:started) do |request|
77
+ assert_equal "EmployeeController", request[:controller]
78
+ assert_equal "index", request[:action]
79
+ assert_equal "GET", request[:method]
80
+ assert_equal '10.1.1.33', request[:ip]
81
+ assert_equal '2008-07-13 06:25:58', request[:timestamp]
82
+ end
83
+
84
+ parser = RailsAnalyzer::LogParser.new(fragment_file(2)).each(:completed) do |request|
85
+ assert_equal "http://example.com/employee.xml", request[:url]
86
+ assert_equal 200, request[:status]
87
+ assert_equal 0.21665, request[:duration]
88
+ assert_equal 0.00926, request[:rendering]
89
+ assert_equal 0.0, request[:db]
90
+ end
91
+
92
+ end
93
+
94
+ def test_virtual_mongrel
95
+ request_log_analyzer = RequestLogAnalyzer.new()
96
+ request_log_analyzer.analyze_with_virtual_mongrels([fragment_file(5)])
97
+ end
98
+
99
+ end
@@ -0,0 +1,45 @@
1
+ require 'test/unit'
2
+
3
+ require "#{File.dirname(__FILE__)}/../lib/base/log_parser"
4
+ require "#{File.dirname(__FILE__)}/../lib/base/record_inserter"
5
+
6
+ require "#{File.dirname(__FILE__)}/../lib/rails_analyzer/log_parser"
7
+ require "#{File.dirname(__FILE__)}/../lib/rails_analyzer/record_inserter"
8
+
9
+ class RecordInserterTest < Test::Unit::TestCase
10
+
11
+ def fragment_file(number)
12
+ "#{File.dirname(__FILE__)}/log_fragments/fragment_#{number}.log"
13
+ end
14
+
15
+ def setup
16
+ File.delete('_tmp.db') if File.exist?('_tmp.db')
17
+ end
18
+
19
+ def teardown
20
+ File.delete('_tmp.db') if File.exist?('_tmp.db')
21
+ end
22
+
23
+ def test_insert_log_fragment
24
+
25
+ db = RailsAnalyzer::RecordInserter.insert_batch_into('_tmp.db') do |batch|
26
+ RailsAnalyzer::LogParser.new(fragment_file(1)).each { |request| batch.insert(request) }
27
+ end
28
+
29
+ assert_equal 4, db.database.get_first_value("SELECT COUNT(*) FROM started_requests").to_i
30
+ assert_equal 4, db.database.get_first_value("SELECT COUNT(*) FROM completed_requests").to_i
31
+ end
32
+
33
+ def test_insert_multiple_fragments
34
+ RailsAnalyzer::RecordInserter.insert_batch_into('_tmp.db') do |batch|
35
+ RailsAnalyzer::LogParser.new(fragment_file(1)).each { |request| batch.insert(request) }
36
+ end
37
+
38
+ db = RailsAnalyzer::RecordInserter.insert_batch_into('_tmp.db') do |batch|
39
+ RailsAnalyzer::LogParser.new(fragment_file(2)).each { |request| batch.insert(request) }
40
+ end
41
+ assert_equal 5, db.database.get_first_value("SELECT COUNT(*) FROM started_requests").to_i
42
+ assert_equal 5, db.database.get_first_value("SELECT COUNT(*) FROM completed_requests").to_i
43
+ end
44
+
45
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wvanbergen-request-log-analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-12-28 00:00:00 -08:00
13
+ date: 2008-12-29 00:00:00 -08:00
14
14
  default_executable: request-log-analyzer
15
15
  dependencies: []
16
16
 
@@ -18,6 +18,7 @@ description: Rails log analyzer's purpose is to find what actions are best candi
18
18
  email: willem@vanbergen.org
19
19
  executables:
20
20
  - request-log-analyzer
21
+ - request-log-database
21
22
  extensions: []
22
23
 
23
24
  extra_rdoc_files: []
@@ -29,8 +30,11 @@ files:
29
30
  - TODO
30
31
  - bin
31
32
  - bin/request-log-analyzer
33
+ - bin/request-log-database
32
34
  - lib
33
35
  - lib/base
36
+ - lib/base/log_parser.rb
37
+ - lib/base/record_inserter.rb
34
38
  - lib/base/summarizer.rb
35
39
  - lib/bashcolorizer.rb
36
40
  - lib/command_line
@@ -38,24 +42,14 @@ files:
38
42
  - lib/command_line/exceptions.rb
39
43
  - lib/command_line/flag.rb
40
44
  - lib/merb_analyzer
45
+ - lib/merb_analyzer/log_parser.rb
41
46
  - lib/merb_analyzer/summarizer.rb
42
47
  - lib/rails_analyzer
48
+ - lib/rails_analyzer/log_parser.rb
49
+ - lib/rails_analyzer/record_inserter.rb
43
50
  - lib/rails_analyzer/summarizer.rb
44
51
  - lib/rails_analyzer/virtual_mongrel.rb
45
- - lib/request_log_analyzer
46
52
  - lib/request_log_analyzer.rb
47
- - lib/request_log_analyzer/aggregator
48
- - lib/request_log_analyzer/aggregator/base.rb
49
- - lib/request_log_analyzer/aggregator/database.rb
50
- - lib/request_log_analyzer/aggregator/echo.rb
51
- - lib/request_log_analyzer/aggregator/summarizer.rb
52
- - lib/request_log_analyzer/controller.rb
53
- - lib/request_log_analyzer/file_format
54
- - lib/request_log_analyzer/file_format.rb
55
- - lib/request_log_analyzer/file_format/merb.rb
56
- - lib/request_log_analyzer/file_format/rails.rb
57
- - lib/request_log_analyzer/log_parser.rb
58
- - lib/request_log_analyzer/request.rb
59
53
  - lib/ruby-progressbar
60
54
  - lib/ruby-progressbar/progressbar.en.rd
61
55
  - lib/ruby-progressbar/progressbar.ja.rd
@@ -97,9 +91,19 @@ files:
97
91
  - tasks
98
92
  - tasks/github-gem.rake
99
93
  - tasks/request_log_analyzer.rake
100
- - tasks/rspec.rake
94
+ - tasks/test.rake
101
95
  - test
102
96
  - test/base_summarizer_test.rb
97
+ - test/log_fragments
98
+ - test/log_fragments/fragment_1.log
99
+ - test/log_fragments/fragment_2.log
100
+ - test/log_fragments/fragment_3.log
101
+ - test/log_fragments/fragment_4.log
102
+ - test/log_fragments/fragment_5.log
103
+ - test/log_fragments/merb_1.log
104
+ - test/merb_log_parser_test.rb
105
+ - test/rails_log_parser_test.rb
106
+ - test/record_inserter_test.rb
103
107
  has_rdoc: false
104
108
  homepage: http://github.com/wvanbergen/request-log-analyzer/wikis
105
109
  post_install_message:
@@ -128,3 +132,6 @@ specification_version: 2
128
132
  summary: A command line tool to analyze Rails logs
129
133
  test_files:
130
134
  - test/base_summarizer_test.rb
135
+ - test/merb_log_parser_test.rb
136
+ - test/rails_log_parser_test.rb
137
+ - test/record_inserter_test.rb
@@ -1,34 +0,0 @@
1
- module RequestLogAnalyzer::Aggregator
2
-
3
-
4
- class Base
5
-
6
- include RequestLogAnalyzer::FileFormat
7
-
8
- attr_reader :options
9
-
10
- def initialize(format, options = {})
11
- self.register_file_format(format)
12
- @options = options
13
- end
14
-
15
- def aggregate(request)
16
- # implement me!
17
- end
18
-
19
-
20
- def prepare
21
- end
22
-
23
- def finalize
24
- end
25
-
26
- def warning(type, message, lineno)
27
- end
28
-
29
- def report(color = false)
30
-
31
- end
32
-
33
- end
34
- end
@@ -1,86 +0,0 @@
1
- require 'rubygems'
2
- require 'activerecord'
3
-
4
- module RequestLogAnalyzer::Aggregator
5
-
6
- class Database < Base
7
-
8
- attr_reader :request_id
9
-
10
- def prepare
11
- ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => options[:database])
12
-
13
- File.unlink(options[:database]) if File.exist?(options[:database])
14
- create_database_schema!
15
-
16
- @request_id = 0
17
- end
18
-
19
- def aggregate(request)
20
- @request_id += 1
21
-
22
- request.lines.each do |line|
23
- class_name = "#{line[:line_type]}_line".camelize #split(/[^a-z0-9]/i).map{ |w| w.capitalize }.join('')
24
-
25
- attributes = line.reject { |k, v| [:line_type].include?(k) }
26
- attributes[:request_id] = @request_id if options[:combined_requests]
27
- file_format.const_get(class_name).create!(attributes)
28
- end
29
-
30
- end
31
-
32
- def warning(type, message, lineno)
33
- file_format::Warning.create!(:warning_type => type.to_s, :message => message, :lineno => lineno)
34
- end
35
-
36
- protected
37
-
38
- def create_database_table(name, definition)
39
- ActiveRecord::Migration.suppress_messages do
40
- ActiveRecord::Migration.create_table("#{name}_lines") do |t|
41
- t.column(:request_id, :integer) #if options[:combined_requests]
42
- t.column(:lineno, :integer)
43
- definition.captures.each do |field|
44
- # there is only on key/value pait in this hash
45
- field.each { |key, capture_type| t.column(key, column_type(capture_type)) }
46
- end
47
- end
48
- end
49
- end
50
-
51
- def create_warning_table_and_class
52
- ActiveRecord::Migration.suppress_messages do
53
- ActiveRecord::Migration.create_table("warnings") do |t|
54
- t.string :warning_type, :limit => 30, :null => false
55
- t.string :message
56
- t.integer :lineno
57
- end
58
- end
59
-
60
- file_format.const_set('Warning', Class.new(ActiveRecord::Base)) unless file_format.const_defined?('Warning')
61
- end
62
-
63
- def create_activerecord_class(name, definition)
64
- class_name = "#{name}_line".camelize
65
- file_format.const_set(class_name, Class.new(ActiveRecord::Base)) unless file_format.const_defined?(class_name)
66
- end
67
-
68
- def create_database_schema!
69
- file_format.line_definitions.each do |name, definition|
70
- create_database_table(name, definition)
71
- create_activerecord_class(name, definition)
72
- end
73
-
74
- create_warning_table_and_class
75
- end
76
-
77
- def column_type(capture_type)
78
- case capture_type
79
- when :sec; :double
80
- when :msec; :double
81
- when :float; :double
82
- else capture_type
83
- end
84
- end
85
- end
86
- end
@@ -1,10 +0,0 @@
1
- module RequestLogAnalyzer::Aggregator
2
-
3
- class Echo < Base
4
-
5
- def aggregate(request)
6
- puts "\nRequest: " + request.inspect
7
- end
8
-
9
- end
10
- end
@@ -1,53 +0,0 @@
1
- module RequestLogAnalyzer::Aggregator
2
-
3
- class Summarizer < Base
4
-
5
- attr_reader :buckets
6
-
7
- def prepare
8
- @buckets = {}
9
- end
10
-
11
- def aggregate(request)
12
- if options[:combined_requests]
13
- current_bucket_hash = @buckets
14
- else
15
- @buckets[request.line_type] ||= {}
16
- current_bucket_hash = @buckets[request.line_type]
17
- end
18
-
19
- bucket_name = bucket_for(request)
20
- current_bucket_hash[bucket_name] ||= default_bucket_content
21
- update_bucket(current_bucket_hash[bucket_name], request)
22
- end
23
-
24
- def default_bucket_content
25
- return { :count => 0 }
26
- end
27
-
28
- def update_bucket(bucket, request)
29
- bucket[:count] += 1
30
- end
31
-
32
- def bucket_for(request)
33
- 'all'
34
- end
35
-
36
- def report(color = false)
37
- if options[:combined_requests]
38
- @buckets.each do |hash, values|
39
- puts " #{hash[0..40].ljust(41)}: #{values[:count]}"
40
- end
41
- else
42
- @buckets.each do |line_type, buckets|
43
- puts "Line type #{line_type.inspect}:"
44
- buckets.each do |hash, values|
45
- puts " #{hash[0..40].ljust(41)}: #{values[:count]}"
46
- end
47
- end
48
- end
49
- end
50
-
51
-
52
- end
53
- end