fix(tradein/proxy): проба спрашивает каждую площадку, вердикт пишется на пару «узел × источник» (#2800 B) #2803
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#2803
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2800b-per-source-probe"
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?
Что не так
#2723 починил транспорт пробы — ходить браузером, как ходит работа. Ходила она при этом для всех узлов на один зашитый адрес,
robots.txtАвито. Прокси-узел не «жив/мёртв» вообще: он годен или не годен конкретной площадке.Живой замер 09.08.2026 тем же трактом (сайдкар
tradein-browser→ camoufox с этим прокси → навигация):NS_ERROR_PROXY_BAD_GATEWAYУ узла 1 при этом
browser_fail_streak=0и свежая проба.domclick_city_sweep— ноль лотов четвёртые сутки.Два уточнения к исходной гипотезе, найденные замером:
domclick.ru/robots.txtчерез него отдаёт 200,bff-search-web.domclick.ru/robots.txt— 500. Проба по apex-домену была бы зелёной и бесполезной — та же ошибка «проба идёт не рабочим путём», на третьей оси;ok = html непустой) засчитывала её как успех.Что сделано
_PROBE_URLSвbrowser_fetcher.py):www.avito.ru,ekb.cian.ru,realty.yandex.ru,bff-search-web.domclick.ru.probe_proxy_via_browser(..., source=...)выбирает адрес;sourceв теле/fetchостаётся'generic'— проба по-прежнему не отбирает лок у боевого инстанса camoufox.User-agentесть в robots.txt всех четырёх рабочих хостов (проверено вживую) и отсутствует в заглушке. Такой ответ теперьfail_kind="page".scrape_proxy_source_bans(её уже читаетacquire(source)). Новой сущности и миграции нет. Свои строки помеченыreason='probe:browser';clear_source_bans(..., only_reason=...)даёт пробе снимать только их. Бан, распознанный боевым сбором, проба не гасит: robots.txt площадка отдаёт и забаненному IP, и позволить дешёвому успеху стирать дорогой вердикт значило бы повторить #2723 на паре.Порог отключения не поднимался, affinity ни у кого не снималась — симптом не заметается.
Цена (посчитана до правки, замером)
/fetchBROWSER_PROBE_MINUTES=360не тронут)Крест ограничен источниками, которым узел вообще может достаться (
provider_affinity IN (source,'any')— тот же предикат, что уacquire). Разрежённая схема (по одному источнику за такт, round-robin) рассматривалась и отвергнута числом: вердикт пары протухал бы до 24 ч при бане в 6 ч — окно, в которомacquireснова выдаёт узел, не спросив.Тесты
Новый
tests/test_2800_per_source_probe.py— 12 из 14 красные наorigin/main, прогон приложен ниже. Главный краснеет на настоящей поломке, а не на отсутствующем ключе счётчика:то есть на старом коде
acquire('domclick')выдаёт ровно тот узел, у которого рабочий хост Домклика отвечаетNS_ERROR_PROXY_BAD_GATEWAY.Два теста проходят на main и оставлены как сторожа несломанного: «одна мёртвая площадка не пятнает узел» и «все мёртвые — пятнают» (#2723 цел).
Два теста #2723 обновлены осознанно: они считали вызовы пробы за прогон (1 → 4). Семантика такта не менялась — изменилась цена одного прогона, и она теперь в них записана числом.
Локально:
pytest tests/test_2800_per_source_probe.py tests/test_2723_browser_probe.py tests/services/test_proxy_pool.py tests/services/test_proxy_rotation.py tests/test_2657_domclick_proxy_pool.py tests/test_admin_proxies.py→ 196 passed. Полный прогон совпадает с базой origin/main (11 падений локальной среды, одинаковые до и после).Прод-верификация (критерий записан ДО факта)
proxy_healthcheckидёт каждые 30 минут, браузерный крест — по гейтуbrowser_check_at(≤6 ч после деплоя). Критерии:tradein-scraperпоявляется строкаhealthcheck done — … pair_checked=16 …(было:browser_checked=4без пары).scrape_proxy_source_bansпоявляется строка(proxy_id=1, source='domclick', reason='probe:browser')— раздельный вердикт по источникам у узла, у которого Авито зелёный.domclick_city_sweep(scrape_schedules.next_run_at): узел 1 в прогон не попадает,acquire('domclick')его не выдаёт. Признак в логах — отсутствиеleased proxy id=1 provider=domclick.Пункт 3 — не обещание, что Домклик соберётся: у него могут быть свои беды помимо узла. Проверяемое утверждение ровно одно: первый бакет не тратится на узел, который до площадки не доходит.
Refs #2800
errors=0иdone, все домовые поля Циана нулевые #2700