-type state() ::
#state{}.
--define(PATH_PREFIX , <<"beam_stats">>).
--define(DEFAULT_HOST , "localhost").
--define(DEFAULT_PORT , 2003).
--define(DEFAULT_TIMEOUT , 5000).
+-define(DEFAULT_HOST , "localhost").
+-define(DEFAULT_PORT , 2003).
+-define(DEFAULT_TIMEOUT , 5000).
-spec init([option()]) ->
{non_neg_integer(), state()}.
-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).
-spec terminate(state()) ->
{}.
terminate(#state{sock=SockOpt}) ->
- ok = hope_option:iter(SockOpt, fun gen_tcp:close/1),
- {}.
+ hope_option:iter(SockOpt, fun gen_tcp:close/1).
%% ============================================================================
--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."),
of ok ->
State
; {error, _}=Error ->
- ?log_error("gen_tcp:send(~p, ~p) -> ~p", [Sock, Payload, Error]),
+ ?log_error("gen_tcp:send(~p, Payload) -> ~p", [Sock, Error]),
% TODO: Maybe schedule retry?
ok = gen_tcp:close(Sock),
State#state{sock=none}
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_to_bins(beam_stats:t()) ->
- [binary()].
-beam_stats_to_bins(#beam_stats{}=BeamStats) ->
- MsgAddPrefix =
- fun (M) -> beam_stats_msg_graphite:add_path_prefix(M, ?PATH_PREFIX) end,
- Msgs1 = beam_stats_msg_graphite:of_beam_stats(BeamStats),
- Msgs2 = lists:map(MsgAddPrefix, Msgs1),
- lists:map(fun beam_stats_msg_graphite:to_bin/1, Msgs2).
+-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_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_iolist/1, Msgs).