fix(tradein/scraper): статус «забанен» перестаёт выдавать наш сбой за чужой (#2686) #2711

Merged
bot-backend merged 1 commit from fix/2686-ban-split-and-alerts into main 2026-08-06 08:18:27 +00:00

1 commit

Author SHA1 Message Date
f18440021c fix(tradein/scraper): статус «забанен» перестаёт выдавать наш сбой за чужой (#2686)
All checks were successful
CI / changes (pull_request) Successful in 8s
CI Trade-In / 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 3m4s
Из 115 avito-прогонов со статусом 'banned' 92 (80%) — отказ НАШЕГО браузерного
сайдкара («browser unavailable (proxy may be down)»), 10 — реальный firewall
площадки, 11 — HTTP 429/403. Оба исхода писали разный текст ошибки и получали
один статус: различитель лежал в данных и терялся в момент присвоения. По этому
статусу миграция 206 замедлила avito_full_load_exhaustive более чем вдвое —
основание было ложным.

Разводим не пути, а диагноз:
- AvitoSidecarUnavailableError — подтип AvitoRateLimitedError, поднимается ровно
  там, где отказ порождён нашей инфраструктурой. Подтип, а не отдельный класс,
  чтобы все `except (AvitoBlockedError, AvitoRateLimitedError)` продолжали ловить
  его без изменений — иначе прогон ушёл бы в mark_failed и потерял чекпоинт;
- scrape_runs.ban_kind ('platform' | 'infra', миграция 218) рядом со status,
  а не вместо него. Новое значение статуса пришлось бы доучить пяти местам
  (CHECK, IN-списки обоих сторожей, Literal admin API, список статусов во
  фронте), каждое из которых молча врёт, если про него забыть;
- побочная функция 'banned' — сохранение done_buckets-чекпоинта — остаётся у
  ОБОИХ исходов: следующий прогон не начинает с нуля ни при нашем отказе, ни при
  блокировке площадкой. Тест стережёт оба.

Признак несётся от места порождения (тип исключения), а не разбирается из текста
постфактум; разбор текста в миграции — разовая ретро-классификация истории.

Возврат такта Авито сюда НЕ входит — он вынесен в #2687 на данные 9-10.08.

Refs #2686
2026-08-06 13:14:01 +05:00