oink 0.9.3 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +30 -0
- data/README.rdoc +11 -1
- data/Rakefile +2 -2
- data/lib/oink/instrumentation/active_record.rb +17 -9
- data/lib/oink/instrumentation/memory_snapshot.rb +3 -2
- data/lib/oink/middleware.rb +1 -1
- data/lib/oink/reports/base.rb +20 -0
- data/lib/oink/reports/memory_usage_report.rb +3 -1
- metadata +147 -158
- data/spec/fakes/fake_application_controller.rb +0 -30
- data/spec/fakes/psuedo_output.rb +0 -7
- data/spec/helpers/database.rb +0 -20
- data/spec/oink/instrumentation/instance_type_counter_spec.rb +0 -47
- data/spec/oink/instrumentation/memory_snapshot_spec.rb +0 -84
- data/spec/oink/middleware_configuration_spec.rb +0 -65
- data/spec/oink/middleware_spec.rb +0 -82
- data/spec/oink/rails/instance_type_counter_spec.rb +0 -52
- data/spec/oink/rails/memory_usage_logger_spec.rb +0 -23
- data/spec/oink/reports/active_record_instantiation_report_spec.rb +0 -193
- data/spec/oink/reports/memory_usage_report_spec.rb +0 -267
- data/spec/oink/reports/oinked_request_spec.rb +0 -22
- data/spec/oink/reports/priority_queue_spec.rb +0 -74
- data/spec/spec_helper.rb +0 -21
@@ -1,30 +0,0 @@
|
|
1
|
-
class FakeApplicationController
|
2
|
-
|
3
|
-
def initialize(logger = Logger.new(StringIO.new))
|
4
|
-
@logger = logger
|
5
|
-
end
|
6
|
-
|
7
|
-
class << self
|
8
|
-
attr_accessor :around_filters
|
9
|
-
|
10
|
-
def around_filter method
|
11
|
-
(@around_filters ||= []) << method
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def index
|
16
|
-
run_around_filters
|
17
|
-
end
|
18
|
-
|
19
|
-
def logger
|
20
|
-
@logger
|
21
|
-
end
|
22
|
-
|
23
|
-
protected
|
24
|
-
def run_around_filters
|
25
|
-
self.class.around_filters.each { |filter| self.send(filter) { perform_action } }
|
26
|
-
end
|
27
|
-
|
28
|
-
def perform_action
|
29
|
-
end
|
30
|
-
end
|
data/spec/fakes/psuedo_output.rb
DELETED
data/spec/helpers/database.rb
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
|
3
|
-
def setup_memory_database
|
4
|
-
ActiveRecord::Base.establish_connection(
|
5
|
-
:adapter => 'sqlite3',
|
6
|
-
:database => ':memory:'
|
7
|
-
)
|
8
|
-
|
9
|
-
ActiveRecord::Schema.define(:version => 1) do
|
10
|
-
create_table "pigs", :force => true do |t|
|
11
|
-
t.integer "pen_id"
|
12
|
-
t.string "name"
|
13
|
-
t.boolean "smells"
|
14
|
-
end
|
15
|
-
|
16
|
-
create_table "pens", :force => true do |t|
|
17
|
-
t.string "location"
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
-
|
3
|
-
describe Oink::Instrumentation::ActiveRecord do
|
4
|
-
before do
|
5
|
-
ActiveRecord::Base.reset_instance_type_count
|
6
|
-
Pig.delete_all
|
7
|
-
Pen.delete_all
|
8
|
-
end
|
9
|
-
|
10
|
-
describe "hash" do
|
11
|
-
it "should not count objects not instantiated" do
|
12
|
-
ActiveRecord::Base.instantiated_hash["Pig"].should == nil
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should include the objects instantiated" do
|
16
|
-
Pig.create(:name => "Babe")
|
17
|
-
Pig.first
|
18
|
-
ActiveRecord::Base.instantiated_hash["Pig"].should == 2
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should count instantiations for multiple classes" do
|
22
|
-
Pig.create(:name => "Babe")
|
23
|
-
Pen.create(:location => "Backyard")
|
24
|
-
Pig.first
|
25
|
-
ActiveRecord::Base.instantiated_hash["Pen"].should == 1
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should report the total number of objects instantiated" do
|
29
|
-
Pig.create(:name => "Babe")
|
30
|
-
Pen.create(:location => "Backyard")
|
31
|
-
Pig.first
|
32
|
-
ActiveRecord::Base.total_objects_instantiated.should == 3
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
describe "reset" do
|
37
|
-
it "should reset the total count" do
|
38
|
-
Pig.create(:name => "Babe")
|
39
|
-
ActiveRecord::Base.instantiated_hash["Pig"].should == 1
|
40
|
-
ActiveRecord::Base.reset_instance_type_count
|
41
|
-
ActiveRecord::Base.total_objects_instantiated.should == 0
|
42
|
-
Pig.create(:name => "Babe")
|
43
|
-
ActiveRecord::Base.total_objects_instantiated.should == 0
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
-
|
3
|
-
module Oink
|
4
|
-
module Instrumentation
|
5
|
-
|
6
|
-
describe StatmMemorySnapshot do
|
7
|
-
|
8
|
-
before do
|
9
|
-
StatmMemorySnapshot.unset_statm_page_size
|
10
|
-
end
|
11
|
-
|
12
|
-
it "returns memory when pagesize is 4096" do
|
13
|
-
pages = 6271
|
14
|
-
statm_file = "#{pages} 1157 411 1 0 763 0\n"
|
15
|
-
File.should_receive(:read).with("/proc/self/statm").and_return(statm_file)
|
16
|
-
|
17
|
-
system_call = mock(SystemCall, :stdout => "4096\n", :success? => true)
|
18
|
-
SystemCall.should_receive(:execute).with('getconf PAGESIZE').and_return(system_call)
|
19
|
-
StatmMemorySnapshot.new.memory.should == (pages * 4)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "falls back to a 4096 if getconf PAGESIZE is not available" do
|
23
|
-
pages = 6271
|
24
|
-
statm_file = "#{pages} 1157 411 1 0 763 0\n"
|
25
|
-
File.should_receive(:read).with("/proc/self/statm").and_return(statm_file)
|
26
|
-
system_call = mock(SystemCall, :stdout => "", :success? => false)
|
27
|
-
SystemCall.should_receive(:execute).with('getconf PAGESIZE').and_return(system_call)
|
28
|
-
StatmMemorySnapshot.new.memory.should == (pages * 4)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
describe SmapsMemorySnapshot do
|
33
|
-
|
34
|
-
it "returns a sum of the sizes in the /proc/$$/smaps file" do
|
35
|
-
proc_file = <<-STR
|
36
|
-
Header
|
37
|
-
|
38
|
-
Size: 25
|
39
|
-
Size: 13 trailing
|
40
|
-
|
41
|
-
leading Size: 4
|
42
|
-
|
43
|
-
Footer
|
44
|
-
|
45
|
-
STR
|
46
|
-
File.should_receive(:new).with("/proc/#{$$}/smaps").and_return(proc_file)
|
47
|
-
SmapsMemorySnapshot.new.memory.should == 42
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
describe ProcessStatusMemorySnapshot do
|
53
|
-
it "returns the result of a PS command" do
|
54
|
-
system_call = mock(SystemCall, :stdout => "915")
|
55
|
-
SystemCall.should_receive(:execute).with("ps -o vsz= -p #{$$}").and_return(system_call)
|
56
|
-
ProcessStatusMemorySnapshot.new.memory.should == 915
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "#available?" do
|
60
|
-
it "returns true if ps succeeds" do
|
61
|
-
system_call = mock(SystemCall, :success? => true)
|
62
|
-
SystemCall.should_receive(:execute).with("ps -o vsz= -p #{$$}").and_return(system_call)
|
63
|
-
ProcessStatusMemorySnapshot.available?.should be_true
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe MemorySnapshot do
|
69
|
-
describe "#memory_snapshot_class" do
|
70
|
-
it "raises an Oink::MemoryDataUnavailableError if not strategies can be found" do
|
71
|
-
[WindowsMemorySnapshot, StatmMemorySnapshot, SmapsMemorySnapshot, ProcessStatusMemorySnapshot].each { |klass| klass.stub(:available? => false) }
|
72
|
-
|
73
|
-
lambda { MemorySnapshot.memory_snapshot_class }.should raise_error(MemoryDataUnavailableError)
|
74
|
-
end
|
75
|
-
|
76
|
-
it "returns the first available memory snapshot strategy" do
|
77
|
-
[WindowsMemorySnapshot, SmapsMemorySnapshot, ProcessStatusMemorySnapshot].each { |klass| klass.stub(:available? => false) }
|
78
|
-
StatmMemorySnapshot.stub(:available? => true)
|
79
|
-
MemorySnapshot.memory_snapshot_class.should == StatmMemorySnapshot
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
-
require "oink/middleware"
|
3
|
-
require 'rack/test'
|
4
|
-
|
5
|
-
describe "Oink::Middleware configuration" do
|
6
|
-
include Rack::Test::Methods
|
7
|
-
|
8
|
-
class SampleApplication
|
9
|
-
def call(env)
|
10
|
-
[200, {}, ""]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:app) { Oink::Middleware.new(SampleApplication.new, oink_configuration) }
|
15
|
-
let(:oink_configuration) { @oink_configuration || {} }
|
16
|
-
|
17
|
-
context "instruments options" do
|
18
|
-
before do
|
19
|
-
@log_output = StringIO.new
|
20
|
-
Hodel3000CompliantLogger.stub(:new => Hodel3000CompliantLogger.new(@log_output))
|
21
|
-
Oink::Instrumentation::MemorySnapshot.stub(:memory => 4092)
|
22
|
-
end
|
23
|
-
|
24
|
-
context "with the memory instrument specified" do
|
25
|
-
before do
|
26
|
-
@oink_configuration = { :instruments => :memory }
|
27
|
-
end
|
28
|
-
|
29
|
-
it "does log memory usage" do
|
30
|
-
get "/"
|
31
|
-
@log_output.string.should include("Memory usage: 4092 | PID: #{$$}")
|
32
|
-
end
|
33
|
-
|
34
|
-
it "does not log activerecord objects instantiated" do
|
35
|
-
get "/"
|
36
|
-
@log_output.string.should_not include("Instantiation Breakdown:")
|
37
|
-
end
|
38
|
-
|
39
|
-
it "does not monkeypatch activerecord" do
|
40
|
-
ActiveRecord::Base.should_not_receive(:include)
|
41
|
-
get "/"
|
42
|
-
end
|
43
|
-
|
44
|
-
it "does not call reset_instance_type_count" do
|
45
|
-
ActiveRecord::Base.should_not_receive(:reset_instance_type_count)
|
46
|
-
get "/"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
context "with the activerecord instrument specified" do
|
51
|
-
before do
|
52
|
-
@oink_configuration = { :instruments => :activerecord }
|
53
|
-
get "/"
|
54
|
-
end
|
55
|
-
|
56
|
-
it "does not log memory usage" do
|
57
|
-
@log_output.string.should_not include("Memory usage:")
|
58
|
-
end
|
59
|
-
|
60
|
-
it "does log activerecord objects instantiated" do
|
61
|
-
@log_output.string.should include("Instantiation Breakdown:")
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../spec_helper")
|
2
|
-
require "oink/middleware"
|
3
|
-
require 'rack/test'
|
4
|
-
|
5
|
-
describe Oink::Middleware do
|
6
|
-
include Rack::Test::Methods
|
7
|
-
|
8
|
-
class SampleApplication
|
9
|
-
def call(env)
|
10
|
-
case env['PATH_INFO']
|
11
|
-
when "/no_pigs"
|
12
|
-
when "/two_pigs"
|
13
|
-
Pig.create(:name => "Babe")
|
14
|
-
Pig.first
|
15
|
-
when "/two_pigs_in_a_pen"
|
16
|
-
Pig.create(:name => "Babe")
|
17
|
-
Pen.create(:location => "Backyard")
|
18
|
-
Pig.first
|
19
|
-
end
|
20
|
-
[200, {}, ""]
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
let(:log_output) { StringIO.new }
|
25
|
-
let(:logger) { Hodel3000CompliantLogger.new(log_output) }
|
26
|
-
let(:app) { Oink::Middleware.new(SampleApplication.new, :logger => logger) }
|
27
|
-
|
28
|
-
before do
|
29
|
-
Oink::Instrumentation::MemorySnapshot.stub(:memory => 4092)
|
30
|
-
Pig.delete_all
|
31
|
-
Pen.delete_all
|
32
|
-
end
|
33
|
-
|
34
|
-
context "support legacy rails log format in transition to oink's own log format" do
|
35
|
-
it "writes rails[pid] to the log even if the app isn't a rails app (for now)" do
|
36
|
-
get "/no_pigs"
|
37
|
-
log_output.string.should include("rails[#{$$}]")
|
38
|
-
end
|
39
|
-
|
40
|
-
it "writes 'Oink Log Entry Complete' after the request has completed" do
|
41
|
-
get "/no_pigs"
|
42
|
-
log_output.string.should include("Oink Log Entry Complete")
|
43
|
-
end
|
44
|
-
|
45
|
-
it "logs the action and controller in rails 3.x" do
|
46
|
-
get "/no_pigs", {}, {'action_dispatch.request.parameters' => {'controller' => 'oinkoink', 'action' => 'piggie'}}
|
47
|
-
log_output.string.should include("Oink Action: oinkoink#piggie")
|
48
|
-
end
|
49
|
-
|
50
|
-
it "logs the action and controller in rails 2.3.x" do
|
51
|
-
get "/no_pigs", {}, {'action_controller.request.path_parameters' => {'controller' => 'oinkoink', 'action' => 'piggie'}}
|
52
|
-
log_output.string.should include("Oink Action: oinkoink#piggie")
|
53
|
-
end
|
54
|
-
|
55
|
-
it "logs the action and controller within a module" do
|
56
|
-
get "/no_pigs", {}, {'action_dispatch.request.parameters' => {'controller' => 'oinkoink/admin', 'action' => 'piggie'}}
|
57
|
-
log_output.string.should include("Oink Action: oinkoink/admin#piggie")
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
it "reports 0 totals" do
|
62
|
-
get "/no_pigs"
|
63
|
-
log_output.string.should include("Instantiation Breakdown: Total: 0")
|
64
|
-
end
|
65
|
-
|
66
|
-
it "reports totals first even if it's a tie" do
|
67
|
-
get "/two_pigs"
|
68
|
-
log_output.string.should include("Instantiation Breakdown: Total: 2 | Pig: 2")
|
69
|
-
end
|
70
|
-
|
71
|
-
it "reports pigs and pens instantiated" do
|
72
|
-
get "/two_pigs_in_a_pen"
|
73
|
-
log_output.string.should include("Instantiation Breakdown: Total: 3 | Pig: 2 | Pen: 1")
|
74
|
-
end
|
75
|
-
|
76
|
-
it "logs memory usage" do
|
77
|
-
Oink::Instrumentation::MemorySnapshot.should_receive(:memory).and_return(4092)
|
78
|
-
get "/two_pigs_in_a_pen"
|
79
|
-
log_output.string.should include("Memory usage: 4092 | PID: #{$$}")
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
-
|
3
|
-
class ARCountApplicationController < FakeApplicationController
|
4
|
-
include Oink::InstanceTypeCounter
|
5
|
-
|
6
|
-
def no_pigs
|
7
|
-
run_around_filters
|
8
|
-
end
|
9
|
-
|
10
|
-
def two_pigs_in_a_pen
|
11
|
-
Pig.create!
|
12
|
-
Pig.create!
|
13
|
-
Pen.create!
|
14
|
-
run_around_filters
|
15
|
-
end
|
16
|
-
|
17
|
-
def two_pigs
|
18
|
-
Pig.create!
|
19
|
-
Pig.create!
|
20
|
-
run_around_filters
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
describe Oink::InstanceTypeCounter do
|
26
|
-
|
27
|
-
before do
|
28
|
-
Pig.delete_all
|
29
|
-
Pen.delete_all
|
30
|
-
end
|
31
|
-
|
32
|
-
let(:log_output) { StringIO.new }
|
33
|
-
let(:logger) { Logger.new(log_output) }
|
34
|
-
|
35
|
-
it "reports no AR objects instantiated" do
|
36
|
-
controller = ARCountApplicationController.new(logger)
|
37
|
-
controller.no_pigs
|
38
|
-
log_output.string.should include("Instantiation Breakdown: Total: 0")
|
39
|
-
end
|
40
|
-
|
41
|
-
it "reports AR objects instantiated by type" do
|
42
|
-
controller = ARCountApplicationController.new(logger)
|
43
|
-
controller.two_pigs_in_a_pen
|
44
|
-
log_output.string.should include("Instantiation Breakdown: Total: 3 | Pig: 2 | Pen: 1")
|
45
|
-
end
|
46
|
-
|
47
|
-
it "reports totals first even if its a tie" do
|
48
|
-
controller = ARCountApplicationController.new(logger)
|
49
|
-
controller.two_pigs
|
50
|
-
log_output.string.should include("Instantiation Breakdown: Total: 2 | Pig: 2")
|
51
|
-
end
|
52
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
-
|
3
|
-
class MemoryLoggerApplicationController < FakeApplicationController
|
4
|
-
include Oink::MemoryUsageLogger
|
5
|
-
end
|
6
|
-
|
7
|
-
describe Oink::MemoryUsageLogger do
|
8
|
-
it "should return memory usage info from the snapshot" do
|
9
|
-
Oink::Instrumentation::MemorySnapshot.should_receive("memory").and_return(42)
|
10
|
-
log_output = StringIO.new
|
11
|
-
controller = MemoryLoggerApplicationController.new(Logger.new(log_output))
|
12
|
-
controller.index
|
13
|
-
log_output.string.should include("Memory usage: 42 | PID: #{$$}")
|
14
|
-
end
|
15
|
-
|
16
|
-
it "should log an error message if cannot find a memory snapshot strategy" do
|
17
|
-
Oink::Instrumentation::MemorySnapshot.should_receive("memory").and_raise(Oink::Instrumentation::MemoryDataUnavailableError)
|
18
|
-
controller = MemoryLoggerApplicationController.new
|
19
|
-
lambda {
|
20
|
-
controller.index
|
21
|
-
}.should_not raise_error
|
22
|
-
end
|
23
|
-
end
|
@@ -1,193 +0,0 @@
|
|
1
|
-
require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
|
2
|
-
|
3
|
-
module Oink::Reports
|
4
|
-
describe ActiveRecordInstantiationReport do
|
5
|
-
|
6
|
-
describe "short summary with frequent offenders" do
|
7
|
-
|
8
|
-
it "should report actions which exceed the threshold once" do
|
9
|
-
str = <<-STR
|
10
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
11
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
12
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
13
|
-
STR
|
14
|
-
|
15
|
-
io = StringIO.new(str)
|
16
|
-
output = PsuedoOutput.new
|
17
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
18
|
-
output.should include("1, Users#show")
|
19
|
-
end
|
20
|
-
|
21
|
-
it "should not report actions which do not exceed the threshold" do
|
22
|
-
str = <<-STR
|
23
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
24
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 50 | User: 50
|
25
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
26
|
-
STR
|
27
|
-
|
28
|
-
io = StringIO.new(str)
|
29
|
-
output = PsuedoOutput.new
|
30
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
31
|
-
output.should_not include("1, Users#show")
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should report actions which exceed the threshold multiple times" do
|
35
|
-
str = <<-STR
|
36
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
37
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
38
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
39
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
40
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
41
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
42
|
-
STR
|
43
|
-
|
44
|
-
io = StringIO.new(str)
|
45
|
-
output = PsuedoOutput.new
|
46
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
47
|
-
output.should include("2, Users#show")
|
48
|
-
end
|
49
|
-
|
50
|
-
it "should order actions by most exceeded" do
|
51
|
-
str = <<-STR
|
52
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Media#show
|
53
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
54
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
55
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Media#show
|
56
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
57
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
58
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
59
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
60
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
61
|
-
STR
|
62
|
-
|
63
|
-
io = StringIO.new(str)
|
64
|
-
output = PsuedoOutput.new
|
65
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
66
|
-
output[-2].should == "2, Media#show"
|
67
|
-
output[-1].should == "1, Users#show"
|
68
|
-
end
|
69
|
-
|
70
|
-
it "should not be bothered by incomplete requests" do
|
71
|
-
str = <<-STR
|
72
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Media#show
|
73
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 24 | User: 24
|
74
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
75
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Media#show
|
76
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
77
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
78
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
79
|
-
STR
|
80
|
-
|
81
|
-
io = StringIO.new(str)
|
82
|
-
output = PsuedoOutput.new
|
83
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
84
|
-
output.should include("1, Users#show")
|
85
|
-
end
|
86
|
-
|
87
|
-
end
|
88
|
-
|
89
|
-
describe "summary with top 10 offenses" do
|
90
|
-
|
91
|
-
it "should only report requests over threshold" do
|
92
|
-
str = <<-STR
|
93
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
94
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
95
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
96
|
-
STR
|
97
|
-
|
98
|
-
io = StringIO.new(str)
|
99
|
-
output = PsuedoOutput.new
|
100
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
101
|
-
output.should include("1. Feb 01 01:58:31, 51, Users#show")
|
102
|
-
end
|
103
|
-
|
104
|
-
it "should not include requests which are not over threshold" do
|
105
|
-
str = <<-STR
|
106
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
107
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 50 | User: 50
|
108
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
109
|
-
STR
|
110
|
-
|
111
|
-
io = StringIO.new(str)
|
112
|
-
output = PsuedoOutput.new
|
113
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
114
|
-
output.should_not include("1. Feb 01 01:58:31, 50, Users#show")
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should order offenses from biggest to smallest" do
|
118
|
-
str = <<-STR
|
119
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Details#show
|
120
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 75 | User: 75
|
121
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
122
|
-
Feb 01 01:58:32 ey04-s00297 rails[4413]: Oink Action: Media#show
|
123
|
-
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
124
|
-
Feb 01 01:58:34 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
125
|
-
STR
|
126
|
-
|
127
|
-
io = StringIO.new(str)
|
128
|
-
output = PsuedoOutput.new
|
129
|
-
ActiveRecordInstantiationReport.new(io, 50).print(output)
|
130
|
-
output[4].should == "1. Feb 01 01:58:34, 100, Media#show"
|
131
|
-
output[5].should == "2. Feb 01 01:58:31, 75, Details#show"
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
describe "verbose format" do
|
137
|
-
it "should print the full lines of actions exceeding the threshold" do
|
138
|
-
str = <<-STR
|
139
|
-
Feb 01 01:58:32 ey04-s00297 rails[4413]: Oink Action: Media#show
|
140
|
-
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
141
|
-
Feb 01 01:58:34 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
142
|
-
STR
|
143
|
-
io = StringIO.new(str)
|
144
|
-
output = PsuedoOutput.new
|
145
|
-
ActiveRecordInstantiationReport.new(io, 50, :format => :verbose).print(output)
|
146
|
-
output[3..5].should == str.split("\n")[0..2].map { |o| o.strip }
|
147
|
-
end
|
148
|
-
|
149
|
-
it "should handle actions which do not complete properly" do
|
150
|
-
str = <<-STR
|
151
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Media#show
|
152
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 24 | User: 24
|
153
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
154
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Media#show
|
155
|
-
Feb 01 01:58:29 ey04-s00297 rails[4413]: Oink Action: Users#show
|
156
|
-
Feb 01 01:58:30 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 51 | User: 51
|
157
|
-
Feb 01 01:58:31 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
158
|
-
STR
|
159
|
-
|
160
|
-
io = StringIO.new(str)
|
161
|
-
output = PsuedoOutput.new
|
162
|
-
ActiveRecordInstantiationReport.new(io, 50, :format => :verbose).print(output)
|
163
|
-
output[3..5].should == str.split("\n")[4..6].map { |o| o.strip }
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
describe "multiple io streams" do
|
168
|
-
it "should accept multiple files" do
|
169
|
-
|
170
|
-
str1 = <<-STR
|
171
|
-
Feb 01 01:58:32 ey04-s00297 rails[4413]: Oink Action: Media#show
|
172
|
-
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
173
|
-
Feb 01 01:58:34 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
174
|
-
STR
|
175
|
-
|
176
|
-
str2 = <<-STR
|
177
|
-
Feb 01 01:58:32 ey04-s00297 rails[4413]: Oink Action: Media#show
|
178
|
-
Feb 01 01:58:33 ey04-s00297 rails[4413]: Instantiation Breakdown: Total: 100 | User: 100
|
179
|
-
Feb 01 01:58:34 ey04-s00297 rails[4413]: Oink Log Entry Complete
|
180
|
-
STR
|
181
|
-
|
182
|
-
io1 = StringIO.new(str1)
|
183
|
-
io2 = StringIO.new(str2)
|
184
|
-
output = PsuedoOutput.new
|
185
|
-
ActiveRecordInstantiationReport.new([io1, io2], 50).print(output)
|
186
|
-
output.should include("2, Media#show")
|
187
|
-
end
|
188
|
-
|
189
|
-
end
|
190
|
-
|
191
|
-
|
192
|
-
end
|
193
|
-
end
|