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 22

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 106

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 100

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 90

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 24

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

#process_action (private)

[ GitHub ]

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

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 50

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 29

def render(*)
  render_output = nil
  self.view_runtime = cleanup_view_runtime do
    Benchmark.ms { render_output = super }
  end
  render_output
end

#send_data(data, options = {})

[ GitHub ]

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

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 37

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