Skip to content

Instantly share code, notes, and snippets.

@bruce-ding
Forked from kares/slow_query_log.rb
Created January 10, 2019 03:47
Show Gist options
  • Select an option

  • Save bruce-ding/2c12b96b67fbe9304d8e38cc96db7084 to your computer and use it in GitHub Desktop.

Select an option

Save bruce-ding/2c12b96b67fbe9304d8e38cc96db7084 to your computer and use it in GitHub Desktop.
ActiveRecord slow query logging in Rails ... setup using: config.slow_query_log_threshold_in_ms = 500
require 'active_record/log_subscriber'
class SlowQueryLog < ActiveSupport::LogSubscriber
if Rails.configuration.respond_to?(:slow_query_log_threshold_in_ms)
if @@threshold = Rails.configuration.slow_query_log_threshold_in_ms
@@threshold = @@threshold.to_i == 0 ? nil : @@threshold.to_i
end
else
@@threshold = nil
end
def sql(event)
return unless duration_ms = event.duration
return if ! @@threshold || @@threshold > duration_ms
payload = event.payload; name = payload[:name]
return if name.eql? 'EXPLAIN'; return if name.eql? 'SCHEMA'
if ( binds = payload[:binds] ) && ! binds.empty?
binds = " #{binds.map { |col,v| render_bind(col, v) }.inspect}"
end
log "#{name} (#{event.duration.round(1)}ms) #{payload[:sql]}#{binds}"
end
def log(msg)
logger = ActiveRecord::Base.logger
logger && logger.warn("[slow-query] #{msg}")
end
private
def render_bind(column, value) # from ActiveRecord::LogSubscriber
return [nil, value] unless column
if column.binary?
value = value[:value] if value.is_a?(Hash)
value = value ? "<#{value.bytesize} bytes of binary data>" : "<NULL binary data>"
end
[column.name, value]
end
end
SlowQueryLog.attach_to :active_record
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment