@@ -10,41 +10,79 @@ using Dagger
10
10
11
11
function logs_to_chrome_trace (logs:: Dict )
12
12
execution_logs = Dict {Int,Any} ()
13
+ tid_to_uid = Dict {Int,UInt} ()
14
+ uid_to_name = Dict {UInt,String} ()
13
15
add_unknown_procs_metadata = false
14
- Dagger. logs_event_pairs (logs) do w, start_idx, finish_idx
15
- category = logs[w][:core ][start_idx]. category
16
- if category == :compute
17
- tid = logs[w][:id ][start_idx]. thunk_id # thunk id
18
- if ! haskey (execution_logs, tid)
19
- execution_logs[tid] = Dict {Symbol,Any} ()
16
+ for w in keys (logs)
17
+ for idx in 1 : length (logs[w][:core ])
18
+ category = logs[w][:core ][idx]. category
19
+ kind = logs[w][:core ][idx]. kind
20
+ if category == :compute
21
+ tid = logs[w][:id ][idx]. thunk_id # thunk id
22
+ if ! haskey (execution_logs, tid)
23
+ execution_logs[tid] = Dict {Symbol,Any} ()
24
+ end
25
+ if kind == :start
26
+ # start time
27
+ execution_logs[tid][:ts ] = logs[w][:core ][idx]. timestamp / 1e3 # us
28
+ # proc
29
+ proc = logs[w][:id ][idx]. processor
30
+ if proc isa Dagger. ThreadProc
31
+ execution_logs[tid][:pid ] = proc. owner
32
+ execution_logs[tid][:tid ] = proc. tid # thread id
33
+ else
34
+ @warn " Compute event for [$tid ] executed on non-Dagger.ThreadProc processor. Assigning unknown pid and tid"
35
+ execution_logs[tid][:pid ] = - 1
36
+ execution_logs[tid][:tid ] = - 1
37
+ add_unknown_procs_metadata = true
38
+ end
39
+ else
40
+ # stop time (temporary as duration is used in the trace format)
41
+ execution_logs[tid][:_stop ] = logs[w][:core ][idx]. timestamp / 1e3 # us
42
+ end
43
+ elseif category == :add_thunk && kind == :start
44
+ tid = logs[w][:id ][idx]. thunk_id
45
+ if ! haskey (execution_logs, tid)
46
+ execution_logs[tid] = Dict {Symbol,Any} ()
47
+ end
48
+ # auto name
49
+ execution_logs[tid][:name ] = logs[w][:taskfuncnames ][idx]
50
+ # uid-tid mapping for user task name
51
+ if haskey (logs[w], :taskuidtotid )
52
+ uid_tid = logs[w][:taskuidtotid ][idx]
53
+ if uid_tid != = nothing
54
+ uid, tid = uid_tid:: Pair{UInt,Int}
55
+ tid_to_uid[tid] = uid
56
+ end
57
+ end
58
+ elseif category == :data_annotation && kind == :start
59
+ # user task name
60
+ id = logs[w][:id ][idx]:: NamedTuple
61
+ name = String (id. name)
62
+ obj = id. objectid:: Dagger.LoggedMutableObject
63
+ objid = obj. objid
64
+ uid_to_name[objid] = name
20
65
end
21
- t_start = logs[w][:core ][start_idx]. timestamp / 1e3 # us
22
- t_stop = logs[w][:core ][finish_idx]. timestamp / 1e3 # us
23
- proc = logs[w][:id ][start_idx]. processor
24
- execution_logs[tid][:ts ] = t_start
25
- execution_logs[tid][:dur ] = t_stop - t_start
26
- if proc isa Dagger. ThreadProc
27
- execution_logs[tid][:pid ] = proc. owner
28
- execution_logs[tid][:tid ] = proc. tid # thread id
29
- else
30
- @warn " Compute event for [$tid ] executed on non-Dagger.ThreadProc processor. Assigning unknown pid and tid"
31
- execution_logs[tid][:pid ] = - 1
32
- execution_logs[tid][:tid ] = - 1
33
- add_unknown_procs_metadata = true
34
- end
35
- elseif category == :add_thunk
36
- tid = logs[w][:id ][start_idx]. thunk_id
37
- if ! haskey (execution_logs, tid)
38
- execution_logs[tid] = Dict {Symbol,Any} ()
39
- end
40
- fname = logs[w][:taskfuncnames ][start_idx]
41
- execution_logs[tid][:name ] = fname
42
66
end
43
67
end
44
68
events = Vector {Dict{Symbol,Any}} ()
45
- for (_, v) in execution_logs
69
+ for (tid, v) in execution_logs
70
+ if ! haskey (v, :ts ) || ! haskey (v, :_stop )
71
+ continue
72
+ end
73
+ v[:dur ] = v[:_stop ] - v[:ts ]
74
+ delete! (v, :_stop )
75
+
46
76
v[:ph ] = " X"
47
77
v[:cat ] = " compute"
78
+
79
+ # replace auto name with user task name if present
80
+ if haskey (tid_to_uid, tid)
81
+ uid = tid_to_uid[tid]
82
+ if haskey (uid_to_name, uid)
83
+ v[:name ] = uid_to_name[uid]
84
+ end
85
+ end
48
86
push! (events, v)
49
87
end
50
88
if add_unknown_procs_metadata
0 commit comments