X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fbeam_stats_consumer_statsd.erl;h=97e458d0844e21034959fd2b2c46d1e68efa19a6;hb=f079a56c67f6d3210dc1e4e876eab915fe299013;hp=fe8299c5b9e36c1c823049b62e22fecebaabf3fd;hpb=e7b39f0719b5d561181b2ecb49da5b8e6a897076;p=beam_stats.git diff --git a/src/beam_stats_consumer_statsd.erl b/src/beam_stats_consumer_statsd.erl index fe8299c..97e458d 100644 --- a/src/beam_stats_consumer_statsd.erl +++ b/src/beam_stats_consumer_statsd.erl @@ -1,6 +1,7 @@ -module(beam_stats_consumer_statsd). -include("include/beam_stats.hrl"). +-include("beam_stats_logging.hrl"). -behaviour(beam_stats_consumer). @@ -8,14 +9,24 @@ [ option/0 ]). +%% Consumer interface -export( [ init/1 , consume/2 , terminate/1 ]). +%% Tests (to be run by CT): +-export( + [ ct_test__beam_stats_to_bins/1 + , ct_test__memory_component_to_statsd_msg/1 + , ct_test__statsd_msg_add_name_prefix/1 + , ct_test__statsd_msg_to_bin/1 + , ct_test__node_id_to_bin/1 + ]). + -type option() :: - {consumption_interval , erlang:time()} + {consumption_interval , non_neg_integer()} | {dst_host , inet:ip_address() | inet:hostname()} | {dst_port , inet:port_number()} | {src_port , inet:port_number()} @@ -55,7 +66,7 @@ %% ============================================================================ -spec init([option()]) -> - {erlang:time(), state()}. + {non_neg_integer(), state()}. init(Options) -> ConsumptionInterval = hope_kv_list:get(Options, consumption_interval, 60000), DstHost = hope_kv_list:get(Options, dst_host, ?DEFAULT_DST_HOST), @@ -89,7 +100,7 @@ terminate(#state{sock=SockOpt}) -> -spec try_to_send(state(), binary()) -> state(). try_to_send(#state{sock=none}=State, _) -> - io:format("error: socket closed~n"), + ?log_error("Sending failed. No socket in state."), % TODO: Maybe schedule retry? State; try_to_send( @@ -104,7 +115,10 @@ try_to_send( of ok -> State ; {error, _}=Error -> - io:format("error: gen_udp:send/4 failed: ~p~n", [Error]), + ?log_error( + "gen_udp:send(~p, ~p, ~p, ~p) -> ~p", + [Sock, DstHost, DstPort, Error] + ), % TODO: Do something with unsent messages? ok = gen_udp:close(Sock), State#state{sock=none} @@ -119,7 +133,7 @@ try_to_connect_if_no_socket(#state{sock=none, src_port=SrcPort}=State) -> of {ok, Sock} -> State#state{sock = {some, Sock}} ; {error, _}=Error -> - io:format("error: gen_udp:open/1 failed: ~p~n", [Error]), + ?log_error("gen_udp:open(~p) -> ~p", [SrcPort, Error]), State#state{sock = none} end. @@ -194,3 +208,28 @@ metric_type_to_bin(gauge) -> node_id_to_bin(NodeID) -> NodeIDBin = atom_to_binary(NodeID, utf8), re:replace(NodeIDBin, "[\@\.]", "_", [global, {return, binary}]). + +%% ============================================================================ +%% Tests +%% ============================================================================ + +ct_test__beam_stats_to_bins(_Cfg) -> + BEAMStats = #beam_stats{node_id = 'node@host.local', memory = [{foo,1}]}, + [<>] = + beam_stats_to_bins(BEAMStats). + +ct_test__memory_component_to_statsd_msg(_Cfg) -> + #statsd_msg{name = <<"foo">>, value = 1, type = gauge} = + memory_component_to_statsd_msg({foo, 1}). + +ct_test__statsd_msg_add_name_prefix(_Cfg) -> + Msg1 = #statsd_msg{name = <<"foo">>, value = 1, type = gauge}, + Msg2 = statsd_msg_add_name_prefix(Msg1, <<"bar">>), + <> = Msg2#statsd_msg.name. + +ct_test__statsd_msg_to_bin(_Cfg) -> + Msg = #statsd_msg{name = <<"foo">>, value = 1, type = gauge}, + <<"foo:1|g\n">> = statsd_msg_to_bin(Msg). + +ct_test__node_id_to_bin(_Cfg) -> + <<"foo_bar_local">> = node_id_to_bin('foo@bar.local').