Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Resurrect AC::Benchmarking [#3140 state:resolved]
- Loading branch information
Showing
4 changed files
with
108 additions
and
15 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
require 'benchmark' | ||
|
||
module ActionController #:nodoc: | ||
# The benchmarking module times the performance of actions and reports to the logger. If the Active Record | ||
# package has been included, a separate timing section for database calls will be added as well. | ||
module Benchmarking #:nodoc: | ||
extend ActiveSupport::Concern | ||
|
||
module ClassMethods | ||
# Log and benchmark the workings of a single block and silence whatever logging that may have happened inside it | ||
# (unless <tt>use_silence</tt> is set to false). | ||
# | ||
# The benchmark is only recorded if the current level of the logger matches the <tt>log_level</tt>, which makes it | ||
# easy to include benchmarking statements in production software that will remain inexpensive because the benchmark | ||
# will only be conducted if the log level is low enough. | ||
def benchmark(title, log_level = Logger::DEBUG, use_silence = true) | ||
if logger && logger.level == log_level | ||
result = nil | ||
ms = Benchmark.ms { result = use_silence ? silence { yield } : yield } | ||
logger.add(log_level, "#{title} (#{('%.1f' % ms)}ms)") | ||
result | ||
else | ||
yield | ||
end | ||
end | ||
end | ||
|
||
protected | ||
def render(*args, &block) | ||
if logger | ||
if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? | ||
db_runtime = ActiveRecord::Base.connection.reset_runtime | ||
end | ||
|
||
render_output = nil | ||
@view_runtime = Benchmark.ms { render_output = super } | ||
|
||
if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? | ||
@db_rt_before_render = db_runtime | ||
@db_rt_after_render = ActiveRecord::Base.connection.reset_runtime | ||
@view_runtime -= @db_rt_after_render | ||
end | ||
|
||
render_output | ||
else | ||
super | ||
end | ||
end | ||
|
||
private | ||
def process_action(*args) | ||
if logger | ||
ms = [Benchmark.ms { super }, 0.01].max | ||
logging_view = defined?(@view_runtime) | ||
logging_active_record = Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected? | ||
|
||
log_message = 'Completed in %.0fms' % ms | ||
|
||
if logging_view || logging_active_record | ||
log_message << " (" | ||
log_message << view_runtime if logging_view | ||
|
||
if logging_active_record | ||
log_message << ", " if logging_view | ||
log_message << active_record_runtime + ")" | ||
else | ||
")" | ||
end | ||
end | ||
|
||
log_message << " | #{response.status}" | ||
log_message << " [#{complete_request_uri rescue "unknown"}]" | ||
|
||
logger.info(log_message) | ||
response.headers["X-Runtime"] = "%.0f" % ms | ||
else | ||
super | ||
end | ||
end | ||
|
||
def view_runtime | ||
"View: %.0f" % @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: %.0f" % db_runtime | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters