Меньше шума: выключенные платежи не засоряют ленту ошибок, провал прокси-пробы пишется строкой вместо трейса #3483

Merged
lekss361 merged 1 commit from fix/3471-observability-noise into main 2026-09-12 11:18:35 +00:00
Owner

Два источника шума из #3471. Оба про наблюдаемость, поведение сервисов не меняется.

Выключенные платежи

Группа TRADE-IN-3GG в GlitchTip: 167 событий уровня error с 29.08 по 12.09. Источник — внутренний адрес смоук-проверки, кнопки оплаты во фронте нет, клиентского трафика там нет вовсе. Выключенный контур ровным потоком размывал ленту, на фоне которой настоящая ошибка теряется.

Фильтр сопоставляет именно это исключение: HTTPException со статусом 503 и текстом «payments are disabled», а не любой 503 — иначе будущий другой maintenance-503 проглотился бы заодно. Подключён первым шагом в трёх точках инициализации: основное приложение, планировщик и бот. Строго говоря, источник только первый, остальные две — на случай переезда кода.

Сама ручка не тронута: 503 при выключенном контуре остаётся, меняется только то, считается ли это событием для трекера ошибок.

Провал прокси-пробы

184 строки httpx.ProxyError 407 за сутки, каждая с полным трейсом, при том что провал пробы — штатное состояние пула, а не инцидент приложения. Добавлена отдельная ветка на ProxyError: одна строка уровня warning с узлом и причиной, отдельный вид отказа в счётчиках. Итоговая сводка checked/ok/failed не изменилась. Логика пробы, аренды и правила пула не тронуты.

Попутно

Сигнатуры фильтров Sentry во всех трёх точках приведены к Event и Hint из sentry_sdk.types вместо самодельных dict. Это был существующий тип-долг, на котором ругался pyright.

Тесты

  • test_sentry_scrub.py — 47 проходят, из них 6 новых: целевой 503 отбрасывается; обычная ошибка проходит; 503 с другим текстом проходит; тот же текст с другим кодом проходит; отсутствие сведений об исключении не ломает фильтр.
  • test_proxy_pool.py — 66 проходят, 2 новых: проба с ProxyError пишет ровно одну строку без трейса, счётчики сводки при этом верные.
  • test_sentry_init_wiring.py — 5 проходят: оба канала фильтрации подключены во всех точках инициализации.
Два источника шума из #3471. Оба про наблюдаемость, поведение сервисов не меняется. ## Выключенные платежи Группа `TRADE-IN-3GG` в GlitchTip: 167 событий уровня error с 29.08 по 12.09. Источник — внутренний адрес смоук-проверки, кнопки оплаты во фронте нет, клиентского трафика там нет вовсе. Выключенный контур ровным потоком размывал ленту, на фоне которой настоящая ошибка теряется. Фильтр сопоставляет именно это исключение: `HTTPException` со статусом 503 и текстом «payments are disabled», а не любой 503 — иначе будущий другой maintenance-503 проглотился бы заодно. Подключён первым шагом в трёх точках инициализации: основное приложение, планировщик и бот. Строго говоря, источник только первый, остальные две — на случай переезда кода. Сама ручка не тронута: 503 при выключенном контуре остаётся, меняется только то, считается ли это событием для трекера ошибок. ## Провал прокси-пробы 184 строки `httpx.ProxyError 407` за сутки, каждая с полным трейсом, при том что провал пробы — штатное состояние пула, а не инцидент приложения. Добавлена отдельная ветка на `ProxyError`: одна строка уровня warning с узлом и причиной, отдельный вид отказа в счётчиках. Итоговая сводка `checked/ok/failed` не изменилась. Логика пробы, аренды и правила пула не тронуты. ## Попутно Сигнатуры фильтров Sentry во всех трёх точках приведены к `Event` и `Hint` из `sentry_sdk.types` вместо самодельных `dict`. Это был существующий тип-долг, на котором ругался pyright. ## Тесты - `test_sentry_scrub.py` — 47 проходят, из них 6 новых: целевой 503 отбрасывается; обычная ошибка проходит; 503 с другим текстом проходит; тот же текст с другим кодом проходит; отсутствие сведений об исключении не ломает фильтр. - `test_proxy_pool.py` — 66 проходят, 2 новых: проба с `ProxyError` пишет ровно одну строку без трейса, счётчики сводки при этом верные. - `test_sentry_init_wiring.py` — 5 проходят: оба канала фильтрации подключены во всех точках инициализации.
lekss361 added 1 commit 2026-09-12 11:05:02 +00:00
fix(obs): убрать шум выключенных платежей и трейсы health-проб proxy_pool
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI / changes (pull_request) Successful in 17s
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
CI Trade-In / backend-tests (pull_request) Successful in 6m59s
165c4a5edd
Два источника шума в error-ленте и логах:

1. GlitchTip группа TRADE-IN-3GG: 167 событий за 29.08-12.09 — 503
   "payments are disabled" из payments.py._require_enabled, которые бьёт
   внутренний IP смоук-проверки (кнопки оплаты во фронте нет). sentry_sdk
   StarletteIntegration репортит любой HTTPException с кодом из 5xx как
   error-событие, даже когда FastAPI штатно обработал исключение и вернул
   корректный ответ. Добавлен before_send-фильтр
   drop_payments_disabled_event (app/observability/sentry_scrub.py),
   матчащий по (status_code=503, detail="payments are disabled") через
   hint["exc_info"] — не по коду 503 в целом, чтобы не проглотить другие
   503. Подключён во всех трёх точках инициализации sentry_sdk.init
   (app/main.py — единственный реальный источник события,
   scheduler_main.py и tgbot_main.py — belt-and-suspenders для
   единообразия, по образцу scrub_payment_request_body). Само поведение
   ручки не меняется — 503 остаётся, фильтруется только репортинг в
   трекер.

2. proxy_pool._probe_proxy: httpx.ProxyError (407 от прокси-провайдера)
   не попадал ни под TimeoutException, ни под ConnectError и падал в
   generic except Exception с exc_info=True — 184 строки полного
   traceback в сутки на штатный провал health-пробы, хотя итоговая
   сводка checked/ok/failed и так его учитывает. Добавлена отдельная
   ветка except httpx.ProxyError с логом в одну строку (узел + причина
   текстом исключения, без трейса). Логика самой пробы, аренды узлов и
   правил пула не изменена.

Тесты: tests/test_sentry_scrub.py (drop_payments_disabled_event — дропает
целевой 503, пропускает прочие ошибки и прочие 503/detail-комбинации),
tests/services/test_proxy_pool.py (ProxyError логируется одной строкой
без exc_info, счётчики healthcheck не ломаются).

Refs #3471
lekss361 merged commit c826793a2a into main 2026-09-12 11:18:35 +00:00
lekss361 deleted branch fix/3471-observability-noise 2026-09-12 11:18:35 +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#3483
No description provided.