Module: Aws::Xray::Hooks::NetHttp

Included in:
Net::HTTP
Defined in:
lib/aws/xray/hooks/net_http.rb

Constant Summary collapse

NAME_HEADER =
'X-Aws-Xray-Name'.freeze

Instance Method Summary collapse

Instance Method Details

#request_with_aws_xray(req, *args, &block) ⇒ Object



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
# File 'lib/aws/xray/hooks/net_http.rb', line 10

def request_with_aws_xray(req, *args, &block)
  return request_without_aws_xray(req, *args, &block) unless Context.started?
  return request_without_aws_xray(req, *args, &block) if Context.current.disabled?(:net_http)

  uri = URI('')
  uri.scheme = use_ssl? ? 'https' : 'http'
  uri.host = address
  uri.port = port
  uri.path = URI(req.path).path
  request_record = Request.build(
    method: req.method,
    url: uri.to_s,
    user_agent: req['User-Agent'],
  )
  name = req[NAME_HEADER] || req['Host'] || address
  Context.current.start_subsegment(remote: true, name: name) do |sub|
    propagate_trace = sub.generate_trace
    req[TRACE_HEADER] = propagate_trace.to_header_value
    sub.set_http_request(request_record)

    # Don't record twice if down-stream caller calls Net::HTTP#request again.
    res = Context.current.disable_trace(:net_http) { request_without_aws_xray(req, *args, &block) }

    sub.set_http_response_with_error(res.code.to_i, res['Content-Length'], remote: true)
    sub.(CallerBuilder.call) if Aws::Xray.config.record_caller_of_http_requests
    res
  end
end