blob: 366e0cc3a0fd200ebaab2eca555c0a07f3f12d8d [file] [log] [blame]
%% @copyright 2017 Takeru Ohta <phjgt308@gmail.com>
%%
%% @private
-module(jaeger_passage_sampler_queue_limit).
-behaviour(passage_sampler).
%%------------------------------------------------------------------------------
%% Application Internal API
%%------------------------------------------------------------------------------
-export([new/3]).
%%------------------------------------------------------------------------------
%% 'passage_sampler' Callback API
%%------------------------------------------------------------------------------
-export([is_sampled/3]).
%%------------------------------------------------------------------------------
%% Application Internal Functions
%%------------------------------------------------------------------------------
-spec new(BaseSampler, ReporterId, non_neg_integer()) -> passage_sampler:sampler() when
BaseSampler :: passage_sampler:sampler(),
ReporterId :: jaeger_passage_reporter:reporter_id().
new(BaseSampler, Reporter, MaxReporterQueueLen) ->
passage_sampler:new(?MODULE, {BaseSampler, Reporter, MaxReporterQueueLen}).
%%------------------------------------------------------------------------------
%% 'passage_sampler' Callback Functions
%%------------------------------------------------------------------------------
%% @private
is_sampled({BaseSampler, ReporterId, MaxQueueLen}, OperationName, Tags) ->
case jaeger_passage_local_ns:whereis_reporter(ReporterId) of
undefined -> false;
Pid ->
case erlang:process_info(Pid, message_queue_len) of
{_, N} ->
(N =< MaxQueueLen) andalso
passage_sampler:is_sampled(BaseSampler, OperationName, Tags);
_ ->
false
end
end.