fix(tradein/avito): серия отказов обрывается и называет причину, а не выедает бюджет (#2674) #2739
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2739
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/avito-backfill-failure-breaker"
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?
Что было
avito_detail_backfill, три ночи подряд (3, 4, 5 августа):attempted≈1600, failed≈1600, blocked=0, enriched=0, полный бюджет 9000 с и ~1600 запросов через единственный прокси. Брейкер у задачи был только на блоки; отказ, не распознанный как блок, не обрывал ничего.Обогащения у этой задачи нет с 12 июля (последний прогон с
enriched>0— 2026-07-12 01:08). Остальные ночи выглядели так: либоattempted=5, blocked=5(13-22 июля, 1, 2 и 6 августа), либоattempted=0(23-30 июля, очередь была пуста), либо ~1600 отказов.Почему причина неизвестна — и почему это чинится кодом
Поштучные отказы логируются
WARNING; в GlitchTip уезжают толькоERROR, а логи контейнера пропадают при его пересоздании — сегодня контейнер пересоздан в 12:57, и прогоны 11:05 и 12:40 остались без логов вовсе. Различие «площадка нас заблокировала» vs «не поднялся наш прокси-тракт» — это разные владельцы задачи (#2686, #2698), и оно обязано переживать перезапуск контейнера, то есть лежать в самом прогоне.Обе версии сегодня равновероятны и не разводятся имеющимися данными:
curl: (56) CONNECT tunnel failed, response 502, который в тот же день ловил соседнийcian_city_sweep(run 3309, 3 подряд, abort);Avito detail firewall/soft-block) — то есть площадка тоже нас видит.Что сделано
max_consecutive_failures(по умолчанию 25) обрывает серию отказов без единого успеха. Порог намеренно выше блочного: пачка мёртвых карточек (404 →ValueErrorв curl-режиме) не должна ронять здоровый прогон, а 25 подряд — уже не невезение;mark_backfill_finished(fail_hint=…). Прогон 3306 сказал бы не «blocked=5», а какой именно блок и чей;Обхода антибота здесь нет и не предполагается: цель — чтобы завтрашний прогон сам назвал владельца отказа.
Test plan
pytest tests/tasks/test_avito_detail_backfill.py— 20 passed; тест на брейкер падает на старом коде (attempted=200вместо 25)pytestбэкенда — 3854 passedscrape_runs.errorдолжна появиться строка «причина: <класс>: <текст> (N из M)»Refs #2674
done#2698