diff --git a/scripts/graph_tracer.py b/scripts/graph_tracer.py
new file mode 100644
index 0000000000..ba6b62389c
--- /dev/null
+++ b/scripts/graph_tracer.py
@@ -0,0 +1,116 @@
+import fileinput
+import pydot
+
+nodes = {}
+edges = set()
+
+graph = pydot.Dot(graph_name="call_graph", graph_type="digraph")
+
+names = {}
+times = {}
+deferreds = {}
+deferred_edges = set()
+
+root_id = None
+
+for line in fileinput.input():
+ try:
+ if " calls " in line:
+ start, end = line.split(" calls ")
+ start, end = start.strip(), end.strip()
+ edges.add((start, end))
+ print start, end
+ if " named " in line:
+ node_id, name = line.split(" named ")
+ names[node_id.strip()] = name.strip()
+
+ if name.strip() == "Deferred synapse.rest.client.v1.room.RoomSendEventRestServlet.on_PUT":
+ root_id = node_id
+ if " in " in line:
+ node_id, d = line.split(" in ")
+ deferreds[node_id.strip()] = d.strip()
+ if " time " in line:
+ node_id, ms = line.split(" time ")
+ times[node_id.strip()] = int(ms.strip())
+ if " waits on " in line:
+ start, end = line.split(" waits on ")
+ start, end = start.strip(), end.strip()
+ deferred_edges.add((start, end))
+ print start, end
+ except Exception as e:
+ print "failed %s to parse '%s'" % (e.message, line)
+
+
+# deferreds_root = set(deferreds.values())
+# for parent, child in deferred_edges:
+# deferreds_root.discard(child)
+#
+# deferred_tree = {
+# d: {}
+# for d in deferreds_root
+# }
+#
+# def populate(root, tree):
+# for leaf in deferred_edges.get(root, []):
+# populate(leaf, tree.setdefault(leaf, {}))
+#
+#
+# for d in deferreds_root:
+# tree = deferred_tree.setdefault(d, {})
+# populate(d, tree)
+
+print deferred_edges
+print root_id
+
+def is_in_deferred(d):
+ while True:
+ if d == root_id:
+ return True
+
+ for start, end in deferred_edges:
+ if d == end:
+ d = start
+ break
+ else:
+ return False
+
+for node_id, name in names.items():
+ # if times.get(node_id, 100) < 5:
+ # continue
+
+ if node_id in deferreds:
+ if not is_in_deferred(deferreds[node_id]):
+ continue
+ else:
+ if not is_in_deferred(node_id):
+ continue
+
+ node = pydot.Node(node_id, label=name)
+
+ # if node_id in deferreds:
+ # clusters[deferreds[node_id]].add_node(node)
+ # elif node_id in clusters:
+ # clusters[node_id].add_node(node)
+ # else:
+ # graph.add_node(node)
+ graph.add_node(node)
+ nodes[node_id] = node
+
+ # print node_id
+
+for parent, child in edges:
+ if child not in nodes:
+ print child, "not a node"
+ continue
+
+ if parent not in nodes:
+ print parent, "not a node"
+ continue
+
+ edge = pydot.Edge(nodes[parent], nodes[child])
+ graph.add_edge(edge)
+
+
+file_prefix = "call_graph_out"
+graph.write('%s.dot' % file_prefix, format='raw', prog='dot')
+graph.write_svg("%s.svg" % file_prefix, prog='dot')
|