module PerformancePromise

Attributes

configuration[RW]

Public Class Methods

configure() { |configuration| ... } click to toggle source
# File lib/performance_promise.rb, line 12
def self.configure
  self.configuration ||= Configuration.new
  yield(configuration)
end
promises() click to toggle source
# File lib/performance_promise.rb, line 78
def self.promises
  @@promises
end
start() click to toggle source
# File lib/performance_promise.rb, line 17
def self.start
  return unless PerformancePromise.configuration.enable
  return unless PerformancePromise.configuration.allowed_environments.include?(Rails.env)

  ActiveSupport::Notifications.subscribe "sql.active_record" do |name, start, finish, id, payload|
    SQLRecorder.instance.record(payload, finish - start)
  end

  ActiveSupport::Notifications.subscribe "start_processing.action_controller" do |name, start, finish, id, payload|
    SQLRecorder.instance.flush
  end

  ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, start, finish, id, payload|
    db_queries = SQLRecorder.instance.flush
    render_time = finish - start
    method_name = "#{payload[:controller]}\##{payload[:action]}"
    promised = PerformancePromise.promises[method_name]
    if promised
      PerformancePromise::validate_promise(method_name, db_queries, render_time, promised)
    elsif PerformancePromise.configuration.untagged_methods_are_speedy
      PerformancePromise.configuration.logger.warn 'No promises made. Assuming Speedy'
      promised = PerformancePromise.configuration.speedy_promise
      PerformancePromise::validate_promise(method_name, db_queries, render_time, promised)
    end
  end
end
validate_promise(method, db_queries, render_time, options) click to toggle source
# File lib/performance_promise.rb, line 82
def self.validate_promise(method, db_queries, render_time, options)
  return if options[:skip]

  promise_broken = false
  error_messages = []
  backtraces = []

  self.configuration.validations.each do |validation|
    promised = options[validation]
    if promised
      validation_method = 'validate_' + validation.to_s
      passed, error_message, backtrace =
        PerformanceValidations.send(validation_method, db_queries, render_time, promised)
      unless passed
        error_messages << error_message
        backtraces << '-'*80
        backtraces << "#{validation.to_s.upcase}"
        backtraces << backtrace
        promise_broken = true
      end
    end
  end
  if promise_broken
    combined_error_message = "#{method}: Try Performance #{error_messages.join(', ')}"
    if PerformancePromise.configuration.throw_exception
      bp = BrokenPromise.new(combined_error_message)
      bp.set_backtrace(backtraces.flatten)
      raise bp
    else
      PerformancePromise.configuration.logger.warn '-' * 80
      PerformancePromise.configuration.logger.warn Utils.colored(:red, combined_error_message)
      backtraces.flatten.each do |trace|
        PerformancePromise.configuration.logger.warn Utils.colored(:cyan, trace)
      end
      PerformancePromise.configuration.logger.warn '-' * 80
    end
  else
    PerformanceValidations.report_promise_passed(method, db_queries, options)
  end
end