fix(ops): оповещения уходят в тему «алерты», а не в переговорку (#2203) #3129

Merged
lekss361 merged 2 commits from fix/2203-notify-topic into main 2026-08-27 10:50:57 +00:00
Owner

Замечено владельцем сразу после включения канала: «шлёт в чат переговорки».

Что происходило

В форуме Telegram адрес сообщения — пара «чат + тема». Без message_thread_id сообщение попадает в General, и ошибки при этом нет: sendMessage возвращает 200, доставка формально успешна, просто не туда.

Тот же класс отказа, что и всё остальное сегодня: зелено везде, а человек, которому алерт адресован, его не видит.

Правка

Оба отправителя — ops/lib-backup.sh (бэкапы и сторожа устаревания) и ops/uptime-healthcheck.sh — получили условную подстановку:

${TELEGRAM_TOPIC_ID:+-d "message_thread_id=${TELEGRAM_TOPIC_ID}"}

Условная намеренно. Пустой message_thread_id= Telegram отвергает вместе со всем сообщением, а молчащий алерт хуже алерта не в той теме. Нет переменной — нет параметра, поведение прежнее бит в бит.

Переменные на обоих хостах уже заданы (TELEGRAM_TOPIC_ID=158), так что правка вступит в силу с ближайшим деплоем.

Тест исполняет, а не читает

Три вещи, каждая из которых была бы неправдой:

  • Проверять подстроку в файле — она может стоять в мёртвой ветке или потеряться при подстановке.
  • Копировать функцию в тест — копия разойдётся с оригиналом на первой же правке.
  • Сорсить файл целиком — у uptime-healthcheck.sh нет guard'а по BASH_SOURCE, и сорсинг запустил бы настоящие сетевые проверки.

Поэтому тест вырезает notify() из файла построчно, подсовывает подставной curl, который записывает свои аргументы, и смотрит, что реально ушло бы в сеть.

$ python -m pytest tests/ops/test_2203_notify_topic.py -q
6 passed

Покрыто для обоих скриптов: тема передаётся, когда задана; не передаётся вовсе, когда не задана (обратный конец инварианта — иначе пустое значение уронило бы всю отправку); адресат и текст не вытесняются добавленным параметром.

Мелочь для тех, кто будет запускать тесты локально на Windows

Оболочка определяется запуском: WSL монтирует диски в /mnt/c, git-bash — в /c. Без этого подставной curl не находится и тест падает с «curl не был вызван», хотя код исправен. На Linux (CI) пути уже POSIX и преобразование ничего не меняет.

Refs #2203, #3078

Замечено владельцем сразу после включения канала: «шлёт в чат переговорки». ## Что происходило В форуме Telegram адрес сообщения — пара **«чат + тема»**. Без `message_thread_id` сообщение попадает в General, и **ошибки при этом нет**: `sendMessage` возвращает 200, доставка формально успешна, просто не туда. Тот же класс отказа, что и всё остальное сегодня: зелено везде, а человек, которому алерт адресован, его не видит. ## Правка Оба отправителя — `ops/lib-backup.sh` (бэкапы и сторожа устаревания) и `ops/uptime-healthcheck.sh` — получили условную подстановку: ```sh ${TELEGRAM_TOPIC_ID:+-d "message_thread_id=${TELEGRAM_TOPIC_ID}"} ``` **Условная намеренно.** Пустой `message_thread_id=` Telegram отвергает вместе со всем сообщением, а молчащий алерт хуже алерта не в той теме. Нет переменной — нет параметра, поведение прежнее бит в бит. Переменные на обоих хостах уже заданы (`TELEGRAM_TOPIC_ID=158`), так что правка вступит в силу с ближайшим деплоем. ## Тест исполняет, а не читает Три вещи, каждая из которых была бы неправдой: - **Проверять подстроку в файле** — она может стоять в мёртвой ветке или потеряться при подстановке. - **Копировать функцию в тест** — копия разойдётся с оригиналом на первой же правке. - **Сорсить файл целиком** — у `uptime-healthcheck.sh` нет guard'а по `BASH_SOURCE`, и сорсинг запустил бы настоящие сетевые проверки. Поэтому тест **вырезает `notify()` из файла построчно**, подсовывает подставной `curl`, который записывает свои аргументы, и смотрит, что реально ушло бы в сеть. ``` $ python -m pytest tests/ops/test_2203_notify_topic.py -q 6 passed ``` Покрыто для обоих скриптов: тема передаётся, когда задана; **не передаётся вовсе**, когда не задана (обратный конец инварианта — иначе пустое значение уронило бы всю отправку); адресат и текст не вытесняются добавленным параметром. ## Мелочь для тех, кто будет запускать тесты локально на Windows Оболочка определяется запуском: WSL монтирует диски в `/mnt/c`, git-bash — в `/c`. Без этого подставной `curl` не находится и тест падает с «curl не был вызван», хотя код исправен. На Linux (CI) пути уже POSIX и преобразование ничего не меняет. Refs #2203, #3078
lekss361 added 1 commit 2026-08-27 10:12:33 +00:00
fix(ops): оповещения уходят в тему «алерты», а не в переговорку (#2203)
Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Failing after 1m6s
CI / openapi-codegen-check (pull_request) Successful in 1m55s
8945ea5d04
Канал включили — и алерты бэкапов посыпались в ОБЩУЮ тему форума. В форуме
Telegram адрес сообщения это пара «чат + тема»: без message_thread_id всё
попадает в General, причём без единой ошибки. sendMessage возвращает 200,
доставка «успешна», просто не туда.

Отказ того же класса, что и всё остальное сегодня: зелено везде, а человек,
которому адресован алерт, его не видит.

Оба отправителя (ops/lib-backup.sh и ops/uptime-healthcheck.sh) получили
условную подстановку ${TELEGRAM_TOPIC_ID:+-d "message_thread_id=..."}.
Условная намеренно: пустой message_thread_id= Telegram отвергает вместе со
всем сообщением, а молчащий алерт хуже алерта не в той теме. Нет переменной —
нет параметра, поведение прежнее бит в бит.

Тест ИСПОЛНЯЕТ настоящий notify(), извлечённый из файла построчно, подсовывая
подставной curl и проверяя, что реально ушло бы в сеть. Проверять подстроку в
файле бессмысленно: она может стоять в мёртвой ветке. Копировать функцию в
тест — тоже: копия разойдётся с оригиналом на первой правке. Сорсить файл
целиком нельзя: у uptime-healthcheck.sh нет guard'а по BASH_SOURCE, и сорсинг
запустил бы настоящие сетевые проверки.
bot-backend added 1 commit 2026-08-27 10:16:31 +00:00
fix(tests): ruff E741 — однобуквенное имя переменной в разборе скрипта
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 10s
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 1m59s
CI / backend-tests (pull_request) Successful in 17m21s
6446a8cdf5
lekss361 merged commit 0f09c47418 into main 2026-08-27 10:50:56 +00:00
lekss361 deleted branch fix/2203-notify-topic 2026-08-27 10:50:57 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3129
No description provided.