class Atatus::Spies::NetHTTPSpy

@api private

Constants

KEY
SUBTYPE
TYPE

Public Class Methods

disable_in() { || ... } click to toggle source
# File lib/atatus/spies/net_http.rb, line 38
def disable_in
  self.disabled = true

  begin
    yield
  ensure
    self.disabled = false
  end
end
disabled=(disabled) click to toggle source
# File lib/atatus/spies/net_http.rb, line 30
def disabled=(disabled)
  Thread.current[KEY] = disabled
end
disabled?() click to toggle source
# File lib/atatus/spies/net_http.rb, line 34
def disabled?
  Thread.current[KEY] ||= false
end

Public Instance Methods

install() click to toggle source

rubocop:disable Metrics/CyclomaticComplexity

# File lib/atatus/spies/net_http.rb, line 50
def install
  if defined?(::Net) && defined?(::Net::HTTP)

    Net::HTTP.class_eval do
      alias request_without_apm request

      def request(req, body = nil, &block)
        unless (transaction = Atatus.current_transaction)
          return request_without_apm(req, body, &block)
        end

        if Atatus::Spies::NetHTTPSpy.disabled?
          return request_without_apm(req, body, &block)
        end

        host = req['host']&.split(':')&.first || address
        method = req.method.to_s.upcase
        path, query = req.path.split('?')

        url = use_ssl? ? +'https://' : +'http://'
        url << host
        url << ":#{port}" if port
        url << path
        url << "?#{query}" if query
        uri = URI(url)

        destination =
          Atatus::Span::Context::Destination.from_uri(uri)

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

        Atatus.with_span(
          "#{method} #{host}",
          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 = request_without_apm(req, body, &block)

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

          result
        end
      end
    end

  end
end
request(req, body = nil, &block) click to toggle source
# File lib/atatus/spies/net_http.rb, line 56
def request(req, body = nil, &block)
  unless (transaction = Atatus.current_transaction)
    return request_without_apm(req, body, &block)
  end

  if Atatus::Spies::NetHTTPSpy.disabled?
    return request_without_apm(req, body, &block)
  end

  host = req['host']&.split(':')&.first || address
  method = req.method.to_s.upcase
  path, query = req.path.split('?')

  url = use_ssl? ? +'https://' : +'http://'
  url << host
  url << ":#{port}" if port
  url << path
  url << "?#{query}" if query
  uri = URI(url)

  destination =
    Atatus::Span::Context::Destination.from_uri(uri)

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

  Atatus.with_span(
    "#{method} #{host}",
    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 = request_without_apm(req, body, &block)

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

    result
  end
end