From cdcb989e330d3a018b44b154c190c33b9b27040c Mon Sep 17 00:00:00 2001 From: Paul Oliver Date: Mon, 28 Sep 2015 18:04:16 +0200 Subject: [PATCH] Use iolists, where appropriate --- include/beam_stats_msg_statsd_gauge.hrl | 2 +- src/beam_stats_consumer_graphite.erl | 21 +++++++-------- src/beam_stats_consumer_statsd.erl | 21 +++++++-------- src/beam_stats_msg_graphite.erl | 35 ++++++++++++------------- src/beam_stats_msg_statsd_gauge.erl | 20 +++++++------- 5 files changed, 48 insertions(+), 51 deletions(-) diff --git a/include/beam_stats_msg_statsd_gauge.hrl b/include/beam_stats_msg_statsd_gauge.hrl index 445c8a7..415f2a7 100644 --- a/include/beam_stats_msg_statsd_gauge.hrl +++ b/include/beam_stats_msg_statsd_gauge.hrl @@ -1,4 +1,4 @@ -record(beam_stats_msg_statsd_gauge, - { name :: binary() + { name :: iolist() , value :: non_neg_integer() }). diff --git a/src/beam_stats_consumer_graphite.erl b/src/beam_stats_consumer_graphite.erl index 5122479..9f13a66 100644 --- a/src/beam_stats_consumer_graphite.erl +++ b/src/beam_stats_consumer_graphite.erl @@ -52,7 +52,7 @@ init(Options) -> -spec consume(beam_stats_consumer:queue(), state()) -> state(). consume(Q, #state{}=State1) -> - Payload = beam_stats_queue_to_binary(Q), + Payload = beam_stats_queue_to_iolists(Q), State2 = try_to_connect_if_no_socket(State1), try_to_send(State2, Payload). @@ -64,7 +64,7 @@ terminate(#state{sock=SockOpt}) -> %% ============================================================================ --spec try_to_send(state(), binary()) -> +-spec try_to_send(state(), iolist()) -> state(). try_to_send(#state{sock=none}=State, _) -> ?log_error("Sending failed. No socket in state."), @@ -105,14 +105,13 @@ try_to_connect_if_no_socket( State#state{sock = none} end. --spec beam_stats_queue_to_binary(beam_stats_consumer:queue()) -> - binary(). -beam_stats_queue_to_binary(Q) -> - Bins = [beam_stats_to_bins(B) || B <- queue:to_list(Q)], - iolist_to_binary(Bins). +-spec beam_stats_queue_to_iolists(beam_stats_consumer:queue()) -> + [iolist()]. +beam_stats_queue_to_iolists(Q) -> + [beam_stats_to_iolist(B) || B <- queue:to_list(Q)]. --spec beam_stats_to_bins(beam_stats:t()) -> - [binary()]. -beam_stats_to_bins(#beam_stats{}=BeamStats) -> +-spec beam_stats_to_iolist(beam_stats:t()) -> + [iolist()]. +beam_stats_to_iolist(#beam_stats{}=BeamStats) -> Msgs = beam_stats_msg_graphite:of_beam_stats(BeamStats), - lists:map(fun beam_stats_msg_graphite:to_bin/1, Msgs). + lists:map(fun beam_stats_msg_graphite:to_iolist/1, Msgs). diff --git a/src/beam_stats_consumer_statsd.erl b/src/beam_stats_consumer_statsd.erl index 644fb63..18be072 100644 --- a/src/beam_stats_consumer_statsd.erl +++ b/src/beam_stats_consumer_statsd.erl @@ -86,13 +86,13 @@ terminate(#state{sock=SockOpt}) -> %% Transport %% ============================================================================ --spec try_to_connect_and_send(binary(), state()) -> +-spec try_to_connect_and_send(iolist(), state()) -> state(). -try_to_connect_and_send(<>, #state{}=State1) -> +try_to_connect_and_send(Payload, #state{}=State1) -> State2 = try_to_connect_if_no_socket(State1), try_to_send(State2, Payload). --spec try_to_send(state(), binary()) -> +-spec try_to_send(state(), iolist()) -> state(). try_to_send(#state{sock=none}=State, _) -> ?log_error("Sending failed. No socket in state."), @@ -141,18 +141,17 @@ try_to_connect_if_no_socket(#state{sock=none, src_port=SrcPort}=State) -> non_neg_integer(), hope_option:t(binary()) ) -> - [binary()]. + [iolist()]. beam_stats_queue_to_packets(Q, NumMsgsPerPacket, StaticNodeNameOpt) -> - MsgBins = lists:append([beam_stats_to_bins(B, StaticNodeNameOpt) || B <- queue:to_list(Q)]), - MsgBinsChucks = hope_list:divide(MsgBins, NumMsgsPerPacket), - lists:map(fun erlang:iolist_to_binary/1, MsgBinsChucks). + MsgIOLists = lists:append([beam_stats_to_iolists(B, StaticNodeNameOpt) || B <- queue:to_list(Q)]), + hope_list:divide(MsgIOLists, NumMsgsPerPacket). --spec beam_stats_to_bins(beam_stats:t(), hope_option:t(binary())) -> - [binary()]. -beam_stats_to_bins(#beam_stats{node_id=NodeID}=BeamStats, StaticNodeNameOpt) -> +-spec beam_stats_to_iolists(beam_stats:t(), hope_option:t(binary())) -> + [iolist()]. +beam_stats_to_iolists(#beam_stats{node_id=NodeID}=BeamStats, StaticNodeNameOpt) -> NodeIDBinDefault = beam_stats_msg_graphite:node_id_to_bin(NodeID), NodeIDBin = hope_option:get(StaticNodeNameOpt, NodeIDBinDefault), MsgsGraphite = beam_stats_msg_graphite:of_beam_stats(BeamStats, NodeIDBin), MsgsStatsD = lists:map(fun beam_stats_msg_statsd_gauge:of_msg_graphite/1, MsgsGraphite), - lists:map(fun beam_stats_msg_statsd_gauge:to_bin/1, MsgsStatsD). + lists:map(fun beam_stats_msg_statsd_gauge:to_iolist/1, MsgsStatsD). diff --git a/src/beam_stats_msg_graphite.erl b/src/beam_stats_msg_graphite.erl index 6939653..d33e450 100644 --- a/src/beam_stats_msg_graphite.erl +++ b/src/beam_stats_msg_graphite.erl @@ -14,8 +14,8 @@ -export( [ of_beam_stats/1 , of_beam_stats/2 - , to_bin/1 - , path_to_bin/1 + , to_iolist/1 + , path_to_iolist/1 , node_id_to_bin/1 ]). @@ -64,25 +64,25 @@ of_beam_stats(#beam_stats ++ of_processes(Processes, NodeID, Ts), lists:map(fun path_prefix_schema_version/1, Msgs). --spec to_bin(t()) -> - binary(). -to_bin( +-spec to_iolist(t()) -> + iolist(). +to_iolist( ?T { path = Path , value = Value , timestamp = Timestamp } ) -> - PathBin = path_to_bin(Path), + PathIOList = path_to_iolist(Path), ValueBin = integer_to_binary(Value), TimestampInt = timestamp_to_integer(Timestamp), TimestampBin = integer_to_binary(TimestampInt), - <>. + [PathIOList, <<" ">>, ValueBin, <<" ">>, TimestampBin]. --spec path_to_bin([binary()]) -> - binary(). -path_to_bin(Path) -> - bin_join(Path, <<".">>). +-spec path_to_iolist([binary()]) -> + iolist(). +path_to_iolist(Path) -> + interleave(Path, <<".">>). -spec node_id_to_bin(node()) -> binary(). @@ -109,13 +109,12 @@ path_prefix(?T{path=Path}=T, <>) -> schema_version() -> <<"beam_stats_v0">>. --spec bin_join([binary()], binary()) -> - binary(). -bin_join([] , <<_/binary>> ) -> <<>>; -bin_join([<> | []] , <<_/binary>> ) -> B; -bin_join([<> | [_|_]=Bins], <>) -> - BinsBin = bin_join(Bins, Sep), - <>. +-spec interleave(iolist(), iodata()) -> + iolist(). +interleave([], _) -> []; +interleave([X], _) -> [X]; +interleave([X|Xs], Sep) -> + [X, Sep | interleave(Xs, Sep)]. -spec timestamp_to_integer(erlang:timestamp()) -> non_neg_integer(). diff --git a/src/beam_stats_msg_statsd_gauge.erl b/src/beam_stats_msg_statsd_gauge.erl index 8da0198..4f4c533 100644 --- a/src/beam_stats_msg_statsd_gauge.erl +++ b/src/beam_stats_msg_statsd_gauge.erl @@ -9,7 +9,7 @@ -export( [ of_msg_graphite/1 - , to_bin/1 + , to_iolist/1 ]). -define(T, #?MODULE). @@ -26,24 +26,24 @@ of_msg_graphite( , timestamp = _Timestamp } ) -> - PathBin = beam_stats_msg_graphite:path_to_bin(Path), - cons(PathBin, Value). + PathIOList = beam_stats_msg_graphite:path_to_iolist(Path), + cons(PathIOList, Value). --spec cons(binary(), non_neg_integer()) -> +-spec cons(iolist(), non_neg_integer()) -> t(). -cons(<>, Value) -> +cons(Name, Value) -> ?T { name = Name , value = Value }. --spec to_bin(t()) -> - binary(). -to_bin( +-spec to_iolist(t()) -> + iolist(). +to_iolist( ?T - { name = <> + { name = Name , value = Value } ) when Value >= 0 -> ValueBin = integer_to_binary(Value), - << Name/binary, ":", ValueBin/binary, "|g\n">>. + [Name, <<":">>, ValueBin, <<"|g\n">>]. -- 2.20.1