Mercurial > code > home > repos > victoriametrics
annotate create_k8s.py @ 78:a4767069d8b0
alertmanager-conf is now a cmap
author | drewp@bigasterisk.com |
---|---|
date | Wed, 26 Jun 2024 22:29:10 -0700 |
parents | 489c5d9a7dbc |
children | 4809a249d43f |
rev | line source |
---|---|
57 | 1 from pathlib import Path |
56 | 2 from index_page import makeIndexHtml |
3 from output import affinityToNode, build, createIngress, createPv, createPvc, toJson, createSvc | |
55 | 4 |
5 | |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
6 def createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix): |
56 | 7 (build / f'{agentFileName}_deploy.yaml').write_text( |
8 toJson({ | |
9 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": agentName }, | |
10 "spec": { | |
11 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": agentName } }, | |
12 "template": { | |
74 | 13 "metadata": { "labels": { "app": agentName } }, |
56 | 14 "spec": { |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
15 "volumes": [{ "name": "config", "configMap": { "name": f"{objPrefix}-config" } }], |
56 | 16 "serviceAccountName": "victoriametrics", |
17 "containers": [{ | |
18 "name": "vmagent", | |
19 "image": f"docker.io/victoriametrics/vmagent:{vmVersion}", | |
20 "imagePullPolicy": "IfNotPresent", | |
21 "args": [ | |
22 f"-http.pathPrefix={pipelineWebRoot}/vmagent/", | |
23 tzArg, | |
24 f"-promscrape.config=/local/config/{scrapeMapKey}", | |
25 "-promscrape.configCheckInterval=5s", | |
26 "-sortLabels", | |
27 f"-remoteWrite.url=http://{insertName}{pipelineWebRoot}/vminsert/insert/0/prometheus/api/v1/write", | |
28 "-remoteWrite.showURL", | |
29 ], | |
30 "ports": [{ "containerPort": agentPort }], | |
31 "volumeMounts": [{ "name": "config", "mountPath": "/local/config" }] | |
32 }] | |
55 | 33 } |
34 } | |
35 } | |
56 | 36 })) # yapf: disable |
37 | |
55 | 38 |
56 | 39 def createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort): |
40 (build / f'{insertFileName}_deploy.yaml').write_text( | |
41 toJson({ | |
42 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": insertName }, | |
43 "spec": { | |
44 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": insertName } }, | |
45 "template": { | |
74 | 46 "metadata": { "labels": { "app": insertName } }, |
56 | 47 "spec": { |
48 "serviceAccountName": "victoriametrics", | |
49 "containers": [{ | |
50 "name": "vminsert", | |
51 "image": f"docker.io/victoriametrics/vminsert:{vmVersion}-cluster", | |
52 "imagePullPolicy": "IfNotPresent", | |
53 "args": [ | |
54 f"-http.pathPrefix={pipelineWebRoot}/vminsert/", | |
55 tzArg, | |
56 f"-storageNode={storageName}", | |
57 ], | |
58 "ports": [{ "containerPort": insertPort }] | |
59 }] | |
55 | 60 } |
61 } | |
62 } | |
56 | 63 })) # yapf: disable |
55 | 64 |
65 | |
56 | 66 def createStorageDeploy(tzArg, vmVersion, pipelineWebRoot, pipelineName, retention, storageName, storageFileName, localPvHost, volName, storageInsertPort, storageSelectPort): |
67 (build / f'{storageFileName}_2deploy.yaml').write_text( | |
68 toJson({ | |
69 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": storageName }, | |
70 "spec": { | |
71 "replicas": 1, "strategy": { "type": "Recreate" }, "selector": { "matchLabels": { "app": storageName } }, | |
72 "template": { | |
74 | 73 "metadata": { "labels": { "app": storageName } }, |
56 | 74 "spec": { |
75 "volumes": [{ "name": "data", "persistentVolumeClaim": { "claimName": volName } }], | |
76 "serviceAccountName": "victoriametrics", | |
77 "containers": [{ | |
78 "name": "vmstorage", | |
79 "image": f"docker.io/victoriametrics/vmstorage:{vmVersion}-cluster", | |
80 "imagePullPolicy": "IfNotPresent", | |
81 "args": [ | |
82 f"-http.pathPrefix={pipelineWebRoot}/vmstorage/", | |
83 tzArg, | |
84 f"-retentionPeriod={retention}", | |
85 f"-storageDataPath=/data/{pipelineName}", | |
86 ], | |
87 "ports": [ | |
88 { "containerPort": 8482, "name": "http" }, | |
89 { "containerPort": storageInsertPort, "name": "vminsert" }, | |
90 { "containerPort": storageSelectPort, "name": "vmselect" }, | |
91 ], | |
92 "volumeMounts": [{ "name": "data", "mountPath": "/data" }] | |
55 | 93 }], |
56 | 94 "affinity": affinityToNode(localPvHost) |
55 | 95 } |
96 } | |
97 } | |
56 | 98 })) # yapf: disable |
99 | |
55 | 100 |
56 | 101 def createVmselectDeploy(tzArg, vmVersion, webRoot, objPrefix, storageSvcs, selectPort): |
102 name = f"{objPrefix}-vmselect" | |
103 (build / f'{objPrefix}-1vmselect_deploy.yaml').write_text( | |
104 toJson({ | |
105 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": name }, | |
106 "spec": { | |
107 "replicas": 1, | |
108 "strategy": { "type": "Recreate" }, | |
109 "selector": { "matchLabels": { "app": name } }, | |
110 "template": { | |
74 | 111 "metadata": { "labels": { "app": name } }, |
56 | 112 "spec": { |
113 "serviceAccountName": "victoriametrics", | |
114 "containers": [{ | |
115 "name": "vmselect", "image": f"docker.io/victoriametrics/vmselect:{vmVersion}-cluster", "imagePullPolicy": "IfNotPresent", | |
116 "args": [ | |
117 f"-http.pathPrefix={webRoot}/vmselect/", | |
118 tzArg, | |
119 ] + [f"-storageNode={n}" for n in storageSvcs], | |
120 "ports": [{ "containerPort": selectPort }] | |
121 }] | |
55 | 122 } |
123 } | |
124 } | |
56 | 125 })) # yapf: disable |
126 | |
127 def createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, pipelineName, scrapeMapKey, retention): | |
128 agentName = f"{objPrefix}-{pipelineName}-vmagent" | |
129 insertName = f"{objPrefix}-{pipelineName}-vminsert" | |
130 storageName = f"{objPrefix}-{pipelineName}-vmstorage" | |
131 | |
132 agentFileName = f"{objPrefix}-0{pipelineName}-0vmagent" | |
133 insertFileName = f"{objPrefix}-0{pipelineName}-1vminsert" | |
134 storageFileName = f"{objPrefix}-0{pipelineName}-2vmstorage" | |
135 | |
136 localPvHost = "ditto" | |
137 insertPort = 8480 | |
138 agentPort = 8429 | |
139 storageInsertPort = 8400 | |
140 storageSelectPort = 8401 | |
141 volName = f"{objPrefix}-data-{pipelineName}" | |
142 request = "50Gi" | |
143 pipelineWebRoot = f'{webRoot}/{pipelineName}' | |
144 | |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
145 createAgentDeploy(tzArg, vmVersion, pipelineWebRoot, agentFileName, agentName, agentPort, scrapeMapKey, insertName, objPrefix) |
56 | 146 createInsertDeploy(tzArg, vmVersion, pipelineWebRoot, insertName, storageName, insertFileName, insertPort) |
147 createPv(storageFileName, volName, request) | |
148 createPvc(storageFileName, volName, request) | |
149 createStorageDeploy(tzArg, vmVersion, pipelineWebRoot, pipelineName, retention, storageName, storageFileName, localPvHost, volName, storageInsertPort, storageSelectPort) | |
150 | |
151 createSvc(agentFileName, agentName, [{"port": 80, "targetPort": agentPort}]) | |
152 createSvc(insertFileName, insertName, [{"port": 80, "targetPort": insertPort}]) | |
153 createSvc(storageFileName,storageName, [ | |
154 {"port": 80, "targetPort": "http", "name": "http"}, | |
155 {"port": storageInsertPort, "targetPort": "vminsert", "name": "vminsert"}, | |
156 {"port": storageSelectPort, "targetPort": "vmselect", "name": "vmselect"}, | |
157 ]) # yapf: disable | |
158 | |
159 return storageName | |
160 | |
161 | |
162 def createIndex(objPrefix, webRoot, html): | |
163 name = f'{objPrefix}-index' | |
164 httpServeRoot = '/opt/html' | |
165 | |
166 (build / f'{objPrefix}-3index_cmap.yaml').write_text(toJson({ | |
167 "apiVersion": "v1", "kind": "ConfigMap", "metadata": { "name": name }, | |
168 "data": { | |
169 "index.html": html, | |
57 | 170 "index.js": Path("index.js").read_text(), |
171 "index.css": Path("index.css").read_text(), | |
172 } | |
56 | 173 })) # yapf: disable |
62
8134cd480817
make next/ a complete standalone setup dir- no deps on ./
drewp@bigasterisk.com
parents:
60
diff
changeset
|
174 |
56 | 175 (build / f'{objPrefix}-3index_deploy.yaml').write_text( |
176 toJson({ | |
177 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": name }, | |
178 "spec": { | |
179 "replicas": 1, | |
180 "selector": { "matchLabels": { "app": name } }, | |
181 "template": { | |
182 "metadata": { "labels": { "app": name } }, | |
183 "spec": { | |
184 "containers": [{ | |
185 "name": "webserver", "image": "docker.io/joseluisq/static-web-server", "imagePullPolicy": "IfNotPresent", | |
186 "args": [ | |
187 f'--root={httpServeRoot}', | |
188 '--directory-listing=true', | |
189 '--experimental-metrics=true', | |
190 ], | |
191 "ports": [{ "containerPort": 80 }], | |
192 "volumeMounts": [{ "name": "html", "mountPath": f"{httpServeRoot}{webRoot}" }] | |
193 }], | |
194 "volumes": [{ "name": "html", "configMap": { "name": name, "defaultMode": 444 } }] | |
195 } | |
196 } | |
197 } | |
198 })) # yapf: disable | |
199 createSvc(f'{objPrefix}-3index', f'{objPrefix}-index', [{'port': 80, 'targetPort': 80}]) | |
55 | 200 |
57 | 201 |
72 | 202 def createVmalertObjs(tzArg, objPrefix, webRoot, policy, vmVersion): |
203 vmalertName = f"{objPrefix}-vmalert" | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
204 (build / f'{objPrefix}-4vmalert_2deploy.yaml').write_text( |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
205 toJson({ |
72 | 206 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": vmalertName }, |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
207 "spec": { |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
208 "replicas": 1, |
72 | 209 "strategy": { "type": "Recreate" }, |
210 "selector": { "matchLabels": { "app": vmalertName } }, | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
211 "template": { |
72 | 212 "metadata": { "labels": { "app": vmalertName }, }, |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
213 "spec": { |
72 | 214 "volumes": [{ "name": "config", "configMap": { "name": "victoriametrics-config" } }], |
215 "serviceAccountName": "victoriametrics", | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
216 "containers": [{ |
72 | 217 "name": "vmalert", "image": f"docker.io/victoriametrics/vmalert:{vmVersion}", "imagePullPolicy": "IfNotPresent", |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
218 "args": [ |
72 | 219 tzArg, |
220 "-loggerLevel=INFO", | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
221 "-configCheckInterval=5s", |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
222 "-datasource.queryStep=5m", |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
223 "-evaluationInterval=1m", |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
224 "-rule=/local/rules", |
72 | 225 |
226 # used in a field of the alert to link back to vmalert's info page | |
227 f"-external.url=https://bigasterisk.com{webRoot}/vmalert", | |
228 | |
229 f"-datasource.url=http://{objPrefix}-vmselect/m/vmselect/select/0/prometheus", | |
230 f"-http.pathPrefix={webRoot}/vmalert/", | |
73 | 231 f"-notifier.url=http://{objPrefix}-alertmanager/m/alertmanager", |
72 | 232 |
233 # todo: remoteWrite should go to vminsert; not sure how to test it | |
234 # "-remoteRead.url=http://victoriametrics/m/", | |
235 # "-remoteWrite.url=http://victoriametrics/m/", | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
236 ], |
72 | 237 "ports": [{ "containerPort": 8880 }], |
238 "volumeMounts": [{ "name": "config", "mountPath": "/local" }] | |
239 }], | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
240 } |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
241 } |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
242 } |
72 | 243 })) # yapf: disable |
244 | |
245 createSvc(f'{objPrefix}-4vmalert', vmalertName, [{"port": 80, "targetPort": 8880}]) | |
69
6a021aa7b4be
collect alert obj yaml config for a minute (moving it to py)
drewp@bigasterisk.com
parents:
68
diff
changeset
|
246 |
72 | 247 createIngress( |
248 f'{objPrefix}-4vmalert_ingress.yaml', | |
249 'vmalert', | |
250 policy, | |
251 [{ "pathType": "Prefix", "path": f"{webRoot}/vmalert/", "backend": { "service": { "name": vmalertName, "port": { "number": 80 } } } }], | |
252 "bigasterisk.com", | |
253 ) # yapf: disable | |
254 | |
255 | |
256 def createAlertmanagerObjs(tzArg, objPrefix, webRoot, policy): | |
78 | 257 confFilename = "alertmanager.yml" |
258 | |
259 (build / f'{objPrefix}-5alertmanager_conf_cmap.yaml').write_text(toJson({ | |
260 "apiVersion": "v1", "kind": "ConfigMap", "metadata": { "name": "alertmanager-conf" }, | |
261 "data": { | |
262 confFilename: Path("./alertmanager.yaml").read_text(), | |
263 } | |
264 })) # yapf: disable | |
77
489c5d9a7dbc
spelling of alertmanager config filenames
drewp@bigasterisk.com
parents:
74
diff
changeset
|
265 createPv(f'{objPrefix}-5alertmanager', "opt-alertmanager", '50Gi') |
489c5d9a7dbc
spelling of alertmanager config filenames
drewp@bigasterisk.com
parents:
74
diff
changeset
|
266 createPvc(f'{objPrefix}-5alertmanager', "opt-alertmanager", '50Gi') |
72 | 267 |
73 | 268 amName = f'{objPrefix}-alertmanager' |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
269 (build / f'{objPrefix}-5alertmanager_deploy.yaml').write_text( |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
270 toJson({ |
73 | 271 "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": amName }, |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
272 "spec": { |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
273 "replicas": 1, |
73 | 274 "selector": { "matchLabels": { "app": amName } }, |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
275 "template": { |
73 | 276 "metadata": { "labels": { "app": amName } }, |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
277 "spec": { |
78 | 278 "volumes": [ |
279 { "name": "opt-alertmanager", "persistentVolumeClaim": { "claimName": "opt-alertmanager" } }, | |
280 { "name": "alertmanager-conf", "configMap": { "name": "alertmanager-conf" } } | |
281 ], | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
282 "serviceAccountName": "victoriametrics", |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
283 "containers": [{ |
73 | 284 "name": "alertmanager", "image": "docker.io/prom/alertmanager:v0.27.0", "imagePullPolicy": "IfNotPresent", |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
285 "args": [ |
74 | 286 "--log.level=info", |
78 | 287 f"--config.file=/conf/{confFilename}", |
73 | 288 f"--web.external-url=https://bigasterisk.com{webRoot}/alertmanager/", |
289 f"--web.route-prefix={webRoot}/alertmanager", | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
290 ], |
73 | 291 "ports": [{ "containerPort": 9093 }], |
78 | 292 "volumeMounts": [ |
293 { "name": "opt-alertmanager", "mountPath": "/alertmanager" }, | |
294 { "name": "alertmanager-conf", "mountPath": "/conf" } | |
295 ] | |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
296 }], |
72 | 297 "affinity": affinityToNode("ditto"), |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
298 } |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
299 } |
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
300 } |
73 | 301 })) # yapf: disable |
72 | 302 |
73 | 303 createSvc(f'{objPrefix}-5alertmanager', amName, [{"port": 80, "targetPort": 9093}]) |
72 | 304 createIngress( |
305 f'{objPrefix}-5alertmanager_ingress.yaml', | |
73 | 306 amName, |
72 | 307 policy, |
73 | 308 [{ "pathType": "Prefix", "path": "/m/alertmanager/", "backend": { "service": { "name": amName, "port": { "number": 80 } } } }], |
72 | 309 "bigasterisk.com", |
73 | 310 ) # yapf: disable |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
311 |
69
6a021aa7b4be
collect alert obj yaml config for a minute (moving it to py)
drewp@bigasterisk.com
parents:
68
diff
changeset
|
312 |
57 | 313 def main(): |
314 tzArg = "-loggerTimezone=America/Los_Angeles" | |
68 | 315 objPrefix = "victoriametrics" # prefix on all k8s object names |
316 webRoot = "/m" | |
57 | 317 vmVersion = "v1.100.1" |
318 webHost = 'bigasterisk.com' | |
319 pipelines = [ | |
320 ('forever', '100y'), | |
321 ('recent', '90y'), | |
322 ] | |
60
e3151ab43579
moving scrape target configs in py, and into separate retention classes
drewp@bigasterisk.com
parents:
57
diff
changeset
|
323 storageSvcs = [createIngestPipeline(tzArg, vmVersion, webRoot, objPrefix, p, f'scrape_{p}.yaml', ret) for p, ret in pipelines] |
57 | 324 |
325 selectPort = 8481 | |
326 createVmselectDeploy(tzArg, vmVersion, webRoot, objPrefix, storageSvcs, selectPort) | |
327 createSvc(f'{objPrefix}-1vmselect', f"{objPrefix}-vmselect", [{"port": 80, "targetPort": selectPort}]) | |
328 | |
329 ingressPaths = [ | |
74 | 330 { "pathType": "Prefix", "path": f"{webRoot}/", "backend": { "service": { "name": f"{objPrefix}-index", "port": { "number": 80 } } } }, |
57 | 331 { "pathType": "Prefix", "path": f"{webRoot}/vmselect/", "backend": { "service": { "name": f"{objPrefix}-vmselect", "port": { "number": 80 } } } }, |
332 ] # yapf: disable | |
333 for p, _ in pipelines: | |
334 ingressPaths.extend([ | |
335 { "pathType": "Prefix", "path": f"{webRoot}/{p}/vmagent/", "backend": { "service": { "name": f"{objPrefix}-{p}-vmagent", "port": { "number": 80 } } } }, | |
336 { "pathType": "Prefix", "path": f"{webRoot}/{p}/vminsert/", "backend": { "service": { "name": f"{objPrefix}-{p}-vminsert", "port": { "number": 80 } } } }, | |
337 { "pathType": "Prefix", "path": f"{webRoot}/{p}/vmstorage/", "backend": { "service": { "name": f"{objPrefix}-{p}-vmstorage", "port": { "number": 80 } } } }, | |
338 ]) # yapf: disable | |
339 | |
340 policy = """\ | |
341 allow: | |
77
489c5d9a7dbc
spelling of alertmanager config filenames
drewp@bigasterisk.com
parents:
74
diff
changeset
|
342 or: |
57 | 343 - { email: { is: "drewpca@gmail.com" }} |
344 - { email: { is: "kelsimp@gmail.com" }} | |
345 """ | |
346 createIngress(f'{objPrefix}-2ingress.yaml', objPrefix, policy, ingressPaths, webHost) | |
347 createIndex(objPrefix, webRoot, makeIndexHtml(objPrefix, webRoot, webHost)) | |
72 | 348 createVmalertObjs(tzArg, objPrefix, webRoot, policy, vmVersion) |
73 | 349 createAlertmanagerObjs(tzArg, objPrefix, webRoot, policy) |
57 | 350 |
71
bfacf01fd119
conv vmalert/alertmanager config to py
drewp@bigasterisk.com
parents:
69
diff
changeset
|
351 |
57 | 352 main() |