class Hoss::Spies::NetHTTPSpy

@api private

Constants

KEY

Public Class Methods

disable_in() { || ... } click to toggle source
# File lib/hoss/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/hoss/spies/net_http.rb, line 30
def disabled=(disabled)
  Thread.current[KEY] = disabled
end
disabled?() click to toggle source
# File lib/hoss/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/hoss/spies/net_http.rb, line 50
def install
  Net::HTTP.class_eval do
    alias request_without_apm request

    def request(req, body = nil, &block)
      result = nil
      error_in_request = false
      begin
        if req['HOSS-SKIP-INSTRUMENTATION'] == 'true' || Hoss::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)

        Hoss.with_event do |event|
          # Record request
          event.request.headers['host'] = uri.hostname
          req.each_header {|n,v| event.request.headers[n] = v}
          event.request.method = method
          event.request.url = uri.to_s
          event.request.body = req.body
          event.request.received_at = DateTime.now.strftime('%Q').to_i

          begin
            result = request_without_apm(req, body, &block)
          rescue
            error_in_request = true
            raise
          end

          if result
            event.response = Hoss::Event::Response.new
            event.response.received_at = DateTime.now.strftime('%Q').to_i
            event.response.status_code = result.code.to_i
            result.each_header {|n,v| event.response.headers[n] = v}
            event.response.body = result.body
          end

          result
        end
      rescue Exception => e
        raise if error_in_request
        puts format('Hoss Error: %s %s', e.inspect, e.backtrace)
        return result unless result.nil?
        return request_without_apm(req, body, &block)
      end
    end
  end
end
request(req, body = nil, &block) click to toggle source
# File lib/hoss/spies/net_http.rb, line 54
def request(req, body = nil, &block)
  result = nil
  error_in_request = false
  begin
    if req['HOSS-SKIP-INSTRUMENTATION'] == 'true' || Hoss::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)

    Hoss.with_event do |event|
      # Record request
      event.request.headers['host'] = uri.hostname
      req.each_header {|n,v| event.request.headers[n] = v}
      event.request.method = method
      event.request.url = uri.to_s
      event.request.body = req.body
      event.request.received_at = DateTime.now.strftime('%Q').to_i

      begin
        result = request_without_apm(req, body, &block)
      rescue
        error_in_request = true
        raise
      end

      if result
        event.response = Hoss::Event::Response.new
        event.response.received_at = DateTime.now.strftime('%Q').to_i
        event.response.status_code = result.code.to_i
        result.each_header {|n,v| event.response.headers[n] = v}
        event.response.body = result.body
      end

      result
    end
  rescue Exception => e
    raise if error_in_request
    puts format('Hoss Error: %s %s', e.inspect, e.backtrace)
    return result unless result.nil?
    return request_without_apm(req, body, &block)
  end
end