kubezero/charts/kubezero-metrics/sync_prometheus_rules.py

91 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
import os
import json
import yaml
import requests
import textwrap
config_file = sys.argv[1]
configmap_folder = sys.argv[2]
# read config file
with open(config_file, "r") as yaml_contents:
config = yaml.safe_load(yaml_contents.read())
def base_rule(config):
rule = ""
if "condition" in config:
# use index function to make go template happy if '-' in names
if "-" in config["condition"] and "index" not in config["condition"]:
tokens = config["condition"].split(".")
rule = """{{- if index .Values %(condition)s }}
""" % {
"condition": " ".join(f'"{w}"' for w in tokens[2:])
}
else:
rule = (
"""{{- if %(condition)s }}
"""
% config
)
# Base rule for KubeZero
rule += (
"""apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: {{ printf "%%s-%%s" (include "kubezero-lib.fullname" $) "%(name)s" | trunc 63 | trimSuffix "-" }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "kubezero-lib.labels" . | nindent 4 }}
"""
% config
)
return rule
for r in config["rules"]:
if not r["url"].startswith("file://"):
response = requests.get(r["url"])
if response.status_code != 200:
print(
"Skipping the file, response code %s not equals 200"
% response.status_code
)
continue
raw_text = response.text
else:
with open(r["url"].replace("file://", ""), "r") as file_contents:
raw_text = file_contents.read()
obj = json.loads(raw_text)
rule = base_rule(r)
text = yaml.dump(obj["spec"], default_flow_style=False, width=1000, indent=2)
# Encode {{ }} for helm
text = (
text.replace("{{", "{{`{{")
.replace("}}", "}}`}}")
.replace("{{`{{", "{{`{{`}}")
.replace("}}`}}", "{{`}}`}}")
)
rule += """spec:\n"""
rule += textwrap.indent(text, " " * 2) + "\n"
if "condition" in r:
rule += "{{- end }}" + "\n"
# Write Configmap
configmap_file = os.path.join(configmap_folder, r["name"] + ".yaml")
with open(configmap_file, "w") as f:
f.write(rule)