Merge pull request 'fix(ops/metrics): тема «метрики» задаётся дефолтом, а не ручным заведением секрета' (#3167) from fix/3163-infra-topic-default into main
All checks were successful
Deploy / changes (push) Successful in 9s
Deploy / build-frontend (push) Has been skipped
Deploy / deploy-caddy (push) Has been skipped
Deploy Metrics / server (push) Successful in 15s
Deploy Metrics / agent-apps (push) Successful in 22s
Deploy Metrics / agent-infra (push) Successful in 22s
Deploy / build-backend (push) Successful in 35s
Deploy / build-worker (push) Successful in 38s
Deploy / deploy (push) Successful in 1m2s
Deploy / deploy-status (push) Successful in 1s
Deploy / perimeter-smoke (push) Successful in 10s

This commit is contained in:
bot-backend 2026-08-27 19:47:28 +00:00
commit ba57cf7c05
2 changed files with 36 additions and 29 deletions

View file

@ -164,26 +164,28 @@ jobs:
# бы вовсе — то есть алертинг исчез бы целиком, а не «ушёл не в
# ту тему».
#
# Откат обязателен: пока METRICS_TELEGRAM_INFRA_TOPIC_ID не
# прописана на хосте, берём METRICS_TELEGRAM_TOPIC_ID — тогда
# поведение остаётся ровно прежним, а не ломается молча.
# Значение по умолчанию стоит ЗДЕСЬ, а не в секрете. Номер темы
# форума секретом не является: в репозитории уже лежат домены,
# пути на хостах, имена контейнеров и внешние адреса. Зато шаг
# «завести секрет руками» — это отказ, который уже случился:
# 27.08 два прогона подряд молча откатились на тему клиентских
# инцидентов, и тема «метрики» осталась пустой при полностью
# зелёном деплое.
#
# Прежний откат на METRICS_TELEGRAM_TOPIC_ID убран намеренно: он
# давал ровно то состояние, ради ухода от которого всё и
# затевалось — весь инфраструктурный поток в теме клиентских
# инцидентов, — и сообщал об этом строкой в логе, которую никто
# не читает. Молчаливое «почти правильно» хуже явной поломки.
#
# Переменная окружения по-прежнему перекрывает значение: переезд
# темы или другой чат решается ею, без правки кода.
INFRA_TOPIC_ID="${METRICS_TELEGRAM_INFRA_TOPIC_ID:-245}"
METRICS_TELEGRAM_INFRA_TOPIC_LINE=" message_thread_id: ${INFRA_TOPIC_ID}"
if [ -n "${METRICS_TELEGRAM_INFRA_TOPIC_ID:-}" ]; then
INFRA_TOPIC_ID="${METRICS_TELEGRAM_INFRA_TOPIC_ID}"
INFRA_TOPIC_IS_FALLBACK=0
echo "Инфраструктура: тема ${INFRA_TOPIC_ID} из окружения."
else
INFRA_TOPIC_ID="${METRICS_TELEGRAM_TOPIC_ID:-}"
INFRA_TOPIC_IS_FALLBACK=1
fi
if [ -n "${INFRA_TOPIC_ID}" ]; then
METRICS_TELEGRAM_INFRA_TOPIC_LINE=" message_thread_id: ${INFRA_TOPIC_ID}"
if [ "${INFRA_TOPIC_IS_FALLBACK}" = "1" ]; then
echo "Инфраструктура: METRICS_TELEGRAM_INFRA_TOPIC_ID не задана — откат на METRICS_TELEGRAM_TOPIC_ID, топик ${INFRA_TOPIC_ID}."
else
echo "Инфраструктура: адресуются в топик ${INFRA_TOPIC_ID}."
fi
else
METRICS_TELEGRAM_INFRA_TOPIC_LINE=""
echo "Инфраструктура: топик не задан — уйдут в общую тему чата."
echo "Инфраструктура: тема ${INFRA_TOPIC_ID} по умолчанию (METRICS_TELEGRAM_INFRA_TOPIC_ID не задана)."
fi
if [ -n "${METRICS_TELEGRAM_ONCALL:-}" ]; then

View file

@ -133,22 +133,27 @@ def test_deploy_computes_whole_line_and_passes_it_to_envsubst() -> None:
)
def test_infra_topic_falls_back_to_client_topic_when_unset() -> None:
"""Без METRICS_TELEGRAM_INFRA_TOPIC_ID — откат на METRICS_TELEGRAM_TOPIC_ID (#3163).
def test_infra_topic_has_working_default_and_never_falls_back_to_client_topic() -> None:
"""Тема по умолчанию задана в самом деплое и НЕ откатывается на клиентскую (#3163).
Разделение тем не должно ломать деплой у тех, кто ещё не прописал новую
переменную на хосте: пока её нет, поведение обязано остаться ровно
прежним (топик из METRICS_TELEGRAM_TOPIC_ID), а не откатиться в общую тему
чата или сломать рендер конфига.
Первая половина: без значения по умолчанию разделение тем зависело бы от
ручного шага «завести секрет». Этот шаг уже отказал 27.08 два прогона
подряд отработали зелёными, а тема «метрики» осталась пустой.
Вторая половина важнее: откат на METRICS_TELEGRAM_TOPIC_ID запрещён явно.
Он возвращал ровно то состояние, ради ухода от которого всё затевалось
весь инфраструктурный поток в теме клиентских инцидентов, и сообщал об
этом строкой в логе прогона, которую никто не читает.
"""
text = WORKFLOW.read_text(encoding="utf-8")
assert re.search(
r'if \[ -n "\$\{METRICS_TELEGRAM_INFRA_TOPIC_ID:-\}" \]; then'
r'[\s\S]*?INFRA_TOPIC_ID="\$\{METRICS_TELEGRAM_INFRA_TOPIC_ID\}"'
r'[\s\S]*?else'
r'[\s\S]*?INFRA_TOPIC_ID="\$\{METRICS_TELEGRAM_TOPIC_ID:-\}"',
r'INFRA_TOPIC_ID="\$\{METRICS_TELEGRAM_INFRA_TOPIC_ID:-\d+\}"',
text,
), "нет отката на METRICS_TELEGRAM_TOPIC_ID при незаданной METRICS_TELEGRAM_INFRA_TOPIC_ID"
), "у инфраструктурной темы нет значения по умолчанию — разделение зависит от ручного шага"
assert not re.search(
r'INFRA_TOPIC_ID="\$\{METRICS_TELEGRAM_TOPIC_ID',
text,
), "вернулся откат на тему клиентских инцидентов — это и есть исходный дефект"
def test_config_is_validated_before_stack_comes_up() -> None: