locals { ################################################################# # 1. Discover & decode alert YAML files from / ################################################################# alert_files = fileset( "${path.root}/${var.alerts_dir}", var.file_pattern ) decoded_files = [ for f in local.alert_files : yamldecode(file("${path.root}/${var.alerts_dir}/${f}")) ] ################################################################# # 2. Flatten: each file may contain multiple groups ################################################################# groups_raw = flatten([ for doc in local.decoded_files : try(doc.groups, []) ]) ################################################################# # 3. Merge defaults & convert camelCase → snake_case ################################################################# groups = [ for g in local.groups_raw : merge(g, { uid = try( g.uid, trim(replace(replace(lower(g.name), " ", "-"), "_", "-"), "-") ) folder_uid = try(try(g.folder_uid, g.folder), var.default_folder_uid) interval = try(g.interval, "1m") rules = [ for r in g.rules : merge(r, { data = [ for d in r.data : merge(d, { datasource_uid = try(d.datasourceUid, var.default_datasource_uid) relative_time_range = try(d.relativeTimeRange, { from = 600, to = 0 }) }) ] }) ] }) ] }