@@ -43,29 +43,80 @@ TRACEPARENT_HEADER_FORMAT =
43
43
r" ^[ \t ]*(?P<version>[0-9a-f]{2})-(?P<trace_id>[0-9a-f]{32})-(?P<span_id>[0-9a-f]{16})-(?P<trace_flag>[0-9a-f]{2})(?P<rest>-.*)?[ \t ]*$"
44
44
45
45
function extract_context (
46
- carrier:: Union {
47
- AbstractVector{<: Pair{<:AbstractString,<:AbstractString} },
48
- AbstractDict{<: AbstractString ,<: AbstractString },
49
- },
46
+ carrier:: AbstractDict{<:AbstractString,<:AbstractString} ,
50
47
propagator:: TraceContextTextMapPropagator ,
51
48
ctx:: Context = current_context (),
52
49
)
53
- trace_id, span_id, trace_flag, trace_state = nothing , nothing , nothing , TraceState ()
54
- for (k, v) in carrier
55
- if k == " traceparent"
56
- m = match (TRACEPARENT_HEADER_FORMAT, v)
57
- if ! isnothing (m)
58
- if m[" version" ] == " 00" && isnothing (m[" rest" ])
59
- trace_id = parse (TraceIdType, m[" trace_id" ], base = 16 )
60
- span_id = parse (SpanIdType, m[" span_id" ], base = 16 )
61
- trace_flag = parse (TraceFlag, m[" trace_flag" ])
62
- end
50
+ trace_id = nothing
51
+ span_id = nothing
52
+ trace_flag = nothing
53
+ trace_state = TraceState ()
54
+
55
+ carrier_keys = collect (keys (carrier))
56
+
57
+ traceparent_idx = findfirst (k -> lowercase (k) == " traceparent" , carrier_keys)
58
+
59
+ if traceparent_idx != = nothing
60
+ m = match (TRACEPARENT_HEADER_FORMAT, carrier[carrier_keys[traceparent_idx]])
61
+ if m != = nothing && m[" version" ] == " 00" && m[" rest" ] === nothing
62
+ trace_id = parse (TraceIdType, m[" trace_id" ], base = 16 )
63
+ span_id = parse (SpanIdType, m[" span_id" ], base = 16 )
64
+ trace_flag = parse (TraceFlag, m[" trace_flag" ])
65
+
66
+ # we only look for/parse tracestate if traceparent is ok
67
+ tracestate_idx = findfirst (k -> lowercase (k) == " tracestate" , carrier_keys)
68
+ if tracestate_idx != = nothing
69
+ trace_state = parse (TraceState, carrier[carrier_keys[tracestate_idx]])
63
70
end
64
- elseif k == " tracestate"
65
- trace_state = parse (TraceState, v)
66
71
end
67
72
end
68
- if isnothing (trace_id) || isnothing (span_id) || isnothing (trace_flag)
73
+
74
+ return _extract_context (trace_id, span_id, trace_flag, trace_state, propagator, ctx)
75
+ end
76
+
77
+ function extract_context (
78
+ carrier:: AbstractVector{<:Pair{<:AbstractString,<:AbstractString}} ,
79
+ propagator:: TraceContextTextMapPropagator ,
80
+ ctx:: Context = current_context (),
81
+ )
82
+ trace_id = nothing
83
+ span_id = nothing
84
+ trace_flag = nothing
85
+ trace_state = TraceState ()
86
+
87
+ traceparent_idx = findfirst (kv -> lowercase (kv[1 ]) == " traceparent" , carrier)
88
+
89
+ if traceparent_idx != = nothing
90
+ m = match (TRACEPARENT_HEADER_FORMAT, carrier[traceparent_idx][2 ])
91
+ if m != = nothing && m[" version" ] == " 00" && m[" rest" ] === nothing
92
+ trace_id = parse (TraceIdType, m[" trace_id" ], base = 16 )
93
+ span_id = parse (SpanIdType, m[" span_id" ], base = 16 )
94
+ trace_flag = parse (TraceFlag, m[" trace_flag" ])
95
+
96
+ # we only look for/parse tracestate if traceparent is ok
97
+ tracestate_idx = findfirst (kv -> lowercase (kv[1 ]) == " tracestate" , carrier)
98
+ if tracestate_idx != = nothing
99
+ trace_state = parse (TraceState, carrier[tracestate_idx][2 ])
100
+ end
101
+ end
102
+ end
103
+
104
+ return _extract_context (trace_id, span_id, trace_flag, trace_state, propagator, ctx)
105
+ end
106
+
107
+ function _extract_context (
108
+ trace_id,
109
+ span_id,
110
+ trace_flag,
111
+ trace_state,
112
+ propagator:: TraceContextTextMapPropagator ,
113
+ ctx:: Context = current_context (),
114
+ )
115
+ return if (
116
+ trace_id === nothing ||
117
+ span_id === nothing ||
118
+ trace_flag === nothing
119
+ )
69
120
ctx
70
121
else
71
122
merge (
0 commit comments