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/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..02c69e4 100644 --- a/src/opencensus.erl +++ b/src/opencensus.erl @@ -19,7 +19,10 @@ -export([generate_trace_id/0, generate_span_id/0, - http_status_to_trace_status/1]). + http_status_to_trace_status/1, + span_kind_client/0, + span_kind_server/0, + span_kind_unspecified/0]). -include("opencensus.hrl"). @@ -108,6 +111,31 @@ 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. +%% @end +%%-------------------------------------------------------------------- +-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. 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/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),