Current section
Files
Jump to
Current section
Files
src/statsderl_pool.erl
-module(statsderl_pool).
-include("statsderl.hrl").
-compile(inline).
-compile({inline_size, 512}).
-export([
sample/2,
sample_scaled/2,
server_name/1
]).
%% public
-spec sample(sample_rate(), operation()) ->
ok.
sample(1, Operation) ->
operation(Operation);
sample(1.0, Operation) ->
operation(Operation);
sample(Rate, Operation) ->
RateInt = trunc(Rate * ?MAX_UNSIGNED_INT_32),
sample_scaled(RateInt, Operation).
-spec sample_scaled(non_neg_integer(), operation()) ->
ok.
sample_scaled(RateInt, Operation) ->
Rand = granderl:uniform(?MAX_UNSIGNED_INT_32),
case Rand =< RateInt of
true ->
N = Rand rem ?POOL_SIZE + 1,
operation(Operation, server_name(N));
false ->
ok
end.
-spec server_name(1..4) ->
atom().
server_name(1) -> statsderl_1;
server_name(2) -> statsderl_2;
server_name(3) -> statsderl_3;
server_name(4) -> statsderl_4.
%% private
cast({cast, _} = Cast, ServerName) ->
send(ServerName, Cast);
cast(Operation, ServerName) ->
send(ServerName, {cast, statsderl_protocol:encode(Operation)}).
operation(Operation) ->
operation(Operation, random_server()).
operation({timing_now, Key, Value}, ServerName) ->
Value2 = statsderl_utils:timing_now(Value),
cast({timing, Key, Value2}, ServerName);
operation({timing_now_us, Key, Value}, ServerName) ->
Value2 = statsderl_utils:timing_now_us(Value),
cast({timing, Key, Value2}, ServerName);
operation(Operation, ServerName) ->
cast(Operation, ServerName).
random_server() ->
server_name(granderl:uniform(?POOL_SIZE)).
send(ServerName, Msg) ->
try
ServerName ! Msg,
ok
catch
_:_ ->
ok
end.