{application, beam_stats,
[
{description, "Periodic VM stats production and consumption."},
- {vsn, "0.14.2"},
+ {vsn, "0.14.3"},
{registered, []},
{applications,
[ kernel
-spec collect(beam_stats_delta:t()) ->
t().
collect(DeltasServer) ->
- {_, DeltaOfReductions} = beam_stats_source:erlang_statistics(reductions),
{ {io_bytes_in , DeltaOfIOBytesIn}
, {io_bytes_out , DeltaOfIOBytesOut}
} = beam_stats_delta:of_io(DeltasServer),
, io_bytes_in = DeltaOfIOBytesIn
, io_bytes_out = DeltaOfIOBytesOut
, context_switches = beam_stats_delta:of_context_switches(DeltasServer)
- , reductions = DeltaOfReductions
+ , reductions = beam_stats_delta:of_reductions(DeltasServer)
, run_queue = beam_stats_source:erlang_statistics(run_queue)
, ets = beam_stats_ets:collect()
, processes = beam_stats_processes:collect()
, stop/1
, of_context_switches/1
, of_io/1
+ , of_reductions/1
]).
-record(?MODULE,
, {io_bytes_out , DeltaOut}
}.
+% We can get between-calls-delta directly from erlang:statistics(reductions),
+% but then if some other process also calls it - we'll get incorrect data on
+% the next call.
+% Managing deltas ourselves here, will at least reduce the possible callers to
+% only those with knowledge of our table ID.
+-spec of_reductions(t()) ->
+ non_neg_integer().
+of_reductions(?T{erlang_statistics=Table}) ->
+ Key = reductions,
+ {Current, _} = beam_stats_source:erlang_statistics(Key),
+ delta(Table, Key, Current).
+
-spec delta(ets:tid(), atom(), non_neg_integer()) ->
non_neg_integer().
delta(Table, Key, CurrentTotal) ->
[ {io_bytes_in , 6}
, {io_bytes_out , 14}
, {context_switches , 10}
+ , {reductions , 18}
]
),
ct:log("meck_expect_beam_stats ok~n"),
IOBytesIn = hope_kv_list:get(Overrides, io_bytes_in , 3),
IOBytesOut = hope_kv_list:get(Overrides, io_bytes_out, 7),
ContextSwitches = hope_kv_list:get(Overrides, context_switches, 5),
+ Reductions = hope_kv_list:get(Overrides, reductions, 9),
Pid0 = list_to_pid("<0.0.0>"),
Pid1 = list_to_pid("<0.1.0>"),
Pid2 = list_to_pid("<0.2.0>"),
meck:expect(beam_stats_source, erlang_statistics,
fun (io ) -> {{input, IOBytesIn}, {output, IOBytesOut}}
; (context_switches) -> {ContextSwitches, 0}
- ; (reductions ) -> {0, 9} % 1st element is unused
+ ; (reductions ) -> {Reductions, undefined} % 2nd element is unused
; (run_queue ) -> 17
end
),