[tradein][backend] Sentry-алерт на N подряд scraper-фейлов (mark_failed/mark_banned) #827

Closed
opened 2026-05-30 19:52:09 +00:00 by lekss361 · 2 comments
Owner

Worker: auto-backend, ветка от forgejo/main. Best-effort алерт (try/except как существующий). Конфликт → коммент.

Задача

Единственный Sentry-алерт по скраперам — узкий cian cookies-expired (scheduler.py:314). mark_failed/mark_banned только пишут status+logger.warning. Серия подряд-фейлов источника (бан/протухшие куки/сломанный парсер) проходит молча. Нужен алерт при N (порог 3) подряд failed/banned для одного source.

Файлы

  • scrape_runs.py:83 mark_failed, :110 mark_banned
  • референс: scheduler.py:314 (sentry_sdk.capture_message в try/except)
  • таблица scrape_runs (source,status,finished_at)

Definition of Done

  • После UPDATE на failed/banned → запрос последних N runs этого source; если все N ∈ (failed,banned) → один sentry_sdk.capture_message(level=error).
  • Порог N = module-const (CONSECUTIVE_FAILURE_ALERT_THRESHOLD=3).
  • try/except вокруг алерта (pass если sentry не init).
  • Алертит только при достижении порога (не на каждый фейл — антиспам).
  • Тест: streak<N нет capture; streak==N capture вызван (mock). ruff clean.

Не делать

  • НЕ менять сигнатуры mark_failed/mark_banned. НЕ трогать success-путь. НЕ настраивать новый DSN.
> Worker: auto-backend, ветка от forgejo/main. Best-effort алерт (try/except как существующий). Конфликт → коммент. ## Задача Единственный Sentry-алерт по скраперам — узкий cian cookies-expired (scheduler.py:314). mark_failed/mark_banned только пишут status+logger.warning. Серия подряд-фейлов источника (бан/протухшие куки/сломанный парсер) проходит молча. Нужен алерт при N (порог 3) подряд failed/banned для одного source. ## Файлы - scrape_runs.py:83 mark_failed, :110 mark_banned - референс: scheduler.py:314 (sentry_sdk.capture_message в try/except) - таблица scrape_runs (source,status,finished_at) ## Definition of Done - [ ] После UPDATE на failed/banned → запрос последних N runs этого source; если все N ∈ (failed,banned) → один sentry_sdk.capture_message(level=error). - [ ] Порог N = module-const (CONSECUTIVE_FAILURE_ALERT_THRESHOLD=3). - [ ] try/except вокруг алерта (pass если sentry не init). - [ ] Алертит только при достижении порога (не на каждый фейл — антиспам). - [ ] Тест: streak<N нет capture; streak==N capture вызван (mock). ruff clean. ## Не делать - НЕ менять сигнатуры mark_failed/mark_banned. НЕ трогать success-путь. НЕ настраивать новый DSN.
lekss361 added this to the Night batch — 2026-05-31 milestone 2026-05-30 19:52:09 +00:00
lekss361 added the
observability
scope/backend
priority/p3
tradein
status/ready
labels 2026-05-30 19:52:09 +00:00
bot-backend added
status/wip
and removed
status/ready
labels 2026-05-30 19:56:27 +00:00
bot-backend self-assigned this 2026-05-30 19:56:27 +00:00
bot-backend added
status/review
and removed
status/wip
labels 2026-05-30 20:01:36 +00:00
Collaborator

PR #833 (feat/827-scraper-failure-alert) → review. CONSECUTIVE_FAILURE_ALERT_THRESHOLD=3, _alert_if_consecutive_failures в конце mark_failed/mark_banned (после commit): последние N+1 finished-runs источника → capture_message только если первые N все failed/banned И (N+1)-й не failed/banned (анти-спам, ×1 на Nй). try/except: pass (best-effort). Сигнатуры/success-path не тронуты. 13 passed, ruff clean.

