#!/usr/bin/python import json import csv import sys import os class FancyFloat(float): def __repr__(self): return format(Decimal(self), "f") class JsonRpcEncoder(json.JSONEncoder): def decimalize(self, val): if isinstance(val, dict): return {k:self.decimalize(v) for k,v in val.items()} if isinstance(val, (list, tuple)): return type(val)(self.decimalize(v) for v in val) if isinstance(val, float): return FancyFloat(val) return val def encode(self, val): return super().encode(self.decimalize(val)) if len(sys.argv) == 1: sys.exit(1) trace_events = [] call_stack = [] l = [p for p in os.listdir(sys.argv[1]) if p.endswith(".report")] if len(l) == 0: print("No reports are in this folder") sys.exit(1) file_name = l[0] with open(file_name, "r") as in_file: csv_reader = csv.reader(in_file, delimiter=',') pf = 1 first_line = True last_ts = -1; for line in csv_reader: if first_line: pf = float(line[0]) / 1000 first_line = False continue if line[0] == "->": call_stack.append(line) elif line[0] == "<-": call = call_stack.pop() ts = float(call[1]) dur = (float(line[1])-ts) dict = { "pid": 1, "tid": 1, "ts" : ts, "dur": dur, "ph" : "X", "name": call[2], "args": { "file": f"({call[3]}:{call[4]})", } } if call[5]: dict["args"]["info1"] = call[5] if call[6]: dict["args"]["info2"] = call[6] trace_events.append(dict) else: print("invalid syntax") break with open(f"{file_name}.json", "w") as out_file: out_file.write(json.dumps({"traceEvents": trace_events}, indent=4))