locals { # Duration parsing map duration_units = { "s" = 1 "m" = 60 "h" = 3600 "d" = 86400 } # Mapping for datasources datasource_mapping = { for ds in var.datasources : ds.uid => ds.name } datasource_mapping_type = { for ds in var.datasources : ds.uid => lookup(ds, "type", "prometheus") } # Folder time range mapping with 1-minute default folder_time_ranges = { for uid in distinct([for group in var.groups : lookup(var.folder_uids, group.dashboard_alert_group_name, null) if group.dashboard_alert_group_name != null]) : uid => lookup(var.folder_time_ranges, uid, 60) # Default to 60 seconds (1 minute) if not specified } # Combine all alerts and their respective configurations combined_alerts = flatten([ for group in var.groups : [ for datasource_uid in group.alerts_on_datasources_uid : { alert_group_name = group.dashboard_alert_group_name folder_uid = lookup(var.folder_uids, group.dashboard_alert_group_name, null) datasource_name = lookup(local.datasource_mapping, datasource_uid, "unknown") datasource_uid = datasource_uid datasource_type = lookup(local.datasource_mapping_type, datasource_uid, "prometheus") alert_files = [ for file_path in fileset(group.alert_definitions_path, "**/*.yaml") : { # Store full YAML content after variable substitution content = yamldecode(templatefile("${group.alert_definitions_path}/${file_path}", var.alert_variables)) # Extract commonly used fields name = try(yamldecode(templatefile("${group.alert_definitions_path}/${file_path}", var.alert_variables)).name, null) alert_type = try(yamldecode(templatefile("${group.alert_definitions_path}/${file_path}", var.alert_variables)).datasource_type, "prometheus") editor_type = try(yamldecode(templatefile("${group.alert_definitions_path}/${file_path}", var.alert_variables)).editor_type, null) mode = try(yamldecode(templatefile("${group.alert_definitions_path}/${file_path}", var.alert_variables)).mode, "single") # File metadata alert_file_path = "${group.alert_definitions_path}/${file_path}" alert_category = split("/", file_path)[0] } if can(group.alert_definitions_path) && group.alert_definitions_path != null && (try(trimspace(group.alert_definitions_path), "") != "") ] } ] ]) # Group alerts by datasource grouped_alerts_by_datasource = { for alert in local.combined_alerts : "${alert.datasource_name} (${alert.alert_group_name})" => merge(alert, { alert_files = flatten([ for a in local.combined_alerts : a.alert_files if a.datasource_name == alert.datasource_name && a.alert_group_name == alert.alert_group_name ]) }) } }