Module: Datadog::Tracing::Contrib::ActionPack::ActionController::Instrumentation::Metal

Defined in:
lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb

Overview

Instrumentation for ActionController::Metal

Instance Method Summary collapse

Instance Method Details

#datadog_response_statusObject



120
121
122
123
124
125
126
127
128
129
# File 'lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb', line 120

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) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb', line 86

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
    # 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