summary refs log tree commit diff
path: root/scripts/graph_tracer.py
blob: ba6b62389cc0d032af305a66a895e2e01908d369 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
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')