blob: 50c5aa54c356f26186f82febef9623ab99d6aad7 [file] [log] [blame]
%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
%%
%% @doc Utility Functions
-module(jaeger_passage).
%%------------------------------------------------------------------------------
%% Exported API
%%------------------------------------------------------------------------------
-export([start_tracer/2, start_tracer/3]).
-export([stop_tracer/1]).
-export_type([start_tracer_option/0, start_tracer_options/0]).
%%------------------------------------------------------------------------------
%% Exported Types
%%------------------------------------------------------------------------------
-type start_tracer_options() :: [start_tracer_option()].
%% Options for {@link start_tracer/3}.
-type start_tracer_option() :: {reporter_id, jaeger_passage_reporter:reporter_id()}
| {max_queue_len, non_neg_integer() | infinity}
| jaeger_passage_reporter:start_option().
%% <ul>
%% <li>`reporter_id': In {@link start_tracer/3} function, it starts a reporter with this identifier. The default value is `Tracer'.</li>
%% <li>`max_queue_len': While the queue length of the reporter process exceeds this value, all new spans are rejected by the sampler. The default value is `1024'. Note that this value only affects the root spans (e.g., the child spans never be discarded by this limitation).</li>
%% </ul>
%%------------------------------------------------------------------------------
%% Exported Functions
%%------------------------------------------------------------------------------
%% @equiv start_tracer(TracerId, Sampler, [])
-spec start_tracer(Tracer, Sampler) -> ok | {error, Reason :: term()} when
Tracer :: passage:tracer_id(),
Sampler :: passage_sampler:sampler().
start_tracer(Tracer, Sampler) ->
start_tracer(Tracer, Sampler, []).
%% @doc Starts a tracer for Jaeger.
%%
%% This function also starts a reporter for the jaeger agent.
%%
%% Conceptually this is equivalent to the following code:
%%
%% ```
%% ReporterId = proplists:get_value(reporter_id, Options, Tracer),
%% Context = jaeger_passage_span_context,
%% {ok, Reporter} = jaeger_passage_reporter:start(ReporterId, Options),
%% passage_tracer_registry:register(Tracer, Context, Sampler, Reporter).
%% '''
%%
%% === Examples ===
%%
%% ```
%% %% Starts `test_tracer'
%% Sampler = passage_sampler_all:new().
%% ok = jaeger_passage:start_tracer(example_tracer, Sampler).
%%
%% [example_tracer] = passage_tracer_registry:which_tracers().
%% [example_tracer] = jaeger_passage_reporter:which_reporters().
%%
%% %% Starts and finishes spans
%% passage_pd:start_span(example_span, [{tracer, example_tracer}]).
%% passage_pd:log(#{message => "something wrong"}, [error]).
%% passage_pd:finish_span().
%%
%% %% Stops `example_tracer'
%% ok = jaeger_passage:stop_tracer(example_tracer).
%% [] = passage_tracer_registry:which_tracers().
%% [] = jaeger_passage_reporter:which_reporters().
%% '''
-spec start_tracer(Tracer, Sampler, Options) -> ok | {error, Reason :: term()} when
Tracer :: passage:tracer_id(),
Sampler :: passage_sampler:sampler(),
Options :: start_tracer_options().
start_tracer(Tracer, Sampler0, Options) ->
ReporterId = proplists:get_value(reporter_id, Options, Tracer),
MaxQueueLen = proplists:get_value(max_queue_len, Options, 1024),
Context = jaeger_passage_span_context,
Sampler1 =
case MaxQueueLen of
infinity -> Sampler0;
Max ->
(is_integer(Max) andalso Max >= 0) orelse
error(badarg, [Tracer, Sampler0, Options]),
jaeger_passage_sampler_queue_limit:new(Sampler0, ReporterId, Max)
end,
ReporterOptions =
lists:filter(fun ({reporter_id, _}) -> false;
({max_queue_len, _}) -> false;
(_) -> true
end,
Options),
case jaeger_passage_reporter:start(ReporterId, ReporterOptions) of
{error, Reason} -> {error, Reason};
{ok, Reporter} ->
passage_tracer_registry:register(Tracer, Context, Sampler1, Reporter)
end.
%% @doc Stops the tracer which has been started by {@link start_tracer/3}.
-spec stop_tracer(passage:tracer_id()) -> ok.
stop_tracer(Tracer) ->
case passage_tracer_registry:get_reporter(Tracer) of
error -> ok;
{ok, Reporter} ->
ReporterId = jaeger_passage_reporter:get_id(Reporter),
jaeger_passage_reporter:stop(ReporterId),
passage_tracer_registry:deregister(Tracer)
end.