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

レールから変更されたメソッド全体に依存しないメソッドが望ましいのですが、これが確実に機能させる唯一の方法です。

価値があるので、これは非常に簡単にgemにスピンオフでき、Railsバージョンごとに新しいものがあり、アプリごとにバージョンに関連するgemを含めるだけです。これは、複数のバージョンをサポートしている可能性があるためです。レール。これは、前述のアプローチの脆弱性の一部を最小限に抑えるのに役立ちます。とにかく、これが役立つことを願っています-頑張ってください!

于 2012-10-17T01:13:23.683 に答える
0

Rails (または他のラックベース) アプリがどのように時間を費やしているかをすばやく理解するのに役立つ、rack-mini-profiler を強くお勧めします。どの Ruby コードがどの SQL ステートメントを生成したかを示すのに特に適しています。以下の 3 つのリンクすべてにアクセスして、うまく使用する方法を学んでください。幸運を。

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 に答える