Skip to content

@belt /query_trace.rb
Created

Embed URL

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
QueryTrace... ported to rails3
require 'term/ansicolor'
# yeilds a stacktrace for each SQL query
# put this file in config/initializers
class QueryTrace < ActiveSupport::LogSubscriber
include Term::ANSIColor
attr_accessor :trace_queries
def sql(event) #:nodoc:
return unless QueryTrace.enabled? && logger.debug? && Rails.env.development?
stack = Rails.backtrace_cleaner.clean(caller)
first_line = stack.shift
return unless first_line
msg = prefix + bold + cyan + "#{first_line}\n" + reset
msg += cyan + stack.join("\n") + reset
debug msg
end
# :call-seq:
# Klass.enabled?
#
# yields boolean if SQL queries should be logged or not
def self.enabled?
defined?(@trace_queries) && @trace_queries
end
# :call-seq:
# Klass.status
#
# yields text if QueryTrace has been enabled or not
def self.status
QueryTrace.enabled? ? 'enabled' : 'disabled'
end
# :call-seq:
# Klass.enable!
#
# turn on SQL query origin logging
def self.enable!
@trace_queries = true
end
# :call-seq:
# Klass.disable!
#
# turn off SQL query origin logging
def self.disable!
@trace_queries = false
end
# :call-seq:
# Klass.toggle!
#
# Toggles query tracing yielding a boolean indicating the new state of query
# origin tracing
def self.toggle!
enabled? ? disable! : enable!
enabled?
end
protected
def prefix #:nodoc:
bold(magenta('Called from: ')) + reset
end
end
QueryTrace.attach_to :active_record
trap('QUIT') do
# Sending 2 backspace characters removes the ^\ that is
# printed to the console.
rm_noise = "\b\b"
QueryTrace.toggle!
puts "#{rm_noise}=> QueryTrace #{QueryTrace.status}"
end
QueryTrace.enable! if ENV['QUERY_TRACE']
puts "=> QueryTrace #{QueryTrace.status}; CTRL-\\ to toggle"
@aokolish

Thanks for this. I had to add gem 'term-ansicolor' to my gemfile to get it working.

@jasonfb

For rails 3 see this as an alternative https://github.com/flyerhzm/bullet

@flori

Holy shit, you guys shouldn't trap QUIT without actually quitting afterwards…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.