5
5
import subprocess
6
6
from prometheus_api_client import PrometheusConnect
7
7
from utils import FLAMEGRAPHS_DIR , get_git_root
8
+ from flamegraph import get_function_symbol
8
9
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 ):
10
11
"""
11
12
Filters metrics from prometheus for entries that look like:
12
13
[ { 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
43
44
if key not in labels :
44
45
filter = True
45
46
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 ])
47
56
if filter :
48
57
continue
49
58
@@ -60,8 +69,8 @@ def get_stack_lines(prom, group_by_kvs, stack_keys, metric_name, sum_metrics=Non
60
69
return lines if non_zero else []
61
70
62
71
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 )
65
74
if not lines :
66
75
return
67
76
@@ -88,24 +97,24 @@ def create_flamegraph(fname, prom, group_by_kvs, stack_keys, metric_name, sum_me
88
97
print (f"Created flamegraph at { flamegraph_path } " )
89
98
90
99
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 ):
92
101
# Assume group_by is a list of length 1
93
102
group_by_values_list = prom .get_label_values (label_name = group_by [0 ])
94
103
for group_by_values in group_by_values_list :
95
104
group_by_kvs = list (zip (group_by , [group_by_values ]))
96
105
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 )
98
107
99
108
100
- def create_custom_flamegraphs (prom , group_by = ["group" ]):
109
+ def create_custom_flamegraphs (prom , group_by = ["group" ], string_table = None ):
101
110
for reverse in [False , True ]:
102
111
create_flamegraphs (prom , group_by , ["cycle_tracker_span" , "dsl_ir" , "opcode" ], "frequency" ,
103
- reverse = reverse )
112
+ reverse = reverse , string_table = string_table )
104
113
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 )
106
115
create_flamegraphs (prom , group_by , ["cell_tracker_span" ], "cells_used" ,
107
116
sum_metrics = ["simple_advice_cells" , "fixed_cells" , "lookup_advice_cells" ],
108
- reverse = reverse )
117
+ reverse = reverse , string_table = string_table )
109
118
110
119
111
120
def main ():
@@ -117,11 +126,18 @@ def main():
117
126
118
127
argparser = argparse .ArgumentParser ()
119
128
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 )
120
130
args = argparser .parse_args ()
121
131
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
+
122
138
prom = PrometheusConnect (url = args .prometheus_url , disable_ssl = True )
123
139
124
- create_custom_flamegraphs (prom )
140
+ create_custom_flamegraphs (prom , string_table = string_table )
125
141
126
142
127
143
if __name__ == '__main__' :
0 commit comments