diff --git a/lib/mini_profiler/profiling_methods.rb b/lib/mini_profiler/profiling_methods.rb index e62f1291..78d0dda0 100644 --- a/lib/mini_profiler/profiling_methods.rb +++ b/lib/mini_profiler/profiling_methods.rb @@ -17,6 +17,10 @@ def record_sql(query, elapsed_ms, params = nil) ) end + def report_reader_duration(elapsed_ms, row_count = nil, class_name = nil) + current&.current_timer&.report_reader_duration(elapsed_ms, row_count, class_name) + end + def start_step(name) return unless current parent_timer = current.current_timer diff --git a/lib/mini_profiler/timer_struct/request.rb b/lib/mini_profiler/timer_struct/request.rb index 4f8de616..940d0b38 100644 --- a/lib/mini_profiler/timer_struct/request.rb +++ b/lib/mini_profiler/timer_struct/request.rb @@ -125,6 +125,12 @@ def move_sql(sql, destination) end end + # please call SqlTiming#report_reader_duration instead + def report_reader_duration(elapsed_ms, row_count = nil, class_name = nil) + last_time = self[:sql_timings]&.last + last_time&.report_reader_duration(elapsed_ms, row_count, class_name) + end + def add_custom(type, elapsed_ms, page) TimerStruct::Custom.new(type, elapsed_ms, page, self).tap do |timer| timer[:parent_timing_id] = self[:id] diff --git a/lib/mini_profiler/timer_struct/sql.rb b/lib/mini_profiler/timer_struct/sql.rb index e9a78c75..28d30964 100644 --- a/lib/mini_profiler/timer_struct/sql.rb +++ b/lib/mini_profiler/timer_struct/sql.rb @@ -51,12 +51,14 @@ def initialize(query, duration_ms, page, parent, params = nil, skip_backtrace = ) end - def report_reader_duration(elapsed_ms) + def report_reader_duration(elapsed_ms, row_count = nil, class_name = nil) return if @reported @reported = true self[:duration_milliseconds] += elapsed_ms @parent[:sql_timings_duration_milliseconds] += elapsed_ms @page[:duration_milliseconds_in_sql] += elapsed_ms + self[:row_count] = self[:row_count].to_i + row_count if row_count + self[:class_name] = class_name if class_name end def trim_binds(binds) diff --git a/lib/mini_profiler_rails/railtie.rb b/lib/mini_profiler_rails/railtie.rb index 67fbae0c..57379962 100644 --- a/lib/mini_profiler_rails/railtie.rb +++ b/lib/mini_profiler_rails/railtie.rb @@ -114,6 +114,16 @@ def self.initialize!(app) Rack::MiniProfiler.binds_to_params(payload[:binds]) ) end + + subscribe("instantiation.active_record") do |name, start, finish, id, payload| + next if !should_measure? + + Rack::MiniProfiler.report_reader_duration( + (finish - start) * 1000, + payload[:record_count], + payload[:class_name] + ) + end end end @already_initialized = true