From 5be7b6882f12fb973a482c101bb1ad4b737c080c Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 4 Jul 2026 02:58:03 +0500 Subject: [PATCH 1/2] =?UTF-8?q?fix(market-metrics):=20offer-trend=20=D1=82?= =?UTF-8?q?=D0=B0=D0=B9=D0=BC=D0=B0=D1=83=D1=82=20=E2=80=94=20warning=20?= =?UTF-8?q?=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20exception?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Профилирование 2026-07-04: QueryCanceled на /analyze (~2/сутки в GlitchTip) — это НЕ user-баг. Offer-trend (§4.3) — самый тяжёлый запрос analyze (211k итераций Nested Loop в objective_lots_history, ~7.4 ГБ буфер-трафика) — на холодном кэше иногда пробивает свой 8с-гвард (~3% прогонов hot-участка). Обрабатывается корректно (деградация в пустой offer_block, analyze успешен), но logger.exception при LoggingIntegration(event_level=ERROR) поднимал ложные GlitchTip-события. Ожидаемый таймаут аддитивного блока = WARNING. Корневой фикс (индекс objective_lots_history) — отдельным PR database-expert. --- backend/app/services/site_finder/market_metrics.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/app/services/site_finder/market_metrics.py b/backend/app/services/site_finder/market_metrics.py index 20f32a8f..001b049b 100644 --- a/backend/app/services/site_finder/market_metrics.py +++ b/backend/app/services/site_finder/market_metrics.py @@ -875,12 +875,16 @@ def compute_offer_price_trend( } try: rows = db.execute(_OFFER_TREND_SQL, params).mappings().all() - except Exception: - logger.exception( - "market_metrics: offer-trend query failed (lat=%s lon=%s radius=%s)", + except Exception as exc: + # Ожидаемый путь: 8с-гвард (parcels.py) отменяет запрос на холодном кэше + # (~2/сутки, профилирование 2026-07-04) — блок аддитивный, analyze успешен. + # WARNING, не exception: ERROR-уровень поднимал ложные GlitchTip-события. + logger.warning( + "market_metrics: offer-trend query failed (lat=%s lon=%s radius=%s): %s", center_lat, center_lon, radius_m, + exc, ) rows = [] -- 2.45.3 From 2d546a4127e1ca8a1d5161091045f2f4176b98fb Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 4 Jul 2026 03:10:13 +0500 Subject: [PATCH 2/2] =?UTF-8?q?docs(market-metrics):=20=D1=81=D0=B2=D1=8F?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D1=82=20=D1=86=D0=B5=D0=BD=D1=8B=20=D1=81=20partial-=D0=B8?= =?UTF-8?q?=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=BE=D0=BC=20=D0=BC=D0=B8=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20186?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/services/site_finder/market_metrics.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/app/services/site_finder/market_metrics.py b/backend/app/services/site_finder/market_metrics.py index 001b049b..77b11863 100644 --- a/backend/app/services/site_finder/market_metrics.py +++ b/backend/app/services/site_finder/market_metrics.py @@ -810,6 +810,9 @@ _OFFER_TREND_SQL = text( # Границы вменяемости цены предложения (руб/м²). Шире, чем сделки-тренд (30k–500k): # предложение включает премиум/апартаменты; отсекаем только явный ETL-мусор. +# ⚠ Значения зеркалированы ЛИТЕРАЛАМИ в partial-предикате покрывающего индекса +# data/sql/186_objective_lots_history_offer_trend_covering_idx.sql — при изменении +# констант индекс надо пересоздать, иначе offer-trend молча теряет Index-Only Scan. _OFFER_PRICE_MIN: int = 10000 _OFFER_PRICE_MAX: int = 1000000 -- 2.45.3