module ActionController::Instrumentation

def append_info_to_payload(payload) # :doc:

:doc:
with the payload, so you can add more information.
Every time after an action is processed, this method is invoked
def append_info_to_payload(payload) # :doc:
  payload[:view_runtime] = view_runtime
end

def cleanup_view_runtime # :doc:

:doc:
end
super - time_taken_in_something_expensive
def cleanup_view_runtime

views, like database querying time.
A hook which allows you to clean up any time, wrongly taken into account in
def cleanup_view_runtime # :doc:
  yield
end

def halted_callback_hook(filter, _)

A hook invoked every time a before callback is halted.
def halted_callback_hook(filter, _)
  ActiveSupport::Notifications.instrument("halted_callback.action_controller", filter: filter)
end

def initialize(...) # :nodoc:

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

def process_action(*)

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

def redirect_to(*)

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

def render(*)

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

def send_data(data, options = {})

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

def send_file(path, options = {})

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