fix(tradein): budget Cian valuation call to stop 25s estimate stalls («не считает») #1777

Merged
lekss361 merged 1 commit from fix/tradein-estimate-latency-budgets into main 2026-06-19 09:48:42 +00:00
Owner

Проблема (прод-инцидент)

Клиент: «сервис вообще не считает», «Автовокзал не считает, Уктус посчитал».

Репродукция в tradein-backend показала: оба адреса считаются, но /api/v1/trade-in/estimate стал очень медленным (Уктус — 36.7с, адрес на Автовокзале — дольше). Плавающее «посчитал/не посчитал» = гонка по таймауту, зависящая от адреса/состояния кэша и латентности внешних провайдеров.

Корневой сток латентности: вызов Cian Valuation в estimate_quality() — единственный необёрнутый в _with_budget внешний enrichment. Его внутренний curl-timeout (~25с) блокирует весь запрос на каждом cache-miss. Cian сейчас 100% таймаутит, успех не кэшируется → каждый новый адрес платит 25с.

Фикс

Оборачиваем Cian-вызов в _with_budget() — ровно как уже сделано для Yandex valuation строкой выше. При превышении бюджета → None, тот же graceful-путь, что и сетевая ошибка (без 5xx, без зависания).

  • config.py: новый сеттинг estimate_cian_valuation_timeout_s (default 8.0с, env ESTIMATE_CIAN_VALUATION_TIMEOUT_S).
  • estimator.py: Cian-вызов внутри существующего try обёрнут в _with_budget(..., label="cian_valuation").
  • Тест test_estimator_cian_budget.py: (1) сеттинг существует/дефолт 8.0; (2) TimeoutError от Cian → estimate возвращается без cian_valuation в sources_used, без исключения.

Вне scope (намеренно)

Yandex Geocoder (403, мёртвый ключ) и DaData (403) — по решению заказчика пока не трогаем. Это ротация ключей на стороне инфры, не код. Данный PR делает оценку устойчивой к медленному Cian независимо от состояния тех ключей.

Тесты

pytest tests/test_estimator_cian_budget.py — 2 passed. Pre-commit (ruff/ruff-format) — green.

## Проблема (прод-инцидент) Клиент: «сервис вообще не считает», «Автовокзал не считает, Уктус посчитал». Репродукция в `tradein-backend` показала: **оба адреса считаются**, но `/api/v1/trade-in/estimate` стал очень медленным (Уктус — 36.7с, адрес на Автовокзале — дольше). Плавающее «посчитал/не посчитал» = гонка по таймауту, зависящая от адреса/состояния кэша и латентности внешних провайдеров. **Корневой сток латентности:** вызов Cian Valuation в `estimate_quality()` — единственный **необёрнутый в `_with_budget`** внешний enrichment. Его внутренний curl-timeout (~25с) блокирует весь запрос на каждом cache-miss. Cian сейчас 100% таймаутит, успех не кэшируется → каждый новый адрес платит 25с. ## Фикс Оборачиваем Cian-вызов в `_with_budget()` — ровно как уже сделано для Yandex valuation строкой выше. При превышении бюджета → `None`, тот же graceful-путь, что и сетевая ошибка (без 5xx, без зависания). - `config.py`: новый сеттинг `estimate_cian_valuation_timeout_s` (default **8.0с**, env `ESTIMATE_CIAN_VALUATION_TIMEOUT_S`). - `estimator.py`: Cian-вызов внутри существующего try обёрнут в `_with_budget(..., label="cian_valuation")`. - Тест `test_estimator_cian_budget.py`: (1) сеттинг существует/дефолт 8.0; (2) TimeoutError от Cian → estimate возвращается без `cian_valuation` в sources_used, без исключения. ## Вне scope (намеренно) Yandex Geocoder (403, мёртвый ключ) и DaData (403) — **по решению заказчика пока не трогаем**. Это ротация ключей на стороне инфры, не код. Данный PR делает оценку устойчивой к медленному Cian независимо от состояния тех ключей. ## Тесты `pytest tests/test_estimator_cian_budget.py` — 2 passed. Pre-commit (ruff/ruff-format) — green.
lekss361 added 1 commit 2026-06-19 09:43:53 +00:00
fix(tradein): budget Cian valuation call to stop 25s estimate stalls
All checks were successful
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 5s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
80380dc32a
The Cian Valuation enrichment was the only ungated external call in
estimate_quality() — its internal curl timeout (~25s) blocks the whole
/estimate request on every cache-miss, intermittently pushing latency
past the gateway/patience window (perceived as 'сервис не считает').

Wrap it in _with_budget() (mirrors the existing Yandex-valuation guard):
on timeout it degrades to None — the same graceful path as a network
error — instead of stalling. New setting estimate_cian_valuation_timeout_s
(default 8.0s, env ESTIMATE_CIAN_VALUATION_TIMEOUT_S).
lekss361 merged commit 374238daac into main 2026-06-19 09:48:42 +00:00
lekss361 deleted branch fix/tradein-estimate-latency-budgets 2026-06-19 09:48:42 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#1777
No description provided.