request-log-analyzer 1.12.7 → 1.12.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,18 +13,18 @@ module RequestLogAnalyzer::FileFormat
13
13
  line.header = true
14
14
  line.teaser = /Started /
15
15
  line.regexp = /Started ([A-Z]+) "([^"]+)" for (#{ip_address}) at (#{timestamp('%a %b %d %H:%M:%S %z %Y')}|#{timestamp('%Y-%m-%d %H:%M:%S %z')})/
16
-
16
+
17
17
  line.capture(:method)
18
18
  line.capture(:path)
19
19
  line.capture(:ip)
20
20
  line.capture(:timestamp).as(:timestamp)
21
21
  end
22
-
22
+
23
23
  # Processing by QueriesController#index as HTML
24
24
  line_definition :processing do |line|
25
25
  line.teaser = /Processing by /
26
26
  line.regexp = /Processing by ([A-Za-z0-9\-:]+)\#(\w+) as ([\w\/\*]*)/
27
-
27
+
28
28
  line.capture(:controller)
29
29
  line.capture(:action)
30
30
  line.capture(:format)
@@ -36,7 +36,7 @@ module RequestLogAnalyzer::FileFormat
36
36
  line.regexp = / Parameters:\s+(\{.*\})/
37
37
  line.capture(:params).as(:eval)
38
38
  end
39
-
39
+
40
40
  # Completed 200 OK in 224ms (Views: 200.2ms | ActiveRecord: 3.4ms)
41
41
  # Completed 302 Found in 23ms
42
42
  # Completed in 189ms
@@ -44,13 +44,21 @@ module RequestLogAnalyzer::FileFormat
44
44
  line.footer = true
45
45
  line.teaser = /Completed /
46
46
  line.regexp = /Completed (\d+)? .*in (\d+(?:\.\d+)?)ms(?:[^\(]*\(Views: (\d+(?:\.\d+)?)ms .* ActiveRecord: (\d+(?:\.\d+)?)ms.*\))?/
47
-
47
+
48
48
  line.capture(:status).as(:integer)
49
49
  line.capture(:duration).as(:duration, :unit => :msec)
50
50
  line.capture(:view).as(:duration, :unit => :msec)
51
51
  line.capture(:db).as(:duration, :unit => :msec)
52
52
  end
53
-
53
+
54
+ # ActionController::RoutingError (No route matches [GET] "/missing_stuff"):
55
+ line_definition :routing_errors do |line|
56
+ line.teaser = /RoutingError/
57
+ line.regexp = /No route matches \[([A-Z]+)\] "([^"]+)"/
58
+ line.capture(:missing_resource_method).as(:string)
59
+ line.capture(:missing_resource).as(:string)
60
+ end
61
+
54
62
  # ActionView::Template::Error (undefined local variable or method `field' for #<Class>) on line #3 of /Users/willem/Code/warehouse/app/views/queries/execute.csv.erb:
55
63
  line_definition :failure do |line|
56
64
  line.footer = true
@@ -77,29 +85,32 @@ module RequestLogAnalyzer::FileFormat
77
85
  # Rendered collection (0.0ms)
78
86
 
79
87
  REQUEST_CATEGORIZER = lambda { |request| "#{request[:controller]}##{request[:action]}.#{request[:format]}" }
80
-
88
+
81
89
  report do |analyze|
82
-
90
+
83
91
  analyze.timespan
84
92
  analyze.hourly_spread
85
-
93
+
86
94
  analyze.frequency :category => REQUEST_CATEGORIZER, :title => 'Most requested'
87
95
  analyze.frequency :method, :title => 'HTTP methods'
88
96
  analyze.frequency :status, :title => 'HTTP statuses returned'
89
-
97
+
90
98
  analyze.duration :duration, :category => REQUEST_CATEGORIZER, :title => "Request duration", :line_type => :completed
91
99
  analyze.duration :partial_duration, :category => :rendered_file, :title => 'Partials rendering time', :line_type => :rendered
92
100
  analyze.duration :view, :category => REQUEST_CATEGORIZER, :title => "View rendering time", :line_type => :completed
93
101
  analyze.duration :db, :category => REQUEST_CATEGORIZER, :title => "Database time", :line_type => :completed
94
-
102
+
95
103
  analyze.frequency :category => REQUEST_CATEGORIZER, :title => 'Process blockers (> 1 sec duration)',
96
104
  :if => lambda { |request| request[:duration] && request[:duration] > 1.0 }
