Class: RequestMetrics::Base
- Inherits:
-
ActiveSupport::LogSubscriber
- Object
- ActiveSupport::LogSubscriber
- RequestMetrics::Base
- Defined in:
- lib/request_metrics/base.rb
Class Method Summary collapse
- .inherited(subclass) ⇒ Object
- .install! ⇒ Object
- .metric_accessor(name) ⇒ Object
- .summary_log(payload) ⇒ Object
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| = super(payload) subclass.summary_log(payload)&.then { << it } 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() logger.debug() log_query_source if verbose_query_logs end |
#log(**options) ⇒ Object
67 68 69 |
# File 'lib/request_metrics/base.rb', line 67 def log(**) raise NotImplementedError, "#{self.class} must implement #log" end |