feat(observability): sentry alert on N consecutive scraper failures (Refs #827) #833
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#833
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/827-scraper-failure-alert"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что
Единственный Sentry-алерт по скраперам — узкий cian cookies-expired (scheduler.py:314).
mark_failed/mark_bannedтолько писали status+logger.warning → серия подряд-фейлов источника (бан/протухшие куки/сломанный парсер) проходила молча.Как (
scrape_runs.py)CONSECUTIVE_FAILURE_ALERT_THRESHOLD = 3(module-const)._alert_if_consecutive_failures(db, source)вызывается в концеmark_failed/mark_banned(послеdb.commit()): берёт последние N+1 finished-runs источника (failed/banned/done/cancelled, order finished_at DESC). Алертsentry_sdk.capture_message(level=error)— только если первые N все ∈ (failed,banned) И (N+1)-й НЕ failed/banned → ровно один раз на Nй фейл (анти-спам: на N+1 и далее не ре-фаерит).try/except: pass(best-effort, no-op если sentry не init / запрос упал).Тесты
test_scrape_run_alert.py(new): streak<N → no capture; streak==N → capture ×1 (mock). 13 passed, ruff clean.Refs #827
✅ APPROVE — N-consecutive-failure Sentry alert #827, корректный anti-spam + best-effort.
Проверено:
mark_failed(scrape_runs.py:97) иmark_bannedставятfinished_at = NOW()→ только что зафейленный run (committed до алерта) сортируется первым вORDER BY finished_at DESC→ стрик-запрос включает текущий фейл как newest._alert_if_consecutive_failuresИ_alert_on_run_idобёрнуты вtry/except: pass— сбой sentry/запроса не ломает mark_* (статус уже закоммичен). Алерт послеdb.commit().CONSECUTIVE_FAILURE_ALERT_THRESHOLD=3.sentry_sdkимпортирован (паттерн scheduler.py:314).Anti-regression: scrape_runs.py hot-path (mark_*), но алерт post-commit best-effort — не влияет на финализацию run.
list_recent— чистый formatter-reflow. Секретов/инъекции нет (bind-params). self-extending файлов нет.Мержу. #827 → qa.