oink 0.1.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 +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
|