X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=src%2Fbeam_stats_state.erl;h=f21f2312fb5f3698e43c8735d5a25f5eda40f1ae;hb=28c1d03aafd6e29afd911f6e291cd46d9591575d;hp=17f9c904234bbb4d62c819ea1092e25dec608ff9;hpb=3fe887d79d3cfe5d52c42aa178b912b6521980a2;p=beam_stats.git diff --git a/src/beam_stats_state.erl b/src/beam_stats_state.erl index 17f9c90..f21f231 100644 --- a/src/beam_stats_state.erl +++ b/src/beam_stats_state.erl @@ -12,18 +12,37 @@ , export/1 ]). --record(?MODULE, - { timestamp :: erlang:timestamp() - , node_id :: atom() - , memory :: [{atom(), non_neg_integer()}] +-record(snapshots, + { memory :: [{atom(), non_neg_integer()}] + , run_queue :: non_neg_integer() + }). - , previous_io_bytes_in :: non_neg_integer() - , previous_io_bytes_out :: non_neg_integer() - , current_io_bytes_in :: non_neg_integer() - , current_io_bytes_out :: non_neg_integer() +-type snapshots() :: + #snapshots{}. - , previous_context_switches :: non_neg_integer() - , current_context_switches :: non_neg_integer() +-record(deltas, + { reductions :: non_neg_integer() + }). + +-type deltas() :: + #deltas{}. + +-record(totals, + { io_bytes_in :: non_neg_integer() + , io_bytes_out :: non_neg_integer() + , context_switches :: non_neg_integer() + }). + +-type totals() :: + #totals{}. + +-record(?MODULE, + { timestamp :: erlang:timestamp() + , node_id :: atom() + , snapshots :: snapshots() % Current state + , deltas :: deltas() % Accumulated since last check + , totals_previous :: totals() % Accumulated since VM start, as of last state + , totals_current :: totals() % Accumulated since VM start, as of this state }). -define(T, #?MODULE). @@ -34,66 +53,92 @@ -spec new() -> t(). new() -> - { {input , CurrentIOBytesIn} - , {output , CurrentIOBytesOut} - } = erlang:statistics(io), - {CurrentContextSwitches, 0} = erlang:statistics(context_switches), + TotalsPrevious = totals_empty(), + new(TotalsPrevious). + +-spec new(TotalsPrevious :: totals()) -> + t(). +new(#totals{}=TotalsPrevious) -> ?T - { timestamp = os:timestamp() - , node_id = erlang:node() - , memory = erlang:memory() - , previous_io_bytes_in = 0 - , previous_io_bytes_out = 0 - , current_io_bytes_in = CurrentIOBytesIn - , current_io_bytes_out = CurrentIOBytesOut - , previous_context_switches = 0 - , current_context_switches = CurrentContextSwitches + { timestamp = os:timestamp() + , node_id = erlang:node() + , snapshots = snapshots_new() + , deltas = deltas_new() + , totals_previous = TotalsPrevious + , totals_current = totals_new() }. -spec update(t()) -> t(). -update(?T - { previous_io_bytes_in = PreviousIOBytesIn - , previous_io_bytes_out = PreviousIOBytesOut - , previous_context_switches = PreviousContextSwitches - } -) -> - { {input , CurrentIOBytesIn} - , {output , CurrentIOBytesOut} - } = erlang:statistics(io), - {CurrentContextSwitches, 0} = erlang:statistics(context_switches), - ?T - { timestamp = os:timestamp() - , node_id = erlang:node() - , memory = erlang:memory() - , previous_io_bytes_in = PreviousIOBytesIn - , previous_io_bytes_out = PreviousIOBytesOut - , current_io_bytes_in = CurrentIOBytesIn - , current_io_bytes_out = CurrentIOBytesOut - , previous_context_switches = PreviousContextSwitches - , current_context_switches = CurrentContextSwitches - }. +update(?T{totals_current=TotalsPrevious}) -> + new(TotalsPrevious). -spec export(t()) -> beam_stats:t(). export( ?T - { timestamp = Timestamp - , node_id = NodeID - , memory = Memory - , previous_io_bytes_in = PreviousIOBytesIn - , previous_io_bytes_out = PreviousIOBytesOut - , current_io_bytes_in = CurrentIOBytesIn - , current_io_bytes_out = CurrentIOBytesOut - , previous_context_switches = PreviousContextSwitches - , current_context_switches = CurrentContextSwitches + { timestamp = Timestamp + , node_id = NodeID + , snapshots = + #snapshots + { memory = Memory + , run_queue = RunQueue + } + , deltas = + #deltas + { reductions = Reductions + } + , totals_previous = + #totals + { io_bytes_in = PreviousIOBytesIn + , io_bytes_out = PreviousIOBytesOut + , context_switches = PreviousContextSwitches + } + , totals_current = + #totals + { io_bytes_in = CurrentIOBytesIn + , io_bytes_out = CurrentIOBytesOut + , context_switches = CurrentContextSwitches + } } ) -> #beam_stats - { timestamp = Timestamp - , node_id = NodeID - , memory = Memory - , io_bytes_in = CurrentIOBytesIn - PreviousIOBytesIn - , io_bytes_out = CurrentIOBytesOut - PreviousIOBytesOut + { timestamp = Timestamp + , node_id = NodeID + , memory = Memory + , io_bytes_in = CurrentIOBytesIn - PreviousIOBytesIn + , io_bytes_out = CurrentIOBytesOut - PreviousIOBytesOut , context_switches = CurrentContextSwitches - PreviousContextSwitches + , reductions = Reductions + , run_queue = RunQueue + }. + +snapshots_new() -> + #snapshots + { memory = erlang:memory() + , run_queue = erlang:statistics(run_queue) + }. + +deltas_new() -> + {_ReductionsTotal, ReductionsDelta} = erlang:statistics(reductions), + #deltas + { reductions = ReductionsDelta + }. + +totals_new() -> + { {input , IOBytesIn} + , {output , IOBytesOut} + } = erlang:statistics(io), + {ContextSwitches, 0} = erlang:statistics(context_switches), + #totals + { io_bytes_in = IOBytesIn + , io_bytes_out = IOBytesOut + , context_switches = ContextSwitches + }. + +totals_empty() -> + #totals + { io_bytes_in = 0 + , io_bytes_out = 0 + , context_switches = 0 }.