fix(tradein/proxy): проба Домклика спрашивает защищённый путь, а не robots.txt (#2855) #2856
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#2856
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2855-probe-protected-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?
Что чинится
Проба узла и работа делили транспорт и хост, но не ресурс:
QRATOR закрывает
/api/offers/*и не трогаетrobots.txt, поэтому проба отвечала 200 «пара здорова» ровно тогда, когда свип с того же узла получал блок-страницу.Числа с прода 13.08
Через полчаса проба снова скажет «здоров», и цикл повторится. Зелёный ответ здесь не бесполезен, а вреден — он читается как разрешение выдать узел.
Что сделано
Адрес пробы Домклика — count-эндпоинт
/api/offers/count/v1: та же защищённая семья путей, что у работы, но ответ — одно число, без пагинации и без выдачи. Нагрузка на площадку остаётся минимальной, и это тот же довод, по которому здесь используется/fetch, а не/fetch-json(последний делает переход на главную).Признак «ресурс отдан» стал зависеть от площадки:
User-agentу robots.txt-источников,snippetsCountу Домклика. Вынесен отдельной картой, а не условием в теле, чтобы добавление площадки с боевым путём было одной строкой.Параметры запроса продублированы из
providers/domclick/serp.py::_build_count_urlнамеренно: импорт провайдера вbrowser_fetcherдал бы цикл (провайдеры уже импортируют его).Знание было в коде на шаг от вывода
Пункт 4 шапки
test_2800_per_source_probe.pyуже гласил: «robots.txt площадка отдаёт и забаненному IP». Следствие обработали — проба не гасит боевой бан. Причину, что тогда она и о защищённом пути ничего не говорит, не заметили.Красный прогон
Тем же файлом теста на
origin/main(детач-worktree): 4 failed, 14 passed. На ветке: 18 passed.Падают: адрес Домклика (
/api/offers/count/v1против robots.txt), текст отказа (теперь называет конкретный маркер), и обе половины нового теста.Двусторонность держится внутри ветки: параметризация даёт случай блок-страницы (
ok=False) и случай живого ответа (ok=True) — реализация «маркер не найден никогда» провалила бы вторую. Наorigin/mainвторая половина тоже красная, но по другой причине — тамokвыходит True, и падает проверка адреса; в комментарии теста это записано явно, чтобы не выдавать её за двусторонний контроль на обеих сторонах.Смежные наборы:
test_2723_browser_probe+test_proxy_pool+test_kit_browser_fetcher_proxy_pool— 85 passed.Что это НЕ чинит
Сбор не воскреснет: правка делает отказ видимым, а не снимает его. Пул перестанет выдавать Домклику узел, про который уже известно, что площадка его отбивает.
Риск назвать числом: узлов четыре. Если площадка отбивает на всех, честная проба забанит все четыре пары, и Домклик останется без узлов до истечения шестичасовых банов. Это может оказаться хуже нынешнего, где узел выдаётся и часть лотов всё же собирается (79 за прогон 13.08). Проверять после деплоя: число забаненных пар
узел×domclickза сутки и выработка свипа — если выработка упала до нуля, размен не оправдался.Refs #2855, #2657, #2854
Уточнение риска — он меньше, чем я написал выше, и вот почему
В теле PR я назвал риск: честная проба забанит все четыре пары, Домклик останется без узлов, и станет хуже нынешних 79 лотов. Додумал до конца — так не выйдет, и довод стоит записать до мержа.
Блок возникает ВО ВРЕМЯ прогона, а не до него. Свип успевает собрать 79-372 лота за 111-332 секунды, и только потом получает блок-страницу. Значит на момент выдачи узел не был отбит — иначе первая же страница вернула бы блок и лотов было бы ноль.
Отсюда поведение новой пробы:
snippetsCount→ годенТо есть правка отказывает ровно в тех случаях, где прогон и так дал бы ноль, и не отказывает там, где он собрал бы свои 79. Потери выработки быть не должно.
Остаточная неопределённость, которую не снимаю: это рассуждение, а не замер. Возможен режим, где площадка держит узел отбитым дольше нашего шестичасового бана, и тогда проба будет честно отказывать чаще, чем сегодня выдаётся. Поэтому критерий приёмки остаётся прежним и проверяется числом.
Критерий приёмки, записанный до факта
Первый свип Домклика после деплоя (расписание — около 05:00 UTC):
lots_fetchedсопоставим с 58-79 последних суток. Ноль означает, что размен не оправдался и правку надо откатывать, а не объяснять;узел×domclickбольше нуля. Если по-прежнему ноль при ежедневном блоке свипа — правка не сработала, иsnippetsCountне тот признак.Оба числа снимаются одним запросом к
scrape_runsиscrape_proxy_source_bans.