123456789_123456789_123456789_123456789_123456789_

Module: ActionController::Instrumentation

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Defined in: actionpack/lib/action_controller/metal/instrumentation.rb

Overview

Adds instrumentation to several ends in Base. It also provides some hooks related with process_action. This allows an ORM like Active Record and/or DataMapper to plug in ::ActionController and show related information.

Check ::ActiveRecord::Railties::ControllerRuntime for an example.

::AbstractController::Logger - Attributes & Methods

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Attribute Summary

Instance Method Summary

::ActiveSupport::Benchmarkable - self

#benchmark

Allows you to measure the execution time of a block in a template and records the result to the log.

Class Attribute Details

.logger (rw)

[ GitHub ]

  
# File 'actionpack/lib/abstract_controller/logger.rb', line 12

config_accessor :logger

Instance Attribute Details

#logger (rw)

[ GitHub ]

  
# File 'actionpack/lib/abstract_controller/logger.rb', line 12

config_accessor :logger

#view_runtime (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 21

attr_internal :view_runtime

Instance Method Details

#append_info_to_payload(payload) (private)

Every time after an action is processed, this method is invoked with the payload, so you can add more information.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 105

def append_info_to_payload(payload) # :doc:
  payload[:view_runtime] = view_runtime
end

#cleanup_view_runtime (private)

A hook which allows you to clean up any time, wrongly taken into account in views, like database querying time.

def cleanup_view_runtime
  super - time_taken_in_something_expensive
end
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 99

def cleanup_view_runtime # :doc:
  yield
end

#halted_callback_hook(filter, _) (private)

A hook invoked every time a before callback is halted.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 89

def halted_callback_hook(filter, _)
  ActiveSupport::Notifications.instrument("halted_callback.action_controller", filter: filter)
end

#initialize

This method is for internal use only.
[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 23

def initialize(...) # :nodoc:
  super
  self.view_runtime = nil
end

#process_action (private)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 59

def process_action(*)
  ActiveSupport::ExecutionContext[:controller] = self

  raw_payload = {
    controller: self.class.name,
    action: action_name,
    request: request,
    params: request.filtered_parameters,
    headers: request.headers,
    format: request.format.ref,
    method: request.request_method,
    path: request.filtered_path
  }

  ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload)

  ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
    result = super
    payload[:response] = response
    payload[:status]   = response.status
    result
  rescue => error
    payload[:status] = ActionDispatch::ExceptionWrapper.status_code_for_exception(error.class.name)
    raise
  ensure
    append_info_to_payload(payload)
  end
end

#redirect_to

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 49

def redirect_to(*)
  ActiveSupport::Notifications.instrument("redirect_to.action_controller", request: request) do |payload|
    result = super
    payload[:status]   = response.status
    payload[:location] = response.filtered_location
    result
  end
end

#render

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 28

def render(*)
  render_output = nil
  self.view_runtime = cleanup_view_runtime do
    ActiveSupport::Benchmark.realtime(:float_millisecond) { render_output = super }
  end
  render_output
end

#send_data(data, options = {})

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 43

def send_data(data, options = {})
  ActiveSupport::Notifications.instrument("send_data.action_controller", options) do
    super
  end
end

#send_file(path, options = {})

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/instrumentation.rb', line 36

def send_file(path, options = {})
  ActiveSupport::Notifications.instrument("send_file.action_controller",
    options.merge(path: path)) do
    super
  end
end