6
6
7
7
from utils import FLAMEGRAPHS_DIR , get_git_root
8
8
9
- def get_stack_lines (metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics = None ):
9
+ def get_function_symbol (string_table , offset_str ):
10
+ try :
11
+ offset_int = int (offset_str )
12
+ end = string_table .find (b'\0 ' , offset_int )
13
+ if end == - 1 :
14
+ print (f"Invalid symbol offset: { offset_int } " )
15
+ return None
16
+ return string_table [offset_int :end ].decode ()
17
+ except ValueError :
18
+ return offset_str
19
+
20
+
21
+ def get_stack_lines (metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics = None , string_table = None ):
10
22
"""
11
23
Filters a metrics_dict obtained from json for entries that look like:
12
24
[ { labels: [["key1", "span1;span2"], ["key2", "span3"]], "metric": metric_name, "value": 2 } ]
@@ -40,7 +52,15 @@ def get_stack_lines(metrics_dict, group_by_kvs, stack_keys, metric_name, sum_met
40
52
if key not in labels :
41
53
filter = True
42
54
break
43
- stack_values .append (labels [key ])
55
+ if key == 'cycle_tracker_span' :
56
+ if labels [key ] == '' or string_table is None :
57
+ stack_values .append (labels [key ])
58
+ else :
59
+ symbol_offsets = labels [key ].split (';' )
60
+ function_symbols = [get_function_symbol (string_table , offset ) for offset in symbol_offsets ]
61
+ stack_values .extend (function_symbols )
62
+ else :
63
+ stack_values .append (labels [key ])
44
64
if filter :
45
65
continue
46
66
@@ -57,8 +77,8 @@ def get_stack_lines(metrics_dict, group_by_kvs, stack_keys, metric_name, sum_met
57
77
return lines if non_zero else []
58
78
59
79
60
- def create_flamegraph (fname , metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics = None , reverse = False ):
61
- lines = get_stack_lines (metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics )
80
+ def create_flamegraph (fname , metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics = None , reverse = False , string_table = None ):
81
+ lines = get_stack_lines (metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics , string_table )
62
82
if not lines :
63
83
return
64
84
@@ -86,7 +106,7 @@ def create_flamegraph(fname, metrics_dict, group_by_kvs, stack_keys, metric_name
86
106
print (f"Created flamegraph at { flamegraph_path } " )
87
107
88
108
89
- def create_flamegraphs (metrics_file , group_by , stack_keys , metric_name , sum_metrics = None , reverse = False ):
109
+ def create_flamegraphs (metrics_file , group_by , stack_keys , metric_name , sum_metrics = None , reverse = False , string_table = None ):
90
110
fname_prefix = os .path .splitext (os .path .basename (metrics_file ))[0 ]
91
111
92
112
with open (metrics_file , 'r' ) as f :
@@ -104,18 +124,18 @@ def create_flamegraphs(metrics_file, group_by, stack_keys, metric_name, sum_metr
104
124
for group_by_values in group_by_values_list :
105
125
group_by_kvs = list (zip (group_by , group_by_values ))
106
126
fname = fname_prefix + '-' + '-' .join (group_by_values )
107
- create_flamegraph (fname , metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics , reverse = reverse )
127
+ create_flamegraph (fname , metrics_dict , group_by_kvs , stack_keys , metric_name , sum_metrics , reverse = reverse , string_table = string_table )
108
128
109
129
110
- def create_custom_flamegraphs (metrics_file , group_by = ["group" ]):
130
+ def create_custom_flamegraphs (metrics_file , group_by = ["group" ], string_table = None ):
111
131
for reverse in [False , True ]:
112
132
create_flamegraphs (metrics_file , group_by , ["cycle_tracker_span" , "dsl_ir" , "opcode" ], "frequency" ,
113
- reverse = reverse )
133
+ reverse = reverse , string_table = string_table )
114
134
create_flamegraphs (metrics_file , group_by , ["cycle_tracker_span" , "dsl_ir" , "opcode" , "air_name" ], "cells_used" ,
115
- reverse = reverse )
135
+ reverse = reverse , string_table = string_table )
116
136
create_flamegraphs (metrics_file , group_by , ["cell_tracker_span" ], "cells_used" ,
117
137
sum_metrics = ["simple_advice_cells" , "fixed_cells" , "lookup_advice_cells" ],
118
- reverse = reverse )
138
+ reverse = reverse , string_table = string_table )
119
139
120
140
121
141
def main ():
@@ -127,9 +147,16 @@ def main():
127
147
128
148
argparser = argparse .ArgumentParser ()
129
149
argparser .add_argument ('metrics_json' , type = str , help = "Path to the metrics JSON" )
150
+ argparser .add_argument ('--guest-symbols' , type = str , help = "Path to the guest symbols file" , default = None , required = False )
130
151
args = argparser .parse_args ()
131
152
132
- create_custom_flamegraphs (args .metrics_json )
153
+ if args .guest_symbols :
154
+ with open (args .guest_symbols , 'rb' ) as f :
155
+ string_table = f .read ()
156
+ else :
157
+ string_table = None
158
+
159
+ create_custom_flamegraphs (args .metrics_json , string_table = string_table )
133
160
134
161
135
162
if __name__ == '__main__' :
0 commit comments