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