Module: JCW::HttpTracer

Defined in:
lib/jcw/http_tracer.rb

Class Method Summary collapse

Class Method Details

.patch_performObject

rubocop:disable Metrics/MethodLength



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/jcw/http_tracer.rb', line 9

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)
        full_path = request.uri.to_s

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

        tracer = ::HTTP::Tracer.tracer

        request_name = "http.request #{verb} #{path}"
        tracer.start_active_span(request_name, tags: tags) do |scope|
          request.headers.merge!(options.headers)
          OpenTracing.inject(scope.span.context, OpenTracing::FORMAT_TEXT_MAP,
                             request.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_method :perform_without_tracing, :perform
    alias_method :perform, :perform_with_tracing
  end
end