105
+
106
+ analyze.frequency :category => lambda{|x| "[#{x[:missing_resource_method]}] #{x[:missing_resource]}"},
107
+ :title => "Routing Errors", :if => lambda{ |request| !request[:missing_resource].nil? }
97
108
  end
98
-
109
+
99
110
  class Request < RequestLogAnalyzer::Request
100
111
  # Used to handle conversion of abbrev. month name to a digit
101
112
  MONTHS = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
102
-
113
+
103
114
  def convert_timestamp(value, definition)
104
115
  # the time value can be in 2 formats:
105
116
  # - 2010-10-26 02:27:15 +0000 (ruby 1.9.2)
@@ -11,7 +11,7 @@ module RequestLogAnalyzer
11
11
 
12
12
  # The current version of request-log-analyzer.
13
13
  # Do not change the value by hand; it will be updated automatically by the gem release script.
14
- VERSION = "1.12.7"
14
+ VERSION = "1.12.8"
15
15
 
16
16
  # Convert a string/symbol in camelcase ({RequestLogAnalyzer::Controller}) to underscores
17
17
  # (<tt>request_log_analyzer/controller</tt>). This function can be used to load the file (using
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
2
2
  s.name = "request-log-analyzer"
3
3
 
4
4
  # Do not set the version and date field manually, this is done by the release script
5
- s.version = "1.12.7"
6
- s.date = "2013-01-02"
5
+ s.version = "1.12.8"
6
+ s.date = "2013-01-22"
7
7
 
8
8
  s.rubyforge_project = 'r-l-a'
9
9
 
@@ -3,24 +3,24 @@ require 'spec_helper'
3
3
  describe RequestLogAnalyzer::FileFormat::Rails3 do
4
4
 
5
5
  subject { RequestLogAnalyzer::FileFormat.load(:rails3) }
6
-
6
+
7
7
  it { should be_well_formed }
8
- it { should have(10).report_trackers }
9
-
8
+ it { should have(11).report_trackers }
9
+
10
10
  describe '#parse_line' do
11
11
 
12
12
  it "should parse :started lines correctly" do
13
13
  line = 'Started GET "/queries" for 127.0.0.1 at Thu Feb 25 16:15:18 -0800 2010'
