fix(tradein/scraper): detail-backfill с нулём обогащений перестаёт называться успехом (#2674) #2695

Merged
bot-backend merged 1 commit from fix/2674-domclick-backfill-honesty into main 2026-08-06 05:59:38 +00:00

1 commit

Author SHA1 Message Date
0e806e1101 fix(tradein/scraper): detail-backfill с нулём обогащений перестаёт называться успехом (#2674)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
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 3m1s
Все три detail-backfill'а (avito/yandex/domclick) финализировались одним
mark_done — прогон, который сделал N попыток и не обогатил ни одного
объявления, отчитывался успехом. На проде это 78 прогонов из 158:
  domclick 24/30 — 494 попытки, 0 обогащено, 63 блока, 431 fail;
  avito    23/76 — в т.ч. 5 прогонов по 1500-1600 попыток с нулём;
  yandex   31/52 — все ровно attempted=5 failed=5 (упор в брейкер).

Существующие алерты этот класс не ловили: _alert_if_consecutive_failures
считает только failed/banned, а _alert_if_consecutive_zero_results смотрит
total_seen, которого в counters backfill'ов нет вовсе (всегда 0 → стрик
никогда не прерывается → анти-спам молчит после первого срабатывания).
Поэтому 30 пустых прогонов Домклика и прошли незамеченными.

Один общий финализатор runs.mark_backfill_finished на три задачи (правка в
одной точке, а не в трёх копиях), правила по образцу #2657 для
domclick_city_sweep:
  attempted=0            → done   (честная пустота, кандидатов не было);
  блоки + обрыв/ноль     → banned (external constraint, не наш баг; тот же
                                   статус, что #2642 дал cian/yandex);
  ноль результата без блоков → failed (это уже наша поломка);
  иначе                  → done   (в т.ч. частичный прогон).
`gone` (404 у avito) считается результатом наравне с enriched: прогон,
подтвердивший снятие объявлений, работу сделал.

Причина пишется в scrape_runs.error с числами прогона, а не пустой строкой.
Побочный эффект честности: три подряд banned/failed поднимают уже
существующий Sentry-алерт — ровно тот сигнал, которого не хватало.

Корневая причина нуля у Домклика — внешняя и уже разобрана в #2636/#2645
(детект QRATOR-маркеров) + куки test-аккаунта протухли 2026-08-03
(domclick_session_cookies.expires_at_estimate), обновление ручное. Расписание
не трогаем: брейкер обрывает прогон после 3 блоков за ~150 с, а миграция кук
не перезальёт.

Refs #2674
2026-08-06 10:45:52 +05:00