2
"""Parse tracelog output for analysis/diagrams.
4
NOTE: tracelog is still in development.
7
./wandb/tools/tracelog-tool.py
8
./wandb/tools/tracelog-tool.py --logdir logdir/
9
./wandb/tools/tracelog-tool.py --format plantuml
15
from dataclasses import dataclass
16
from typing import List
29
def __init__(self) -> None:
30
self._items: List[SequenceItem] = []
31
self._uuid_messages = dict()
33
def _parse(self, line: str) -> None:
35
index = line.find("TRACELOG(")
43
magic, direct, ts, msg_id, op, resource, thr, msg, uuid, stream = items
44
self._uuid_messages.setdefault(uuid, msg)
45
if magic != "TRACELOG(1)":
47
thr = thr.replace("-", "_")
62
msg = "return_" + self._uuid_messages.get(uuid)
63
item = SequenceItem(ts=ts, src=src, request=request, dst=dst, info=msg)
66
def add(self, item: SequenceItem):
67
self._items.append(item)
69
def output_plantuml(self) -> None:
71
for item in self._items:
72
line = f"{item.src} --> {item.dst}: {item.info}"
73
lines.append((item.ts, line))
77
skinparam responseMessageBelowArrow true
79
participant User as MainThread
80
control router as MsgRouterThr
81
control check_stop as ChkStopThr
82
control net_stat as NetStatThr
85
queue record_q as record_q
86
queue result_q as result_q
89
control handler as HandlerThread
90
control stats as StatsThr
92
queue write_q as write_q
93
control writer as WriterThread
94
control sender as SenderThread
99
for _, line in sorted(lines):
103
def output_mermaid(self) -> None:
105
for item in self._items:
106
line = f"{item.src} ->> {item.dst}: {item.info}"
107
lines.append((item.ts, line))
111
participant MainThread as User
112
participant MsgRouterThr as router
113
participant ChkStopThr as check_stop
114
participant NetStatThr as net_stat
116
participant record_q as record_q
117
participant result_q as result_q
119
participant HandlerThread as handler
120
participant StatsThr as stats
121
participant send_q as send_q
122
participant write_q as write_q
123
participant WriterThread as writer
124
participant SenderThread as sender
128
for _, line in sorted(lines):
131
def load(self, fname: str) -> None:
132
with open(fname) as f:
133
for line in f.readlines():
136
def loaddir(self, dname: str) -> None:
138
for p in pathlib.Path(dname).iterdir():
148
argparser = argparse.ArgumentParser()
149
argparser.add_argument("--logdir", default="wandb/latest-run/logs/")
150
argparser.add_argument("--format", default="mermaid")
151
args = argparser.parse_args()
153
parser = TracelogParser()
154
parser.loaddir(args.logdir)
155
if args.format == "plantuml":
156
parser.output_plantuml()
157
elif args.format == "mermaid":
158
parser.output_mermaid()
160
print(f"Unknown format: {args.format}")
164
if __name__ == "__main__":