This repository was archived by the owner on Mar 29, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathconvert_log.py
More file actions
119 lines (107 loc) · 4.55 KB
/
convert_log.py
File metadata and controls
119 lines (107 loc) · 4.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import json
import sys
def convert_timestamp_to_milliseconds(log_start, timestamp):
timestamp = int(timestamp) / 1e6
log_start = int(log_start) / 1e6
return timestamp - log_start
# Very crude, works for now
def parse_log_line(line):
parts = line.strip().split(',')
if len(parts) >= 4 and parts[0].endswith("EVENT"):
event_name = parts[1]
timestamp = parts[2]
extra_data = parts[3]
return event_name, timestamp, extra_data
return None
def convert(log_file):
event_pairs = {
"lfx_beginframe": "lfx_endframe",
"marker_SIMULATION_START": "marker_SIMULATION_END",
"marker_RENDERSUBMIT_START": "marker_RENDERSUBMIT_END",
"marker_PRESENT_START": "marker_PRESENT_END",
"async_marker_PRESENT_START": "async_marker_PRESENT_START",
"async_marker_OUB_RENDERSUBMIT_START": "async_marker_OUB_RENDERSUBMIT_END",
"async_marker_OUB_PRESENT_START": "async_marker_OUB_PRESENT_END"
}
in_progress_events = {}
events = []
with open(log_file, 'r') as file:
log_lines = file.readlines()
if not log_lines:
return None
# Find earliest timestamp
first_event = None
for line in log_lines:
first_event = parse_log_line(line)
if first_event:
break
if first_event is None:
raise ValueError("No valid log lines found in the log file.")
log_start_time = int(first_event[1])
for line in log_lines:
parsed = parse_log_line(line)
if parsed:
event_name, timestamp, extra_data = parsed
timestamp_ns = int(timestamp)
time_in_us = (timestamp_ns - log_start_time) // 1000
if event_name in event_pairs:
if extra_data not in in_progress_events:
in_progress_events[extra_data] = []
in_progress_events[extra_data].append((event_name, time_in_us))
elif event_name in event_pairs.values():
start_event_name = next((k for k, v in event_pairs.items() if v == event_name), None)
if start_event_name and extra_data in in_progress_events:
matching_event = next((evt for evt in in_progress_events[extra_data] if evt[0] == start_event_name), None)
if matching_event:
in_progress_events[extra_data].remove(matching_event)
begin_time = matching_event[1]
events.append({
"name": start_event_name.replace("_START", "").replace("begin", ""),
"cat": "LatencyFlex" if "lfx" in start_event_name else "Marker",
"ph": "X",
"ts": begin_time,
"dur": time_in_us - begin_time,
"pid": 0,
"args": {
"frame_id": extra_data,
}
})
if not in_progress_events[extra_data]:
del in_progress_events[extra_data]
elif event_name == "lfx_sleep" or event_name == "al2_sleep":
duration_us = int(extra_data) // 1000
events.append({
"name": event_name,
"cat": "LatencyFlex",
"ph": "X",
"ts": time_in_us,
"dur": duration_us,
"pid": 0
})
else:
events.append({
"name": event_name,
"cat": "General",
"ph": "i",
"ts": time_in_us,
"pid": 0,
"args": {
"frame_id": extra_data
}
})
return events
def main():
if len(sys.argv) > 1:
log_file = sys.argv[1]
output_file = 'trace_events.json'
trace_events = convert(log_file)
if trace_events:
with open(output_file, 'w') as file:
json.dump({"traceEvents": trace_events}, file, indent=4)
print("Trace event data saved to", output_file)
else:
print("No data to convert.")
else:
print("No path provided")
if __name__ == "__main__":
main()