gendesign/backend/tests/ops
bot-backend 5ea05cffa6
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m0s
CI / backend-tests (pull_request) Successful in 17m28s
fix(ops/metrics): правки конфига Alertmanager молча не доезжали до контейнера
Пойман на проде 27.08 сразу после мержа #3136. На диске лежал новый конфиг —
`webhook_configs` на сервис кнопки подтверждения, — `amtool check-config` его
одобрил, деплой зелёный. А контейнер продолжал слать алерты напрямую:

    на диске:     webhook_configs: url http://alert-ack:8080/alertmanager
    в контейнере: telegram_configs:

Конфиг подключён бинд-маунтом ФАЙЛА, а рендер делает `rm` и создаёт файл
заново — иначе не перезаписать: после chown он принадлежит 65534 с правами
600, а каталог принадлежит деплой-пользователю. `rm` + создание даёт НОВЫЙ
инод, тогда как открытый дескриптор внутри работающего контейнера продолжает
смотреть на прежний, уже удалённый. `up -d` контейнер не трогает: он
сравнивает описание сервиса, а содержимое бинд-маунта в сравнение не входит.

Отказ беззвучный — ни одного красного признака нигде. Значит и все прежние
правки маршрутизации применялись лишь тогда, когда контейнер пересоздавался
по совпадению.

Перезагрузка по SIGHUP/API не лечит: она перечитывает тот же открытый инод.
Лечит только пересоздание контейнера — его и добавляю, под флагом, который
выставляется ПОСЛЕ успешной проверки конфига. Порядок важен: при обратном
битый конфиг убивал бы работающий Alertmanager вместо того, чтобы оставить
прежний работать.

Прод уже приведён в соответствие вручную — контейнер пересоздан, маршрут
клиентских инцидентов теперь идёт через кнопку. Эта правка нужна, чтобы
следующая правка конфига доехала сама.

Три теста: пересоздание есть, оно закрыто проверкой флага (безусловное рвало
бы доставку на каждом деплое метрик), флаг выставляется после проверки.
Прогон: 78 ops-тестов зелёные, ruff чист.
2026-08-27 15:10:23 +03:00
..
__init__.py fix(ci): прод-деплои в одну группу concurrency — прун одного убивал pull другого (#2950) (#2952) 2026-08-20 07:47:48 +00:00
test_3xxx_alertmanager_inode.py fix(ops/metrics): правки конфига Alertmanager молча не доезжали до контейнера 2026-08-27 15:10:23 +03:00
test_2203_backup_trailer_grep_dashdash.py fix(ops): проверка трейлера дампа падала на grep — ведущие -- принимались за опции (#2203) 2026-08-20 23:38:45 +03:00
test_2203_notify_topic.py fix(tests): ruff E741 — однобуквенное имя переменной в разборе скрипта 2026-08-27 13:16:26 +03:00
test_2950_deploy_concurrency_group.py chore(format): нормализация под ruff 0.15.20 — 161 файл, только формат (#2864) (#3022) 2026-08-21 12:01:52 +00:00
test_3029_deploy_drift.py feat(ops): сторож расхождения «прод ↔ main» — молчаливый недоехавший деплой становится видимым (#3029) 2026-08-27 12:35:43 +03:00
test_3059_alert_retry.py fix(ops): алерт не теряется от одного сетевого отказа (#3059) 2026-08-26 10:02:46 +03:00
test_3078_alert_ack.py fix(tests): убрать директивы noqa на неактивное правило 2026-08-27 14:32:34 +03:00
test_3078_alert_topic.py feat(observability): алерты адресуются в топик форумной группы (#3078) 2026-08-26 14:10:56 +03:00
test_3078_exporter_profiles.py fix(observability): агент не падает из-за переменной чужой роли (#3078) 2026-08-26 12:45:31 +03:00
test_3078_metrics_role_discovery.py fix(observability): привилегированную роль спрашиваем у контейнера, а не угадываем (#3078) 2026-08-26 12:08:37 +03:00
test_3078_oncall_route.py feat(observability): кнопка «Принял в работу» под клиентским инцидентом (#3078) 2026-08-27 13:56:00 +03:00
test_3114_log_credential_scrub.py fix(observability): пароли не уезжают в Loki — скруббер учётных данных (#3114) 2026-08-26 15:50:57 +03:00