Module: Instana::Instrumentation::NetHTTPInstrumentation

Defined in:
lib/instana/instrumentation/net-http.rb

Instance Method Summary collapse

Instance Method Details

#request(*args, &block) ⇒ Object



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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/instana/instrumentation/net-http.rb', line 9

def request(*args, &block)
  if skip_instrumentation?
    do_skip = true
    return super(*args, &block)
  end

  current_span = ::Instana.tracer.start_span(:'net-http')

  # Send out the tracing context with the request
  request = args[0]

  # Set request headers; encode IDs as hexadecimal strings
  t_context = ::Instana.tracer.context
  request['X-Instana-L'] = t_context.level.to_s

  if t_context.active?
    request['X-Instana-T'] = t_context.trace_id_header
    request['X-Instana-S'] = t_context.span_id_header
  end

  request['Traceparent'] = t_context.trace_parent_header
  request['Tracestate'] = t_context.trace_state_header unless t_context.trace_state_header.empty?

  # Collect up KV info now in case any exception is raised
  kv_payload = { :http => {} }
  kv_payload[:http][:method] = request.method

  if request.uri
    uri_without_query = request.uri.dup.tap { |r| r.query = nil }
    kv_payload[:http][:url] = uri_without_query.to_s.gsub(/\?\z/, '')
    kv_payload[:http][:params] = ::Instana.secrets.remove_from_query(request.uri.query)
  else
    if use_ssl?
      kv_payload[:http][:url] = "https://#{@address}:#{@port}#{request.path}"
    else
      kv_payload[:http][:url] = "http://#{@address}:#{@port}#{request.path}"
    end
  end

  kv_payload[:http][:url] = ::Instana.secrets.remove_from_query(kv_payload[:http][:url]).gsub(/\?\z/, '')

  # The core call
  response = super(*args, &block)

  kv_payload[:http][:status] = response.code
  if response.code.to_i >= 500
    # Because of the 5xx response, we flag this span as errored but
    # without a backtrace (no exception)
    current_span.record_exception(nil)
  end

  response
rescue => e
  current_span&.record_exception(e)
  raise
ensure
  current_span&.set_tags(kv_payload)
  current_span&.finish unless do_skip
end

#skip_instrumentation?Boolean

Returns:

  • (Boolean)


69
70
71
72
73
# File 'lib/instana/instrumentation/net-http.rb', line 69

def skip_instrumentation?
  dnt_spans = [:dynamodb, :sqs, :sns, :s3]
  !Instana.tracer.tracing? || !started? || !Instana.config[:nethttp][:enabled] ||
    (!::Instana.tracer.current_span.nil? && dnt_spans.include?(::Instana.tracer.current_span.name))
end