我们有来自一套应用程序的 MySQL 慢查询日志,主要是在 Ruby 中,一些使用 Rails ActiveRecord,另一些使用 Sequel。
我们希望能够轻松地将特定(MySQL)慢查询返回到生成它的代码。是否有可以在这些工具中启用的功能,或者可以应用到它们的补丁,它添加嵌入到 SQL 注释中的工具,比如__FILE__
和__FUNCTION__
标识符?
我们有来自一套应用程序的 MySQL 慢查询日志,主要是在 Ruby 中,一些使用 Rails ActiveRecord,另一些使用 Sequel。
我们希望能够轻松地将特定(MySQL)慢查询返回到生成它的代码。是否有可以在这些工具中启用的功能,或者可以应用到它们的补丁,它添加嵌入到 SQL 注释中的工具,比如__FILE__
和__FUNCTION__
标识符?
有趣的问题,这是我将如何处理它...
我会用它config.active_record.auto_explain_threshold_in_seconds
来自动解释慢查询,就像你正在做的那样。
然后,我将覆盖该logging_query_plan
方法ActiveRecord::Explain
以将任何相关数据添加到您的日志中。这是一个添加当前堆栈跟踪的示例:
# /config/initializers/add_additional_instumentation_to_explain.rb
module ActiveRecord
module Explain
def logging_query_plan # :nodoc:
return yield unless logger
threshold = auto_explain_threshold_in_seconds
current = Thread.current
if threshold && current[:available_queries_for_explain].nil?
begin
queries = current[:available_queries_for_explain] = []
start = Time.now
result = yield
if Time.now - start > threshold
# START ADDING ADDITIONAL INFORMATION
begin
puts 'ADDING ADDITIONAL INFORMATION...'
raise 'foo'
rescue
puts 'DISPLAYING THE CURRENT STACKTRACE FOR THE FOLLOWING EXPLAIN'
puts $@
end
logger.warn(exec_explain(queries))
end
result
ensure
current[:available_queries_for_explain] = nil
end
else
yield
end
end
end
end
我更喜欢一种不依赖于 rails 的整个修改方法的方法,但这是我可以让它可靠地工作的唯一方法。
对于它的价值,这将很容易分拆成一个 gem,每个 rails 版本都有一个新的,并且只需为每个应用程序包含您的版本的相关 gem,因为听起来您可能支持多个版本铁轨。这将有助于最小化所述方法的一些脆弱性。无论如何,希望这会有所帮助 - 祝你好运!
我强烈推荐 rack-mini-profiler 来帮助快速了解你的 Rails(或其他基于机架的)应用程序是如何花费时间的。它特别擅长显示哪些 Ruby 代码生成了哪些 SQL 语句。访问下面的所有三个链接以学习如何使用它。祝你好运。
http://railscasts.com/episodes/368-miniprofiler
http://samsaffron.com/archive/2012/07/12/miniprofiler-ruby-edition