lib/elastic_apm/spies/faraday.rb in elastic-apm-3.3.0 vs lib/elastic_apm/spies/faraday.rb in elastic-apm-3.4.0
- old
+ new
@@ -14,54 +14,72 @@
ElasticAPM::Spies::NetHTTPSpy.disable_in do
yield
end
end
- # rubocop:disable Metrics/PerceivedComplexity
# rubocop:disable Metrics/CyclomaticComplexity
def install
::Faraday::Connection.class_eval do
alias run_request_without_apm run_request
def run_request(method, url, body, headers, &block)
unless (transaction = ElasticAPM.current_transaction)
return run_request_without_apm(method, url, body, headers, &block)
end
- host = if url_prefix.is_a?(URI) && url_prefix.host
- url_prefix.host
- elsif url.nil?
- tmp_request = build_request(method) do |req|
- yield(req) if block_given?
- end
- URI(tmp_request.path).host
- else
- URI(url).host
- end
+ uri = URI(build_url(url))
- name = "#{method.upcase} #{host}"
+ # If url is set inside block it isn't available until yield,
+ # so we temporarily build the request to yield. This could be a
+ # problem if the block has side effects as it will be yielded twice
+ # ~mikker
+ unless uri.host
+ tmp_request = build_request(method) do |req|
+ yield(req) if block_given?
+ end
+ uri = URI(tmp_request.path)
+ end
+ host = uri.host
+
+ upcased_method = method.to_s.upcase
+
+ destination = ElasticAPM::Span::Context::Destination.from_uri(uri)
+
+ context =
+ ElasticAPM::Span::Context.new(
+ http: { url: uri, method: upcased_method },
+ destination: destination
+ )
+
ElasticAPM.with_span(
- name,
+ "#{upcased_method} #{host}",
TYPE,
subtype: SUBTYPE,
- action: method.to_s
+ action: upcased_method,
+ context: context
) do |span|
ElasticAPM::Spies::FaradaySpy.without_net_http do
trace_context = span&.trace_context || transaction.trace_context
- run_request_without_apm(method, url, body, headers) do |req|
- req['Elastic-Apm-Traceparent'] = trace_context.to_header
+ result =
+ run_request_without_apm(method, url, body, headers) do |req|
+ req['Elastic-Apm-Traceparent'] = trace_context.to_header
- yield req if block_given?
+ yield req if block_given?
+ end
+
+ if (http = span&.context&.http)
+ http.status_code = result.status.to_s
end
+
+ result
end
end
end
end
end
# rubocop:enable Metrics/CyclomaticComplexity
- # rubocop:enable Metrics/PerceivedComplexity
end
register 'Faraday', 'faraday', FaradaySpy.new
end
end