fix(tradein/estimator): yandex/cian valuation в /estimate через пул прокси; честный лог при пустом пуле (#3398) #3399
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3399
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3398-estimator-valuations-proxy-pool"
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?
Часть #3398. Не закрывает issue (п. 1 acquire на event loop, п. 2 атрибуция банов, п. 4 IMV-403 — остаются).
Дефект (прод, 06.09, каждая проба
/estimate):curl_cffi ProxyError: CONNECT tunnel failed, response 407→yandex_valuation: empty resultиCian valuation fetch failed: … 407. Оба источника — безproxy_provider→use_pool=False→ env-фолбэкSCRAPER_PROXY_URL(выключенный узел 9). Оба мертвы с 02.09; в ответе это читалось как «нет данных».Фикс (только
app/services/estimator.py; kit уже принимал провайдер):YandexValuationScraper(..., proxy_provider=RealProxyProvider())(lease на сессию в__aenter__, release в__aexit__);estimate_via_cian_valuation—"proxy_provider": RealProxyProvider()в_c_kwargs(покрывает и основной вызов, и отложенную фоновую догрузку; lease на вызов, release вfinallycurl_proxy_url). Оба под существующим_with_budget(8 с); отмена по бюджету →health=False+ release (33cad4f8).Деградация:
caused_by_no_proxy→ WARNING «пул прокси пуст — продолжаем без Yandex/Cian» (не ERROR — пустой пул не сбой площадки), прежний None-путь; строка yandex «empty result» переписана честно («данных нет ЛИБО фетч не дошёл — причина строкой выше от scraper_kit»), без новых полей API —fetch_house_historyсъедаетProxyErrorи отдаётNone, неотличимый от «дом не найден» (потолок).Тесты
tests/test_3398_estimator_valuations_proxy_pool.py(7): провайдер передан в обоих вызовах; пустой пул в production → оценка без источников, без исключения, честный лог; lease освобождён ровно один раз на успехе/ошибке — через настоящийcurl_proxy_url(yandex — реальныйYandexValuationScraperс подменённым_CurlCffiSession; cian — реальная kit-функция подestimate_quality).Фальсификация (
git apply -Restimator.py): 7 failed по значению (assert [] == ['cian'], провайдера нет / lease не взят). Восстановлено.Прогоны: полный backend
5568 passed, 35 skipped(rc=0); ruff OK.Приёмка на проде:
POST /api/v1/trade-in/estimateизнутри контейнера → 200; в логах за окно нет407 CONNECT tunnel failed, естьyandex_valuation: fresh fetch saved …/cian_valuation: price=…либо честное «пул прокси пуст»; узелleased_byзанят в момент вызова и свободен после;USE_PROXY_POOL_CURL=trueв backend (есть с #3387).Code-review (06.09): ⚠️ minor. Подтверждено: оба вызова под
_with_budget8 с;NoProxyAvailableErrorу yandex летит из__aenter__и ловится в_get_or_fetch_yandex_valuation_cached; у ciancurl_proxy_urlстоит СНАРУЖИ внутреннегоtry(докстрока «не кидает исключений» врёт) — новая ветка живая; lease не течёт (ExitStack/finally,except BaseException);asyncio.gatherвestimate_qualityнет — три последовательных lease; тесты через настоящийcurl_proxy_url; строку «empty result» никто не парсил.Докатываю до мержа главное: на проде
ESTIMATE_EXTERNAL_SOURCES_BACKGROUND=true→ синхронный cian возвращает None до прокси-слоя, а настоящий фетч идёт в_defer_external_refresh, где пустой пул ловится общимexcept Exception → logger.exception→ ERROR+traceback в GlitchTip; демоушен черезcaused_by_no_proxyв общей функции (3 строки) + тест в background-режиме. Известное поведение (без правки): при фоне yandex/cian живут параллельно между запросами (потолок 8 задач) и при пуле из 3 узлов/estimateпод нагрузкой может сам себе исчерпать пул — деградация честная.