Отказ в alert-ack перестаёт съедать следующий алерт #3490

Merged
lekss361 merged 1 commit from fix/3471-alert-ack-drain-body into main 2026-09-12 11:34:31 +00:00
Owner

Что сломалось

Проверял резервный канал GlitchTip на проде сразу после деплоя #3482/#3484. Первый зонд без секрета получил ожидаемый 401. Второй, уже с верным секретом, вернул:

HTTP/1.1 501 Unsupported method ('{"text":"probe"}POST')

Тело первого запроса осталось в сокете и стало началом строки второго.

Почему

protocol_version = "HTTP/1.1", то есть соединение переиспользуется, а Caddy перед сервисом держит пул к апстриму. Три ветки в do_POST отвечали, не вычитав тело: 404 на чужом пути, 503 при незаданном секрете, 401 при неверном. Любая из них портила следующий запрос по тому же соединению.

Последствие ровно обратно смыслу канала: один отказ ронял следующий настоящий алерт именно там, где резервный путь и нужен.

Фикс

Тело читается один раз в начале do_POST и передаётся в обработчик. Все ветки отказа теперь отвечают на уже вычитанном запросе.

Test plan

  • четыре новых теста поднимают настоящий сокет и шлют пару запросов по одному соединению
  • на прежнем коде три из них падают с той же строкой 501 Unsupported method ('{"text":"probe"}POST'), проверено откатом
  • pytest ops/metrics/alert-ack/test_app.py — 13 passed
  • после деплоя: повторить прод-зонд, второй запрос должен дать 200 и сообщение в теме

Refs #3471

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Что сломалось Проверял резервный канал GlitchTip на проде сразу после деплоя #3482/#3484. Первый зонд без секрета получил ожидаемый 401. Второй, уже с верным секретом, вернул: ``` HTTP/1.1 501 Unsupported method ('{"text":"probe"}POST') ``` Тело первого запроса осталось в сокете и стало началом строки второго. ## Почему `protocol_version = "HTTP/1.1"`, то есть соединение переиспользуется, а Caddy перед сервисом держит пул к апстриму. Три ветки в `do_POST` отвечали, не вычитав тело: 404 на чужом пути, 503 при незаданном секрете, 401 при неверном. Любая из них портила следующий запрос по тому же соединению. Последствие ровно обратно смыслу канала: один отказ ронял следующий настоящий алерт именно там, где резервный путь и нужен. ## Фикс Тело читается один раз в начале `do_POST` и передаётся в обработчик. Все ветки отказа теперь отвечают на уже вычитанном запросе. ## Test plan - [x] четыре новых теста поднимают настоящий сокет и шлют пару запросов по одному соединению - [x] на прежнем коде три из них падают с той же строкой `501 Unsupported method ('{"text":"probe"}POST')`, проверено откатом - [x] `pytest ops/metrics/alert-ack/test_app.py` — 13 passed - [ ] после деплоя: повторить прод-зонд, второй запрос должен дать 200 и сообщение в теме Refs #3471 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 added 1 commit 2026-09-12 11:26:01 +00:00
fix(ops): alert-ack вычитывает тело запроса до любой ветки отказа
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 / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
4d3e273405
Соединение переиспользуется (protocol_version = HTTP/1.1), и Caddy перед
сервисом держит пул к апстриму. Ответ 401/404/503 без чтения тела оставлял
его в сокете, и следующий запрос по тому же соединению начинался с чужих
байт.

Поймано на проде: зонд без секрета получил 401, а следующий запрос — уже с
верным секретом — вернул 501 Unsupported method ('{"text":"probe"}POST').
То есть один отказ съедал следующий НАСТОЯЩИЙ алерт, ровно в том канале,
который заводился как резервный.

Тело теперь читается один раз в начале do_POST и передаётся вниз. Четыре
теста поднимают настоящий сокет и шлют пару запросов по одному соединению —
на прежнем коде три из них падают с той же строкой 501.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 merged commit d74121d74c into main 2026-09-12 11:34:31 +00:00
lekss361 deleted branch fix/3471-alert-ack-drain-body 2026-09-12 11:34:31 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#3490
No description provided.