oink 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +136 -0
- data/Rakefile +29 -0
- data/bin/oink +5 -0
- data/lib/oink.rb +9 -0
- data/lib/oink/active_record_instantiation_reporter.rb +68 -0
- data/lib/oink/base.rb +40 -0
- data/lib/oink/cli.rb +97 -0
- data/lib/oink/memory_usage_reporter.rb +72 -0
- data/lib/oink/oinked_request/oinked_ar_request.rb +9 -0
- data/lib/oink/oinked_request/oinked_memory_request.rb +9 -0
- data/lib/oink/oinked_request/oinked_request.rb +16 -0
- data/lib/oink/priority_queue.rb +37 -0
- data/lib/oink/rails.rb +2 -0
- data/lib/oink/rails/instance_type_counter.rb +86 -0
- data/lib/oink/rails/memory_usage_logger.rb +40 -0
- data/spec/oink/active_record_instantiation_reporter_spec.rb +191 -0
- data/spec/oink/memory_usage_reporter_spec.rb +265 -0
- data/spec/oinked_request/oinked_request_spec.rb +20 -0
- data/spec/priority_queue/priority_queue_spec.rb +75 -0
- data/spec/rails/instance_type_counter_spec.rb +45 -0
- data/spec/rails/memory_usage_logger_spec.rb +74 -0
- data/spec/spec_helper.rb +37 -0
- metadata +84 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
class OinkedRequest
|
2
|
+
include Comparable
|
3
|
+
|
4
|
+
attr_accessor :action, :datetime, :log_lines, :oink_number
|
5
|
+
|
6
|
+
def initialize(action, datetime, log_lines, oink_number)
|
7
|
+
@action = action
|
8
|
+
@datetime = datetime
|
9
|
+
@log_lines = log_lines
|
10
|
+
@oink_number = oink_number
|
11
|
+
end
|
12
|
+
|
13
|
+
def <=>(other)
|
14
|
+
self.oink_number <=> other.oink_number
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class PriorityQueue
|
2
|
+
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(size)
|
6
|
+
@size = size
|
7
|
+
@queue = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def push(item)
|
11
|
+
if @queue.size < @size
|
12
|
+
@queue << item
|
13
|
+
elsif item > @queue.last
|
14
|
+
@queue[@size - 1] = item
|
15
|
+
end
|
16
|
+
prioritize
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_a
|
20
|
+
@queue
|
21
|
+
end
|
22
|
+
|
23
|
+
def size
|
24
|
+
@queue.size
|
25
|
+
end
|
26
|
+
|
27
|
+
def each
|
28
|
+
@queue.each { |i| yield i }
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def prioritize
|
34
|
+
@queue.sort! { |a, b| b <=> a }
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/lib/oink/rails.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
module Oink
|
2
|
+
|
3
|
+
def self.extended_active_record?
|
4
|
+
@oink_extended_active_record
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.extended_active_record!
|
8
|
+
@oink_extended_active_record = true
|
9
|
+
end
|
10
|
+
|
11
|
+
module InstanceTypeCounter
|
12
|
+
def self.included(klass)
|
13
|
+
ActiveRecord::Base.send(:include, OinkInstanceTypeCounterInstanceMethods)
|
14
|
+
|
15
|
+
klass.class_eval do
|
16
|
+
after_filter :report_instance_type_count
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def before_report_active_record_count(instantiation_data)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def report_instance_type_count
|
26
|
+
report_hash = ActiveRecord::Base.instantiated_hash.merge("Total" => ActiveRecord::Base.total_objects_instantiated)
|
27
|
+
breakdown = report_hash.sort{|a,b| b[1]<=>a[1]}.collect {|k,v| "#{k}: #{v}" }.join(" | ")
|
28
|
+
before_report_active_record_count(breakdown)
|
29
|
+
if logger
|
30
|
+
logger.info("Instantiation Breakdown: #{breakdown}")
|
31
|
+
end
|
32
|
+
ActiveRecord::Base.reset_instance_type_count
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module OinkInstanceTypeCounterInstanceMethods
|
37
|
+
|
38
|
+
def self.included(klass)
|
39
|
+
klass.class_eval do
|
40
|
+
|
41
|
+
@@instantiated = {}
|
42
|
+
@@total = nil
|
43
|
+
|
44
|
+
def self.reset_instance_type_count
|
45
|
+
@@instantiated = {}
|
46
|
+
@@total = nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.increment_instance_type_count
|
50
|
+
@@instantiated[base_class.name] ||= 0
|
51
|
+
@@instantiated[base_class.name] += 1
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.instantiated_hash
|
55
|
+
@@instantiated
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.total_objects_instantiated
|
59
|
+
@@total ||= @@instantiated.values.sum
|
60
|
+
end
|
61
|
+
|
62
|
+
unless Oink.extended_active_record?
|
63
|
+
class << self
|
64
|
+
alias_method :allocate_before_oink, :allocate
|
65
|
+
|
66
|
+
def allocate
|
67
|
+
value = allocate_before_oink
|
68
|
+
increment_instance_type_count
|
69
|
+
value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
alias_method :initialize_before_oink, :initialize
|
74
|
+
|
75
|
+
def initialize(*args, &block)
|
76
|
+
value = initialize_before_oink(*args, &block)
|
77
|
+
self.class.increment_instance_type_count
|
78
|
+
value
|
79
|
+
end
|
80
|
+
|
81
|
+
Oink.extended_active_record!
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
begin
|
2
|
+
require 'win32ole'
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
|
6
|
+
module Oink
|
7
|
+
module MemoryUsageLogger
|
8
|
+
def self.included(klass)
|
9
|
+
klass.class_eval do
|
10
|
+
after_filter :log_memory_usage
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def get_memory_usage
|
16
|
+
if defined? WIN32OLE
|
17
|
+
wmi = WIN32OLE.connect("winmgmts:root/cimv2")
|
18
|
+
mem = 0
|
19
|
+
query = "select * from Win32_Process where ProcessID = #{$$}"
|
20
|
+
wmi.ExecQuery(query).each do |wproc|
|
21
|
+
mem = wproc.WorkingSetSize
|
22
|
+
end
|
23
|
+
mem.to_i / 1000
|
24
|
+
elsif proc_file = File.new("/proc/#{$$}/smaps") rescue nil
|
25
|
+
proc_file.map do |line|
|
26
|
+
size = line[/Size: *(\d+)/, 1] and size.to_i
|
27
|
+
end.compact.sum
|
28
|
+
else
|
29
|
+
`ps -o vsz= -p #{$$}`.to_i
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def log_memory_usage
|
34
|
+
if logger
|
35
|
+
memory_usage = get_memory_usage
|
36
|
+
logger.info("Memory usage: #{memory_usage} | PID: #{$$}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
|
3
|
+
describe Oink::ActiveRecordInstantiationReporter do
|
4
|
+
|
5
|
+
describe "short summary with frequent offenders" do
|
6
|
+
|
7
|
+
it "should report actions which exceed the threshold once" do
|
8
|
+
str = <<-STR
|
9
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
10
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
11
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
12
|
+
STR
|
13
|
+
|
14
|
+
io = StringIO.new(str)
|
15
|
+
output = PsuedoOutput.new
|
16
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
17
|
+
output.should include("1, Users#show")
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not report actions which do not exceed the threshold" do
|
21
|
+
str = <<-STR
|
22
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
23
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 50 | User: 50
|
24
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
25
|
+
STR
|
26
|
+
|
27
|
+
io = StringIO.new(str)
|
28
|
+
output = PsuedoOutput.new
|
29
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
30
|
+
output.should_not include("1, Users#show")
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should report actions which exceed the threshold multiple times" do
|
34
|
+
str = <<-STR
|
35
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
36
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
37
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
38
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
39
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
40
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
41
|
+
STR
|
42
|
+
|
43
|
+
io = StringIO.new(str)
|
44
|
+
output = PsuedoOutput.new
|
45
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
46
|
+
output.should include("2, Users#show")
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should order actions by most exceeded" do
|
50
|
+
str = <<-STR
|
51
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Media#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
52
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
53
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
54
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Media#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
55
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
56
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
57
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
58
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
59
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
60
|
+
STR
|
61
|
+
|
62
|
+
io = StringIO.new(str)
|
63
|
+
output = PsuedoOutput.new
|
64
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
65
|
+
output[-2].should == "2, Media#show"
|
66
|
+
output[-1].should == "1, Users#show"
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should not be bothered by incomplete requests" do
|
70
|
+
str = <<-STR
|
71
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Media#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
72
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 24 | User: 24
|
73
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
74
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Media#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
75
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
76
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
77
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
78
|
+
STR
|
79
|
+
|
80
|
+
io = StringIO.new(str)
|
81
|
+
output = PsuedoOutput.new
|
82
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
83
|
+
output.should include("1, Users#show")
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
describe "summary with top 10 offenses" do
|
89
|
+
|
90
|
+
it "should only report requests over threshold" do
|
91
|
+
str = <<-STR
|
92
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
93
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
94
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
95
|
+
STR
|
96
|
+
|
97
|
+
io = StringIO.new(str)
|
98
|
+
output = PsuedoOutput.new
|
99
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
100
|
+
output.should include("1. Feb 01 01:58:31, 51, Users#show")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should not include requests which are not over threshold" do
|
104
|
+
str = <<-STR
|
105
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
106
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 50 | User: 50
|
107
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
108
|
+
STR
|
109
|
+
|
110
|
+
io = StringIO.new(str)
|
111
|
+
output = PsuedoOutput.new
|
112
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
113
|
+
output.should_not include("1. Feb 01 01:58:31, 50, Users#show")
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should order offenses from biggest to smallest" do
|
117
|
+
str = <<-STR
|
118
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing DetailsController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
119
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 75 | User: 75
|
120
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
121
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
122
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
123
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
124
|
+
STR
|
125
|
+
|
126
|
+
io = StringIO.new(str)
|
127
|
+
output = PsuedoOutput.new
|
128
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50).print(output)
|
129
|
+
output[4].should == "1. Feb 01 01:58:34, 100, MediaController#show"
|
130
|
+
output[5].should == "2. Feb 01 01:58:31, 75, DetailsController#show"
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
|
135
|
+
describe "verbose format" do
|
136
|
+
it "should print the full lines of actions exceeding the threshold" do
|
137
|
+
str = <<-STR
|
138
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
139
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
140
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
141
|
+
STR
|
142
|
+
io = StringIO.new(str)
|
143
|
+
output = PsuedoOutput.new
|
144
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50, :format => :verbose).print(output)
|
145
|
+
output[3..5].should == str.split("\n")[0..2].map { |o| o.strip }
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should handle actions which do not complete properly" do
|
149
|
+
str = <<-STR
|
150
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Media#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
151
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 24 | User: 24
|
152
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
153
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Media#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
154
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
155
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
156
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
157
|
+
STR
|
158
|
+
|
159
|
+
io = StringIO.new(str)
|
160
|
+
output = PsuedoOutput.new
|
161
|
+
Oink::ActiveRecordInstantiationReporter.new(io, 50, :format => :verbose).print(output)
|
162
|
+
output[3..5].should == str.split("\n")[4..6].map { |o| o.strip }
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "multiple io streams" do
|
167
|
+
it "should accept multiple files" do
|
168
|
+
|
169
|
+
str1 = <<-STR
|
170
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
171
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
172
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
173
|
+
STR
|
174
|
+
|
175
|
+
str2 = <<-STR
|
176
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
177
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
178
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
179
|
+
STR
|
180
|
+
|
181
|
+
io1 = StringIO.new(str1)
|
182
|
+
io2 = StringIO.new(str2)
|
183
|
+
output = PsuedoOutput.new
|
184
|
+
Oink::ActiveRecordInstantiationReporter.new([io1, io2], 50).print(output)
|
185
|
+
output.should include("2, MediaController#show")
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
end
|
@@ -0,0 +1,265 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
+
|
3
|
+
describe Oink::MemoryUsageReporter do
|
4
|
+
|
5
|
+
TEN_MEGS = 10 * 1024
|
6
|
+
|
7
|
+
describe "short summary with frequent offenders" do
|
8
|
+
|
9
|
+
it "should report actions which exceed the threshold once" do
|
10
|
+
str = <<-STR
|
11
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
12
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
13
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
14
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
15
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
16
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
17
|
+
STR
|
18
|
+
|
19
|
+
io = StringIO.new(str)
|
20
|
+
output = PsuedoOutput.new
|
21
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
22
|
+
output.should include("1, MediaController#show")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should not report actions which do not exceed the threshold" do
|
26
|
+
threshold = 10
|
27
|
+
|
28
|
+
str = <<-STR
|
29
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
30
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
31
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
32
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
33
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS} | PID: 4413
|
34
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
35
|
+
STR
|
36
|
+
|
37
|
+
io = StringIO.new(str)
|
38
|
+
output = PsuedoOutput.new
|
39
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
40
|
+
output.should_not include("1, MediaController#show")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should report actions which exceed the threshold multiple times" do
|
44
|
+
str = <<-STR
|
45
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
46
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
47
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
48
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
49
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
50
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
51
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
52
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{(TEN_MEGS * 2) + 2} | PID: 4413
|
53
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
54
|
+
STR
|
55
|
+
|
56
|
+
io = StringIO.new(str)
|
57
|
+
output = PsuedoOutput.new
|
58
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
59
|
+
output.should include("2, MediaController#show")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should order actions by most exceeded" do
|
63
|
+
str = <<-STR
|
64
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
65
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
66
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
67
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
68
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
69
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
70
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
71
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{(TEN_MEGS * 2) + 2} | PID: 4413
|
72
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
73
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
74
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{(TEN_MEGS * 3) + 3} | PID: 4413
|
75
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
76
|
+
STR
|
77
|
+
|
78
|
+
io = StringIO.new(str)
|
79
|
+
output = PsuedoOutput.new
|
80
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
81
|
+
output[-2].should == "2, MediaController#show"
|
82
|
+
output[-1].should == "1, Users#show"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should not report actions which do not complete properly" do
|
86
|
+
threshold = 10
|
87
|
+
|
88
|
+
str = <<-STR
|
89
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
90
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
91
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
92
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
93
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
94
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
95
|
+
STR
|
96
|
+
|
97
|
+
io = StringIO.new(str)
|
98
|
+
output = PsuedoOutput.new
|
99
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
100
|
+
output.should_not include("1, MediaController#show")
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should not report actions from different pids" do
|
104
|
+
str = <<-STR
|
105
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
106
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
107
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
108
|
+
Feb 01 01:58:29 ey04-s00297 rails[5513]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
109
|
+
Feb 01 01:58:30 ey04-s00297 rails[5513]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
110
|
+
Feb 01 01:58:30 ey04-s00297 rails[5513]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
111
|
+
STR
|
112
|
+
|
113
|
+
io = StringIO.new(str)
|
114
|
+
output = PsuedoOutput.new
|
115
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
116
|
+
output.should_not include("1, MediaController#show")
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "summary with top 10 offenses" do
|
120
|
+
|
121
|
+
it "should only report requests over threshold" do
|
122
|
+
str = <<-STR
|
123
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
124
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
125
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
126
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
127
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
128
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
129
|
+
STR
|
130
|
+
|
131
|
+
io = StringIO.new(str)
|
132
|
+
output = PsuedoOutput.new
|
133
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
134
|
+
output.should include("1. Feb 01 01:58:34, #{TEN_MEGS + 1} KB, MediaController#show")
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should not include requests which are not over the threshold" do
|
138
|
+
str = <<-STR
|
139
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
140
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
141
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
142
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
143
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS} | PID: 4413
|
144
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
145
|
+
STR
|
146
|
+
|
147
|
+
io = StringIO.new(str)
|
148
|
+
output = PsuedoOutput.new
|
149
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
150
|
+
output.should_not include("1. Feb 01 01:58:34, #{TEN_MEGS + 1} KB, MediaController#show")
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should order offenses from biggest to smallest" do
|
154
|
+
str = <<-STR
|
155
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
156
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
157
|
+
Feb 01 01:58:31 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
158
|
+
Feb 01 01:58:32 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
159
|
+
Feb 01 01:58:33 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
160
|
+
Feb 01 01:58:34 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
161
|
+
Feb 01 01:58:35 ey04-s00297 rails[4413]: Processing DetailsController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
162
|
+
Feb 01 01:58:36 ey04-s00297 rails[4413]: Memory usage: #{(TEN_MEGS * 2) + 2} | PID: 4413
|
163
|
+
Feb 01 01:58:37 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
164
|
+
STR
|
165
|
+
|
166
|
+
io = StringIO.new(str)
|
167
|
+
output = PsuedoOutput.new
|
168
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS).print(output)
|
169
|
+
output[4].should == "1. Feb 01 01:58:34, #{TEN_MEGS + 1} KB, MediaController#show"
|
170
|
+
output[5].should == "2. Feb 01 01:58:37, #{TEN_MEGS + 1} KB, DetailsController#show"
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
|
175
|
+
# it "should report the time span" do
|
176
|
+
# str = <<-STR
|
177
|
+
# Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
178
|
+
# Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
179
|
+
# Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
180
|
+
# Mar 13 01:58:29 ey04-s00297 rails[5513]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
181
|
+
# Mar 13 01:58:30 ey04-s00297 rails[5513]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
182
|
+
# Mar 13 03:58:30 ey04-s00297 rails[5513]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
183
|
+
# STR
|
184
|
+
#
|
185
|
+
# io = StringIO.new(str)
|
186
|
+
# output = PsuedoOutput.new
|
187
|
+
# Oink::MemoryUsageReporter.new(io, TEN_MEGS).each_line do |line|
|
188
|
+
# output << line
|
189
|
+
# end
|
190
|
+
# output.first.should == "Feb 01 01:58:29 - Mar 13 03:58:30"
|
191
|
+
# end
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
describe "verbose format" do
|
196
|
+
it "should print the full lines of actions exceeding the threshold" do
|
197
|
+
str = <<-STR
|
198
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
199
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Parameters: {"id"=>"2332", "controller"=>"users"}
|
200
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
201
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
202
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
203
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Parameters: {"id"=>"22900", "controller"=>"media"}
|
204
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
205
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
206
|
+
STR
|
207
|
+
io = StringIO.new(str)
|
208
|
+
output = PsuedoOutput.new
|
209
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS, :format => :verbose).print(output)
|
210
|
+
output[3..6].should == str.split("\n")[4..7].map { |o| o.strip }
|
211
|
+
end
|
212
|
+
|
213
|
+
it "should handle actions which do not complete properly" do
|
214
|
+
threshold = 10
|
215
|
+
|
216
|
+
str = <<-STR
|
217
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
218
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
219
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
220
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
221
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
222
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
223
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing ActorController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
224
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{(TEN_MEGS * 2) + 2} | PID: 4413
|
225
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
226
|
+
STR
|
227
|
+
|
228
|
+
io = StringIO.new(str)
|
229
|
+
output = PsuedoOutput.new
|
230
|
+
Oink::MemoryUsageReporter.new(io, TEN_MEGS, :format => :verbose).print(output)
|
231
|
+
output[3..5].should == str.split("\n")[6..8].map { |o| o.strip }
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "multiple io streams" do
|
236
|
+
it "should accept multiple files" do
|
237
|
+
|
238
|
+
str1 = <<-STR
|
239
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
240
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
241
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
242
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
243
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
244
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
245
|
+
STR
|
246
|
+
|
247
|
+
str2 = <<-STR
|
248
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing Users#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
249
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: 0 | PID: 4413
|
250
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
251
|
+
Feb 01 01:58:29 ey04-s00297 rails[4413]: Processing MediaController#show (for 92.84.151.171 at 2009-02-01 01:58:29) [GET]
|
252
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Memory usage: #{TEN_MEGS + 1} | PID: 4413
|
253
|
+
Feb 01 01:58:30 ey04-s00297 rails[4413]: Completed in 984ms (View: 840, DB: 4) | 200 OK
|
254
|
+
STR
|
255
|
+
|
256
|
+
io1 = StringIO.new(str1)
|
257
|
+
io2 = StringIO.new(str2)
|
258
|
+
output = PsuedoOutput.new
|
259
|
+
Oink::MemoryUsageReporter.new([io1, io2], TEN_MEGS).print(output)
|
260
|
+
output.should include("2, MediaController#show")
|
261
|
+
end
|
262
|
+
|
263
|
+
end
|
264
|
+
|
265
|
+
end
|