0

リクエストごとに、これをログに記録します。

Completed 200 OK in 854ms (Views: 1.0ms | ActiveRecord: 17.0ms)

クエリの数も含めることはできますか?
何かのようなもの:

Completed 200 OK in 854ms (Views: 1.0ms | ActiveRecord: 17.0ms | Queries: 10)

理想的には、すべての「キャッシュされた」ものがそのカウントにも表示されるようにしたいと思います。つまり、「キャッシュ」によって「N + 1」クエリがDBにヒットするのを防いだとしても、問題があることを知りたいのです。

モンキーパッチ/手動で何かを編集するのは問題ありません。開発ボックスのためだけにこれが本当に必要だからです。

(これを文明的に作成して本番環境で使用できる場合はさらに良いですが、そうでない場合は、自分のマシンで手動で変更されたRailsを使用するだけで問題ありません)

ありがとう!
ダニエル

4

1 に答える 1

2

ThinkingSphinx gem がこのようなことを行い、Sphinx クエリの実行に費やした時間をログの概要に追加することを私は知っています。クエリの数を表示するために、おそらく同様のことを行うことができます (他の人がこの機能を高く評価するに違いないので、独自の宝石を作成することによって)。私はそれがどのように機能するかを詳しく見ていませんが、ActionController と LogSubscriber への変更が原因のようです:

lib/thinking_sphinx/action_controller.rb:

module ThinkingSphinx
  module ActionController
    extend ActiveSupport::Concern

    protected

    attr_internal :query_runtime

    def cleanup_view_runtime
      log_subscriber = ThinkingSphinx::ActiveRecord::LogSubscriber
      query_runtime_pre_render = log_subscriber.reset_runtime
      runtime = super
      query_runtime_post_render = log_subscriber.reset_runtime
      self.query_runtime = query_runtime_pre_render + query_runtime_post_render
      runtime - query_runtime_post_render
    end

    def append_info_to_payload(payload)
      super
      payload[:query_runtime] = query_runtime
    end

    module ClassMethods
      def log_process_action(payload)
        messages, query_runtime = super, payload[:query_runtime]
        messages << ("Sphinx: %.1fms" % query_runtime.to_f) if query_runtime
        messages
      end
    end
  end
end

ライブラリ/thinking_sphinx/active_record/log_subscriber.rb:

require 'active_support/log_subscriber'

module ThinkingSphinx
  module ActiveRecord
    class LogSubscriber < ActiveSupport::LogSubscriber
      def self.runtime=(value)
        Thread.current['thinking_sphinx_query_runtime'] = value
      end

      def self.runtime
        Thread.current['thinking_sphinx_query_runtime'] ||= 0
      end

      def self.reset_runtime
        rt, self.runtime = runtime, 0
        rt
      end

      def initialize
        super
        @odd_or_even = false
      end

      def query(event)
        self.class.runtime += event.duration
        return unless logger.debug?

        identifier = color('Sphinx Query (%.1fms)' % event.duration, GREEN, true)
        query = event.payload[:query]
        query = color query, nil, true if odd?

        debug "  #{identifier}  #{query}"
      end

      def message(event)
        return unless logger.debug?

        identifier = color 'Sphinx', GREEN, true
        message = event.payload[:message]
        message = color message, nil, true if odd?

        debug "  #{identifier}  #{message}"
      end

      def odd?
        @odd_or_even = !@odd_or_even
      end

      def logger
        return @logger if defined? @logger
        self.logger = ::ActiveRecord::Base.logger
      end

      def logger=(logger)
        @logger = logger
      end

      attach_to :thinking_sphinx
    end
  end
end

これが役立つことを願っています。

于 2012-11-07T15:28:39.327 に答える