Class: RequestMetrics::Base

Inherits:
ActiveSupport::LogSubscriber
  • Object
show all
Defined in:
lib/request_metrics/base.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.inherited(subclass) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/request_metrics/base.rb', line 31

def self.inherited(subclass)
  super

  subclass.backtrace_cleaner = ActiveSupport::BacktraceCleaner.new
  subclass.verbose_query_logs = verbose_query_logs
  subclass.metrics = []

  RequestMetrics.register(subclass)

  controller_runtime_module = Module.new { extend ActiveSupport::Concern }

  controller_runtime_module.class_methods do
    define_method :log_process_action do |payload|
      messages = super(payload)
      subclass.summary_log(payload)&.then { messages << it }
      messages
    end
  end

  controller_runtime_module.define_method :append_info_to_payload do |payload|
    super(payload)
    subclass.metrics.each { |metric| payload[metric] = subclass.send("reset_#{metric}") }
  end

  subclass.const_set :ControllerRuntime, controller_runtime_module
end

.install!Object



58
59
60
61
# File 'lib/request_metrics/base.rb', line 58

def self.install!
  runtime_module = const_get(:ControllerRuntime)
  ActiveSupport.on_load(:action_controller) { include runtime_module }
end

.metric_accessor(name) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/request_metrics/base.rb', line 14

def self.metric_accessor(name)
  metrics << name

  subclass = self
  key = :"#{subclass.object_id}/#{name}"

  define_singleton_method(name) { Thread.current[key] ||= 0 }
  define_singleton_method("#{name}=") { |value| Thread.current[key] = value }
  define_singleton_method("reset_#{name}") { send(name).tap { send("#{name}=", 0) } }
  define_singleton_method("add_#{name}") { |delta| send("#{name}=", send(name) + delta) }

  define_method(name) { subclass.send(name) }
  define_method("#{name}=") { |v| subclass.send("#{name}=", v) }
  define_method("reset_#{name}") { subclass.send("reset_#{name}") }
  define_method("add_#{name}") { |delta| subclass.send("add_#{name}", delta) }
end

.summary_log(payload) ⇒ Object



63
64
65
# File 'lib/request_metrics/base.rb', line 63

def self.summary_log(payload)
  nil
end

Instance Method Details

#debug(message) ⇒ Object



73
74
75
76
# File 'lib/request_metrics/base.rb', line 73

def debug(message)
  logger.debug(message)
  log_query_source if verbose_query_logs
end

#log(**options) ⇒ Object

Raises:

  • (NotImplementedError)


67
68
69
# File 'lib/request_metrics/base.rb', line 67

def log(**options)
  raise NotImplementedError, "#{self.class} must implement #log"
end