Skip to content

Instantly share code, notes, and snippets.

@saimonmoore
Created March 6, 2012 11:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save saimonmoore/1985860 to your computer and use it in GitHub Desktop.
Save saimonmoore/1985860 to your computer and use it in GitHub Desktop.
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?
Rails.backtrace_cleaner.remove_silencers!
Rails.backtrace_cleaner.add_silencer { |line| line =~ /unicorn|gems|transaction|active_support/ }
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"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment