class QueryBudget
def initialize(app, max_queries: 50)
@app = app
@max_queries = max_queries
end
def call(env)
count = 0
subscriber = ActiveSupport::Notifications.subscribe('sql.active_record') do |*, payload|
next if payload[:name] == 'SCHEMA'
count += 1
end
status, headers, body = @app.call(env)
if Rails.env.development? && count > @max_queries
Rails.logger.warn({ msg: 'query_budget_exceeded', count: count, path: env['PATH_INFO'] }.to_json)
end
[status, headers, body]
ensure
ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
end
end
Set a rough query budget per request in dev/test and alert when exceeded. This is a pragmatic way to keep performance regressions visible without requiring a full APM setup.