diff --git a/openspec/changes/2026-09-13-vesti-alerts/design.md b/openspec/changes/archive/2026-09-13-vesti-alerts/design.md similarity index 100% rename from openspec/changes/2026-09-13-vesti-alerts/design.md rename to openspec/changes/archive/2026-09-13-vesti-alerts/design.md diff --git a/openspec/changes/2026-09-13-vesti-alerts/proposal.md b/openspec/changes/archive/2026-09-13-vesti-alerts/proposal.md similarity index 100% rename from openspec/changes/2026-09-13-vesti-alerts/proposal.md rename to openspec/changes/archive/2026-09-13-vesti-alerts/proposal.md diff --git a/openspec/changes/2026-09-13-vesti-alerts/specs/vesti-alerts/spec.md b/openspec/changes/archive/2026-09-13-vesti-alerts/specs/vesti-alerts/spec.md similarity index 100% rename from openspec/changes/2026-09-13-vesti-alerts/specs/vesti-alerts/spec.md rename to openspec/changes/archive/2026-09-13-vesti-alerts/specs/vesti-alerts/spec.md diff --git a/openspec/changes/2026-09-13-vesti-alerts/tasks.md b/openspec/changes/archive/2026-09-13-vesti-alerts/tasks.md similarity index 100% rename from openspec/changes/2026-09-13-vesti-alerts/tasks.md rename to openspec/changes/archive/2026-09-13-vesti-alerts/tasks.md diff --git a/openspec/specs/vesti-alerts/spec.md b/openspec/specs/vesti-alerts/spec.md new file mode 100644 index 0000000..5aeebc2 --- /dev/null +++ b/openspec/specs/vesti-alerts/spec.md @@ -0,0 +1,102 @@ +# vesti-alerts Specification + +## Purpose +TBD - created by archiving change 2026-09-13-vesti-alerts. Update Purpose after archive. + +## Requirements + +### Requirement: VestiWebDown + +Алерт на недоступность web-интерфейса VESTI (:8400, systemd-юнит). + +#### Scenario: web не отвечает + +- Given метрика `vesti_web_up{component="vesti"}` = 0 +- When условие держится 2 минуты +- Then алерт `VestiWebDown` переходит в Firing (severity critical) + +#### Scenario: web восстановился + +- Given метрика `vesti_web_up{component="vesti"}` = 1 +- When алерт в Firing +- Then алерт закрывается автоматически + +### Requirement: VestiPublisherDown + +Алерт на недоступность publisher-сервиса VESTI (:8410, /healthz). + +#### Scenario: publisher не отвечает + +- Given метрика `vesti_publisher_health{component="vesti"}` = 0 +- When условие держится 2 минуты +- Then алерт `VestiPublisherDown` переходит в Firing (severity critical) + +#### Scenario: publisher восстановился + +- Given метрика `vesti_publisher_health{component="vesti"}` = 1 +- When алерт в Firing +- Then алерт закрывается автоматически + +### Requirement: VestiPublisherContainerDown + +Алерт на остановку Docker-контейнера publisher. + +#### Scenario: контейнер publisher не в статусе Up + +- Given метрика `vesti_publisher_docker{component="vesti"}` = 0 +- When условие держится 2 минуты +- Then алерт `VestiPublisherContainerDown` переходит в Firing (severity critical) + +#### Scenario: контейнер publisher снова Up + +- Given метрика `vesti_publisher_docker{component="vesti"}` = 1 +- When алерт в Firing +- Then алерт закрывается автоматически + +### Requirement: VestiTunnelDown + +Алерт на недоступность SOCKS5-туннеля Telegram (:1080). + +#### Scenario: туннель недоступен + +- Given метрика `vesti_telegram_tunnel{component="vesti"}` = 0 +- When условие держится 2 минуты +- Then алерт `VestiTunnelDown` переходит в Firing (severity critical) + +#### Scenario: туннель восстановился + +- Given метрика `vesti_telegram_tunnel{component="vesti"}` = 1 +- When алерт в Firing +- Then алерт закрывается автоматически + +### Requirement: VestiDbDown + +Алерт на недоступность SQLite-базы vesti.db. + +#### Scenario: БД недоступна + +- Given метрика `vesti_db_ok{component="vesti"}` = 0 +- When условие держится 2 минуты +- Then алерт `VestiDbDown` переходит в Firing (severity critical) + +#### Scenario: БД восстановилась + +- Given метрика `vesti_db_ok{component="vesti"}` = 1 +- When алерт в Firing +- Then алерт закрывается автоматически + +### Requirement: VestiDbStale + +Алерт на устаревание данных краулера (не запускался >30 минут). + +#### Scenario: краулер не запускался более 30 минут + +- Given метрика `vesti_db_last_run_ts{component="vesti"}` = T +- When `time() - T` > 1800 секунд и условие держится 5 минут +- Then алерт `VestiDbStale` переходит в Firing (severity warning) + +#### Scenario: краулер снова запустился + +- Given метрика `vesti_db_last_run_ts{component="vesti"}` обновлена (time() - ts < 1800) +- When алерт в Firing +- Then алерт закрывается автоматически