fix(tradein/avito): браузерный бэкфилл ходил мимо пула прокси #3145

Merged
lekss361 merged 2 commits from fix/3045-browser-mode-no-proxy-lease into main 2026-08-27 13:22:05 +00:00
Owner

Найдено проверкой, восстановил ли сбор предыдущий PR (#3143). Не восстановил — и вот почему.

Что происходит

Ветка browser_mode в avito_detail_backfill конструировала фетчер так:

browser_fetcher = BrowserFetcher(
    source="avito", endpoint=settings.browser_http_endpoint
)

Без proxy_provider / use_pool / environment фетчер не кладёт "proxy" в тело POST /fetch. Сайдкар берёт свой env-прокси, и прогон уходит мимо пула целиком: ни выбора узла по affinity, ни учёта scrape_proxy_source_bans, ни ротации при блоке.

В логе это видно прямым текстом: proxy_lease_id=None.

Замер на проде, прогон 5098

avito_detail_backfill: run_id=5098 mode=browser
BrowserFetcher: клиент создан, endpoint=http://tradein-browser:3000 proxy_lease_id=None
BLOCKED #1/1600 (consecutive=1): Avito detail firewall/soft-block (browser-mode)
BLOCKED #2 … #5
ABORT -- 5 consecutive blocks, IP rate-limited. enriched=0 attempted=5

Одновременно в том же логе, через две минуты:

proxy_pool: healthcheck done — checked=4 ok=4 failed=0
mark_health id=1  ok=True exit_ip=46.8.154.50
mark_health id=9  ok=True exit_ip=5.227.52.55
mark_health id=10 ok=True exit_ip=31.29.196.214
mark_health id=11 ok=True exit_ip=178.70.224.116

Пул полностью здоров, ни один узел не занят и не забанен. А тот же URL Авито через прокси отдаёт 200 и 3.3 МБ настоящей страницы (проверял отдельно, из того же контейнера). Площадка нас пускала — запрос шёл не оттуда.

Это уже чинили рядом

house_imv_backfill страдал ровно тем же#2698. Из комментария, который там оставили:

Результат: 03.07-05.08 все 35 из 35 попыток каждого прогона падали… пока avito_city_sweep/avito_newbuilding_sweep в те же дни тянули сотни объявлений через ТОТ ЖЕ сайдкар и тот же инстанс камуфокса — они пул подключают.

Тот путь починили и закрыли тестом. Этот остался.

Почему предыдущий PR не помог

#3143 чинил потерю прокси в повторах curl-пути. Дефект там настоящий и правка верна, но боевой режим бэкфилла — mode=browser, и до curl-веток он не доходит вовсе. Отмечаю прямо, чтобы не осталось впечатления, что Авито уже ожил.

Тесты

Три:

  1. Конструктор на месте — страховка от того, что тест онемеет после рефакторинга.
  2. Все три аргумента проводки передаются — собственно инвариант.
  3. use_pool читается из конфига, а не зашит константой. Зашитый True отнял бы у владельца выключатель USE_PROXY_POOL_BROWSER; зашитый False вернул бы дефект, ничего не сломав заметно.

Проверил, что тест краснеет на коде без проводки.

$ uv run python -m pytest tests/test_3045_… tests/test_2698_… tests/scrapers/ -q
113 passed

$ uv run ruff check …
All checks passed!

После деплоя проверю прогоном и отпишусь фактическим числом обогащённых — обещать восстановление до замера не буду.

Refs #3045, #3034, #2698

Найдено проверкой, восстановил ли сбор предыдущий PR (#3143). **Не восстановил** — и вот почему. ## Что происходит Ветка `browser_mode` в `avito_detail_backfill` конструировала фетчер так: ```python browser_fetcher = BrowserFetcher( source="avito", endpoint=settings.browser_http_endpoint ) ``` Без `proxy_provider` / `use_pool` / `environment` фетчер не кладёт `"proxy"` в тело `POST /fetch`. Сайдкар берёт свой env-прокси, и прогон уходит **мимо пула целиком**: ни выбора узла по affinity, ни учёта `scrape_proxy_source_bans`, ни ротации при блоке. В логе это видно прямым текстом: `proxy_lease_id=None`. ## Замер на проде, прогон 5098 ``` avito_detail_backfill: run_id=5098 mode=browser BrowserFetcher: клиент создан, endpoint=http://tradein-browser:3000 proxy_lease_id=None BLOCKED #1/1600 (consecutive=1): Avito detail firewall/soft-block (browser-mode) BLOCKED #2 … #5 ABORT -- 5 consecutive blocks, IP rate-limited. enriched=0 attempted=5 ``` Одновременно в том же логе, через две минуты: ``` proxy_pool: healthcheck done — checked=4 ok=4 failed=0 mark_health id=1 ok=True exit_ip=46.8.154.50 mark_health id=9 ok=True exit_ip=5.227.52.55 mark_health id=10 ok=True exit_ip=31.29.196.214 mark_health id=11 ok=True exit_ip=178.70.224.116 ``` Пул полностью здоров, ни один узел не занят и не забанен. А тот же URL Авито через прокси отдаёт **200 и 3.3 МБ** настоящей страницы (проверял отдельно, из того же контейнера). Площадка нас пускала — запрос шёл не оттуда. ## Это уже чинили рядом `house_imv_backfill` страдал **ровно тем же** — #2698. Из комментария, который там оставили: > Результат: 03.07-05.08 все 35 из 35 попыток каждого прогона падали… пока `avito_city_sweep`/`avito_newbuilding_sweep` в те же дни тянули сотни объявлений через ТОТ ЖЕ сайдкар и тот же инстанс камуфокса — они пул подключают. Тот путь починили и закрыли тестом. Этот остался. ## Почему предыдущий PR не помог #3143 чинил потерю прокси в повторах **curl-пути**. Дефект там настоящий и правка верна, но боевой режим бэкфилла — `mode=browser`, и до curl-веток он не доходит вовсе. Отмечаю прямо, чтобы не осталось впечатления, что Авито уже ожил. ## Тесты Три: 1. **Конструктор на месте** — страховка от того, что тест онемеет после рефакторинга. 2. **Все три аргумента проводки передаются** — собственно инвариант. 3. **`use_pool` читается из конфига, а не зашит константой.** Зашитый `True` отнял бы у владельца выключатель `USE_PROXY_POOL_BROWSER`; зашитый `False` вернул бы дефект, ничего не сломав заметно. Проверил, что тест краснеет на коде без проводки. ``` $ uv run python -m pytest tests/test_3045_… tests/test_2698_… tests/scrapers/ -q 113 passed $ uv run ruff check … All checks passed! ``` После деплоя проверю прогоном и отпишусь фактическим числом обогащённых — обещать восстановление до замера не буду. Refs #3045, #3034, #2698
lekss361 added 1 commit 2026-08-27 12:58:55 +00:00
fix(tradein/avito): браузерный бэкфилл ходил мимо пула прокси
Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Failing after 4m53s
d66a52d492
Ветка browser_mode в avito_detail_backfill конструировала BrowserFetcher без
proxy_provider/use_pool/environment. Без них фетчер не кладёт "proxy" в тело
POST /fetch, сайдкар берёт свой env-прокси, и прогон уходит мимо пула целиком:
ни выбора узла по affinity, ни учёта scrape_proxy_source_bans, ни ротации при
блоке. В логе это ровно `proxy_lease_id=None`.

Ровно этот дефект чинили рядом — #2698 в house_imv_backfill, где он держал
35 отказов из 35 попыток в каждом прогоне полтора месяца, пока соседние свипы
через ТОТ ЖЕ сайдкар тянули сотни объявлений. Здесь он остался.

Замер 27.08, прогон 5098:

    mode=browser, proxy_lease_id=None
    BLOCKED #1..#5 подряд — firewall/soft-block (browser-mode)
    ABORT — 5 consecutive blocks, enriched=0 attempted=5

При этом пул здоров — 4 узла, все ok, ни один не занят, браузерная проверка
пройдена в то же утро. А тот же URL Авито через прокси отдаёт 200 и 3.3 МБ
страницы. То есть площадка нас пускала, запрос шёл не оттуда.

Это объясняет, почему предыдущая правка (#3143, прокси в повторах curl-пути)
не восстановила сбор: боевой режим бэкфилла — browser, и он до curl-веток
вообще не доходит.

Три теста: конструктор на месте (страховка от проверки пустоты), все три
аргумента проводки передаются, use_pool читается из конфига а не зашит
константой (зашитый True отнял бы у владельца выключатель, зашитый False вернул
бы дефект незаметно). Проверил красноту на коде без проводки.
Прогон: 113 тестов зелёные, ruff чист.

Refs #3045, #3034, #2698
bot-backend added 1 commit 2026-08-27 13:16:31 +00:00
test(tradein/avito): тест закреплял отсутствие проводки пула
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
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 4m46s
c1918b404d
`assert_called_once_with(source=..., endpoint=...)` требует, чтобы других
аргументов у вызова НЕ БЫЛО. Тем самым тест закреплял ровно тот дефект, который
чинит этот PR: браузерный фетчер обязан был строиться без проводки пула, иначе
CI краснел.

Заменено на проверку вхождения: source и endpoint по-прежнему сверяются, плюс
явно требуется наличие proxy_provider/use_pool/environment — то, без чего
прогон уходит мимо пула (proxy_lease_id=None, 5 блоков из 5 при здоровом пуле).

Прогон: 277 тестов зелёные, ruff чист.
lekss361 merged commit a1ace9fcde into main 2026-08-27 13:22:05 +00:00
lekss361 deleted branch fix/3045-browser-mode-no-proxy-lease 2026-08-27 13:22:05 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3145
No description provided.