55import subprocess
66from prometheus_api_client import PrometheusConnect
77from utils import FLAMEGRAPHS_DIR , get_git_root
8+ from flamegraph import get_function_symbol
89
9- def get_stack_lines (prom , group_by_kvs , stack_keys , metric_name , sum_metrics = None ):
10+ def get_stack_lines (prom , group_by_kvs , stack_keys , metric_name , sum_metrics = None , string_table = None ):
1011 """
1112 Filters metrics from prometheus for entries that look like:
1213 [ { labels: [["key1", "span1;span2"], ["key2", "span3"]], "metric": metric_name, "value": 2 } ]
@@ -43,7 +44,15 @@ def get_stack_lines(prom, group_by_kvs, stack_keys, metric_name, sum_metrics=Non
4344 if key not in labels :
4445 filter = True
4546 break
46- stack_values .append (labels [key ])
47+ if key == 'cycle_tracker_span' :
48+ if labels [key ] == '' or string_table is None :
49+ stack_values .append (labels [key ])
50+ else :
51+ symbol_offsets = labels [key ].split (';' )
52+ function_symbols = [get_function_symbol (string_table , offset ) for offset in symbol_offsets ]
53+ stack_values .extend (function_symbols )
54+ else :
55+ stack_values .append (labels [key ])
4756 if filter :
4857 continue
4958
@@ -60,8 +69,8 @@ def get_stack_lines(prom, group_by_kvs, stack_keys, metric_name, sum_metrics=Non
6069 return lines if non_zero else []
6170
6271
63- def create_flamegraph (fname , prom , group_by_kvs , stack_keys , metric_name , sum_metrics = None , reverse = False ):
64- lines = get_stack_lines (prom , group_by_kvs , stack_keys , metric_name , sum_metrics )
72+ def create_flamegraph (fname , prom , group_by_kvs , stack_keys , metric_name , sum_metrics = None , reverse = False , string_table = None ):
73+ lines = get_stack_lines (prom , group_by_kvs , stack_keys , metric_name , sum_metrics , string_table )
6574 if not lines :
6675 return
6776
@@ -88,24 +97,24 @@ def create_flamegraph(fname, prom, group_by_kvs, stack_keys, metric_name, sum_me
8897 print (f"Created flamegraph at { flamegraph_path } " )
8998
9099
91- def create_flamegraphs (prom , group_by , stack_keys , metric_name , sum_metrics = None , reverse = False ):
100+ def create_flamegraphs (prom , group_by , stack_keys , metric_name , sum_metrics = None , reverse = False , string_table = None ):
92101 # Assume group_by is a list of length 1
93102 group_by_values_list = prom .get_label_values (label_name = group_by [0 ])
94103 for group_by_values in group_by_values_list :
95104 group_by_kvs = list (zip (group_by , [group_by_values ]))
96105 fname = 'metrics' + '-' + '-' .join ([group_by_values ])
97- create_flamegraph (fname , prom , group_by_kvs , stack_keys , metric_name , sum_metrics , reverse = reverse )
106+ create_flamegraph (fname , prom , group_by_kvs , stack_keys , metric_name , sum_metrics , reverse = reverse , string_table = string_table )
98107
99108
100- def create_custom_flamegraphs (prom , group_by = ["group" ]):
109+ def create_custom_flamegraphs (prom , group_by = ["group" ], string_table = None ):
101110 for reverse in [False , True ]:
102111 create_flamegraphs (prom , group_by , ["cycle_tracker_span" , "dsl_ir" , "opcode" ], "frequency" ,
103- reverse = reverse )
112+ reverse = reverse , string_table = string_table )
104113 create_flamegraphs (prom , group_by , ["cycle_tracker_span" , "dsl_ir" , "opcode" , "air_name" ], "cells_used" ,
105- reverse = reverse )
114+ reverse = reverse , string_table = string_table )
106115 create_flamegraphs (prom , group_by , ["cell_tracker_span" ], "cells_used" ,
107116 sum_metrics = ["simple_advice_cells" , "fixed_cells" , "lookup_advice_cells" ],
108- reverse = reverse )
117+ reverse = reverse , string_table = string_table )
109118
110119
111120def main ():
@@ -117,11 +126,18 @@ def main():
117126
118127 argparser = argparse .ArgumentParser ()
119128 argparser .add_argument ('prometheus_url' , type = str , help = "Path to the prometheus server" )
129+ argparser .add_argument ('--guest-symbols' , type = str , help = "Path to the guest symbols file" , default = None , required = False )
120130 args = argparser .parse_args ()
121131
132+ if args .guest_symbols :
133+ with open (args .guest_symbols , 'rb' ) as f :
134+ string_table = f .read ()
135+ else :
136+ string_table = None
137+
122138 prom = PrometheusConnect (url = args .prometheus_url , disable_ssl = True )
123139
124- create_custom_flamegraphs (prom )
140+ create_custom_flamegraphs (prom , string_table = string_table )
125141
126142
127143if __name__ == '__main__' :
0 commit comments