Current section

Files

Jump to
task_graph src task_graph_flow.erl
Raw

src/task_graph_flow.erl

%% Listens to task_graph events and formats dependency
%% graph in dot format
-module(task_graph_flow).
-behaviour(gen_event).
-include("task_graph_int.hrl").
%% gen_event callbacks:
-export([ init/1, handle_event/2, handle_call/2
, handle_info/2, terminate/2, code_change/3
]).
-record(state,
{ fd :: file:io_device()
, start_ts :: integer()
}).
%%%===================================================================
%%% API
%%%===================================================================
%%%===================================================================
%%% gen_event callbacks
%%%===================================================================
init(Args) ->
Filename = maps:get(filename, Args, "task_graph_flow.log"),
{ok, FD} = file:open(Filename, [write]),
{ok, #state{ fd = FD
, start_ts = erlang:system_time(?tg_timeUnit)
}}.
handle_event(#tg_event{timestamp = Ts, kind = spawn_task, data = Task}, State) ->
log(Ts, spawn, Task, State),
{ok, State};
handle_event(#tg_event{timestamp = Ts, kind = Evt, data = Ref}, State)
when Evt =:= complete_task; Evt =:= task_failed ->
log(Ts, Evt, Ref, State),
{ok, State};
handle_event(_, State) ->
{ok, State}.
log(Ts, Event, Ref, #state{fd=FD, start_ts=T}) ->
Dt = erlang:convert_time_unit( Ts - T
, native
, ?tg_timeUnit
),
io:format(FD, "~10B: ~p ~p~n", [Dt, Event, Ref]).
handle_call(_Request, State) ->
Reply = ok,
{ok, Reply, State}.
handle_info(_Info, State) ->
{ok, State}.
terminate(_Reason, #state{fd=FD}) ->
ok = file:close(FD).
code_change(_OldVsn, State, _Extra) ->
{ok, State}.