Current section
Files
Jump to
Current section
Files
src/oc_server.erl
-module(oc_server).
-export([start_link/0,
add_span/1,
finish_span/1,
put_attribute/3,
put_attributes/2,
add_time_event/2,
add_time_event/3,
set_status/3,
add_link/2]).
-export([init/1,
handle_call/3,
handle_cast/2]).
-include("opencensus.hrl").
-record(state, {}).
start_link() ->
maybe_init_ets(),
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
add_span(Span) ->
gen_server:cast(?MODULE, {add_span, Span}).
finish_span(SpanCtx) ->
gen_server:cast(?MODULE, {finish_span, SpanCtx}).
put_attribute(Key, Value, SpanCtx) ->
gen_server:cast(?MODULE, {put_attribute, Key, Value, SpanCtx}).
put_attributes(NewAttributes, SpanCtx) ->
gen_server:cast(?MODULE, {put_attributes, NewAttributes, SpanCtx}).
add_time_event(TimeEvent, Span) ->
add_time_event(wts:timestamp(), TimeEvent, Span).
add_time_event(Timestamp, TimeEvent, SpanCtx) ->
gen_server:cast(?MODULE, {add_time_event, Timestamp, TimeEvent, SpanCtx}).
set_status(Code, Message, SpanCtx) ->
gen_server:cast(?MODULE, {set_status, Code, Message, SpanCtx}).
add_link(Link, SpanCtx) ->
gen_server:cast(?MODULE, {add_link, Link, SpanCtx}).
init([]) ->
{ok, #state{}}.
handle_call(_, _From, State) ->
{noreply, State}.
handle_cast({add_span, Span}, State) ->
ets:insert(?SPAN_TAB, Span),
{noreply, State};
handle_cast({finish_span, SpanId}, State) ->
ets:update_element(?SPAN_TAB, SpanId, [{#span.end_time, wts:timestamp()}]),
{noreply, State}.
maybe_init_ets() ->
case ets:info(?SPAN_TAB, name) of
undefined ->
ets:new(?SPAN_TAB, [named_table, public, {write_concurrency, true},
{read_concurrency, true}, {keypos, #span.span_id}]);
_ ->
ok
end.