Skip to content

Commit 67c83d2

Browse files
authored
feat: add extract_from and extract_span_context (#109)
* add extract_from and extract_span_context * add generate_w3c* * up
1 parent 8e9ecc2 commit 67c83d2

File tree

3 files changed

+64
-46
lines changed

3 files changed

+64
-46
lines changed

src/api/Project.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "OpenTelemetryAPI"
22
uuid = "4f63ef3d-5940-44e7-a611-2d97696cffc9"
33
authors = ["Jun Tian <tianjun.cpp@gmail.com>"]
4-
version = "0.5.1"
4+
version = "0.5.2"
55

66
[deps]
77
Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"

src/api/ext/OpenTelemetryAPIHTTPExt.jl

-4
Original file line numberDiff line numberDiff line change
@@ -216,8 +216,4 @@ function OpenTelemetryAPI.uninstrument!(::Val{:HTTP})
216216
)
217217
end
218218

219-
function __init__()
220-
println("$(@__MODULE__) is loaded!")
221-
end
222-
223219
end

src/api/src/propagator/trace_context_textmap_propagator.jl

+63-41
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,30 @@ This propagator follows the [W3C format](https://www.w3.org/TR/trace-context/#tr
77
"""
88
struct TraceContextTextMapPropagator <: AbstractPropagator end
99

10+
function generate_w3c_traceparent(trace_id, span_id, trace_flag_sampled)
11+
return "00-$(string(trace_id, base=16, pad=32))-$(string(span_id, base=16,pad=16))-$(trace_flag_sampled ? "01" : "00")"
12+
end
13+
14+
function generate_w3c_traceparent(sc::SpanContext)
15+
return generate_w3c_traceparent(sc.trace_id, sc.span_id, sc.trace_flag.sampled)
16+
end
17+
18+
function generate_w3c_context(sc::SpanContext)
19+
return generate_w3c_traceparent(sc), string(sc.trace_state)
20+
end
21+
1022
function inject_context!(
1123
carrier::Union{
1224
AbstractVector{<:Pair{<:AbstractString,<:AbstractString}},
1325
AbstractDict{<:AbstractString,<:AbstractString},
1426
},
1527
propagator::TraceContextTextMapPropagator,
16-
ctx::Context = current_context(),
28+
ctx::Context = current_context()
1729
)
1830
sc = span_context(ctx)
1931
if !isnothing(sc)
20-
s_trace_parent = "00-$(string(sc.trace_id, base=16, pad=32))-$(string(sc.span_id, base=16,pad=16))-$(sc.trace_flag.sampled ? "01" : "00")"
32+
s_trace_parent, s_trace_state = generate_w3c_context(sc)
2133
push!(carrier, "traceparent" => s_trace_parent)
22-
s_trace_state = string(sc.trace_state)
2334
if !isempty(s_trace_state)
2435
push!(carrier, "tracestate" => s_trace_state)
2536
end
@@ -31,7 +42,7 @@ end
3142
function inject_context!(
3243
carrier::T,
3344
::TraceContextTextMapPropagator,
34-
ctx::Context = current_context(),
45+
ctx::Context = current_context()
3546
) where {T}
3647
@warn "unknown carrier type $T"
3748
carrier
@@ -43,10 +54,53 @@ TRACEPARENT_HEADER_FORMAT =
4354
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]*$"
4455

4556
function extract_context(
46-
carrier::AbstractDict{<:AbstractString,<:AbstractString},
57+
carrier::Union{
58+
AbstractDict{<:AbstractString,<:AbstractString},
59+
AbstractVector{<:Pair{<:AbstractString,<:AbstractString}}
60+
},
4761
propagator::TraceContextTextMapPropagator,
4862
ctx::Context = current_context(),
4963
)
64+
trace_id, span_id, trace_flag, trace_state = extract_from(carrier)
65+
return if (
66+
trace_id === nothing ||
67+
span_id === nothing ||
68+
trace_flag === nothing
69+
)
70+
ctx
71+
else
72+
merge(
73+
ctx,
74+
Context(Dict(
75+
SPAN_KEY_IN_CONTEXT => NonRecordingSpan(
76+
"",
77+
SpanContext(span_id, trace_id, false, trace_flag, trace_state),
78+
nothing,
79+
)
80+
)),
81+
)
82+
end
83+
end
84+
85+
function extract_span_context(
86+
carrier::Union{
87+
AbstractDict{<:AbstractString,<:AbstractString},
88+
AbstractVector{<:Pair{<:AbstractString,<:AbstractString}}
89+
}
90+
)
91+
trace_id, span_id, trace_flag, trace_state = extract_from(carrier)
92+
return if (
93+
trace_id === nothing ||
94+
span_id === nothing ||
95+
trace_flag === nothing
96+
)
97+
nothing
98+
else
99+
SpanContext(span_id, trace_id, false, trace_flag, trace_state)
100+
end
101+
end
102+
103+
function extract_from(carrier::AbstractDict{<:AbstractString,<:AbstractString})
50104
trace_id = nothing
51105
span_id = nothing
52106
trace_flag = nothing
@@ -70,15 +124,10 @@ function extract_context(
70124
end
71125
end
72126
end
73-
74-
return _extract_context(trace_id, span_id, trace_flag, trace_state, propagator, ctx)
127+
return trace_id, span_id, trace_flag, trace_state
75128
end
76129

77-
function extract_context(
78-
carrier::AbstractVector{<:Pair{<:AbstractString,<:AbstractString}},
79-
propagator::TraceContextTextMapPropagator,
80-
ctx::Context = current_context(),
81-
)
130+
function extract_from(carrier::AbstractVector{<:Pair{<:AbstractString,<:AbstractString}})
82131
trace_id = nothing
83132
span_id = nothing
84133
trace_flag = nothing
@@ -100,37 +149,9 @@ function extract_context(
100149
end
101150
end
102151
end
103-
104-
return _extract_context(trace_id, span_id, trace_flag, trace_state, propagator, ctx)
152+
return trace_id, span_id, trace_flag, trace_state
105153
end
106154

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-
)
120-
ctx
121-
else
122-
merge(
123-
ctx,
124-
Context(Dict(
125-
SPAN_KEY_IN_CONTEXT => NonRecordingSpan(
126-
"",
127-
SpanContext(span_id, trace_id, false, trace_flag, trace_state),
128-
nothing,
129-
)
130-
)),
131-
)
132-
end
133-
end
134155

135156
# fallback
136157
function extract_context(
@@ -141,3 +162,4 @@ function extract_context(
141162
@warn "unknown carrier type $T"
142163
ctx
143164
end
165+

0 commit comments

Comments
 (0)