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