49 lines
1.4 KiB
HCL
49 lines
1.4 KiB
HCL
locals {
|
|
# 1. Find and decode YAML files
|
|
alert_files = fileset(
|
|
"${path.root}/${var.alerts_dir}",
|
|
"**/*.yaml"
|
|
)
|
|
|
|
decoded_files = [
|
|
for f in local.alert_files :
|
|
yamldecode(file("${path.root}/${var.alerts_dir}/${f}"))
|
|
]
|
|
|
|
# 2. Flatten: each YAML may define multiple groups
|
|
groups_raw = flatten([
|
|
for doc in local.decoded_files : try(doc.groups, [])
|
|
])
|
|
|
|
# 3. Inject defaults (datasource, folder, interval) and sanitize models
|
|
groups = [
|
|
for g in local.groups_raw : merge(g, {
|
|
uid = try(g.uid, lower(replace(g.name, " ", "-")))
|
|
folder_uid = var.folder_uid
|
|
interval = try(g.interval, "${var.default_interval_seconds}s")
|
|
|
|
rules = [
|
|
for r in g.rules : merge(r, {
|
|
data = [
|
|
for d in r.data : merge(d, {
|
|
# Preserve __expr__ for expressions, otherwise inject default UID
|
|
datasource_uid = (
|
|
try(d.datasourceUid, "") == "__expr__"
|
|
? "__expr__"
|
|
: var.datasource_uid
|
|
)
|
|
|
|
relative_time_range = try(d.relativeTimeRange, { from = 600, to = 0 })
|
|
|
|
# Sanitize model: remove keys Grafana ignores to prevent plan drift
|
|
model = {
|
|
for k, v in d.model : k => v
|
|
if !(k == "queryType" || k == "query_type")
|
|
}
|
|
})
|
|
]
|
|
})
|
|
]
|
|
})
|
|
]
|
|
}
|