module Datadog::Contrib::ActionPack::ActionController::Instrumentation::Metal

Instrumentation for ActionController::Metal

Public Instance Methods

datadog_response_status() click to toggle source
# File lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb, line 142
def datadog_response_status
  case response
  when ::ActionDispatch::Response
    response.status
  when Array
    # Likely a Rack response array: first element is the status.
    status = response.first
    status.class <= Integer ? status : nil
  end
end
process_action(*args) click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb, line 106
def process_action(*args)
  # mutable payload with a tracing context that is used in two different
  # signals; it propagates the request span so that it can be finished
  # no matter what
  payload = {
    controller: self.class,
    action: action_name,
    env: request.env,
    headers: {
      # The exception this controller was given in the request,
      # which is typical if the controller is configured to handle exceptions.
      request_exception: request.headers['action_dispatch.exception']
    },
    tracing_context: {}
  }

  begin
    payload[:exception_controller?] = Instrumentation.exception_controller?(payload)

    # process and catch request exceptions
    Instrumentation.start_processing(payload)
    result = super(*args)
    status = datadog_response_status
    payload[:status] = status unless status.nil?
    result
  # rubocop:disable Lint/RescueException
  rescue Exception => e
    payload[:exception] = [e.class.name, e.message]
    payload[:exception_object] = e
    raise e
  end
# rubocop:enable Lint/RescueException
ensure
  Instrumentation.finish_processing(payload)
end