Module: TraceView::Inst::CurlUtility

Included in:
CurlEasy
Defined in:
lib/traceview/inst/curb.rb

Overview

Curb instrumentation wraps instance and class methods in two classes: Curl::Easy and Curl::Multi. This CurlUtility module is used as a common module to be shared among both modules.

Instance Method Summary collapse

Instance Method Details

#profile_curb_method(kvs, method, args, &block) ⇒ Object

profile_curb_method

An agnostic method that will profile any Curl::Easy method (and optional args and block) that you throw at it.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/traceview/inst/curb.rb', line 55

def profile_curb_method(kvs, method, args, &block)
  # If we're not tracing, just do a fast return.
  return self.send(method, args, &block) if !TraceView.tracing?

  begin
    response_context = nil
    req_context = nil
    handle_cross_host = TraceView::Config[:curb][:cross_host]
    kvs.merge! traceview_collect

    TraceView::API.log_entry(:curb, kvs)
    kvs.clear

    if handle_cross_host && !kvs[:blacklisted]
      req_context = TraceView::Context.toString()
      self.headers['X-Trace'] = req_context
    end

    # The core curb call
    response = self.send(method, *args, &block)

    if handle_cross_host
      kvs[:HTTPStatus] = response_code

      # If we get a redirect, report the location header
      if ((300..308).to_a.include? response_code) && headers.key?("Location")
        kvs[:Location] = headers["Location"]
      end

      _, *response_headers = header_str.split(/[\r\n]+/).map(&:strip)
      response_headers = Hash[response_headers.flat_map{ |s| s.scan(/^(\S+): (.+)/) }]

      response_context = response_headers['X-Trace']
      if response_context && !kvs[:blacklisted]
        TraceView::XTrace.continue_service_context(req_context, response_context)
      end
    end

    response
  rescue => e
    TraceView::API.log_exception(:curb, e)
    raise e
  ensure
    TraceView::API.log_exit(:curb, kvs)
  end
end

#traceview_collect(verb = nil) ⇒ Object

traceview_collect

Used as a central area to retrieve and return values that we’re interesting in reporting to TraceView



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
# File 'lib/traceview/inst/curb.rb', line 18

def traceview_collect(verb = nil)
  kvs = {}

  if TraceView::Config[:curb][:cross_host]
    kvs[:IsService] = 1

    # Conditionally log query args
    if TraceView::Config[:curb][:log_args]
      kvs[:RemoteURL] = url
    else
      kvs[:RemoteURL] = url.split('?').first
    end

    kvs[:HTTPMethod] = verb if verb
  end

  # Avoid cross host tracing for blacklisted domains
  kvs[:blacklisted] = TraceView::API.blacklisted?(URI(url).hostname)
  kvs[:Backtrace] = TraceView::API.backtrace if TraceView::Config[:curb][:collect_backtraces]

  kvs
rescue => e
  TraceView.logger.debug "[traceview/debug] Error capturing curb KVs: #{e.message}"
  if TraceView::Config[:verbose]
    TraceView.logger.debug "[traceview/debug] #{__method__}:#{File.basename(__FILE__)}:#{__LINE__}: #{e.message}"
    TraceView.logger.debug e.backtrace.join('\n')
  end
ensure
  return kvs
end