Add `parent_span_id` field
diff --git a/src/jaeger_passage_span_context.erl b/src/jaeger_passage_span_context.erl
index cbf01f9..9d86f1f 100644
--- a/src/jaeger_passage_span_context.erl
+++ b/src/jaeger_passage_span_context.erl
@@ -26,6 +26,7 @@
%%------------------------------------------------------------------------------
-export([get_trace_id/1]).
-export([get_span_id/1]).
+-export([get_parent_span_id/1]).
-export([get_debug_id/1]).
-export([get_flags/1]).
@@ -44,8 +45,9 @@
-record(?STATE,
{
- trace_id = 0 :: trace_id(),
- span_id = 0 :: span_id(),
+ trace_id = 0 :: trace_id(),
+ span_id = 0 :: span_id(),
+ parent_span_id = 0 :: span_id(),
is_sampled = false :: boolean(),
debug_id :: binary() | undefined
}).
@@ -86,6 +88,10 @@
get_span_id(Context) ->
(passage_span_context:get_state(Context))#?STATE.span_id.
+-spec get_parent_span_id(passage_span_context:context()) -> span_id().
+get_parent_span_id(Context) ->
+ (passage_span_context:get_state(Context))#?STATE.parent_span_id.
+
%% @private
-spec get_debug_id(passage_span_context:context()) -> {ok, binary()} | eror.
get_debug_id(Context) ->
@@ -111,13 +117,19 @@
span_id = rand:uniform(16#FFFFFFFFFFFFFFFF),
is_sampled = true
};
-make_span_context_state([{_, Ref} | _]) ->
- #?STATE{trace_id = TraceId} =
+make_span_context_state([{Type, Ref} | _]) ->
+ #?STATE{trace_id = TraceId, span_id = RefSpanId, parent_span_id = RefParentId} =
passage_span_context:get_state(passage_span:get_context(Ref)),
+ ParentId =
+ case Type of
+ child_of -> RefSpanId;
+ follows_from -> RefParentId
+ end,
#?STATE{
- trace_id = TraceId,
- span_id = rand:uniform(16#FFFFFFFFFFFFFFFF),
- is_sampled = true
+ trace_id = TraceId,
+ span_id = rand:uniform(16#FFFFFFFFFFFFFFFF),
+ parent_span_id = ParentId,
+ is_sampled = true
}.
%% @private
@@ -226,34 +238,36 @@
FlagSampled + FlagDebug.
-spec state_to_string(#?STATE{}) -> binary().
-state_to_string(State = #?STATE{trace_id = TraceId, span_id = SpanId}) ->
- DummyParentId = 0,
+state_to_string(State) ->
+ #?STATE{trace_id = TraceId, span_id = SpanId, parent_span_id = ParentId} = State,
Flags = get_flags_from_state(State),
list_to_binary(io_lib:format("~.16b:~.16b:~.16b:~.16b",
- [TraceId, SpanId, DummyParentId, Flags])).
+ [TraceId, SpanId, ParentId, Flags])).
-spec state_from_string(binary()) -> #?STATE{}.
state_from_string(Str) ->
- {ok, [TraceId, SpanId, _ParentSpanId, Flags], _} =
+ {ok, [TraceId, SpanId, ParentSpanId, Flags], _} =
io_lib:fread("~16u:~16u:~16u:~16u", binary_to_list(Str)),
#?STATE{
trace_id = TraceId,
span_id = SpanId,
+ parent_span_id = ParentSpanId,
is_sampled = (Flags band ?FLAG_SAMPLED) =/= 0
}.
-spec encode_state(#?STATE{}) -> binary().
-encode_state(State = #?STATE{trace_id = TraceId, span_id = SpanId}) ->
- DummyParentId = 0,
+encode_state(State) ->
+ #?STATE{trace_id = TraceId, span_id = SpanId, parent_span_id = ParentId} = State,
Flags = get_flags_from_state(State),
- <<TraceId:128, SpanId:64, DummyParentId:64, Flags:32>>.
+ <<TraceId:128, SpanId:64, ParentId:64, Flags:32>>.
-spec decode_state(binary()) -> {#?STATE{}, binary()}.
-decode_state(<<TraceId:128, SpanId:64, _:64, Flags:32, Bin/binary>>) ->
+decode_state(<<TraceId:128, SpanId:64, ParentId:64, Flags:32, Bin/binary>>) ->
State =
#?STATE{
trace_id = TraceId,
span_id = SpanId,
+ parent_span_id = ParentId,
is_sampled = (Flags band ?FLAG_SAMPLED) =/= 0
},
{State, Bin}.
diff --git a/src/jaeger_passage_thrift.erl b/src/jaeger_passage_thrift.erl
index ad71b6c..46726cf 100644
--- a/src/jaeger_passage_thrift.erl
+++ b/src/jaeger_passage_thrift.erl
@@ -98,13 +98,7 @@
make_span(Span) ->
Context = passage_span:get_context(Span),
TraceId = jaeger_passage_span_context:get_trace_id(Context),
- ParentSpanId =
- case [Ref || {child_of, Ref} <- passage_span:get_refs(Span)] of
- [] -> 0;
- [Ref | _] ->
- RefContext = passage_span:get_context(Ref),
- jaeger_passage_span_context:get_span_id(RefContext)
- end,
+ ParentSpanId = jaeger_passage_span_context:get_parent_span_id(Context),
Tags0 = passage_span:get_tags(Span),
Tags1 =
case jaeger_passage_span_context:get_debug_id(Context) of