11import time
22import aiohttp
3+ from string import Template
34from typing import Iterator , AsyncGenerator
45from django .conf import settings
56
67
7- query_last_metrics_promql_tpl = """
8- last_over_time({__name__=~"%s",namespace="%s"}[%s])
9- """
10-
11- query_network_receive_flow_promql_tpl = """
12- increase(container_network_receive_bytes_total{namespace=~"%s"}[%s])
13- """
14-
15- query_network_transmit_flow_promql_tpl = """
16- increase(container_network_transmit_bytes_total{namespace=~"%s"}[%s])
17- """
18-
19- query_cpu_usage_promql_tpl = """
20- sum (rate (container_cpu_usage_seconds_total{pod=~"^%s-.*$",namespace="%s"}[%s]))
21- by (pod)
22- """
23-
24-
25- query_memory_usage_promql_tpl = """
26- sum (avg_over_time (container_memory_working_set_bytes{pod=~"^%s-.*$",namespace="%s"}[%s]))
27- by (pod)
28- """
29-
30- query_volume_size_promql_tpl = """
31- max by(namespace, persistentvolumeclaim, storageclass) (
32- kube_persistentvolumeclaim_resource_requests_storage_bytes{namespace="%s"}
33- * on(namespace, persistentvolumeclaim) group_left(storageclass)
34- kube_persistentvolumeclaim_info{namespace="%s"}
35- * on(namespace, persistentvolumeclaim) group_left()
36- kube_persistentvolumeclaim_annotations{
37- namespace="%s",
38- annotation_billing_drycc_cc_type="usage"
39- }
40- )
41- """
42-
43- query_network_receive_usage_promql_tpl = """
44- sum (rate (container_network_receive_bytes_total{pod=~"^%s-.*$",namespace="%s"}[%s]))
45- by (pod)
46- """
47-
48- query_network_transmit_usage_promql_tpl = """
49- sum (rate (container_network_transmit_bytes_total{pod=~"^%s-.*$",namespace="%s"}[%s]))
50- by (pod)
51- """
8+ query_last_metrics_promql_tpl = Template ("""
9+ last_over_time({__name__=~"${metrics}",namespace="${namespace}"}[${duration}])
10+ """ )
5211
5312
5413async def query_prom (url , params ) -> list [tuple [dict [str , str ], int ]]:
@@ -66,10 +25,11 @@ async def last_metrics(namespace) -> AsyncGenerator[Iterator, str]:
6625 if not settings .DRYCC_METRICS_CONFIG :
6726 return
6827 url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query"
69- promql = query_last_metrics_promql_tpl % (
70- '|' .join (settings .DRYCC_METRICS_CONFIG .keys ()),
71- namespace ,
72- settings .DRYCC_METRICS_INTERVAL )
28+ promql = query_last_metrics_promql_tpl .substitute (
29+ metrics = '|' .join (settings .DRYCC_METRICS_CONFIG .keys ()),
30+ namespace = namespace ,
31+ duration = settings .DRYCC_METRICS_INTERVAL
32+ )
7333 for item in await query_prom (url , {"query" : promql , "start" : int (time .time () - 60 )}):
7434 yield '%s{%s} %s\n ' % (
7535 item ['metric' ]['__name__' ],
@@ -81,59 +41,22 @@ async def last_metrics(namespace) -> AsyncGenerator[Iterator, str]:
8141 )
8242
8343
84- async def query_volume_size (namespaces : Iterator [str ], start : int , stop : int
85- ) -> list [tuple [dict [str , str ], int ]]:
86- url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query"
87- promql = query_volume_size_promql_tpl % (
88- "|" .join (namespaces ), "|" .join (namespaces ), "|" .join (namespaces ))
89- return await query_prom (url , {"query" : promql , "start" : start , "end" : stop })
90-
91-
92- async def query_network_receive_flow (namespaces : Iterator [str ], start : int , stop : int
93- ) -> list [tuple [dict [str , str ], int ]]:
44+ async def query_volume_usage (namespaces : Iterator [str ], start : int , stop : int
45+ ) -> list [tuple [dict [str , str ], int ]]:
46+ if not settings .DRYCC_VICTORIAMETRICS_URL :
47+ return []
9448 url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query"
95- promql = query_network_receive_flow_promql_tpl % ("|" .join (namespaces ), f"{ stop - start } s" )
49+ promql = Template (settings .DRYCC_VOLUME_USAGE_TEMPLATE ).substitute (
50+ namespaces = "|" .join (namespaces )
51+ )
9652 return await query_prom (url , {"query" : promql , "start" : start , "end" : stop })
9753
9854
99- async def query_network_transmit_flow (namespaces : Iterator [str ], start : int , stop : int
100- ) -> list [tuple [dict [str , str ], int ]]:
55+ async def query_network_usage (namespaces : Iterator [str ], start : int , stop : int
56+ ) -> list [tuple [dict [str , str ], int ]]:
10157 url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query"
102- promql = query_network_transmit_flow_promql_tpl % ("|" .join (namespaces ), f"{ stop - start } s" )
58+ promql = Template (settings .DRYCC_NETWORK_USAGE_TEMPLATE ).substitute (
59+ namespaces = "|" .join (namespaces ),
60+ duration = f"{ stop - start } s"
61+ )
10362 return await query_prom (url , {"query" : promql , "start" : start , "end" : stop })
104-
105-
106- async def query_cpu_usage (namespace : str , ptype : str , every : str ,
107- start : int , stop : int , step : int ,
108- ) -> list [tuple [dict [str , str ], int ]]:
109- url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query_range"
110- pod_prefix = "%s-%s" % (namespace , ptype )
111- promql = query_cpu_usage_promql_tpl % (pod_prefix , namespace , every )
112- return await query_prom (url , {"query" : promql , "start" : start , "end" : stop , "step" : step })
113-
114-
115- async def query_memory_usage (namespace : str , ptype : str , every : str ,
116- start : int , stop : int , step : int ,
117- ) -> list [tuple [dict [str , str ], int ]]:
118- url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query_range"
119- pod_prefix = "%s-%s" % (namespace , ptype )
120- promql = query_memory_usage_promql_tpl % (pod_prefix , namespace , every )
121- return await query_prom (url , {"query" : promql , "start" : start , "end" : stop , "step" : step })
122-
123-
124- async def query_network_receive_usage (namespace : str , ptype : str , every : str ,
125- start : int , stop : int , step : int ,
126- ) -> list [tuple [dict [str , str ], int ]]:
127- url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query_range"
128- pod_prefix = "%s-%s" % (namespace , ptype )
129- promql = query_network_receive_usage_promql_tpl % (pod_prefix , namespace , every )
130- return await query_prom (url , {"query" : promql , "start" : start , "end" : stop , "step" : step })
131-
132-
133- async def query_network_transmit_usage (namespace : str , ptype : str , every : str ,
134- start : int , stop : int , step : int ,
135- ) -> list [tuple [dict [str , str ], int ]]:
136- url = f"{ settings .DRYCC_VICTORIAMETRICS_URL } /api/v1/query_range"
137- pod_prefix = "%s-%s" % (namespace , ptype )
138- promql = query_network_transmit_usage_promql_tpl % (pod_prefix , namespace , every )
139- return await query_prom (url , {"query" : promql , "start" : start , "end" : stop , "step" : step })
0 commit comments