production_log_analyzer 1.3.0 → 1.5.0
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.
- data/History.txt +34 -0
- data/{LICENSE → LICENSE.txt} +1 -1
- data/Manifest.txt +7 -3
- data/{README → README.txt} +27 -42
- data/Rakefile +11 -57
- data/bin/action_errors +46 -0
- data/lib/production_log/action_grep.rb +14 -11
- data/lib/production_log/analyzer.rb +284 -275
- data/lib/production_log/parser.rb +121 -125
- data/test/test.syslog.0.14.x.log +1 -0
- data/test/test.syslog.1.2.shortname.log +5 -0
- data/test/test.syslog.empty.log +2 -0
- data/test/test.syslog.log +3 -0
- data/test/test_action_grep.rb +1 -1
- data/test/test_analyzer.rb +251 -236
- data/test/test_parser.rb +162 -88
- metadata +62 -42
@@ -9,154 +9,150 @@
|
|
9
9
|
|
10
10
|
module LogParser
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
class LogEntry
|
16
|
-
|
17
|
-
##
|
18
|
-
# Controller and action for this request
|
12
|
+
##
|
13
|
+
# LogEntry contains a summary of log data for a single request.
|
19
14
|
|
20
|
-
|
15
|
+
class LogEntry
|
21
16
|
|
22
|
-
|
23
|
-
|
17
|
+
##
|
18
|
+
# Controller and action for this request
|
24
19
|
|
25
|
-
|
20
|
+
attr_reader :page
|
26
21
|
|
27
|
-
|
28
|
-
|
22
|
+
##
|
23
|
+
# Requesting IP
|
29
24
|
|
30
|
-
|
25
|
+
attr_reader :ip
|
31
26
|
|
32
|
-
|
33
|
-
|
34
|
-
# complete text of the SQL query is not saved to reduct memory usage.
|
27
|
+
##
|
28
|
+
# Time the request was made
|
35
29
|
|
36
|
-
|
30
|
+
attr_reader :time
|
37
31
|
|
38
|
-
|
39
|
-
|
32
|
+
##
|
33
|
+
# Array of SQL queries containing query type and time taken. The
|
34
|
+
# complete text of the SQL query is not saved to reduct memory usage.
|
40
35
|
|
41
|
-
|
36
|
+
attr_reader :queries
|
42
37
|
|
43
|
-
|
44
|
-
|
38
|
+
##
|
39
|
+
# Total request time, including database, render and other.
|
45
40
|
|
46
|
-
|
41
|
+
attr_reader :request_time
|
47
42
|
|
48
|
-
|
49
|
-
|
43
|
+
##
|
44
|
+
# Total render time.
|
50
45
|
|
51
|
-
|
52
|
-
|
53
|
-
##
|
54
|
-
# Creates a new LogEntry from the log data in +entry+.
|
46
|
+
attr_reader :render_time
|
55
47
|
|
56
|
-
|
57
|
-
|
58
|
-
@ip = nil
|
59
|
-
@time = nil
|
60
|
-
@queries = []
|
61
|
-
@request_time = 0
|
62
|
-
@render_time = 0
|
63
|
-
@db_time = 0
|
64
|
-
@in_component = 0
|
48
|
+
##
|
49
|
+
# Total database time
|
65
50
|
|
66
|
-
|
67
|
-
end
|
51
|
+
attr_reader :db_time
|
68
52
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
when /^Completed in ([\S]+) .+ Rendering: ([\S]+) .+ DB: ([\S]+)/ then
|
85
|
-
next if @in_component > 0
|
86
|
-
@request_time = $1.to_f
|
87
|
-
@render_time = $2.to_f
|
88
|
-
@db_time = $3.to_f
|
89
|
-
when /^Completed in ([\S]+) .+ DB: ([\S]+)/ then # Redirect
|
90
|
-
next if @in_component > 0
|
91
|
-
@request_time = $1.to_f
|
92
|
-
@render_time = 0
|
93
|
-
@db_time = $2.to_f
|
94
|
-
when /(.+?) \(([^)]+)\) / then
|
95
|
-
@queries << [$1, $2.to_f]
|
96
|
-
when /^Start rendering component / then
|
97
|
-
@in_component += 1
|
98
|
-
when /^End of component rendering$/ then
|
99
|
-
@in_component -= 1
|
100
|
-
when /^Fragment hit: / then
|
101
|
-
else
|
102
|
-
raise "Can't handle #{line.inspect}" if $TESTING
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
53
|
+
##
|
54
|
+
# Creates a new LogEntry from the log data in +entry+.
|
55
|
+
|
56
|
+
def initialize(entry)
|
57
|
+
@page = nil
|
58
|
+
@ip = nil
|
59
|
+
@time = nil
|
60
|
+
@queries = []
|
61
|
+
@request_time = 0
|
62
|
+
@render_time = 0
|
63
|
+
@db_time = 0
|
64
|
+
@in_component = 0
|
65
|
+
|
66
|
+
parse entry
|
67
|
+
end
|
106
68
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
69
|
+
##
|
70
|
+
# Extracts log data from +entry+, which is an Array of lines from the
|
71
|
+
# same request.
|
72
|
+
|
73
|
+
def parse(entry)
|
74
|
+
entry.each do |line|
|
75
|
+
case line
|
76
|
+
when /^Parameters/, /^Cookie set/, /^Rendering/,
|
77
|
+
/^Redirected/ then
|
78
|
+
# nothing
|
79
|
+
when /^Processing ([\S]+) \(for (.+) at (.*)\)/ then
|
80
|
+
next if @in_component > 0
|
81
|
+
@page = $1
|
82
|
+
@ip = $2
|
83
|
+
@time = $3
|
84
|
+
when /^Completed in ([\S]+) .+ Rendering: ([\S]+) .+ DB: ([\S]+)/ then
|
85
|
+
next if @in_component > 0
|
86
|
+
@request_time = $1.to_f
|
87
|
+
@render_time = $2.to_f
|
88
|
+
@db_time = $3.to_f
|
89
|
+
when /^Completed in ([\S]+) .+ DB: ([\S]+)/ then # Redirect
|
90
|
+
next if @in_component > 0
|
91
|
+
@request_time = $1.to_f
|
92
|
+
@render_time = 0
|
93
|
+
@db_time = $2.to_f
|
94
|
+
when /(.+?) \(([^)]+)\) / then
|
95
|
+
@queries << [$1, $2.to_f]
|
96
|
+
when /^Start rendering component / then
|
97
|
+
@in_component += 1
|
98
|
+
when /^End of component rendering$/ then
|
99
|
+
@in_component -= 1
|
100
|
+
when /^Fragment hit: / then
|
101
|
+
else # noop
|
102
|
+
# raise "Can't handle #{line.inspect}" if $TESTING
|
116
103
|
end
|
104
|
+
end
|
105
|
+
end
|
117
106
|
|
107
|
+
def ==(other) # :nodoc:
|
108
|
+
other.class == self.class and
|
109
|
+
other.page == self.page and
|
110
|
+
other.ip == self.ip and
|
111
|
+
other.time == self.time and
|
112
|
+
other.queries == self.queries and
|
113
|
+
other.request_time == self.request_time and
|
114
|
+
other.render_time == self.render_time and
|
115
|
+
other.db_time == self.db_time
|
118
116
|
end
|
119
117
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
118
|
+
end
|
119
|
+
|
120
|
+
##
|
121
|
+
# Parses IO stream +stream+, creating a LogEntry for each recognizable log
|
122
|
+
# entry.
|
123
|
+
#
|
124
|
+
# Log entries are recognised as starting with Processing, continuing with
|
125
|
+
# the same process id through Completed.
|
126
|
+
|
127
|
+
def self.parse(stream) # :yields: log_entry
|
128
|
+
buckets = Hash.new { |h,k| h[k] = [] }
|
129
|
+
comp_count = Hash.new 0
|
130
|
+
|
131
|
+
stream.each_line do |line|
|
132
|
+
line =~ / ([^ ]+) ([^ ]+)\[(\d+)\]: (.*)/
|
133
|
+
next if $2.nil? or $2 == 'newsyslog'
|
134
|
+
bucket = [$1, $2, $3].join '-'
|
135
|
+
data = $4
|
136
|
+
|
137
|
+
buckets[bucket] << data
|
138
|
+
|
139
|
+
case data
|
140
|
+
when /^Start rendering component / then
|
141
|
+
comp_count[bucket] += 1
|
142
|
+
when /^End of component rendering$/ then
|
143
|
+
comp_count[bucket] -= 1
|
144
|
+
when /^Completed/ then
|
145
|
+
next unless comp_count[bucket] == 0
|
146
|
+
entry = buckets.delete bucket
|
147
|
+
next unless entry.any? { |l| l =~ /^Processing/ }
|
148
|
+
yield LogEntry.new(entry)
|
149
|
+
end
|
150
|
+
end
|
153
151
|
|
154
|
-
|
155
|
-
|
156
|
-
end
|
152
|
+
buckets.each do |bucket, data|
|
153
|
+
yield LogEntry.new(data)
|
157
154
|
end
|
155
|
+
end
|
158
156
|
|
159
157
|
end
|
160
158
|
|
161
|
-
# vim: ts=4 sts=4 sw=4
|
162
|
-
|
data/test/test.syslog.0.14.x.log
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
//src/production_log_analyzer/dev/test/test.syslog.0.14.x.log#1 - add change 3135 (text)
|
1
2
|
Nov 7 12:14:02 192.168.1.71 43things[24950]: Processing RssController#entries (for 10.43.199.12 at 2005-11-07 12:14:02) [GET]
|
2
3
|
Nov 7 12:14:02 192.168.1.71 43things[24950]: Parameters: {"rss/entries/goal.html/entries/goal"=>nil, "action"=>"entries", "id"=>"goal", "controller"=>"rss", "goal_id"=>"86381"}
|
3
4
|
Nov 7 12:14:02 192.168.1.71 43things[24950]: Rendering rss/rss2.0
|
@@ -0,0 +1,5 @@
|
|
1
|
+
//src/production_log_analyzer/dev/test/test.syslog.1.2.shortname.log#1 - add change 3135 (text)
|
2
|
+
Jan 17 16:19:22 tlucas rails[2265]: Processing Short#a (for 127.0.0.1 at 2007-01-17 16:19:22) [GET]
|
3
|
+
Jan 17 16:19:22 tlucas rails[2265]: Parameters: {"action"=>"a", "controller"=>"short"}
|
4
|
+
Jan 17 16:19:22 tlucas rails[2265]: Rendering short/a
|
5
|
+
Jan 17 16:19:22 tlucas rails[2265]: Completed in 0.02666 (37 reqs/sec) | Rendering: 0.02261 (84%) | DB: 0.00222 (8%) | 200 OK [http://127.0.0.1/short]
|
data/test/test.syslog.log
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
//src/production_log_analyzer/dev/test/test.syslog.log#1 - add change 3135 (text)
|
1
2
|
Mar 7 00:00:00 online1 newsyslog[61307]: logfile turned over
|
2
3
|
Mar 7 00:00:20 online1 rails[59600]: Goal Load (0.002112) SELECT g.*, gs.score as score FROM goals g, goal_similarities gs WHERE g.id = gs.similar_goal_id AND g.num_active_people > 0 AND gs.goal_similarity_type_id = 1 AND gs.goal_id = 59133 ORDER BY score DESC LIMIT 3
|
3
4
|
Mar 7 00:00:20 online1 rails[59600]: Tag Load (0.001527) SELECT tags.*, count(*) as num_goals FROM tags_teams, tags, teams WHERE tags_teams.tag_id = tags.id AND tags_teams.team_id = teams.id AND teams.num_members > 0 AND teams.goal_id = 59133 GROUP BY tags.id ORDER BY num_goals DESC LIMIT 5
|
@@ -6,6 +7,7 @@ Mar 7 00:00:20 online1 rails[59600]: Person Load (0.001884) SELECT * FROM peo
|
|
6
7
|
Mar 7 00:00:20 online1 rails[59600]: Person Load (0.001159) SELECT * FROM people WHERE id = 10519 LIMIT 1
|
7
8
|
Mar 7 00:00:20 online1 rails[59600]: Rendering layouts/default (200 OK)
|
8
9
|
Mar 7 00:00:20 online1 rails[59600]: Completed in 0.300741 (3 reqs/sec) | Rendering: 0.049924 (16%) | DB: 0.092428 (30%)
|
10
|
+
Mar 7 00:00:25 online2 rails[59628]: -> vsize: 83628032 rssize: 79933440 runtime: 1151489566)
|
9
11
|
Mar 7 00:00:25 online2 rails[59628]: Processing RssController#uber (for 67.18.200.5 at Mon Mar 07 00:00:25 CST 2005)
|
10
12
|
Mar 7 00:00:25 online2 rails[59628]: Parameters: {:id=>"author", :"rss/uber/author.html/uber/author"=>nil, :action=>"uber", :username=>"looch", :controller=>"rss"}
|
11
13
|
Mar 7 00:00:25 online2 rails[59628]: Cookie set: auth=STUFF; path=/; expires=Thu, 05 Mar 2015 06:00:25 GMT
|
@@ -24,6 +26,7 @@ Mar 7 00:00:25 online1 rails[59628]: ProfileImage Load (0.001554) SELECT * FR
|
|
24
26
|
Mar 7 00:00:25 online1 rails[59628]: Rendering rss/rss2.0 (200 OK)
|
25
27
|
Mar 7 00:00:25 online1 rails[59628]: Completed in 0.034519 (28 reqs/sec) | Rendering: 0.011770 (34%) | DB: 0.007962 (23%)
|
26
28
|
Mar 7 00:00:25 online2 rails[59628]: Completed in 0.034519 (28 reqs/sec) | Rendering: 0.011770 (34%) | DB: 0.007962 (23%)
|
29
|
+
Mar 7 00:00:25 online2 rails[59628]: <- vsize: 83628032 rssize: 79933440 runtime: 1151487080
|
27
30
|
Mar 7 00:00:27 online1 rails[59645]: Processing ThingsController#view (for 67.18.200.5 at Mon Mar 07 00:00:27 CST 2005)
|
28
31
|
Mar 7 00:00:27 online1 rails[59645]: Parameters: {:id=>"11891", :"things/view/11891.html/view/11891"=>nil, :action=>"view", :controller=>"things"}
|
29
32
|
Mar 7 00:00:27 online1 rails[59645]: Cookie set: auth=STUFF; path=/; expires=Thu, 05 Mar 2015 06:00:27 GMT
|
data/test/test_action_grep.rb
CHANGED
data/test/test_analyzer.rb
CHANGED
@@ -8,89 +8,89 @@ require 'production_log/analyzer'
|
|
8
8
|
|
9
9
|
class TestEnumerable < Test::Unit::TestCase
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def test_sum
|
12
|
+
assert_equal 45, (1..9).sum
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
def test_average
|
16
|
+
# Ranges don't have a length
|
17
|
+
assert_in_delta 5.0, (1..9).to_a.average, 0.01
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
def test_sample_variance
|
21
|
+
assert_in_delta 6.6666, (1..9).to_a.sample_variance, 0.0001
|
22
|
+
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
def test_standard_deviation
|
25
|
+
assert_in_delta 2.5819, (1..9).to_a.standard_deviation, 0.0001
|
26
|
+
end
|
27
27
|
|
28
28
|
end
|
29
29
|
|
30
30
|
class TestSizedList < Test::Unit::TestCase
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
end
|
32
|
+
def setup
|
33
|
+
@list = SizedList.new 10 do |arr,|
|
34
|
+
arr.delete_at 0
|
35
|
+
true
|
37
36
|
end
|
37
|
+
end
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
def test_append
|
40
|
+
assert_equal [], @list.entries
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
42
|
+
(1..10).each { |i| @list << i }
|
43
|
+
assert_equal 10, @list.length
|
44
|
+
assert_equal((1..10).to_a, @list.entries)
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
@list << 11
|
47
|
+
assert_equal 10, @list.length
|
48
|
+
assert_equal((2..11).to_a, @list.entries)
|
49
|
+
end
|
50
50
|
|
51
51
|
end
|
52
52
|
|
53
53
|
class TestSlowestTimes < Test::Unit::TestCase
|
54
54
|
|
55
|
-
|
56
|
-
|
57
|
-
|
55
|
+
def setup
|
56
|
+
@list = SlowestTimes.new 10
|
57
|
+
end
|
58
58
|
|
59
|
-
|
60
|
-
|
59
|
+
def test_that_it_works
|
60
|
+
expected = []
|
61
61
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
10.downto(1) do |i|
|
63
|
+
@list << [i, nil]
|
64
|
+
expected << [i, nil]
|
65
|
+
end
|
66
66
|
|
67
|
-
|
67
|
+
assert_equal expected, @list.entries
|
68
68
|
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
@list << [11, nil]
|
70
|
+
expected.pop
|
71
|
+
expected.push [11, nil]
|
72
72
|
|
73
|
-
|
74
|
-
|
73
|
+
assert_equal 10, @list.length
|
74
|
+
assert_equal expected, @list.entries
|
75
75
|
|
76
|
-
|
76
|
+
@list << [0, nil]
|
77
77
|
|
78
|
-
|
79
|
-
|
78
|
+
assert_equal expected, @list.entries
|
79
|
+
end
|
80
80
|
|
81
81
|
end
|
82
82
|
|
83
83
|
class TestAnalyzer < Test::Unit::TestCase
|
84
84
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
85
|
+
def setup
|
86
|
+
@analyzer = Analyzer.new 'test/test.syslog.log'
|
87
|
+
@analyzer.process
|
88
|
+
end
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
def test_self_email
|
91
|
+
email = Analyzer.email('test/test.syslog.log', 'devnull@robotcoop.com',
|
92
|
+
nil, 1)
|
93
|
+
expected = <<-EOF
|
94
94
|
Subject: pl_analyze
|
95
95
|
To: devnull@robotcoop.com
|
96
96
|
Content-Type: text/html
|
@@ -105,7 +105,7 @@ PeopleController#progress: 2 0.489 0.489 0.000 0.977
|
|
105
105
|
PeopleController#view: 2 0.731 0.371 0.360 1.102
|
106
106
|
|
107
107
|
Slowest Request Times:
|
108
|
-
|
108
|
+
\tTeamsController#progress took 1.470s
|
109
109
|
|
110
110
|
------------------------------------------------------------------------
|
111
111
|
|
@@ -119,7 +119,7 @@ PeopleController#progress: 2 0.415 0.415 0.000 0.830
|
|
119
119
|
PeopleController#view: 2 0.338 0.149 0.189 0.486
|
120
120
|
|
121
121
|
Slowest Total DB Times:
|
122
|
-
|
122
|
+
\tTeamsController#progress took 1.144s
|
123
123
|
|
124
124
|
------------------------------------------------------------------------
|
125
125
|
|
@@ -133,52 +133,52 @@ PeopleController#progress: 2 0.302 0.302 0.000 0.604
|
|
133
133
|
PeopleController#view: 2 0.487 0.209 0.278 0.695
|
134
134
|
|
135
135
|
Slowest Total Render Times:
|
136
|
-
|
136
|
+
\tPeopleController#view took 0.695s
|
137
137
|
</pre>
|
138
138
|
EOF
|
139
139
|
|
140
|
-
|
141
|
-
|
140
|
+
assert_equal expected, email
|
141
|
+
end
|
142
142
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
143
|
+
def test_self_envelope
|
144
|
+
expected = [
|
145
|
+
"Subject: pl_analyze",
|
146
|
+
"To: devnull@example.com",
|
147
|
+
"Content-Type: text/html"
|
148
|
+
]
|
149
149
|
|
150
|
-
|
151
|
-
|
150
|
+
assert_equal expected, Analyzer.envelope('devnull@example.com')
|
151
|
+
end
|
152
152
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
153
|
+
def test_self_envelope_subject
|
154
|
+
expected = [
|
155
|
+
"Subject: happy fancy boom",
|
156
|
+
"To: devnull@example.com",
|
157
|
+
"Content-Type: text/html"
|
158
|
+
]
|
159
159
|
|
160
|
-
|
161
|
-
|
162
|
-
|
160
|
+
assert_equal(expected,
|
161
|
+
Analyzer.envelope('devnull@example.com', 'happy fancy boom'))
|
162
|
+
end
|
163
163
|
|
164
|
-
|
165
|
-
|
166
|
-
|
164
|
+
def test_average_db_time
|
165
|
+
assert_in_delta 0.4023761, @analyzer.average_db_time, 0.0000001
|
166
|
+
end
|
167
167
|
|
168
|
-
|
169
|
-
|
170
|
-
|
168
|
+
def test_average_render_time
|
169
|
+
assert_in_delta 0.3015584, @analyzer.average_render_time, 0.0000001
|
170
|
+
end
|
171
171
|
|
172
|
-
|
173
|
-
|
174
|
-
|
172
|
+
def test_average_request_time
|
173
|
+
assert_in_delta 0.6338176, @analyzer.average_request_time, 0.0000001
|
174
|
+
end
|
175
175
|
|
176
|
-
|
177
|
-
|
178
|
-
|
176
|
+
def test_db_time_std_dev
|
177
|
+
assert_in_delta 0.3941380, @analyzer.db_time_std_dev, 0.0000001
|
178
|
+
end
|
179
179
|
|
180
|
-
|
181
|
-
|
180
|
+
def test_db_times_summary
|
181
|
+
expected = <<EOF.strip
|
182
182
|
DB Times Summary: Count Avg Std Dev Min Max
|
183
183
|
ALL REQUESTS: 11 0.366 0.393 0.000 1.144
|
184
184
|
|
@@ -189,80 +189,95 @@ PeopleController#progress: 2 0.415 0.415 0.000 0.830
|
|
189
189
|
PeopleController#view: 2 0.338 0.149 0.189 0.486
|
190
190
|
EOF
|
191
191
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
def test_logfile_name
|
196
|
-
assert_equal 'test/test.syslog.log', @analyzer.logfile_name
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_longest_request_name
|
200
|
-
assert_equal false, @analyzer.instance_variables.include?('@longest_req')
|
192
|
+
assert_equal expected, @analyzer.db_times_summary
|
193
|
+
end
|
201
194
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
nil => [0],
|
208
|
-
}
|
209
|
-
|
210
|
-
@analyzer.instance_variable_set('@request_times', request_times)
|
211
|
-
|
212
|
-
assert_equal 26, @analyzer.longest_request_name
|
213
|
-
end
|
214
|
-
|
215
|
-
def test_pad_request_name
|
216
|
-
assert_equal 26, @analyzer.longest_request_name
|
217
|
-
assert_equal("PeopleController#view: ",
|
218
|
-
@analyzer.pad_request_name("PeopleController#view"))
|
219
|
-
end
|
220
|
-
|
221
|
-
def test_pad_request_name_nil
|
222
|
-
assert_equal 26, @analyzer.longest_request_name
|
223
|
-
assert_equal("Unknown: ",
|
224
|
-
@analyzer.pad_request_name(nil))
|
195
|
+
def test_empty_syslog
|
196
|
+
analyzer = Analyzer.new 'test/test.syslog.empty.log'
|
197
|
+
assert_nothing_raised do
|
198
|
+
analyzer.process
|
199
|
+
analyzer.report(1)
|
225
200
|
end
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
201
|
+
assert_equal "No requests to analyze", analyzer.report(1)
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_logfile_name
|
205
|
+
assert_equal 'test/test.syslog.log', @analyzer.logfile_name
|
206
|
+
end
|
207
|
+
|
208
|
+
def test_longest_request_name
|
209
|
+
assert_equal false, @analyzer.instance_variables.include?('@longest_req')
|
210
|
+
|
211
|
+
request_times = {
|
212
|
+
"ThingsController#view" => [0],
|
213
|
+
"TeamsController#progress" => [1],
|
214
|
+
"RssController#uber" => [0],
|
215
|
+
"PeopleController#progress" => [0],
|
216
|
+
nil => [0],
|
217
|
+
}
|
218
|
+
|
219
|
+
@analyzer.instance_variable_set('@request_times', request_times)
|
220
|
+
|
221
|
+
assert_equal 26, @analyzer.longest_request_name
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_pad_request_name
|
225
|
+
assert_equal 26, @analyzer.longest_request_name
|
226
|
+
assert_equal("PeopleController#view: ",
|
227
|
+
@analyzer.pad_request_name("PeopleController#view"))
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_pad_request_name_nil
|
231
|
+
assert_equal 26, @analyzer.longest_request_name
|
232
|
+
assert_equal("Unknown: ",
|
233
|
+
@analyzer.pad_request_name(nil))
|
234
|
+
end
|
235
|
+
|
236
|
+
def test_pad_request_name_short
|
237
|
+
analyzer = Analyzer.new 'test/test.syslog.1.2.shortname.log'
|
238
|
+
analyzer.process
|
239
|
+
longer_request_name_value = " " * (analyzer.longest_request_name + 1)
|
240
|
+
assert_nothing_raised do
|
241
|
+
analyzer.pad_request_name(longer_request_name_value)
|
258
242
|
end
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
243
|
+
assert_equal longer_request_name_value + ":", analyzer.pad_request_name(longer_request_name_value)
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_process
|
247
|
+
expected_request_times = {
|
248
|
+
"PeopleController#view" => [1.102098, 0.36021],
|
249
|
+
"ThingsController#view" => [0.396183, 0.49176, 1.259728],
|
250
|
+
"TeamsController#progress" => [1.469788, 0.211973],
|
251
|
+
"RssController#uber" => [0.034519, 0.034519],
|
252
|
+
"PeopleController#progress" => [0.977398, 0]
|
253
|
+
}
|
254
|
+
assert_equal expected_request_times, @analyzer.request_times
|
255
|
+
|
256
|
+
expected_db_times = {
|
257
|
+
"PeopleController#view" => [0.486258, 0.189119],
|
258
|
+
"ThingsController#view" => [0.122158, 0.172767, 0.914192],
|
259
|
+
"TeamsController#progress" => [1.143577, 0.149357],
|
260
|
+
"RssController#uber" => [0.007962, 0.007962],
|
261
|
+
"PeopleController#progress" => [0.830409, 0]
|
262
|
+
}
|
263
|
+
assert_equal expected_db_times, @analyzer.db_times
|
264
|
+
|
265
|
+
expected_render_times = {
|
266
|
+
"PeopleController#view" => [0.695476, 0.277921],
|
267
|
+
"ThingsController#view" => [0.107987, 0.197126, 0.505973],
|
268
|
+
"TeamsController#progress" => [0, 0],
|
269
|
+
"RssController#uber" => [0.01177, 0.01177],
|
270
|
+
"PeopleController#progress" => [0.604444, 0]
|
271
|
+
}
|
272
|
+
assert_equal expected_render_times, @analyzer.render_times
|
273
|
+
end
|
274
|
+
|
275
|
+
def test_render_time_std_dev
|
276
|
+
assert_in_delta 0.2513925, @analyzer.render_time_std_dev, 0.0000001
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_render_times_summary
|
280
|
+
expected = <<EOF.strip
|
266
281
|
Render Times Summary: Count Avg Std Dev Min Max
|
267
282
|
ALL REQUESTS: 11 0.219 0.253 0.000 0.695
|
268
283
|
|
@@ -273,11 +288,11 @@ PeopleController#progress: 2 0.302 0.302 0.000 0.604
|
|
273
288
|
PeopleController#view: 2 0.487 0.209 0.278 0.695
|
274
289
|
EOF
|
275
290
|
|
276
|
-
|
277
|
-
|
291
|
+
assert_equal expected, @analyzer.render_times_summary
|
292
|
+
end
|
278
293
|
|
279
|
-
|
280
|
-
|
294
|
+
def test_report
|
295
|
+
expected = <<-EOF
|
281
296
|
Request Times Summary: Count Avg Std Dev Min Max
|
282
297
|
ALL REQUESTS: 11 0.576 0.508 0.000 1.470
|
283
298
|
|
@@ -288,16 +303,16 @@ PeopleController#progress: 2 0.489 0.489 0.000 0.977
|
|
288
303
|
PeopleController#view: 2 0.731 0.371 0.360 1.102
|
289
304
|
|
290
305
|
Slowest Request Times:
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
306
|
+
\tTeamsController#progress took 1.470s
|
307
|
+
\tThingsController#view took 1.260s
|
308
|
+
\tPeopleController#view took 1.102s
|
309
|
+
\tPeopleController#progress took 0.977s
|
310
|
+
\tThingsController#view took 0.492s
|
311
|
+
\tThingsController#view took 0.396s
|
312
|
+
\tPeopleController#view took 0.360s
|
313
|
+
\tTeamsController#progress took 0.212s
|
314
|
+
\tRssController#uber took 0.035s
|
315
|
+
\tRssController#uber took 0.035s
|
301
316
|
|
302
317
|
------------------------------------------------------------------------
|
303
318
|
|
@@ -311,16 +326,16 @@ PeopleController#progress: 2 0.415 0.415 0.000 0.830
|
|
311
326
|
PeopleController#view: 2 0.338 0.149 0.189 0.486
|
312
327
|
|
313
328
|
Slowest Total DB Times:
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
329
|
+
\tTeamsController#progress took 1.144s
|
330
|
+
\tThingsController#view took 0.914s
|
331
|
+
\tPeopleController#progress took 0.830s
|
332
|
+
\tPeopleController#view took 0.486s
|
333
|
+
\tPeopleController#view took 0.189s
|
334
|
+
\tThingsController#view took 0.173s
|
335
|
+
\tTeamsController#progress took 0.149s
|
336
|
+
\tThingsController#view took 0.122s
|
337
|
+
\tRssController#uber took 0.008s
|
338
|
+
\tRssController#uber took 0.008s
|
324
339
|
|
325
340
|
------------------------------------------------------------------------
|
326
341
|
|
@@ -334,27 +349,27 @@ PeopleController#progress: 2 0.302 0.302 0.000 0.604
|
|
334
349
|
PeopleController#view: 2 0.487 0.209 0.278 0.695
|
335
350
|
|
336
351
|
Slowest Total Render Times:
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
352
|
+
\tPeopleController#view took 0.695s
|
353
|
+
\tPeopleController#progress took 0.604s
|
354
|
+
\tThingsController#view took 0.506s
|
355
|
+
\tPeopleController#view took 0.278s
|
356
|
+
\tThingsController#view took 0.197s
|
357
|
+
\tThingsController#view took 0.108s
|
358
|
+
\tRssController#uber took 0.012s
|
359
|
+
\tRssController#uber took 0.012s
|
360
|
+
\tTeamsController#progress took 0.000s
|
361
|
+
\tTeamsController#progress took 0.000s
|
347
362
|
EOF
|
348
363
|
|
349
|
-
|
350
|
-
|
364
|
+
assert_equal expected, @analyzer.report(10)
|
365
|
+
end
|
351
366
|
|
352
|
-
|
353
|
-
|
354
|
-
|
367
|
+
def test_request_time_std_dev
|
368
|
+
assert_in_delta 0.4975667, @analyzer.request_time_std_dev, 0.0000001
|
369
|
+
end
|
355
370
|
|
356
|
-
|
357
|
-
|
371
|
+
def test_request_times_summary
|
372
|
+
expected = <<EOF.strip
|
358
373
|
Request Times Summary: Count Avg Std Dev Min Max
|
359
374
|
ALL REQUESTS: 11 0.576 0.508 0.000 1.470
|
360
375
|
|
@@ -365,41 +380,41 @@ PeopleController#progress: 2 0.489 0.489 0.000 0.977
|
|
365
380
|
PeopleController#view: 2 0.731 0.371 0.360 1.102
|
366
381
|
EOF
|
367
382
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
383
|
+
assert_equal expected, @analyzer.request_times_summary
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_slowest_db_times
|
387
|
+
times = @analyzer.slowest_db_times 3
|
388
|
+
assert_equal 3, times.length
|
389
|
+
expected = [
|
390
|
+
[1.143577, "TeamsController#progress"],
|
391
|
+
[0.914192, "ThingsController#view"],
|
392
|
+
[0.830409, "PeopleController#progress"]
|
393
|
+
]
|
394
|
+
assert_equal expected, times
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_slowest_request_times
|
398
|
+
times = @analyzer.slowest_request_times 3
|
399
|
+
assert_equal 3, times.length
|
400
|
+
expected = [
|
401
|
+
[1.469788, "TeamsController#progress"],
|
402
|
+
[1.259728, "ThingsController#view"],
|
403
|
+
[1.102098, "PeopleController#view"]
|
404
|
+
]
|
405
|
+
assert_equal expected, times
|
406
|
+
end
|
407
|
+
|
408
|
+
def test_slowest_render_times
|
409
|
+
times = @analyzer.slowest_render_times 3
|
410
|
+
assert_equal 3, times.length
|
411
|
+
expected = [
|
412
|
+
[0.695476, "PeopleController#view"],
|
413
|
+
[0.604444, "PeopleController#progress"],
|
414
|
+
[0.505973, "ThingsController#view"]
|
415
|
+
]
|
416
|
+
assert_equal expected, times
|
417
|
+
end
|
403
418
|
|
404
419
|
end
|
405
420
|
|