Module: PerformancePromise

Defined in:
lib/performance_promise.rb

Defined Under Namespace

Classes: BrokenPromise, Configuration

Constant Summary collapse

@@promises =
{}

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.configurationObject

Returns the value of attribute configuration.



9
10
11
# File 'lib/performance_promise.rb', line 9

def configuration
  @configuration
end

Class Method Details

.configure {|configuration| ... } ⇒ Object

Yields:



12
13
14
15
# File 'lib/performance_promise.rb', line 12

def self.configure
  self.configuration ||= Configuration.new
  yield(configuration)
end

.promisesObject



78
79
80
# File 'lib/performance_promise.rb', line 78

def self.promises
  @@promises
end

.startObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 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) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# 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