Skip to content

Commit 106b321

Browse files
committed
chore(usage): add usage promql template
1 parent dec6d93 commit 106b321

7 files changed

Lines changed: 84 additions & 117 deletions

File tree

charts/controller/templates/_helpers.tpl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,3 +452,32 @@ oss:
452452
storage: $size
453453
volumeName: $volume_name
454454
{{- end }}
455+
456+
{{/* Generate controller config default volume usage template */}}
457+
{{ define "controller.config.defaultVolumeUsageTemplate" }}
458+
max by(namespace, persistentvolumeclaim, storageclass) (
459+
kube_persistentvolumeclaim_resource_requests_storage_bytes{
460+
namespace=~"${namespaces}"
461+
}
462+
* on(namespace, persistentvolumeclaim) group_left(storageclass)
463+
kube_persistentvolumeclaim_info{namespace=~"${namespaces}"}
464+
* on(namespace, persistentvolumeclaim) group_left()
465+
kube_persistentvolumeclaim_annotations{
466+
namespace=~"${namespaces}",
467+
annotation_billing_drycc_cc_type="usage"
468+
}
469+
)
470+
{{- end }}
471+
472+
{{/* Generate controller config default network usage template */}}
473+
{{ define "controller.config.defaultNetworkUsageTemplate" }}
474+
label_replace(
475+
sum(increase(istio_request_bytes_sum{namespace=~"${namespaces}"}[${duration}])) by (namespace,pod),
476+
"direction", "rx", "", ""
477+
)
478+
or
479+
label_replace(
480+
sum(increase(istio_response_bytes_sum{namespace=~"${namespaces}"}[${duration}])) by (namespace,pod),
481+
"direction", "tx", "", ""
482+
)
483+
{{- end }}

charts/controller/templates/controller-configmap.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,15 @@ data:
4747
{{- else}}
4848
{{- include "controller.config.defaultVolumeClaimTemplate" . | fromYaml | toPrettyJson | nindent 4 }}
4949
{{- end }}
50+
volume-usage-template.promql: |
51+
{{- if .Values.config.volumeUsageTemplate }}
52+
{{- (tpl .Values.config.volumeUsageTemplate $) | nindent 4 }}
53+
{{- else}}
54+
{{- include "controller.config.defaultVolumeUsageTemplate" . | nindent 4 }}
55+
{{- end }}
56+
network-usage-template.promql: |
57+
{{- if .Values.config.networkUsageTemplate }}
58+
{{- (tpl .Values.config.networkUsageTemplate $) | nindent 4 }}
59+
{{- else}}
60+
{{- include "controller.config.defaultNetworkUsageTemplate" . | nindent 4 }}
61+
{{- end }}

charts/controller/values.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ config:
7575
secretTemplate: ""
7676
volumeTemplate: ""
7777
volumeClaimTemplate: ""
78+
volumeUsageTemplate: ""
79+
networkUsageTemplate: ""
7880

7981
# Service
8082
service:

rootfs/api/management/commands/upload_network_usage.py

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,30 +21,15 @@ def _upload_network_usage(self, start_time, app_map, timestamp):
2121
stop = timestamp - (timestamp % 3600)
2222
start = stop - 3600
2323
networks = []
24-
for item in async_to_sync(monitor.query_network_receive_flow)(app_map.keys(), start, stop): # noqa
24+
for item in async_to_sync(monitor.query_network_usage)(app_map.keys(), start, stop):
2525
metric = item["metric"]
2626
_, value = item["value"]
2727
networks.append({
2828
"app_id": str(app_map[metric['namespace']].uuid),
2929
"owner": app_map[metric['namespace']].owner_id,
3030
"type": "network",
3131
"unit": "bytes",
32-
"name": "rx",
33-
"usage": value,
34-
"kwargs": {
35-
"pod": metric['pod'],
36-
},
37-
"timestamp": start
38-
})
39-
for item in async_to_sync(monitor.query_network_transmit_flow)(app_map.keys(), start, stop): # noqa
40-
metric = item["metric"]
41-
_, value = item["value"]
42-
networks.append({
43-
"app_id": str(app_map[metric['namespace']].uuid),
44-
"owner": app_map[metric['namespace']].owner_id,
45-
"type": "network",
46-
"unit": "bytes",
47-
"name": "tx",
32+
"name": metric['direction'],
4833
"usage": value,
4934
"kwargs": {
5035
"pod": metric['pod'],

rootfs/api/management/commands/upload_volume_usage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def _upload_volume_usage(self, start_time, app_map, timestamp):
2121
stop = timestamp - (timestamp % 3600)
2222
start = stop - 3600
2323
volumes = []
24-
for item in async_to_sync(monitor.query_volume_size)(app_map.keys(), start, stop): # noqa
24+
for item in async_to_sync(monitor.query_volume_usage)(app_map.keys(), start, stop):
2525
metric = item["metric"]
2626
_, value = item["value"]
2727
volumes.append({

rootfs/api/monitor.py

Lines changed: 22 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,13 @@
11
import time
22
import aiohttp
3+
from string import Template
34
from typing import Iterator, AsyncGenerator
45
from 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

5413
async 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})

rootfs/api/settings/production.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,22 @@ def randstr(k):
310310
with open(DRYCC_VOLUME_CLAIM_TEMPLATE_PATH) as fd:
311311
DRYCC_VOLUME_CLAIM_TEMPLATE = json.load(fd)
312312

313+
# drycc volume usage template
314+
DRYCC_VOLUME_USAGE_TEMPLATE = ""
315+
DRYCC_VOLUME_USAGE_TEMPLATE_PATH = os.environ.get(
316+
'DRYCC_VOLUME_USAGE_TEMPLATE_PATH', '/etc/controller/volume-usage-template.promql')
317+
if os.path.exists(DRYCC_VOLUME_USAGE_TEMPLATE_PATH):
318+
with open(DRYCC_VOLUME_USAGE_TEMPLATE_PATH) as fd:
319+
DRYCC_VOLUME_USAGE_TEMPLATE = fd.read()
320+
321+
# drycc network usage template
322+
DRYCC_NETWORK_USAGE_TEMPLATE = ""
323+
DRYCC_NETWORK_USAGE_TEMPLATE_PATH = os.environ.get(
324+
'DRYCC_NETWORK_USAGE_TEMPLATE_PATH', '/etc/controller/network-usage-template.promql')
325+
if os.path.exists(DRYCC_NETWORK_USAGE_TEMPLATE_PATH):
326+
with open(DRYCC_NETWORK_USAGE_TEMPLATE_PATH) as fd:
327+
DRYCC_NETWORK_USAGE_TEMPLATE = fd.read()
328+
313329
# Django secret key
314330
SECRET_KEY = os.environ.get('DRYCC_SECRET_KEY', randstr(64))
315331

0 commit comments

Comments
 (0)