14
- subject.should parse_line(line).as(:started).and_capture(:method => 'GET',
14
+ subject.should parse_line(line).as(:started).and_capture(:method => 'GET',
15
15
  :path => '/queries', :ip => '127.0.0.1', :timestamp => 20100225161518)
16
16
  end
17
-
17
+
18
18
  it "should parse :started lines in Oct, Nov and Dec correctly" do
19
19
  line = 'Started GET "/queries" for 127.0.0.1 at Thu Oct 25 16:15:18 -0800 2010'
20
20
  subject.should parse_line(line).as(:started).and_capture(:method => 'GET',
21
21
  :path => '/queries', :ip => '127.0.0.1', :timestamp => 20101025161518)
22
22
  end
23
-
23
+
24
24
  it "should parse :started lines in Ruby 1.9.2 format correctly" do
25
25
  line = 'Started GET "/queries" for 127.0.0.1 at 2010-10-26 02:27:15 +0000'
26
26
  subject.should parse_line(line).as(:started).and_capture(:method => 'GET',
@@ -32,13 +32,13 @@ describe RequestLogAnalyzer::FileFormat::Rails3 do
32
32
  subject.should parse_line(line).as(:processing).and_capture(
33
33
  :controller => 'QueriesController', :action => 'index', :format => 'HTML')
34
34
  end
35
-
35
+
36
36
  it "should parse nested :processing lines correctly" do
37
37
  line = ' Processing by Projects::QueriesController#index as HTML'
38
38
  subject.should parse_line(line).as(:processing).and_capture(
39
39
  :controller => 'Projects::QueriesController', :action => 'index', :format => 'HTML')
40
40
  end
41
-
41
+
42
42
  it "should parse :processing lines correctly with format */*" do
43
43
  line = ' Processing by ProjectsController#avatar as */*'
44
44
  subject.should parse_line(line).as(:processing).and_capture(
@@ -55,30 +55,35 @@ describe RequestLogAnalyzer::FileFormat::Rails3 do
55
55
  line = ' Parameters: {"action"=>"cached", "controller"=>"cached"}'
56
56
  subject.should parse_line(line).as(:parameters).and_capture(:params => {:action => 'cached', :controller => 'cached'})
57
57
  end
58
-
58
+
59
59
  it "should parse :completed lines correctly" do
60
60
  line = 'Completed 200 OK in 170ms (Views: 78.0ms | ActiveRecord: 48.2ms)'
61
61
  subject.should parse_line(line).as(:completed).and_capture(
62
62
  :duration => 0.170, :view => 0.078, :db => 0.0482, :status => 200)
63
63
  end
64
-
64
+
65
65
  it "should parse :completed lines correctly when ActiveRecord is not mentioned" do
66
66
  line = 'Completed 200 OK in 364ms (Views: 31.4ms)'
67
67
  subject.should parse_line(line).as(:completed).and_capture(:duration => 0.364, :status => 200)
68
68
  end
69
-
69
+
70
70
  it "should parse :completed lines correctly when other durations are specified" do
71
71
  line = 'Completed 200 OK in 384ms (Views: 222.0ms | ActiveRecord: 121.0ms | Sphinx: 0.0ms)'
72
- subject.should parse_line(line).as(:completed).and_capture(:duration => 0.384, :view => 0.222,
72
+ subject.should parse_line(line).as(:completed).and_capture(:duration => 0.384, :view => 0.222,
73
73
  :db => 0.121, :status => 200)
74
74
  end
75
-
76
75
 
77
- it "should pase :failure lines correctly" do
76
+ it "should parse :routing_error lines correctly" do
77
+ line = "ActionController::RoutingError (No route matches [GET] \"/static/faq\"):"
78
+ subject.should parse_line(line).as(:routing_errors).and_capture(:missing_resource_method => "GET",
79
+ :missing_resource => '/static/faq')
80
+ end
81
+
82
+ it "should parse :failure lines correctly" do
78
83
  line = "ActionView::Template::Error (undefined local variable or method `field' for #<Class>) on line #3 of /Users/willem/Code/warehouse/app/views/queries/execute.csv.erb:"
79
- subject.should parse_line(line).as(:failure).and_capture(:line => 3,
80
- :error => 'ActionView::Template::Error',
81
- :message => "undefined local variable or method `field' for #<Class>",
84
+ subject.should parse_line(line).as(:failure).and_capture(:line => 3,
85
+ :error => 'ActionView::Template::Error',
86
+ :message => "undefined local variable or method `field' for #<Class>",
82
87
  :file => '/Users/willem/Code/warehouse/app/views/queries/execute.csv.erb')
83
88
  end
84
89
 
@@ -87,7 +92,7 @@ describe RequestLogAnalyzer::FileFormat::Rails3 do
87
92
  subject.should parse_line(line).as(:rendered).and_capture(:partial_duration => [0.0006])
88
93
  end
89
94
  end
90
-
95
+
91
96
  describe '#parse_io' do
92
97
  let(:log_parser) { RequestLogAnalyzer::Source::LogParser.new(subject) }
93
98
 
@@ -100,7 +105,7 @@ describe RequestLogAnalyzer::FileFormat::Rails3 do
100
105
  Rendered queries/index.html.erb within layouts/default (40.9ms)
101
106
  Completed 200 OK in 170ms (Views: 78.4ms | ActiveRecord: 48.2ms)
102
107
  EOLOG
103
-
108
+
104
109
  log_parser.should_receive(:handle_request).once
105
110
  log_parser.should_not_receive(:warn)
106
111
  log_parser.parse_string(log)
@@ -118,22 +123,6 @@ describe RequestLogAnalyzer::FileFormat::Rails3 do
118
123
  log_parser.parse_string(log)
119
124
  end
120
125
 
121
- it "should parse an unroutable request correctly" do
122
- log = <<-EOLOG
123
- Started GET "/404" for 127.0.0.1 at Fri Mar 19 06:40:57 -0700 2010
124
-
125
- ActionController::RoutingError (No route matches "/404"):
126
-
127
-
128
- Rendered /Users/rails/actionpack/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.0ms)
129
-
130
- EOLOG
131
-
132
- log_parser.should_receive(:handle_request).once
133
- log_parser.should_receive(:warn).once
134
- log_parser.parse_string(log)
135
- end
136
-
137
126
  it "should parse a failing request correctly" do
138
127
  log = <<-EOLOG
139
128
  Started POST "/queries/397638749/execute.csv" for 127.0.0.1 at Mon Mar 01 18:44:33 -0800 2010
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: request-log-analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.12.7
4
+ version: 1.12.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-02 00:00:00.000000000 Z
13
+ date: 2013-01-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rake