Add modules
diff --git a/src/passage_mailbox_sup.erl b/src/passage_mailbox_sup.erl
index 61bc041..b0bbbe0 100644
--- a/src/passage_mailbox_sup.erl
+++ b/src/passage_mailbox_sup.erl
@@ -10,15 +10,20 @@
-spec start_child(passage:tracer()) -> {ok, pid()} | {error, Reason :: term()}.
start_child(Tracer) ->
- Child = #{
- id => Tracer,
- start => {passage_mailbox, start_link, [Tracer]},
- restart => permanent
- },
+ Child = make_child_spec(Tracer),
supervisor:start_child(?MODULE, Child).
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
init([]) ->
- {ok, {#{}, []}}.
+ Default = make_child_spec(passage_tracer:default_tracer()),
+ {ok, {#{}, [Default]}}.
+
+-spec make_child_spec(passage:tracer_id()) -> supervisor:child_spec().
+make_child_spec(Tracer) ->
+ #{
+ id => Tracer,
+ start => {passage_mailbox, start_link, [Tracer]},
+ restart => permanent
+ }.
diff --git a/src/passage_registry.erl b/src/passage_registry.erl
index 4ba0423..5e710e5 100644
--- a/src/passage_registry.erl
+++ b/src/passage_registry.erl
@@ -4,9 +4,9 @@
-export([start_link/0]).
--export([get_default_tracer/0]).
-export([get_sampler/1]).
-export([get_tracer_module/1]). % TODO: get_tracer(?)
+-export([register_tracer/4]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -21,17 +21,28 @@
start_link() ->
gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
--spec get_default_tracer() -> passage:tracer().
-get_default_tracer() ->
- error(unimplemented).
-
-spec get_sampler(passage:tracer()) -> passage_sampler:sampler().
get_sampler(Tracer) ->
- error(unimplemented, [Tracer]).
+ try ets:lookup(?MODULE, {sampler, Tracer}) of
+ [{_, Sampler}] -> Sampler;
+ _ -> passage_sampler_null:new()
+ catch
+ error:badarg -> passage_sampler_null:new()
+ end.
-spec get_tracer_module(passage:tracer()) -> module().
get_tracer_module(Tracer) ->
- error(unimplemented, [Tracer]).
+ try ets:lookup(?MODULE, {tracer, Tracer}) of
+ [{_, Tracer}] -> Tracer;
+ _ -> passage_tracer_null % TODO
+ catch
+ error:badarg -> passage_tracer_null
+ end.
+
+-spec register_tracer(passage:tracer_id(), module(), passage_sampler:sampler(), [passage_reporter:reporter()]) ->
+ ok | {error, Reason :: term()}.
+register_tracer(TracerId, Module, Sampler, Reporters) ->
+ error(unimplemented, [TracerId, Module, Sampler, Reporters]).
init([]) ->
Table = ets:new(?MODULE, [named_table, protected, {read_concurrency, true}]),
diff --git a/src/passage_reporter.erl b/src/passage_reporter.erl
new file mode 100644
index 0000000..c1df8ae
--- /dev/null
+++ b/src/passage_reporter.erl
@@ -0,0 +1 @@
+-module(passage_reporter).
diff --git a/src/passage_sampler.erl b/src/passage_sampler.erl
index 4ff6665..aee9db4 100644
--- a/src/passage_sampler.erl
+++ b/src/passage_sampler.erl
@@ -1,11 +1,12 @@
-module(passage_sampler).
+-export([new/2]).
-export([is_sampled/4]).
-export_type([sampler/0]).
-callback is_sampled(term(), passage:tracer(), passage:operation_name(), passage:tags()) ->
- bool.
+ boolean().
-opaque sampler() :: {?MODULE, module(), term()}.
@@ -13,3 +14,7 @@
bool.
is_sampled({?MODULE, Module, State}, Tracer, Name, Tags) ->
Module:is_sampled(State, Tracer, Name, Tags).
+
+-spec new(module(), term()) -> sampler().
+new(Module, State) ->
+ {?MODULE, Module, State}.
diff --git a/src/passage_sampler_all.erl b/src/passage_sampler_all.erl
new file mode 100644
index 0000000..f4a5e52
--- /dev/null
+++ b/src/passage_sampler_all.erl
@@ -0,0 +1,14 @@
+-module(passage_sampler_all).
+
+-behaviour(passage_sampler).
+
+-export([new/0]).
+
+-export([is_sampled/4]).
+
+-spec new() -> passage_sampler:sampler().
+new() ->
+ passage_sampler:new(?MODULE, undefined).
+
+is_sampled(_State, _Tracer, _OperationName, _Tags) ->
+ true.
diff --git a/src/passage_sampler_null.erl b/src/passage_sampler_null.erl
new file mode 100644
index 0000000..57ab102
--- /dev/null
+++ b/src/passage_sampler_null.erl
@@ -0,0 +1,14 @@
+-module(passage_sampler_null).
+
+-behaviour(passage_sampler).
+
+-export([new/0]).
+
+-export([is_sampled/4]).
+
+-spec new() -> passage_sampler:sampler().
+new() ->
+ passage_sampler:new(?MODULE, undefined).
+
+is_sampled(_State, _Tracer, _OperationName, _Tags) ->
+ false.
diff --git a/src/passage_tracer.erl b/src/passage_tracer.erl
index 1d77266..400c354 100644
--- a/src/passage_tracer.erl
+++ b/src/passage_tracer.erl
@@ -1,13 +1,19 @@
-module(passage_tracer).
+-export([start/2, start/3]).
-export([default_tracer/0]).
-export([get_sampler/1]).
-export([make_span_context_state/2]).
+-export_type([start_option/0]).
+
+-type start_option() :: {sampler, passage_sampler:sampler()}
+ | {reporters, [passage_reporter:reporter()]}.
+
-callback make_span_context_state(passage_span:span(), passage:baggage_items()) ->
passage_span_context:state().
-%% -callback inject_span_context(passage_span_context:context()) ->
+% -callback inject_span_context(passage_span_context:context()) ->
%% ok.
%% -callback extract_span_context() ->
%% {ok, passage_span_context:context()} | error.
@@ -21,8 +27,21 @@
-spec default_tracer() -> passage:tracer_id().
default_tracer() ->
- passage_registry:get_default_tracer().
+ default_tracer.
-spec get_sampler(passage:tracer_id()) -> passage_sampler:sampler().
get_sampler(Tracer) ->
passage_registry:get_sampler(Tracer).
+
+-spec start(passage:tracer_id(), module()) -> ok | {error, Reason :: term()}.
+start(TracerId, Module) ->
+ start(TracerId, Module, []).
+
+-spec start(passage:tracer_id(), module(), [start_option()]) ->
+ ok | {error, Reason :: term()}.
+start(TracerId, Module, Options) ->
+ Sampler = proplists:get_value(sampler, Options, passage_sampler_all:new()),
+ Reporters = proplists:get_value(reporters, Options, []),
+
+ %% TODO: s/passage_registry/passage_tracer_registry/
+ passage_registry:register_tracer(TracerId, Module, Sampler, Reporters).