class Atatus::Spies::FaradaySpy

@api private

Constants

SUBTYPE
TYPE

Public Class Methods

without_net_http() { || ... } click to toggle source
# File lib/atatus/spies/faraday.rb, line 28
def self.without_net_http
  return yield unless defined?(NetHTTPSpy)

  Atatus::Spies::NetHTTPSpy.disable_in do
    yield
  end
end

Public Instance Methods

install() click to toggle source

rubocop:disable Metrics/CyclomaticComplexity

# File lib/atatus/spies/faraday.rb, line 37
def install
  if defined?(::Faraday) && defined?(::Faraday::Connection)

    ::Faraday::Connection.class_eval do
      alias run_request_without_apm run_request

      def run_request(method, url, body, headers, &block)
        unless (transaction = Atatus.current_transaction)
          return run_request_without_apm(method, url, body, headers, &block)
        end

        uri = URI(build_url(url))

        # 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 = Atatus::Span::Context::Destination.from_uri(uri)

        context =
          Atatus::Span::Context.new(
            http: { url: uri, method: upcased_method },
            destination: destination
          )

        Atatus.with_span(
          "#{upcased_method} #{host}",
          TYPE,
          subtype: SUBTYPE,
          action: upcased_method,
          context: context
        ) do |span|
          Atatus::Spies::FaradaySpy.without_net_http do
            trace_context = span&.trace_context || transaction.trace_context

            result =
              run_request_without_apm(method, url, body, headers) do |req|
                trace_context.apply_headers { |k, v| req[k] = v }

                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
end
run_request(method, url, body, headers) { |req| ... } click to toggle source
# File lib/atatus/spies/faraday.rb, line 43
def run_request(method, url, body, headers, &block)
  unless (transaction = Atatus.current_transaction)
    return run_request_without_apm(method, url, body, headers, &block)
  end

  uri = URI(build_url(url))

  # 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 = Atatus::Span::Context::Destination.from_uri(uri)

  context =
    Atatus::Span::Context.new(
      http: { url: uri, method: upcased_method },
      destination: destination
    )

  Atatus.with_span(
    "#{upcased_method} #{host}",
    TYPE,
    subtype: SUBTYPE,
    action: upcased_method,
    context: context
  ) do |span|
    Atatus::Spies::FaradaySpy.without_net_http do
      trace_context = span&.trace_context || transaction.trace_context

      result =
        run_request_without_apm(method, url, body, headers) do |req|
          trace_context.apply_headers { |k, v| req[k] = v }

          yield req if block_given?
        end

      if (http = span&.context&.http)
        http.status_code = result.status.to_s
      end

      result
    end
  end
end