From 838b22a3ccc1f3d60f751724c912d74bb72c32a9 Mon Sep 17 00:00:00 2001 From: Catalina Astengo Date: Wed, 29 Jul 2020 09:43:20 -0600 Subject: [PATCH 1/5] encode b3 headers without padding when not 32 chars --- src/oc_propagation_http_b3.erl | 2 +- test/oc_span_ctx_SUITE.erl | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/oc_propagation_http_b3.erl b/src/oc_propagation_http_b3.erl index f928c65..b104502 100644 --- a/src/oc_propagation_http_b3.erl +++ b/src/oc_propagation_http_b3.erl @@ -39,7 +39,7 @@ to_headers(#span_ctx{trace_id=TraceId, trace_options=TraceOptions}) -> Options = case TraceOptions band 1 of 1 -> "1"; _ -> "0" end, %% iolist_to_binary only needed for versions before otp-21 - EncodedTraceId = iolist_to_binary(io_lib:format("~32.16.0b", [TraceId])), + EncodedTraceId = iolist_to_binary(io_lib:format("~.16b", [TraceId])), EncodedSpanId = iolist_to_binary(io_lib:format("~16.16.0b", [SpanId])), [{?B3_TRACE_ID, EncodedTraceId}, {?B3_SPAN_ID, EncodedSpanId}, diff --git a/test/oc_span_ctx_SUITE.erl b/test/oc_span_ctx_SUITE.erl index 3b55a51..949c551 100644 --- a/test/oc_span_ctx_SUITE.erl +++ b/test/oc_span_ctx_SUITE.erl @@ -134,6 +134,15 @@ b3_encode_decode_headers(_Config) -> compare_b3_headers(Encoded, Headers), ?assertEqual(Decoded, oc_propagation_http_b3:from_headers(Encoded)), + %% TraceId: 4bf92f3577b34da6 + %% SpanId: 00f067aa0ba902b7 + %% Enabled: true + ShortTraceIDHeaders = ?B3_HEADERS(<<"4bf92f3577b34da6">>, <<"00f067aa0ba902b7">>, <<"1">>), + ShortTraceIDDecoded = oc_propagation_http_b3:from_headers(ShortTraceIDHeaders), + ShortTraceIDEncoded = oc_propagation_http_b3:to_headers(ShortTraceIDDecoded), + compare_b3_headers(ShortTraceIDEncoded, ShortTraceIDHeaders), + ?assertEqual(ShortTraceIDDecoded, oc_propagation_http_b3:from_headers(ShortTraceIDEncoded)), + %% TraceId: 4bf92f3577b34da6a3ce929d0e0e4736 %% SpanId: 00f067aa0ba902b7 %% Enabled: false From 33de39dc783f6909f636262e4b54a45171a0d6e7 Mon Sep 17 00:00:00 2001 From: Catalina Astengo Date: Wed, 29 Jul 2020 14:23:44 -0600 Subject: [PATCH 2/5] alternative way of encoding traceid by checking size first --- src/oc_propagation_http_b3.erl | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/oc_propagation_http_b3.erl b/src/oc_propagation_http_b3.erl index b104502..399aef6 100644 --- a/src/oc_propagation_http_b3.erl +++ b/src/oc_propagation_http_b3.erl @@ -39,7 +39,7 @@ to_headers(#span_ctx{trace_id=TraceId, trace_options=TraceOptions}) -> Options = case TraceOptions band 1 of 1 -> "1"; _ -> "0" end, %% iolist_to_binary only needed for versions before otp-21 - EncodedTraceId = iolist_to_binary(io_lib:format("~.16b", [TraceId])), + EncodedTraceId = encode_trace_id(TraceId), EncodedSpanId = iolist_to_binary(io_lib:format("~16.16.0b", [SpanId])), [{?B3_TRACE_ID, EncodedTraceId}, {?B3_SPAN_ID, EncodedSpanId}, @@ -47,6 +47,13 @@ to_headers(#span_ctx{trace_id=TraceId, to_headers(undefined) -> []. +encode_trace_id(TraceId) -> + encode_trace_id(TraceId, binary:encode_unsigned(TraceId)). +encode_trace_id(TraceId, TraceIdBin) when bit_size(TraceIdBin) == 64 -> + iolist_to_binary(io_lib:format("~16.16.0b", [TraceId])); +encode_trace_id(TraceId, _TraceIdBin) -> + iolist_to_binary(io_lib:format("~32.16.0b", [TraceId])). + -spec from_headers(list() | map()) -> maybe(opencensus:span_ctx()). from_headers(Headers) when is_map(Headers) -> from_headers(maps:to_list(Headers)); From 0b92e34fa7d3c08eaa1a9bba01cae6a02aeadd63 Mon Sep 17 00:00:00 2001 From: Catalina Astengo Date: Thu, 13 Aug 2020 14:38:00 -0700 Subject: [PATCH 3/5] adds set_kind func for oc_trace --- src/oc_propagation_http_b3.erl | 9 +-------- src/oc_span.erl | 12 ++++++++++++ test/oc_span_SUITE.erl | 7 +++++-- test/oc_span_ctx_SUITE.erl | 9 --------- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/oc_propagation_http_b3.erl b/src/oc_propagation_http_b3.erl index 399aef6..f928c65 100644 --- a/src/oc_propagation_http_b3.erl +++ b/src/oc_propagation_http_b3.erl @@ -39,7 +39,7 @@ to_headers(#span_ctx{trace_id=TraceId, trace_options=TraceOptions}) -> Options = case TraceOptions band 1 of 1 -> "1"; _ -> "0" end, %% iolist_to_binary only needed for versions before otp-21 - EncodedTraceId = encode_trace_id(TraceId), + EncodedTraceId = iolist_to_binary(io_lib:format("~32.16.0b", [TraceId])), EncodedSpanId = iolist_to_binary(io_lib:format("~16.16.0b", [SpanId])), [{?B3_TRACE_ID, EncodedTraceId}, {?B3_SPAN_ID, EncodedSpanId}, @@ -47,13 +47,6 @@ to_headers(#span_ctx{trace_id=TraceId, to_headers(undefined) -> []. -encode_trace_id(TraceId) -> - encode_trace_id(TraceId, binary:encode_unsigned(TraceId)). -encode_trace_id(TraceId, TraceIdBin) when bit_size(TraceIdBin) == 64 -> - iolist_to_binary(io_lib:format("~16.16.0b", [TraceId])); -encode_trace_id(TraceId, _TraceIdBin) -> - iolist_to_binary(io_lib:format("~32.16.0b", [TraceId])). - -spec from_headers(list() | map()) -> maybe(opencensus:span_ctx()). from_headers(Headers) when is_map(Headers) -> from_headers(maps:to_list(Headers)); diff --git a/src/oc_span.erl b/src/oc_span.erl index f2b2142..7233dcd 100644 --- a/src/oc_span.erl +++ b/src/oc_span.erl @@ -32,6 +32,8 @@ message_event/4, + set_kind/2, + set_status/3]). -include("opencensus.hrl"). @@ -138,6 +140,16 @@ set_status(Code, Message, Span=#span{}) -> set_status(_, _, undefined) -> undefined. +%%-------------------------------------------------------------------- +%% @doc +%% Set Kind. +%% @end +%%-------------------------------------------------------------------- +-spec set_kind(Kind, Span) -> Span when Kind :: opencensus:span_kind(), Span :: maybe(opencensus:span()). +set_kind(Kind, Span=#span{}) -> + Span#span{kind=Kind}; +set_kind(_, undefined) -> + undefined. %%-------------------------------------------------------------------- %% @doc diff --git a/test/oc_span_SUITE.erl b/test/oc_span_SUITE.erl index 01272ce..da0b65d 100644 --- a/test/oc_span_SUITE.erl +++ b/test/oc_span_SUITE.erl @@ -53,10 +53,13 @@ modifications(_Config) -> Span6 = oc_span:add_link(Link, Span5), ?assertEqual(undefined, oc_span:add_link(Link, undefined)), - ?assertEqual({error, no_report_buffer}, oc_span:finish_span(#span_ctx{}, Span6)), + Span7 = oc_span:set_kind(?SPAN_KIND_SERVER, Span6), + ?assertEqual(undefined, oc_span:set_kind(?SPAN_KIND_SERVER, undefined)), + + ?assertEqual({error, no_report_buffer}, oc_span:finish_span(#span_ctx{}, Span7)), {ok, _} = application:ensure_all_started(opencensus), - ?assertEqual(true, oc_span:finish_span(#span_ctx{}, Span6)), + ?assertEqual(true, oc_span:finish_span(#span_ctx{}, Span7)), ?assertEqual(true, oc_span:finish_span(#span_ctx{}, undefined)), application:stop(opencensus). diff --git a/test/oc_span_ctx_SUITE.erl b/test/oc_span_ctx_SUITE.erl index 949c551..3b55a51 100644 --- a/test/oc_span_ctx_SUITE.erl +++ b/test/oc_span_ctx_SUITE.erl @@ -134,15 +134,6 @@ b3_encode_decode_headers(_Config) -> compare_b3_headers(Encoded, Headers), ?assertEqual(Decoded, oc_propagation_http_b3:from_headers(Encoded)), - %% TraceId: 4bf92f3577b34da6 - %% SpanId: 00f067aa0ba902b7 - %% Enabled: true - ShortTraceIDHeaders = ?B3_HEADERS(<<"4bf92f3577b34da6">>, <<"00f067aa0ba902b7">>, <<"1">>), - ShortTraceIDDecoded = oc_propagation_http_b3:from_headers(ShortTraceIDHeaders), - ShortTraceIDEncoded = oc_propagation_http_b3:to_headers(ShortTraceIDDecoded), - compare_b3_headers(ShortTraceIDEncoded, ShortTraceIDHeaders), - ?assertEqual(ShortTraceIDDecoded, oc_propagation_http_b3:from_headers(ShortTraceIDEncoded)), - %% TraceId: 4bf92f3577b34da6a3ce929d0e0e4736 %% SpanId: 00f067aa0ba902b7 %% Enabled: false From a05491c46d4ac8ade9c90aadd716f68381d78be6 Mon Sep 17 00:00:00 2001 From: Catalina Astengo Date: Mon, 17 Aug 2020 10:52:47 -0600 Subject: [PATCH 4/5] adds span kind to octrace --- src/oc_trace.erl | 14 +++++++++++++- src/opencensus.erl | 11 ++++++++++- test/opencensus_SUITE.erl | 15 +++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/oc_trace.erl b/src/oc_trace.erl index 9fd55e2..61e823d 100644 --- a/src/oc_trace.erl +++ b/src/oc_trace.erl @@ -49,7 +49,9 @@ message_event/4, - set_status/3]). + set_status/3, + + set_kind/2]). -dialyzer({nowarn_function, update_trace_options/2}). @@ -302,6 +304,16 @@ set_status(Code, Message, #span_ctx{span_id=SpanId, set_status(_Code, _Message, _Span) -> true. +%%-------------------------------------------------------------------- +%% @doc +%% Set Kind. Returns true if the data was successfully updated. +%% @end +%%-------------------------------------------------------------------- +-spec set_kind(opencensus:span_kind(), maybe(opencensus:span_ctx()))-> boolean(). +set_kind(Kind, SpanCtx) -> + lookup_and_replace(SpanCtx, fun(SpanData) -> + oc_span:set_kind(Kind, SpanData) + end). %%-------------------------------------------------------------------- %% @doc diff --git a/src/opencensus.erl b/src/opencensus.erl index b587f6e..ea52642 100644 --- a/src/opencensus.erl +++ b/src/opencensus.erl @@ -19,7 +19,8 @@ -export([generate_trace_id/0, generate_span_id/0, - http_status_to_trace_status/1]). + http_status_to_trace_status/1, + span_kind_server/0]). -include("opencensus.hrl"). @@ -108,6 +109,14 @@ http_status_to_trace_status(503) -> http_status_to_trace_status(S) -> S. +%%-------------------------------------------------------------------- +%% @doc +%% Returns atom for span kind server to set on trace. +%% @end +%%-------------------------------------------------------------------- +-spec span_kind_server() -> span_kind(). +span_kind_server() -> ?SPAN_KIND_SERVER. + %% %% Before OTP-20 rand:uniform could not give precision higher than 2^56. diff --git a/test/opencensus_SUITE.erl b/test/opencensus_SUITE.erl index 486c755..032c765 100644 --- a/test/opencensus_SUITE.erl +++ b/test/opencensus_SUITE.erl @@ -212,6 +212,21 @@ status(Config) -> ?assertMatch(#status{code=Code, message=Message}, SpanData#span.status). +kind(Config) -> + Tab = ?config(tid, Config), + SpanName1 = <<"kind-span-1">>, + SpanCtx = oc_trace:start_span(SpanName1, undefined), + SpanKind = ?SPAN_KIND_SERVER, + + oc_trace:set_kind(SpanKind, SpanCtx), + + ?FINISH(Tab, SpanCtx), + + [SpanData] = ets:lookup(Tab, SpanCtx#span_ctx.span_id), + ?assertEqual(SpanName1, SpanData#span.name), + ?assertEqual(SpanKind, SpanData#span.kind), + ?assert(SpanData#span.end_time > SpanData#span.start_time). + ctx_with_span(Config) -> Tab = ?config(tid, Config), From 453d7feadb5226ebbafd7e99097b055e37f9bad1 Mon Sep 17 00:00:00 2001 From: Catalina Astengo Date: Mon, 17 Aug 2020 12:43:52 -0600 Subject: [PATCH 5/5] functions to access span kind macros --- src/opencensus.erl | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/opencensus.erl b/src/opencensus.erl index ea52642..02c69e4 100644 --- a/src/opencensus.erl +++ b/src/opencensus.erl @@ -20,7 +20,9 @@ -export([generate_trace_id/0, generate_span_id/0, http_status_to_trace_status/1, - span_kind_server/0]). + span_kind_client/0, + span_kind_server/0, + span_kind_unspecified/0]). -include("opencensus.hrl"). @@ -109,6 +111,14 @@ http_status_to_trace_status(503) -> http_status_to_trace_status(S) -> S. +%%-------------------------------------------------------------------- +%% @doc +%% Returns atom for span kind client to set on trace. +%% @end +%%-------------------------------------------------------------------- +-spec span_kind_client() -> span_kind(). +span_kind_client() -> ?SPAN_KIND_CLIENT. + %%-------------------------------------------------------------------- %% @doc %% Returns atom for span kind server to set on trace. @@ -117,6 +127,15 @@ http_status_to_trace_status(S) -> -spec span_kind_server() -> span_kind(). span_kind_server() -> ?SPAN_KIND_SERVER. +%%-------------------------------------------------------------------- +%% @doc +%% Returns atom for span kind unspecified to set on trace. +%% @end +%%-------------------------------------------------------------------- +-spec span_kind_unspecified() -> span_kind(). +span_kind_unspecified() -> ?SPAN_KIND_UNSPECIFIED. + + %% %% Before OTP-20 rand:uniform could not give precision higher than 2^56.