Current section

Files

Jump to
statsderl src statsderl_server.erl
Raw

src/statsderl_server.erl

-module(statsderl_server).
-include("statsderl.hrl").
-compile(inline).
-compile({inline_size, 512}).
-export([
init/2,
start_link/1
]).
-record(state, {
header :: iodata(),
socket :: inet:socket()
}).
%% public
-spec init(pid(), atom()) ->
no_return().
init(Parent, Name) ->
BaseKey = ?ENV(?ENV_BASEKEY, ?DEFAULT_BASEKEY),
Hostname = ?ENV(?ENV_HOSTNAME, ?DEFAULT_HOSTNAME),
Port = ?ENV(?ENV_PORT, ?DEFAULT_PORT),
case udp_header(Hostname, Port, BaseKey) of
{ok, Header} ->
case gen_udp:open(0, [{active, false}]) of
{ok, Socket} ->
register(Name, self()),
proc_lib:init_ack(Parent, {ok, self()}),
loop(#state {
socket = Socket,
header = Header
});
{error, Reason} ->
exit(Reason)
end;
{error, Reason} ->
exit(Reason)
end.
-spec start_link(atom()) ->
{ok, pid()}.
start_link(Name) ->
proc_lib:start_link(?MODULE, init, [self(), Name]).
%% private
loop(#state {
header = Header,
socket = Socket
} = State) ->
receive
{cast, Packet} ->
erlang:port_command(Socket, [Header, Packet]),
loop(State);
{inet_reply, _Socket, ok} ->
loop(State);
{inet_reply, _Socket, {error, Reason}} ->
statsderl_utils:error_msg("inet_reply error: ~p~n", [Reason]),
loop(State)
end.
udp_header(Hostname, Port, BaseKey) ->
case statsderl_utils:getaddrs(Hostname) of
{ok, {A, B, C, D}} ->
Header = statsderl_udp:header({A, B, C, D}, Port),
BaseKey2 = statsderl_utils:base_key(BaseKey),
{ok, [Header, BaseKey2]};
{error, Reason} ->
{error, Reason}
end.