Class: Instana::InstrumentedRequest

Inherits:
Rack::Request
  • Object
show all
Defined in:
lib/instana/instrumentation/instrumented_request.rb

Constant Summary collapse

W3C_TRACE_PARENT_FORMAT =
/[0-9a-f][0-9a-e]-(?<trace>[0-9a-f]{32})-(?<parent>[0-9a-f]{16})-(?<flags>[0-9a-f]{2})/
INSTANA_TRACE_STATE =
/in=(?<trace>[0-9a-f]+);(?<span>[0-9a-f]+)/

Instance Method Summary collapse

Instance Method Details

#continuing_from_trace_parent?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'lib/instana/instrumentation/instrumented_request.rb', line 88

def continuing_from_trace_parent?
  incoming_context[:from_w3c]
end

#correlation_dataObject



80
81
82
# File 'lib/instana/instrumentation/instrumented_request.rb', line 80

def correlation_data
  @correlation_data ||= parse_correlation_data
end

#external_trace_idObject



104
105
106
# File 'lib/instana/instrumentation/instrumented_request.rb', line 104

def external_trace_id
  incoming_context[:long_instana_id] || incoming_context[:external_trace_id]
end

#external_trace_id?Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/instana/instrumentation/instrumented_request.rb', line 100

def external_trace_id?
  continuing_from_trace_parent? || long_instana_id?
end

#extra_header_tagsObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/instana/instrumentation/instrumented_request.rb', line 51

def extra_header_tags
  return nil unless ::Instana.agent.extra_headers
  headers = {}

  ::Instana.agent.extra_headers.each do |custom_header|
    # Headers are available in this format: HTTP_X_CAPTURE_THIS
    rack_header = 'HTTP_' + custom_header.upcase
    rack_header.tr!('-', '_')

    headers[custom_header.to_sym] = @env[rack_header] if @env.has_key?(rack_header)
  end

  headers
end

#incoming_contextObject



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
# File 'lib/instana/instrumentation/instrumented_request.rb', line 20

def incoming_context
  context = if !correlation_data.empty?
              {}
            elsif @env['HTTP_X_INSTANA_T']
              context_from_instana_headers
            elsif @env['HTTP_TRACEPARENT']
              context_from_trace_parent
            elsif @env['HTTP_TRACESTATE']
              context_from_trace_state
            else
              {}
            end

  context[:level] = @env['HTTP_X_INSTANA_L'][0] if @env['HTTP_X_INSTANA_L']

  unless ::Instana.config[:w3c_trace_correlation]
    trace_state = parse_trace_state

    if context[:from_w3c] && trace_state.empty?
      context.delete(:span_id)
      context[:from_w3c] = false
    elsif context[:from_w3c] && !trace_state.empty?
      context[:trace_id] = trace_state[:t]
      context[:span_id] = trace_state[:p]
      context[:from_w3c] = false
    end
  end

  context
end

#instana_ancestorObject



84
85
86
# File 'lib/instana/instrumentation/instrumented_request.rb', line 84

def instana_ancestor
  @instana_ancestor ||= parse_trace_state
end

#long_instana_id?Boolean

Returns:

  • (Boolean)


96
97
98
# File 'lib/instana/instrumentation/instrumented_request.rb', line 96

def long_instana_id?
  ::Instana::Util.header_to_id(@env['HTTP_X_INSTANA_T']).length == 32
end

#request_paramsObject



66
67
68
# File 'lib/instana/instrumentation/instrumented_request.rb', line 66

def request_params
  ::Instana.secrets.remove_from_query(@env['QUERY_STRING'])
end

#request_tagsObject



70
71
72
73
74
75
76
77
78
# File 'lib/instana/instrumentation/instrumented_request.rb', line 70

def request_tags
  {
    method: request_method,
    url: CGI.unescape(path_info),
    host: host_with_port,
    header: extra_header_tags,
    params: request_params
  }.reject { |_, v| v.nil? }
end

#skip_trace?Boolean

Returns:

  • (Boolean)


15
16
17
18
# File 'lib/instana/instrumentation/instrumented_request.rb', line 15

def skip_trace?
  # Honor X-Instana-L
  @env.has_key?('HTTP_X_INSTANA_L') && @env['HTTP_X_INSTANA_L'].start_with?('0')
end

#synthetic?Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/instana/instrumentation/instrumented_request.rb', line 92

def synthetic?
  @env.has_key?('HTTP_X_INSTANA_SYNTHETIC') && @env['HTTP_X_INSTANA_SYNTHETIC'].eql?('1')
end