From 52c8caaf82c00bd32d61148f58b24f0c099decbc Mon Sep 17 00:00:00 2001 From: Louis-Philippe Gauthier Date: Sun, 17 Dec 2017 16:34:07 -0500 Subject: [PATCH 1/3] Use Metal behaviour --- rebar.config | 1 + rebar.lock | 2 +- src/statsderl.app.src | 2 +- src/statsderl_server.erl | 66 +++++++++++++++++++++++----------------- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/rebar.config b/rebar.config index 92c6039..ba8c4a0 100644 --- a/rebar.config +++ b/rebar.config @@ -12,6 +12,7 @@ {deps, [ {foil, "0.1.0"}, {granderl, "0.1.5"}, + {metal, "0.1.1"}, {parse_trans, "3.0.0"} ]}. diff --git a/rebar.lock b/rebar.lock index 4c11859..06b6fa8 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,7 +1,7 @@ {"1.1.0", [{<<"foil">>,{pkg,<<"foil">>,<<"0.1.0">>},0}, {<<"granderl">>,{pkg,<<"granderl">>,<<"0.1.5">>},0}, - {<<"metal">>,{pkg,<<"metal">>,<<"0.1.1">>},1}, + {<<"metal">>,{pkg,<<"metal">>,<<"0.1.1">>},0}, {<<"parse_trans">>,{pkg,<<"parse_trans">>,<<"3.0.0">>},0}]}. [ {pkg_hash,[ diff --git a/src/statsderl.app.src b/src/statsderl.app.src index 907fcaa..c845851 100644 --- a/src/statsderl.app.src +++ b/src/statsderl.app.src @@ -1,5 +1,5 @@ {application, statsderl, [ - {applications, [kernel, stdlib, granderl, foil]}, + {applications, [kernel, stdlib, granderl, foil, metal]}, {description, "High Performance Erlang StatsD Client"}, {env, []}, {licenses, ["MIT"]}, diff --git a/src/statsderl_server.erl b/src/statsderl_server.erl index 3e29443..abe50f7 100644 --- a/src/statsderl_server.erl +++ b/src/statsderl_server.erl @@ -5,20 +5,33 @@ -compile({inline_size, 512}). -export([ - init/2, start_link/1 ]). +-behaviour(metal). +-export([ + init/3, + handle_msg/2, + terminate/2 +]). + -record(state, { header :: iodata(), socket :: inet:socket() }). %% public --spec init(pid(), atom()) -> - no_return(). +-spec start_link(atom()) -> + {ok, pid()}. -init(Parent, Name) -> +start_link(Name) -> + metal:start_link(?SERVER, Name, undefined). + +%% metal callbacks +-spec init(atom(), pid(), term()) -> + {ok, term()} | {stop, atom()}. + +init(_Name, _Parent, _Opts) -> BaseKey = ?ENV(?ENV_BASEKEY, ?DEFAULT_BASEKEY), Hostname = ?ENV(?ENV_HOSTNAME, ?DEFAULT_HOSTNAME), Port = ?ENV(?ENV_PORT, ?DEFAULT_PORT), @@ -27,43 +40,40 @@ init(Parent, Name) -> {ok, Header} -> case gen_udp:open(0, [{active, false}]) of {ok, Socket} -> - register(Name, self()), - proc_lib:init_ack(Parent, {ok, self()}), - - loop(#state { + {ok, #state { socket = Socket, header = Header - }); + }}; {error, Reason} -> - exit(Reason) + {stop, Reason} end; {error, Reason} -> - exit(Reason) + {stop, Reason} end. --spec start_link(atom()) -> - {ok, pid()}. +-spec handle_msg(term(), term()) -> + {ok, term()}. -start_link(Name) -> - proc_lib:start_link(?MODULE, init, [self(), Name]). - -%% private -loop(#state { +handle_msg({cast, Packet}, #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. + erlang:port_command(Socket, [Header, Packet]), + {ok, State}; +handle_msg({inet_reply, _Socket, ok}, State) -> + {ok, State}; +handle_msg({inet_reply, _Socket, {error, Reason}}, State) -> + statsderl_utils:error_msg("inet_reply error: ~p~n", [Reason]), + {ok, State}. + +-spec terminate(term(), term()) -> + ok. +terminate(_Reason, _State) -> + ok. + +%% private udp_header(Hostname, Port, BaseKey) -> case statsderl_utils:getaddrs(Hostname) of {ok, {A, B, C, D}} -> From cef2813edffc5919977d974694ac8a81578e33c9 Mon Sep 17 00:00:00 2001 From: Louis-Philippe Gauthier Date: Sun, 17 Dec 2017 16:37:16 -0500 Subject: [PATCH 2/3] Update DOC --- doc/statsderl_server.md | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/doc/statsderl_server.md b/doc/statsderl_server.md index 023a55d..99dc4be 100644 --- a/doc/statsderl_server.md +++ b/doc/statsderl_server.md @@ -4,24 +4,35 @@ * [Function Index](#index) * [Function Details](#functions) +__Behaviours:__ [`metal`](metal.md). + ## Function Index ## -
init/2
start_link/1
+
handle_msg/2
init/3
start_link/1
terminate/2
## Function Details ## - + + +### handle_msg/2 ### + +

+handle_msg(X1::term(), State::term()) -> {ok, term()}
+
+
+ + -### init/2 ### +### init/3 ###

-init(Parent::pid(), Name::atom()) -> no_return()
+init(Name::atom(), Parent::pid(), Opts::term()) -> {ok, term()} | {stop, atom()}
 

@@ -34,3 +45,12 @@ start_link(Name::atom()) -> {ok, pid()}
+ + +### terminate/2 ### + +

+terminate(Reason::term(), State::term()) -> ok
+
+
+ From e394e0855a076a7566f9541e33e271300a06436d Mon Sep 17 00:00:00 2001 From: Louis-Philippe Gauthier Date: Sun, 17 Dec 2017 16:39:44 -0500 Subject: [PATCH 3/3] Build on OTP-20.1 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 710b330..e62b463 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,6 +17,7 @@ language: erlang notifications: email: false otp_release: + - 20.1 - 19.1 - 18.3 script: "make travis"