fix(tradein/domclick): подтверждённый отказ площадки уехал в ветку «сбой транспорта» и перестал банить узел #3241
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#3241
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3239-sidecar-ban-page-reaches-ban-path"
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?
Summary
Регрессия моего же #3237, найденная при его приёмке. Сайдкар научился опознавать статический отказ Домклика сам — это работает и остаётся. Но отказ стал приезжать наверх обычной 500-кой,
browser_fetcher.py:781на ней обнуляетlast_response_status, и вdetail.pyсрабатывает веткаexcept Exception, которая по построению не зовётreport_ban(#2600 п.4 — не смешивать «бан» и «сетевой сбой»).Три изменения возвращают отказ на ban-путь, не ломая разделение, ради которого #3237 и делался:
browser/server.py— в тело ошибки кладётся структурный признакban_pageи апстрим-статус. HTTP-код остаётся 500: на него завязанаclassify_browser_probe.browser_fetcher.py—SidecarBanPageErrorкак подклассhttpx.HTTPStatusError, поэтому ловля у Авито/Циана/Яндекса и retry-политикаfetch()нового типа не замечают.providers/domclick/detail.py— различает две ветки: подтверждённый отказ →report_ban+ статус из исключения; транспортный сбой — ровно как раньше.Замер, из которого это видно
Прогон 5287 (29.08, 15:56 UTC, уже на образе с #3237):
Раньше на том же месте было
{"platform": 3}. В логах сайдкара — шестьстатический отказ площадкиподряд, вscrape_proxy_source_bansпосле прогона ни одной новой записи.Вред практический, не косметический:
platform— единственный диагноз, запускающий ротацию IP. Без него пул считает отказавшие узлы здоровыми и выдаёт их следующему прогону.Два решения, которые стоит отметить
Статус несём отдельным полем, а не через
last_response_status: на error-путиfetch()его обнуляет, а у Домклика отказ приходит с 401 — без него классификатор ставитunknown. Тест..._carries_upstream_statusдержит именно это (MagicMock отдал быlast_response_statusкак Mock, и ассерт упал бы, читай код оттуда).Признак структурный, а не подстрока в тексте:
_raise_for_sidecar_statusобрезает тело до 300 символов, и формулировка отказа менялась дважды за месяц.Test plan
status: nullне подменяется выдуманным кодом)ruff checkна всех шести файлахПриёмка на проде
Прогон
domclick_detail_backfillна отказывающем узле:ban_kinds=platform, вscrape_proxy_source_bansпоявляется запись, следующий прогон берёт ДРУГОЙ узел. При этом незавершённое рукопожатие (#3237) по-прежнему не банит.Оговорка та же, что и в #3237: узлы пула 1/9/10/11 подпорчены сегодняшними диагностическими пробами, поэтому первый прогон упрётся в остаточные отказы площадки. Судить по тому, ЗАПИСАЛСЯ ЛИ БАН, а не по
enriched.Closes #3239