class SQLRecorder

Public Instance Methods

clean_trace(trace) click to toggle source
# File lib/performance_promise/sql_recorder.rb, line 53
def clean_trace(trace)
  Rails.backtrace_cleaner.remove_silencers!
  Rails.backtrace_cleaner.add_silencer { |line| not line =~ /^(app)\// }
  Rails.backtrace_cleaner.clean(trace)
end
flush() click to toggle source
# File lib/performance_promise/sql_recorder.rb, line 8
def flush
  captured_queries = @db_queries
  @db_queries = []
  return captured_queries
end
invalid_payload?(payload) click to toggle source
# File lib/performance_promise/sql_recorder.rb, line 45
def invalid_payload?(payload)
  ignore_query_names = [
    'SCHEMA',
    'SQLR-EXPLAIN',
  ]
  payload[:name] && ignore_query_names.any? { |name| payload[:name].include?(name) }
end
record(payload, duration) click to toggle source
# File lib/performance_promise/sql_recorder.rb, line 14
def record(payload, duration)
  return if invalid_payload?(payload)

  # do not record/analyze explain queries used in dev
  return if payload[:sql].include?('EXPLAIN')

  sql = payload[:sql]
  cleaned_trace = clean_trace(caller)
  if sql.include?('SELECT')
    connection = ActiveRecord::Base.connection
    adapter_name = connection.adapter_name
    if adapter_name == 'Mysql2'
      explained = connection.explain(connection, sql).as_json
    elsif adapter_name == 'SQLite'
      explained = connection.execute("EXPLAIN QUERY PLAN #{sql}", 'SQLR-EXPLAIN')
    elsif
      PerformancePromise.configuration.logger.warn("Unkown database adapter {adapter_name}")
      explained = connection.execute("EXPLAIN QUERY PLAN #{sql}", 'SQLR-EXPLAIN')
    end
  else
    explained = nil
  end

  @db_queries << {
    :sql => sql,
    :duration => duration,
    :trace => cleaned_trace,
    :explained => explained,
  }
end