+%% ============================================================================
+
+t_full_cycle(_Cfg) ->
+ meck:new(beam_stats_source),
+ _BEAMStatsExpected = meck_expect_beam_stats(),
+
+ {ok,[hope,beam_stats]} = application:ensure_all_started(beam_stats),
+ ct:log("beam_stats started~n"),
+ ServerPort = 8125,
+ {ok, ServerSocket} = gen_udp:open(ServerPort, [binary, {active, false}]),
+ ct:log("UDP server started started~n"),
+ {ok, _} = beam_stats_consumer:add(beam_stats_consumer_statsd,
+ [ {consumption_interval , 60000}
+ , {dst_host , "localhost"}
+ , {dst_port , ServerPort}
+ , {src_port , 8124}
+ , {num_msgs_per_packet , 10}
+ ]
+ ),
+ ct:log("consumer added~n"),
+ _ = meck_expect_beam_stats(
+ % Double the original values, so that deltas will equal originals after
+ % 1 update of new beam_stats_state:t()
+ [ {io_bytes_in , 6}
+ , {io_bytes_out , 14}
+ , {context_switches , 10}
+ ]
+ ),
+ ct:log("meck_expect_beam_stats ok~n"),
+ {} = beam_stats_producer:sync_produce_consume(),
+ ct:log("produced and consumed~n"),
+ ok = application:stop(beam_stats),
+ ct:log("beam_stats stopped~n"),
+
+ ResultOfReceive1 = gen_udp:recv(ServerSocket, 0),
+ ResultOfReceive2 = gen_udp:recv(ServerSocket, 0),
+ ResultOfReceive3 = gen_udp:recv(ServerSocket, 0),
+ ResultOfReceive4 = gen_udp:recv(ServerSocket, 0),
+ ok = gen_udp:close(ServerSocket),
+ {ok, {_, _, PacketReceived1}} = ResultOfReceive1,
+ {ok, {_, _, PacketReceived2}} = ResultOfReceive2,
+ {ok, {_, _, PacketReceived3}} = ResultOfReceive3,
+ {ok, {_, _, PacketReceived4}} = ResultOfReceive4,
+ ct:log("PacketReceived1: ~n~s~n", [PacketReceived1]),
+ ct:log("PacketReceived2: ~n~s~n", [PacketReceived2]),
+ ct:log("PacketReceived3: ~n~s~n", [PacketReceived3]),
+ ct:log("PacketReceived4: ~n~s~n", [PacketReceived4]),
+ PacketsCombined =
+ << PacketReceived1/binary
+ , PacketReceived2/binary
+ , PacketReceived3/binary
+ , PacketReceived4/binary
+ >>,
+ ct:log("PacketsCombined: ~n~s~n", [PacketsCombined]),
+ MsgsExpected =
+ [ <<"beam_stats_v0.node_foo_host_bar.io.bytes_in:3|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.io.bytes_out:7|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.context_switches:5|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.reductions:9|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.run_queue:17|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.memory.mem_type_foo:1|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.memory.mem_type_bar:2|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.memory.mem_type_baz:3|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.ets_table.size.foo.NAMED:5|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.ets_table.memory.foo.NAMED:40|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.ets_table.size.bar.TID:16|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.ets_table.memory.bar.TID:128|g">>
+
+ % Processes totals
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_all:4|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_exiting:0|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_garbage_collecting:0|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_registered:1|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_runnable:0|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_running:3|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_suspended:0|g">>
+ , <<"beam_stats_v0.node_foo_host_bar.processes_count_waiting:1|g">>