You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

76 lines
1.9 KiB

  1. #!/usr/bin/python
  2. import json
  3. import csv
  4. import sys
  5. import os
  6. class FancyFloat(float):
  7. def __repr__(self):
  8. return format(Decimal(self), "f")
  9. class JsonRpcEncoder(json.JSONEncoder):
  10. def decimalize(self, val):
  11. if isinstance(val, dict):
  12. return {k:self.decimalize(v) for k,v in val.items()}
  13. if isinstance(val, (list, tuple)):
  14. return type(val)(self.decimalize(v) for v in val)
  15. if isinstance(val, float):
  16. return FancyFloat(val)
  17. return val
  18. def encode(self, val):
  19. return super().encode(self.decimalize(val))
  20. if len(sys.argv) == 1:
  21. sys.exit(1)
  22. trace_events = []
  23. call_stack = []
  24. l = [p for p in os.listdir(sys.argv[1]) if p.endswith(".report")]
  25. if len(l) == 0:
  26. print("No reports are in this folder")
  27. sys.exit(1)
  28. file_name = l[0]
  29. with open(file_name, "r") as in_file:
  30. csv_reader = csv.reader(in_file, delimiter=',')
  31. pf = 1
  32. first_line = True
  33. last_ts = -1;
  34. for line in csv_reader:
  35. if first_line:
  36. pf = float(line[0]) / 1000
  37. first_line = False
  38. continue
  39. if line[0] == "->":
  40. call_stack.append(line)
  41. elif line[0] == "<-":
  42. call = call_stack.pop()
  43. ts = float(call[1])
  44. dur = (float(line[1])-ts)
  45. dict = {
  46. "pid": 1,
  47. "tid": 1,
  48. "ts" : ts,
  49. "dur": dur,
  50. "ph" : "X",
  51. "name": call[2],
  52. "args": {
  53. "file": f"({call[3]}:{call[4]})",
  54. }
  55. }
  56. if call[5]:
  57. dict["args"]["info1"] = call[5]
  58. if call[6]:
  59. dict["args"]["info2"] = call[6]
  60. trace_events.append(dict)
  61. else:
  62. print("invalid syntax")
  63. break
  64. with open(f"{file_name}.json", "w") as out_file:
  65. out_file.write(json.dumps({"traceEvents": trace_events}, indent=4))