提交 4ecdf24b 编写于 作者: J José Valim

Kick AR logging back to life and move ControllerRuntime inside ActiveRecord::Rails.

上级 97204fc0
require 'active_record_unit'
require 'active_record/rails/controller_runtime'
require 'fixtures/project'
ActionController::Base.send :include, ActiveRecord::Rails::ControllerRuntime
class ARLoggingController < ActionController::Base
def show
render :inline => "<%= Project.all %>"
end
end
class ARLoggingTest < ActionController::TestCase
tests ARLoggingController
def setup
super
set_logger
end
def wait
ActiveSupport::Notifications.notifier.wait
end
def test_log_with_active_record
get :show
wait
assert_match /ActiveRecord runtime/, logs[3]
end
private
def set_logger
@controller.logger = MockLogger.new
end
def logs
@logs ||= @controller.logger.logged.compact.map {|l| l.to_s.strip}
end
end
require 'benchmark'
require 'yaml'
require 'set'
require 'active_support/benchmarkable'
......
require 'date'
require 'bigdecimal'
require 'bigdecimal/util'
require 'active_support/core_ext/benchmark'
# TODO: Autoload these files
require 'active_record/connection_adapters/abstract/schema_definitions'
......@@ -191,7 +192,6 @@ def current_savepoint_name
end
def log_info(sql, name, ms)
@runtime += ms
if @logger && @logger.debug?
name = '%s (%.1fms)' % [name || 'SQL', ms]
@logger.debug(format_log_entry(name, sql.squeeze(' ')))
......@@ -199,8 +199,12 @@ def log_info(sql, name, ms)
end
protected
def log(sql, name, &block)
ActiveSupport::Notifications.instrument(:sql, :sql => sql, :name => name, &block)
def log(sql, name)
result = nil
ActiveSupport::Notifications.instrument(:sql, :sql => sql, :name => name) do
@runtime += Benchmark.ms { result = yield }
end
result
rescue Exception => e
# Log message and raise exception.
# Set last_verification to 0, so that connection gets verified
......
module ActiveRecord
module ControllerRuntime
extend ActiveSupport::Concern
attr_internal :db_runtime
def cleanup_view_runtime
if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
db_rt_before_render = ActiveRecord::Base.connection.reset_runtime
runtime = super
db_rt_after_render = ActiveRecord::Base.connection.reset_runtime
self.db_runtime = db_rt_before_render + db_rt_after_render
runtime - db_rt_after_render
else
super
end
end
module ClassMethods
def process_log_action(controller)
super
db_runtime = controller.send :db_runtime
logger.info(" ActiveRecord runtime: %.1fms" % db_runtime.to_f) if db_runtime
end
end
end
end
\ No newline at end of file
......@@ -3,13 +3,14 @@
# here. This is needed for correctly setting up the middleware.
# In the future, this might become an optional require.
require "action_controller/rails"
require "active_record/rails/controller_runtime"
module ActiveRecord
class Plugin < Rails::Plugin
plugin_name :active_record
include_modules_in "ActiveRecord::Base"
config.action_controller.include "ActiveRecord::ControllerRuntime"
config.action_controller.include "ActiveRecord::Rails::ControllerRuntime"
rake_tasks do
load "active_record/rails/databases.rake"
......
module ActiveRecord
module Rails
module ControllerRuntime
extend ActiveSupport::Concern
attr_internal :db_runtime
def cleanup_view_runtime
if ActiveRecord::Base.connected?
db_rt_before_render = ActiveRecord::Base.connection.reset_runtime
runtime = super
db_rt_after_render = ActiveRecord::Base.connection.reset_runtime
self.db_runtime = db_rt_before_render + db_rt_after_render
runtime - db_rt_after_render
else
super
end
end
module ClassMethods
def log_process_action(controller)
super
db_runtime = controller.send :db_runtime
logger.info(" ActiveRecord runtime: %.1fms" % db_runtime.to_f) if db_runtime
end
end
end
end
end
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册