Skip to content

Commit 714ef5f

Browse files
committed
Instrument Reflex processing in development and log summary
1 parent 736e87d commit 714ef5f

File tree

3 files changed

+30
-2
lines changed

3 files changed

+30
-2
lines changed

lib/stimulus_reflex/configuration.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def configuration
1414
end
1515

1616
class Configuration
17-
attr_accessor :on_failed_sanity_checks, :on_missing_default_urls, :parent_channel, :logging, :logger, :middleware, :morph_operation, :replace_operation, :precompile_assets
17+
attr_accessor :on_failed_sanity_checks, :on_missing_default_urls, :parent_channel, :logging, :logger, :middleware, :morph_operation, :replace_operation, :precompile_assets, :instrument_reflexes
1818

1919
DEFAULT_LOGGING = proc { "[#{session_id}] #{operation_counter.magenta} #{reflex_info.green} -> #{selector.cyan} via #{mode} Morph (#{operation.yellow})" }
2020

@@ -36,6 +36,7 @@ def initialize
3636
@morph_operation = :morph
3737
@replace_operation = :inner_html
3838
@precompile_assets = true
39+
@instrument_reflexes = Rails.env.development?
3940
end
4041
end
4142
end
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# frozen_string_literal: true
2+
3+
module StimulusReflex
4+
class Instrumenter
5+
def self.instrument(reflex)
6+
return yield unless reflex.logger && StimulusReflex.config.instrument_reflexes
7+
8+
events = []
9+
10+
time = Benchmark.realtime do
11+
ActiveSupport::Notifications.subscribed(lambda{|event| events << event }, /^sql.active_record|^render/) do
12+
yield
13+
end
14+
end
15+
16+
sql, views = events.partition{|e| e.name.match?(/^sql/) }
17+
18+
reflex.logger.info "Processed #{reflex.class.name}##{reflex.method_name} in #{(time * 1000).round(1)}ms " +
19+
"(Views: #{views.sum{|e| e.duration }.round(1)}ms | " +
20+
"ActiveRecord: #{sql.sum{|e| e.duration }.round(1)}ms | " +
21+
"Allocations: #{events.sum{|e| e.allocations }}) \n"
22+
end
23+
end
24+
end

lib/stimulus_reflex/reflex.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
require "stimulus_reflex/cable_readiness"
44
require "stimulus_reflex/version_checker"
5+
require "stimulus_reflex/instrumenter"
56

67
class StimulusReflex::Reflex
78
prepend StimulusReflex::CableReadiness
@@ -122,7 +123,9 @@ def render(*args)
122123

123124
# Invoke the reflex action specified by `name` and run all callbacks
124125
def process(name, *args)
125-
run_callbacks(:process) { public_send(name, *args) }
126+
StimulusReflex::Instrumenter.instrument(reflex) do
127+
run_callbacks(:process) { public_send(name, *args) }
128+
end
126129
end
127130

128131
# Indicates if the callback chain was halted via a throw(:abort) in a before_reflex callback.

0 commit comments

Comments
 (0)