PR #833 (feat/827-scraper-failure-alert) → review. `CONSECUTIVE_FAILURE_ALERT_THRESHOLD=3`, `_alert_if_consecutive_failures` в конце mark_failed/mark_banned (после commit): последние N+1 finished-runs источника → capture_message только если первые N все failed/banned И (N+1)-й не failed/banned (анти-спам, ×1 на Nй). try/except: pass (best-effort). Сигнатуры/success-path не тронуты. 13 passed, ruff clean.
bot-reviewer added
status/qa
and removed
status/review
labels 2026-05-30 20:10:35 +00:00
Collaborator

QA PASS — Sentry alert на N подряд scraper-фейлов (PR #833, merged). Verified по merged diff.

scrape_runs.py:

  • CONSECUTIVE_FAILURE_ALERT_THRESHOLD = 3 module-const.
  • _alert_if_consecutive_failures берёт последние N+1 finished-runs источника → sentry_sdk.capture_message(level=error) ТОЛЬКО если первые N все ∈ (failed,banned) И (N+1)-й НЕ failed/banned → срабатывает ровно при streak==N, не на N+1/N+2 (главный anti-spam case).
  • Весь блок try/except: pass (best-effort, безопасно при неинициализированном Sentry).
  • _alert_on_run_id резолвит source по run_id → вызывает helper; повешено в mark_failed/mark_banned ПОСЛЕ commit(). Сигнатуры + success-path не тронуты.

Edge-разбор (совпадает с тестами): ровно-N (без старого run) → fire; N+older-done → fire; N+1-fails → НЕ fire (уже алертили); streak<N → no-op.

Тесты (13, test_scrape_run_alert.py): все границы streak, mixed failed/banned, sentry-raises-не-пропагирует, db-raises-не-пропагирует, mark_failed/mark_banned интеграция (capture once / не ниже порога). 13 passed, ruff clean.

DoD: query-last-N+alert , N=const , try/except , anti-spam (только на пороге) , тесты streak<N/==N , сигнатуры не тронуты .

status/done, closing. (Code-only observability; try/except покрывает unset GLITCHTIP_DSN на проде.)

✅ **QA PASS** — Sentry alert на N подряд scraper-фейлов (PR #833, merged). Verified по merged diff. **`scrape_runs.py`:** - `CONSECUTIVE_FAILURE_ALERT_THRESHOLD = 3` module-const. ✅ - `_alert_if_consecutive_failures` берёт последние **N+1** finished-runs источника → `sentry_sdk.capture_message(level=error)` ТОЛЬКО если первые N все ∈ (failed,banned) И (N+1)-й НЕ failed/banned → срабатывает ровно при streak==N, не на N+1/N+2 (главный anti-spam case). ✅ - Весь блок `try/except: pass` (best-effort, безопасно при неинициализированном Sentry). ✅ - `_alert_on_run_id` резолвит source по run_id → вызывает helper; повешено в `mark_failed`/`mark_banned` ПОСЛЕ `commit()`. Сигнатуры + success-path не тронуты. ✅ **Edge-разбор (совпадает с тестами):** ровно-N (без старого run) → fire; N+older-done → fire; N+1-fails → НЕ fire (уже алертили); streak<N → no-op. ✅ **Тесты (13, `test_scrape_run_alert.py`):** все границы streak, mixed failed/banned, sentry-raises-не-пропагирует, db-raises-не-пропагирует, mark_failed/mark_banned интеграция (capture once / не ниже порога). 13 passed, ruff clean. ✅ DoD: query-last-N+alert ✅, N=const ✅, try/except ✅, anti-spam (только на пороге) ✅, тесты streak<N/==N ✅, сигнатуры не тронуты ✅. → `status/done`, closing. (Code-only observability; try/except покрывает unset GLITCHTIP_DSN на проде.)
bot-qa added
status/done
and removed
status/qa
labels 2026-05-30 20:14:13 +00:00
Sign in to join this conversation.
No project
No assignees
3 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#827
No description provided.