class Atatus::Spies::HTTPSpy

@api private

Constants

SUBTYPE
TYPE

Public Instance Methods

install() click to toggle source
# File lib/atatus/spies/http.rb, line 27
def install
  if defined?(::HTTP) && defined?(::HTTP::Client)

    ::HTTP::Client.class_eval do
      alias perform_without_apm perform

      def perform(req, options)
        unless (transaction = Atatus.current_transaction)
          return perform_without_apm(req, options)
        end

        method = req.verb.to_s.upcase
        host = req.uri.host

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

        name = "#{method} #{host}"

        Atatus.with_span(
          name,
          TYPE,
          subtype: SUBTYPE,
          action: method,
          context: context
        ) do |span|
          trace_context = span&.trace_context || transaction.trace_context
          trace_context.apply_headers { |key, value| req[key] = value }

          result = perform_without_apm(req, options)

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

          result
        end
      end
    end

  end
end
perform(req, options) click to toggle source
# File lib/atatus/spies/http.rb, line 33
def perform(req, options)
  unless (transaction = Atatus.current_transaction)
    return perform_without_apm(req, options)
  end

  method = req.verb.to_s.upcase
  host = req.uri.host

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

  name = "#{method} #{host}"

  Atatus.with_span(
    name,
    TYPE,
    subtype: SUBTYPE,
    action: method,
    context: context
  ) do |span|
    trace_context = span&.trace_context || transaction.trace_context
    trace_context.apply_headers { |key, value| req[key] = value }

    result = perform_without_apm(req, options)

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

    result
  end
end