3

我们有来自一套应用程序的 MySQL 慢查询日志,主要是在 Ruby 中,一些使用 Rails ActiveRecord,另一些使用 Sequel。

我们希望能够轻松地将特定(MySQL)慢查询返回到生成它的代码。是否有可以在这些工具中启用的功能,或者可以应用到它们的补丁,它添加嵌入到 SQL 注释中的工具,比如__FILE____FUNCTION__标识符?

4

2 回答 2

2

有趣的问题,这是我将如何处理它...

我会用它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,因为听起来您可能支持多个版本铁轨。这将有助于最小化所述方法的一些脆弱性。无论如何,希望这会有所帮助 - 祝你好运!

于 2012-10-17T01:13:23.683 回答
0

我强烈推荐 rack-mini-profiler 来帮助快速了解你的 Rails(或其他基于机架的)应用程序是如何花费时间的。它特别擅长显示哪些 Ruby 代码生成了哪些 SQL 语句。访问下面的所有三个链接以学习如何使用它。祝你好运。

http://miniprofiler.com/

http://railscasts.com/episodes/368-miniprofiler

http://samsaffron.com/archive/2012/07/12/miniprofiler-ruby-edition

于 2012-10-11T14:30:25.490 回答