class Hoss::Spies::HTTPSpy

@api private

Constants

SUBTYPE
TYPE

Public Class Methods

copy_request_body(body) click to toggle source
# File lib/hoss/spies/http.rb, line 28
def self.copy_request_body(body)
  case body.source
  when String
    body.source
  when nil
    nil
  else
    ""
  end
end

Public Instance Methods

install() click to toggle source
# File lib/hoss/spies/http.rb, line 39
def install
  ::HTTP::Client.class_eval do
    alias perform_without_apm perform

    def perform(req, options)
      result = nil
      error_in_request = false
      begin
        if req.headers['HOSS-SKIP-INSTRUMENTATION'] == 'true'
          return perform_without_apm(req, options)
        end

        Hoss.with_event do |event|
          event.request.headers['host'] = req.uri.host
          req.headers.each {|n,v| event.request.headers[n] = v}
          event.request.method = req.verb.to_s.upcase
          event.request.url = req.uri.to_s
          event.request.body = Hoss::Spies::HTTPSpy::copy_request_body(req.body)
          event.request.received_at = DateTime.now.strftime('%Q').to_i
          begin
            result = perform_without_apm(req, options)
          rescue HTTP::TimeoutError => e
            error_in_request = true
            event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionTimeout)
            event.error.received_at = DateTime.now.strftime('%Q').to_i
            raise
          rescue Exception => e
            error_in_request = true
            event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
            event.error.received_at = DateTime.now.strftime('%Q').to_i
            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.headers.each {|n,v| event.response.headers[n] = v}
            event.response.body = result.body.to_s
          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 perform_without_apm(req, options)
      end
    end
  end
end
perform(req, options) click to toggle source
# File lib/hoss/spies/http.rb, line 43
def perform(req, options)
  result = nil
  error_in_request = false
  begin
    if req.headers['HOSS-SKIP-INSTRUMENTATION'] == 'true'
      return perform_without_apm(req, options)
    end

    Hoss.with_event do |event|
      event.request.headers['host'] = req.uri.host
      req.headers.each {|n,v| event.request.headers[n] = v}
      event.request.method = req.verb.to_s.upcase
      event.request.url = req.uri.to_s
      event.request.body = Hoss::Spies::HTTPSpy::copy_request_body(req.body)
      event.request.received_at = DateTime.now.strftime('%Q').to_i
      begin
        result = perform_without_apm(req, options)
      rescue HTTP::TimeoutError => e
        error_in_request = true
        event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionTimeout)
        event.error.received_at = DateTime.now.strftime('%Q').to_i
        raise
      rescue Exception => e
        error_in_request = true
        event.error = Hoss::Event::Error.new(Hoss::Event::Error::ConnectionError)
        event.error.received_at = DateTime.now.strftime('%Q').to_i
        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.headers.each {|n,v| event.response.headers[n] = v}
        event.response.body = result.body.to_s
      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 perform_without_apm(req, options)
  end
end