1- import requests
1+ import time
2+
23from urllib3 .exceptions import InsecureRequestWarning
34
5+ import querier
46
57class Suggester :
6-
7- def __init__ (self , prometheus_host , token , time_range = '7d' ):
8+ def __init__ (self , prometheus_host , token , k8s_flavour , time_range = '7d' , step = '3h' ):
89 self .prometheus_host = prometheus_host
910 self .token = token
1011 self .time_range = time_range
12+ self .queries = querier .queries [k8s_flavour ]
13+ self .end = int (time .time ())
14+ self .start = self .end - 24 * 60 * 60 * int (time_range [:- 1 ])
15+ self .step = step
16+ self .aggregator = {}
17+
18+ for metric , query_struct in self .queries .items ():
19+ if query_struct ["query_type" ] == 'query_range' :
20+ self .aggregator [metric ] = querier .aggregators [metric ]
21+
22+
23+ def build_query (self , k8s_object , metric ):
24+ host = f"{ self .prometheus_host } /api/v1/{ self .queries [metric ]['query_type' ]} "
25+ match self .queries [metric ]["query_type" ]:
26+ case "query" :
27+ params = {
28+ "query" : self .queries [metric ]["query" ].format (
29+ workload = k8s_object [9 ],
30+ namespace = k8s_object [0 ],
31+ time_range = self .time_range
32+ )
33+ }
34+ case "query_range" :
35+ params = {
36+ "query" : self .queries [metric ]["query" ].format (
37+ workload = k8s_object [9 ],
38+ namespace = k8s_object [0 ],
39+ time_range = self .time_range
40+ ),
41+ "start" : self .start ,
42+ "end" : self .end ,
43+ "step" : self .step
44+ }
45+
46+ return host , params
47+
1148
1249 def suggest_values (self , k8s_object ):
13- requests . packages . urllib3 . disable_warnings ( category = InsecureRequestWarning )
50+
1451 headers = {
1552 'Authorization' : f'Bearer { self .token } '
1653 }
17- #Pe i pod avg_over_time(container_memory_working_set_bytes{pod=~'snitch-jvm.*',namespace='snitch',container='snitch-jvm'}[7d])
18- # Retrieve pod memory usage
19- params_memory_request = {
20- "query" : f"avg_over_time(container_memory_working_set_bytes{{pod=~'{ k8s_object [2 ]} .*',namespace='{ k8s_object [0 ]} ',container=''}}[{ self .time_range } ])"
21- }
22-
23- response = requests .get (f"{ self .prometheus_host } /api/v1/query" , headers = headers , params = params_memory_request , verify = False )
24- memoryRequest = f'{ round (float (response .json ()["data" ]["result" ][0 ]["value" ][1 ]) / 1000000 )} M'
25-
26- params_memory_limit = {
27- "query" : f"max_over_time(container_memory_working_set_bytes{{pod=~'{ k8s_object [2 ]} .*',namespace='{ k8s_object [0 ]} ',container=''}}[{ self .time_range } ])"
28- }
29-
30- response = requests .get (f"{ self .prometheus_host } /api/v1/query" , headers = headers , params = params_memory_limit ,
31- verify = False )
32-
33- memoryLimit = f'{ round (float (response .json ()["data" ]["result" ][0 ]["value" ][1 ]) / 1000000 )} M'
34-
35- params_cpu_request = {
36- "query" : f"avg_over_time(pod:container_cpu_usage:sum{{pod=~'{ k8s_object [2 ]} .*',namespace='{ k8s_object [0 ]} '}}[{ self .time_range } ])"
37- }
38-
39- response = requests .get (f"{ self .prometheus_host } /api/v1/query" , headers = headers , params = params_cpu_request ,
40- verify = False )
41-
42- cpu_request = f'{ round (float (response .json ()["data" ]["result" ][0 ]["value" ][1 ]), 3 )} '
43-
44- params_cpu_limit = {
45- "query" : f"max_over_time(pod:container_cpu_usage:sum{{pod=~'{ k8s_object [2 ]} .*',namespace='{ k8s_object [0 ]} '}}[{ self .time_range } ])"
46- }
4754
48- response = requests .get (f"{ self .prometheus_host } /api/v1/query" , headers = headers , params = params_cpu_limit ,
49- verify = False )
55+ results = {}
5056
51- cpu_limit = f'{ round (float (response .json ()["data" ]["result" ][0 ]["value" ][1 ]), 3 )} '
57+ for metric , query_struct in self .queries .items ():
58+ host , params = self .build_query (k8s_object , metric )
59+ result = querier .run_query (host , headers , params )
60+ results [metric ] = querier .handle_response (metric , result , self .aggregator .get (metric , None ))
5261
5362 return [
5463 k8s_object [0 ], # Namespace
@@ -57,13 +66,13 @@ def suggest_values(self, k8s_object):
5766 k8s_object [3 ], # Container
5867 k8s_object [4 ], # Replicas
5968 k8s_object [5 ], # Request CPU
60- cpu_request , # suggested
69+ results [ " cpu_request" ] , # suggested
6170 k8s_object [6 ], # CPU LIMIT,
62- cpu_limit ,
71+ results [ " cpu_limit" ] ,
6372 k8s_object [7 ], # Memory request
64- memoryRequest , # suggest
73+ results [ "memory_request" ] , # suggest
6574 k8s_object [8 ], # memory limit
66- memoryLimit # suggest
75+ results [ "memory_limit" ] # suggest
6776 ]
6877
6978
0 commit comments