module HTTP::Tracer

Constants

IngoreRequest
VERSION

Attributes

ignore_request[RW]
tracer[RW]

Public Class Methods

compatible_version?() click to toggle source
# File lib/http/tracer.rb, line 26
def compatible_version?
  Gem::Version.new(HTTP::VERSION) >= Gem::Version.new("0.1.0")
end
instrument(tracer: OpenTracing.global_tracer, ignore_request: IngoreRequest) click to toggle source
# File lib/http/tracer.rb, line 13
def instrument(tracer: OpenTracing.global_tracer, ignore_request: IngoreRequest)
  begin
    require 'http'
  rescue LoadError
    return
  end
  raise IncompatibleGemVersion unless compatible_version?

  @ignore_request = ignore_request
  @tracer = tracer
  patch_perform
end
patch_perform() click to toggle source
# File lib/http/tracer.rb, line 40
def patch_perform
  ::HTTP::Client.class_eval do
    def perform_with_tracing(request, options)
      if ::HTTP::Tracer.ignore_request.call(request, options)
        res = perform_without_tracing(request, options)
      else
        path, host, port, verb = nil
        path = request.uri.path if request.uri.respond_to?(:path)
        host = request.uri.host if request.uri.respond_to?(:host)
        port = request.uri.port if request.uri.respond_to?(:port)
        verb = request.verb.to_s.upcase if request.respond_to?(:verb)

        tags = {
          'component' => 'ruby-httprb',
          'span.kind' => 'client',
          'http.method' => verb,
          'http.url' => path,
          'peer.host' => host,
          'peer.port' => port
        }.compact

        tracer = ::HTTP::Tracer.tracer

        tracer.start_active_span('http.request', tags: tags) do |scope|
          OpenTracing.inject(scope.span.context, OpenTracing::FORMAT_RACK, options.headers)

          res = perform_without_tracing(request, options)

          scope.span.set_tag('http.status_code', res.status)
          scope.span.set_tag('error', true) if res.is_a?(StandardError)
        end
      end

      res
    end

    alias perform_without_tracing perform
    alias perform perform_with_tracing
  end
end
perform_with_tracing(request, options) click to toggle source
# File lib/http/tracer.rb, line 42
def perform_with_tracing(request, options)
  if ::HTTP::Tracer.ignore_request.call(request, options)
    res = perform_without_tracing(request, options)
  else
    path, host, port, verb = nil
    path = request.uri.path if request.uri.respond_to?(:path)
    host = request.uri.host if request.uri.respond_to?(:host)
    port = request.uri.port if request.uri.respond_to?(:port)
    verb = request.verb.to_s.upcase if request.respond_to?(:verb)

    tags = {
      'component' => 'ruby-httprb',
      'span.kind' => 'client',
      'http.method' => verb,
      'http.url' => path,
      'peer.host' => host,
      'peer.port' => port
    }.compact

    tracer = ::HTTP::Tracer.tracer

    tracer.start_active_span('http.request', tags: tags) do |scope|
      OpenTracing.inject(scope.span.context, OpenTracing::FORMAT_RACK, options.headers)

      res = perform_without_tracing(request, options)

      scope.span.set_tag('http.status_code', res.status)
      scope.span.set_tag('error', true) if res.is_a?(StandardError)
    end
  end

  res
end
remove() click to toggle source
# File lib/http/tracer.rb, line 30
def remove
  return unless ::HTTP::Client.method_defined?(:perform_without_tracing)

  ::HTTP::Client.class_eval do
    remove_method :perform
    alias_method :perform, :perform_without_tracing
    remove_method :perform_without_tracing
  end
end