3
3
from basictracer .context import SpanContext
4
4
from instana import util , log
5
5
6
- prefix_tracer_state = 'X-Instana-'
7
- field_name_trace_id = prefix_tracer_state + 'T'
8
- field_name_span_id = prefix_tracer_state + 'S'
9
- field_count = 2
6
+
7
+ # The carrier can be a dict or a list.
8
+ # Using the trace header as an example, it can be in the following forms
9
+ # for extraction:
10
+ # X-Instana-T
11
+ # HTTP_X_INSTANA_T
12
+ #
13
+ # The second form above is found in places like Django middleware for
14
+ # incoming requests.
15
+ #
16
+ # For injection, we only support the standard format:
17
+ # X-Instana-T
10
18
11
19
12
20
class HTTPPropagator ():
13
21
"""A Propagator for Format.HTTP_HEADERS. """
14
22
23
+ HEADER_KEY_T = 'X-Instana-T'
24
+ HEADER_KEY_S = 'X-Instana-S'
25
+ HEADER_KEY_L = 'X-Instana-L'
26
+ ALT_HEADER_KEY_T = 'HTTP_X_INSTANA_T'
27
+ ALT_HEADER_KEY_S = 'HTTP_X_INSTANA_S'
28
+ ALT_HEADER_KEY_L = 'HTTP_X_INSTANA_L'
29
+
15
30
def inject (self , span_context , carrier ):
16
31
try :
17
32
trace_id = util .id_to_header (span_context .trace_id )
18
33
span_id = util .id_to_header (span_context .span_id )
34
+
19
35
if type (carrier ) is dict or hasattr (carrier , "__dict__" ):
20
- carrier [field_name_trace_id ] = trace_id
21
- carrier [field_name_span_id ] = span_id
36
+ carrier [self .HEADER_KEY_T ] = trace_id
37
+ carrier [self .HEADER_KEY_S ] = span_id
38
+ carrier [self .HEADER_KEY_L ] = "1"
22
39
elif type (carrier ) is list :
23
- trace_header = (field_name_trace_id , trace_id )
24
- carrier .append (trace_header )
25
- span_header = (field_name_span_id , span_id )
26
- carrier .append (span_header )
40
+ carrier .append ((self .HEADER_KEY_T , trace_id ))
41
+ carrier .append ((self .HEADER_KEY_S , span_id ))
42
+ carrier .append ((self .HEADER_KEY_L , "1" ))
27
43
else :
28
44
raise Exception ("Unsupported carrier type" , type (carrier ))
29
45
@@ -39,9 +55,15 @@ def extract(self, carrier): # noqa
39
55
else :
40
56
raise ot .SpanContextCorruptedException ()
41
57
42
- if field_name_trace_id in dc and field_name_span_id in dc :
43
- trace_id = util .header_to_id (dc [field_name_trace_id ])
44
- span_id = util .header_to_id (dc [field_name_span_id ])
58
+ # Look for standard X-Instana-T/S format
59
+ if self .HEADER_KEY_T in dc and self .header_key_s in dc :
60
+ trace_id = util .header_to_id (dc [self .HEADER_KEY_T ])
61
+ span_id = util .header_to_id (dc [self .HEADER_KEY_S ])
62
+
63
+ # Alternatively check for alternate HTTP_X_INSTANA_T/S style
64
+ elif self .ALT_HEADER_KEY_T in dc and self .ALT_HEADER_KEY_S in dc :
65
+ trace_id = util .header_to_id (dc [self .ALT_HEADER_KEY_T ])
66
+ span_id = util .header_to_id (dc [self .ALT_HEADER_KEY_S ])
45
67
46
68
return SpanContext (span_id = span_id ,
47
69
trace_id = trace_id ,
0 commit comments