From 0eb7f5d9633bd65006899118e8f9e8aa642de604 Mon Sep 17 00:00:00 2001 From: Alexandr Date: Wed, 1 Apr 2026 08:36:20 +0300 Subject: [PATCH] refactor: IRM config moved to irm/escalation.yaml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit цепочки эскалации описаны в yaml, vault-метки (vault:key) подставляются через locals.tf --- environments/dev/adibrov/irm/escalation.yaml | 30 ++++++++++++++++ environments/dev/adibrov/locals.tf | 38 ++++++++++---------- 2 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 environments/dev/adibrov/irm/escalation.yaml diff --git a/environments/dev/adibrov/irm/escalation.yaml b/environments/dev/adibrov/irm/escalation.yaml new file mode 100644 index 0000000..b80b166 --- /dev/null +++ b/environments/dev/adibrov/irm/escalation.yaml @@ -0,0 +1,30 @@ +# Цепочки эскалации Grafana IRM для окружения dev/adibrov +# +# Как найти ID: +# Пользователь: Grafana IRM → Users → ID в колонке +# Расписание: Grafana IRM → Schedules → ID из URL +# Группа: Grafana IRM → User groups → ID из URL +# +# Типы шагов: notify_persons, notify_on_call_from_schedule, +# notify_user_group, wait, repeat_escalation + +chains: + - name: infra-default + steps: + # Шаг 1: уведомить дежурного + - type: notify_persons + persons_to_notify: + - vault:irm_user_adibrov + + # Шаг 2: ждём 5 минут + - type: wait + duration_seconds: 300 + + # Шаг 3: повторный важный звонок + - type: notify_persons + persons_to_notify: + - vault:irm_user_adibrov + important: true + + # Шаг 4: повторяем цепочку с начала + - type: repeat_escalation diff --git a/environments/dev/adibrov/locals.tf b/environments/dev/adibrov/locals.tf index 1a50be2..303181c 100644 --- a/environments/dev/adibrov/locals.tf +++ b/environments/dev/adibrov/locals.tf @@ -5,28 +5,26 @@ locals { "X-Disable-Provenance" = var.disable_provenance ? "true" : "false" } - # IRM escalation chains - # ID пользователей/расписаний хранятся в Vault: app/groups/monitoring/grafana/dev/ext + # IRM: читаем конфигурацию из irm/escalation.yaml + # Метки вида "vault:key_name" заменяются значениями из Vault (secret_ext) + _irm_raw = yamldecode(file("${path.module}/irm/escalation.yaml")) + _irm_ext = data.vault_kv_secret_v2.secret_ext.data + irm_escalation_chains = [ - { - name = "infra-default" + for chain in local._irm_raw.chains : { + name = chain.name + team_id = try(chain.team_id, null) steps = [ - { - type = "notify_persons" - persons_to_notify = [data.vault_kv_secret_v2.secret_ext.data["irm_user_adibrov"]] - }, - { - type = "wait" - duration_seconds = 300 - }, - { - type = "notify_persons" - persons_to_notify = [data.vault_kv_secret_v2.secret_ext.data["irm_user_adibrov"]] - important = true - }, - { - type = "repeat_escalation" - } + for step in chain.steps : merge(step, { + persons_to_notify = try([ + for p in step.persons_to_notify : + startswith(p, "vault:") ? local._irm_ext[trimprefix(p, "vault:")] : p + ], null) + persons_to_notify_next_each_time = try([ + for p in step.persons_to_notify_next_each_time : + startswith(p, "vault:") ? local._irm_ext[trimprefix(p, "vault:")] : p + ], null) + }) ] } ]