module ActionController #:nodoc: module Benchmarking #:nodoc: module ClassMethods def benchmark(title, log_level = Logger::DEBUG, use_silence = true) if logger && logger.level == log_level result = nil seconds = Benchmark.realtime { result = use_silence ? silence { yield } : yield } logger.add(log_level, "#{title} (#{'%.5f' % seconds})") result else yield end end end protected private def perform_action_with_benchmark if logger seconds = [ Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001 ].max logging_view = defined?(@view_runtime) logging_active_record = Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? log_message = "Completed in #{sprintf("%.5f", seconds)}" if logging_view || logging_active_record log_message << view_runtime if logging_view if logging_active_record log_message << active_record_runtime else "" end end log_message << " | #{headers["Status"]}" log_message << " [#{complete_request_uri rescue "unknown"}]" logger.info(log_message) response.headers["X-Runtime"] = "#{sprintf("%.0f", seconds * 1000)}ms" else perform_action_without_benchmark end end def view_runtime " | Rendering: %.5f" % @view_runtime end def active_record_runtime db_runtime = ActiveRecord::Base.connection.reset_runtime db_runtime += @db_rt_before_render if @db_rt_before_render db_runtime += @db_rt_after_render if @db_rt_after_render " | DB: %.5f" % db_runtime end end end