diff --git a/src/api/Project.toml b/src/api/Project.toml index 7831be5..3b0686b 100644 --- a/src/api/Project.toml +++ b/src/api/Project.toml @@ -1,7 +1,7 @@ name = "OpenTelemetryAPI" uuid = "4f63ef3d-5940-44e7-a611-2d97696cffc9" authors = ["Jun Tian "] -version = "0.5.1" +version = "0.5.2" [deps] Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" diff --git a/src/api/ext/OpenTelemetryAPIHTTPExt.jl b/src/api/ext/OpenTelemetryAPIHTTPExt.jl index 58a4816..8827878 100644 --- a/src/api/ext/OpenTelemetryAPIHTTPExt.jl +++ b/src/api/ext/OpenTelemetryAPIHTTPExt.jl @@ -216,8 +216,4 @@ function OpenTelemetryAPI.uninstrument!(::Val{:HTTP}) ) end -function __init__() - println("$(@__MODULE__) is loaded!") -end - end \ No newline at end of file diff --git a/src/api/src/propagator/trace_context_textmap_propagator.jl b/src/api/src/propagator/trace_context_textmap_propagator.jl index 1d8878f..30c31bb 100644 --- a/src/api/src/propagator/trace_context_textmap_propagator.jl +++ b/src/api/src/propagator/trace_context_textmap_propagator.jl @@ -7,19 +7,30 @@ This propagator follows the [W3C format](https://www.w3.org/TR/trace-context/#tr """ struct TraceContextTextMapPropagator <: AbstractPropagator end +function generate_w3c_traceparent(trace_id, span_id, trace_flag_sampled) + return "00-$(string(trace_id, base=16, pad=32))-$(string(span_id, base=16,pad=16))-$(trace_flag_sampled ? "01" : "00")" +end + +function generate_w3c_traceparent(sc::SpanContext) + return generate_w3c_traceparent(sc.trace_id, sc.span_id, sc.trace_flag.sampled) +end + +function generate_w3c_context(sc::SpanContext) + return generate_w3c_traceparent(sc), string(sc.trace_state) +end + function inject_context!( carrier::Union{ AbstractVector{<:Pair{<:AbstractString,<:AbstractString}}, AbstractDict{<:AbstractString,<:AbstractString}, }, propagator::TraceContextTextMapPropagator, - ctx::Context = current_context(), + ctx::Context = current_context() ) sc = span_context(ctx) if !isnothing(sc) - 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")" + s_trace_parent, s_trace_state = generate_w3c_context(sc) push!(carrier, "traceparent" => s_trace_parent) - s_trace_state = string(sc.trace_state) if !isempty(s_trace_state) push!(carrier, "tracestate" => s_trace_state) end @@ -31,7 +42,7 @@ end function inject_context!( carrier::T, ::TraceContextTextMapPropagator, - ctx::Context = current_context(), + ctx::Context = current_context() ) where {T} @warn "unknown carrier type $T" carrier @@ -43,10 +54,53 @@ TRACEPARENT_HEADER_FORMAT = r"^[ \t]*(?P[0-9a-f]{2})-(?P[0-9a-f]{32})-(?P[0-9a-f]{16})-(?P[0-9a-f]{2})(?P-.*)?[ \t]*$" function extract_context( - carrier::AbstractDict{<:AbstractString,<:AbstractString}, + carrier::Union{ + AbstractDict{<:AbstractString,<:AbstractString}, + AbstractVector{<:Pair{<:AbstractString,<:AbstractString}} + }, propagator::TraceContextTextMapPropagator, ctx::Context = current_context(), ) + trace_id, span_id, trace_flag, trace_state = extract_from(carrier) + return if ( + trace_id === nothing || + span_id === nothing || + trace_flag === nothing + ) + ctx + else + merge( + ctx, + Context(Dict( + SPAN_KEY_IN_CONTEXT => NonRecordingSpan( + "", + SpanContext(span_id, trace_id, false, trace_flag, trace_state), + nothing, + ) + )), + ) + end +end + +function extract_span_context( + carrier::Union{ + AbstractDict{<:AbstractString,<:AbstractString}, + AbstractVector{<:Pair{<:AbstractString,<:AbstractString}} + } +) + trace_id, span_id, trace_flag, trace_state = extract_from(carrier) + return if ( + trace_id === nothing || + span_id === nothing || + trace_flag === nothing + ) + nothing + else + SpanContext(span_id, trace_id, false, trace_flag, trace_state) + end +end + +function extract_from(carrier::AbstractDict{<:AbstractString,<:AbstractString}) trace_id = nothing span_id = nothing trace_flag = nothing @@ -70,15 +124,10 @@ function extract_context( end end end - - return _extract_context(trace_id, span_id, trace_flag, trace_state, propagator, ctx) + return trace_id, span_id, trace_flag, trace_state end -function extract_context( - carrier::AbstractVector{<:Pair{<:AbstractString,<:AbstractString}}, - propagator::TraceContextTextMapPropagator, - ctx::Context = current_context(), -) +function extract_from(carrier::AbstractVector{<:Pair{<:AbstractString,<:AbstractString}}) trace_id = nothing span_id = nothing trace_flag = nothing @@ -100,37 +149,9 @@ function extract_context( end end end - - return _extract_context(trace_id, span_id, trace_flag, trace_state, propagator, ctx) + return trace_id, span_id, trace_flag, trace_state end -function _extract_context( - trace_id, - span_id, - trace_flag, - trace_state, - propagator::TraceContextTextMapPropagator, - ctx::Context = current_context(), -) - return if ( - trace_id === nothing || - span_id === nothing || - trace_flag === nothing - ) - ctx - else - merge( - ctx, - Context(Dict( - SPAN_KEY_IN_CONTEXT => NonRecordingSpan( - "", - SpanContext(span_id, trace_id, false, trace_flag, trace_state), - nothing, - ) - )), - ) - end -end # fallback function extract_context( @@ -141,3 +162,4 @@ function extract_context( @warn "unknown carrier type $T" ctx end +