blob: 45d4f66986f136a05ee5c1caffcaf0c764e618f5 [file] [log] [blame]
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""This script is used to generate trace from build_packages eventlog.
Usage:
$ ./build_packages --withevents --board=${BOARD}
$ build_trace /mnt/host/source/src/build/events/${date}.json > trace.json
$ # load trace.json from chrome://tracing
"""
from __future__ import print_function
import argparse
import json
import sys
def get_name(event):
name = ""
def append(event, name, key, sep="/"):
if key in event:
if name != "":
name += sep
name += event[key]
return name
name = append(event, name, "task_name")
name = append(event, name, "category")
name = append(event, name, "name")
name = append(event, name, "version", "-")
return name
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument("eventlogfile")
args = parser.parse_args(argv)
with open(args.eventlogfile) as f:
events = map(json.loads, f.readlines())
events.sort(key=lambda event: -event["finish_time"])
threads_starttime = []
trace_events = []
for event in events:
name = get_name(event)
start_time = int(event["start_time"] * 1e6)
finish_time = int(event["finish_time"] * 1e6)
dur = finish_time - start_time
candidate = [x for x in list(enumerate(threads_starttime))
if finish_time <= x[1]]
candidate.sort(key=lambda x: x[0])
if len(candidate) == 0:
tid = len(threads_starttime)
threads_starttime.append(start_time)
else:
tid = candidate[0][0]
threads_starttime[tid] = start_time
trace_events.append({
"name": name,
"ph": "X",
"ts": str(start_time),
"dur": str(dur),
"pid": "0",
"tid": str(tid),
})
json.dump(trace_events, sys.stdout)
if __name__ == "__main__":
main(sys.argv[1:])