%% @copyright 2017 Takeru Ohta %% %% @doc Probabilistic Sampler. %% %% This sampler samples the spans probabilistically. %% %% === Examples === %% %% ``` %% Context = passage_span_context_null, %% Sampler = passage_sampler_probabilistic:new(0.5), %% Reporter = passage_reporter_null:new(), %% %% ok = passage_tracer_registry:register(foo, Context, Sampler, Reporter). %% ''' -module(passage_sampler_probabilistic). -behaviour(passage_sampler). %%------------------------------------------------------------------------------ %% Exported API %%------------------------------------------------------------------------------ -export([new/1]). %%------------------------------------------------------------------------------ %% 'passage_sampler' Callback API %%------------------------------------------------------------------------------ -export([is_sampled/3]). %%------------------------------------------------------------------------------ %% Exported Functions %%------------------------------------------------------------------------------ %% @doc Makes a new sampler. %% %% This will sample spans by the given `SamplingRate'. %% E.g., if `SamplingRate = 0.5', the half of the spans are sampled probabilistically. %% %% The value of `SamplingRate' must be between `0.0' and `1.0'. -spec new(float()) -> passage_sampler:sampler(). new(SamplingRate) -> N = SamplingRate, case is_number(N) andalso 0 =< N andalso N =< 1 of false -> error(badarg, [SamplingRate]); true -> passage_sampler:new(?MODULE, SamplingRate) end. %%------------------------------------------------------------------------------ %% 'passage_sampler' Callback Functions %%------------------------------------------------------------------------------ %% @private is_sampled(SamplingRate, _OperationName, _Tags) -> rand:uniform() < SamplingRate.