Last active
February 6, 2025 09:12
-
-
Save amkisko/9aa686ddd8ebff52397a54fe34d9a036 to your computer and use it in GitHub Desktop.
Rails ActiveRecord and ActiveSupport callbacks wrapper for collecting metrics in pair with rspec
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if ENV["DEBUG_CALLBACKS"] | |
Rails.application.eager_load! | |
ActiveRecord::Callbacks::CALLBACKS.each do |callback_type| | |
ApplicationRecord.descendants.each do |model| | |
kind, name = callback_type.to_s.split("_") | |
chain = model.__callbacks[name.to_sym]&.send(:chain) | |
filtered = chain&.select { |chain_callback| chain_callback.kind == kind.to_sym } | |
$callbacks_counter ||= {} | |
$callbacks_counter[model.name] ||= {} | |
$callbacks_counter[model.name][callback_type] = filtered&.count || 0 | |
end | |
ApplicationRecord.define_method(:run_callbacks) do |kind, *args, &block| | |
$callbacks_stack ||= [] | |
$callbacks_stack << [self.class.name, kind, caller_locations(1, 1).first.label].join("; ") | |
super(kind, *args, &block) | |
end | |
end | |
p $callbacks_counter | |
RSpec.configure do |config| | |
config.after(:each) do | |
$callbacks_stack.each do |callback| | |
puts callback | |
end | |
$callbacks_stack = [] | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment