kubezero/charts/kubezero-metrics/sync_prometheus_rules.py

75 lines
2.1 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)