111 lines
2.7 KiB
Ruby
111 lines
2.7 KiB
Ruby
#This file ripped out of Oink at:
|
|
# github.com/noahd1/oink
|
|
# Thanks!
|
|
require 'benchmark'
|
|
module Oink
|
|
|
|
def self.extended_active_record?
|
|
@oink_extended_active_record
|
|
end
|
|
|
|
def self.extended_active_record!
|
|
@oink_extended_active_record = true
|
|
end
|
|
|
|
module InstanceTypeCounter
|
|
def self.included(klass)
|
|
ActiveRecord::Base.send(:include, OinkInstanceTypeCounterInstanceMethods)
|
|
end
|
|
|
|
def before_report_active_record_count(instantiation_data)
|
|
end
|
|
|
|
def report_hash!
|
|
hash = self.report_hash
|
|
ActiveRecord::Base.reset_instance_type_count
|
|
hash
|
|
end
|
|
def report_hash
|
|
hash = ActiveRecord::Base.instantiated_hash.merge(
|
|
:total_ar_instances => ActiveRecord::Base.total_objects_instantiated,
|
|
:ms_in_instantiate => ActiveRecord::Base.instantiation_time)
|
|
before_report_active_record_count(hash)
|
|
hash
|
|
end
|
|
|
|
def report_instance_type_count
|
|
hash = self.hash
|
|
hash[:event] = 'instantiation_breakdown'
|
|
before_report_active_record_count(hash)
|
|
if logger
|
|
logger.info(hash)
|
|
end
|
|
ActiveRecord::Base.reset_instance_type_count
|
|
end
|
|
end
|
|
|
|
module OinkInstanceTypeCounterInstanceMethods
|
|
|
|
def self.included(klass)
|
|
klass.class_eval do
|
|
|
|
@@instantiated = {}
|
|
@@total = nil
|
|
@@time = 0.0
|
|
|
|
def self.reset_instance_type_count
|
|
@@time = 0.0
|
|
@@instantiated = {}
|
|
@@total = nil
|
|
end
|
|
|
|
def self.increment_instance_type_count(time)
|
|
@@instantiated[base_class.name] ||= 0
|
|
@@instantiated[base_class.name] += 1
|
|
@@time += time
|
|
end
|
|
|
|
def self.instantiated_hash
|
|
@@instantiated
|
|
end
|
|
|
|
def self.instantiation_time
|
|
@@time
|
|
end
|
|
|
|
def self.total_objects_instantiated
|
|
@@total ||= @@instantiated.values.sum
|
|
end
|
|
|
|
unless Oink.extended_active_record?
|
|
class << self
|
|
alias_method :instantiate_before_oink, :instantiate
|
|
|
|
def instantiate(*args, &block)
|
|
value = nil
|
|
time = Benchmark.realtime{
|
|
value = instantiate_before_oink(*args, &block)
|
|
}*1000
|
|
increment_instance_type_count(time)
|
|
value
|
|
end
|
|
end
|
|
|
|
alias_method :initialize_before_oink, :initialize
|
|
|
|
def initialize(*args, &block)
|
|
value = nil
|
|
time = Benchmark.realtime{
|
|
value = initialize_before_oink(*args, &block)
|
|
}*1000
|
|
self.class.increment_instance_type_count(time)
|
|
value
|
|
end
|
|
|
|
Oink.extended_active_record!
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|