興味深い質問ですが、これが私がそれをどのように処理するかです...
あなたがしているように聞こえるので、私は遅いクエリを自動的に説明するために使用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を含めるだけです。これは、複数のバージョンをサポートしている可能性があるためです。レール。これは、前述のアプローチの脆弱性の一部を最小限に抑えるのに役立ちます。とにかく、これが役立つことを願っています-頑張ってください!