Module: Bulletproof::Runtime::ModelLoadCollector

Defined in:
lib/bulletproof/runtime/model_load_collector.rb

Overview

リクエスト中に ActiveRecord の instantiation.active_record イベントを購読し、 モデルごとのロード件数とロード発生箇所を集計する。

スレッドローカル変数を使うため、Puma 等のマルチスレッドサーバーでも 並列リクエスト間で集計が混線しない。

同一モデルが複数回ロードされた場合は件数を合算し、ロード箇所は初回を記録する。

Constant Summary collapse

BATCH_PATH_PATTERN =

ActiveSupport::Notifications のコールバック形式 (name, start, finish, id, payload) ActiveRecord の find_each / in_batches 経由かどうかを判定するパス

%r{activerecord.*/relation/batches}

Class Method Summary collapse

Class Method Details

.collect(&block) ⇒ Object

ブロック実行中のイベントを収集し、ModelLoadEvent の配列を返す(件数降順)



17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/bulletproof/runtime/model_load_collector.rb', line 17

def self.collect(&block)
  Thread.current[THREAD_KEY] = {}

  ActiveSupport::Notifications.subscribed(
    method(:handle_event),
    "instantiation.active_record", &block
  )

  build_events(Thread.current[THREAD_KEY])
ensure
  Thread.current[THREAD_KEY] = nil
end