Skip to content

Instantly share code, notes, and snippets.

@therealadam
Created December 7, 2010 15:54
Show Gist options
  • Save therealadam/731944 to your computer and use it in GitHub Desktop.
Save therealadam/731944 to your computer and use it in GitHub Desktop.
class QueryTracer < ActiveSupport::LogSubscriber
ACCEPT = %r{^(app|config|lib)}.freeze
FRAMES = 5
THRESHOLD = 300 # In ms
def sql(event)
return unless event.duration > THRESHOLD
callers = Rails.
backtrace_cleaner.
clean(caller).
select { |f| f =~ ACCEPT }.
take(FRAMES).
map { |f| f.split(":").take(2).join(":") }.
join(" | ")
# Shamelessly stolen from ActiveRecord::LogSubscriber
warning = color("SLOW QUERY", RED, true)
name = '%s (%.1fms)' % [event.payload[:name], event.duration]
sql = event.payload[:sql].squeeze(' ')
warn " #{warning}"
warn " #{name} #{sql}"
warn " Trace: #{callers}"
end
end
QueryTracer.attach_to :active_record
@qrush
Copy link

qrush commented Apr 25, 2011

this would be awesome wrapped up into a gem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment