in lib/elastic_apm/spies/faraday.rb [51:136]
def run_request(method, url, body, headers, &block)
unless (transaction = ElasticAPM.current_transaction)
return super(method, url, body, headers, &block)
end
if ElasticAPM::Spies::FaradaySpy.disabled?
return super(method, url, body, headers, &block)
end
uri = URI(build_url(url))
unless uri.host
tmp_request = build_request(method) do |req|
yield(req) if block_given?
end
uri = tmp_request.path && URI(tmp_request.path)
end
host = uri&.host || 'localhost'
upcased_method = method.to_s.upcase
if uri
destination = ElasticAPM::Span::Context::Destination.from_uri(uri, type: SUBTYPE)
context =
ElasticAPM::Span::Context.new(
http: { url: uri, method: upcased_method },
destination: destination
)
else
context =
ElasticAPM::Span::Context.new(http: { url: uri, method: upcased_method })
end
context =
ElasticAPM::Span::Context.new(
http: { url: uri, method: upcased_method },
destination: destination
)
ElasticAPM.with_span(
"#{upcased_method} #{host}",
TYPE,
subtype: SUBTYPE,
context: context
) do |span|
ElasticAPM::Spies.without_net_http do
trace_context = span&.trace_context || transaction.trace_context
begin
result = super(method, url, body, headers) do |req|
trace_context.apply_headers { |k, v| req[k] = v }
yield req if block
end
rescue Faraday::ClientError, Faraday::ServerError => e
status =
if e.respond_to?(:response_status)
e.response_status
elsif e.response && e.response.respond_to?(:status)
e.response.status
elsif e.response && e.response.respond_to?(:fetch)
e.response[:status]
end
http = span&.context&.http
if http && status
http.status_code = status.to_s
span.outcome = Span::Outcome.from_http_status(status)
end
raise e
end
if (http = span&.context&.http)
http.status_code = result.status.to_s
end
span&.outcome = Span::Outcome.from_http_status(result.status)
result
end
end
end