blob: 260ff56fe663c2f2a38bb3a586ba67ea8b3d268a [file] [log] [blame]
%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
%%
%% @doc Span Reporter.
%%
%% Note that this component has not been described in the
%% <a href="https://github.com/opentracing/specification/blob/1.1/specification.md">OpenTracing Specification</a>.
%%
%% === Callbacks ===
%%
%% This module requires following callback:
%%
%% ```
%% %% @doc Reports the finished span to an external observer (e.g., Jaeger agent).
%% -callback report(state(), FinishedSpan :: passage_span:span()) -> Ignored :: term().
%% '''
-module(passage_reporter).
%%------------------------------------------------------------------------------
%% Exported API
%%------------------------------------------------------------------------------
-export([new/2]).
-export([is_reporter/1]).
-export([get_module/1]).
-export([get_state/1]).
-export_type([reporter/0]).
-export_type([state/0]).
%%------------------------------------------------------------------------------
%% Application Internal API
%%------------------------------------------------------------------------------
-export([report/2]).
%%------------------------------------------------------------------------------
%% Callback API
%%------------------------------------------------------------------------------
-callback report(state(), passage_span:span()) -> Ignored :: term().
%%------------------------------------------------------------------------------
%% Macros & Records
%%------------------------------------------------------------------------------
-define(REPORTER, ?MODULE).
-record(?REPORTER,
{
module :: module(),
state :: state()
}).
%%------------------------------------------------------------------------------
%% Exported Types
%%------------------------------------------------------------------------------
-opaque reporter() :: #?REPORTER{}.
%% Reporter.
-type state() :: term().
%% Implementation-dependent state.
%%------------------------------------------------------------------------------
%% Exported Functions
%%------------------------------------------------------------------------------
%% @doc Makes a new reporter.
-spec new(module(), state()) -> passage_reporter:reporter().
new(Module, State) ->
#?REPORTER{module = Module, state = State}.
%% @doc Returns `true' if `X' is a reporter, otherwise `false'.
-spec is_reporter(reporter() | term()) -> boolean().
is_reporter(X) ->
is_record(X, ?REPORTER).
%% @doc Returns the module of `Reporter'.
-spec get_module(reporter()) -> module().
get_module(Reporter) ->
Reporter#?REPORTER.module.
%% @doc Returns the state of `Reporter'.
-spec get_state(reporter()) -> state().
get_state(Reporter) ->
Reporter#?REPORTER.state.
%%------------------------------------------------------------------------------
%% Application Internal Functions
%%------------------------------------------------------------------------------
%% @private
-spec report(reporter(), passage_span:span()) -> ok.
report(#?REPORTER{module = Module, state = State}, Span) ->
Module:report(State, Span),
ok.