[tradein] scraper_kit: decommission legacy orchestration (scrape_pipeline.py / scheduler.py) — enable full legacy deletion #2397

Closed
opened 2026-07-04 08:36:23 +00:00 by lekss361 · 2 comments
Owner

Umbrella. Продолжение #2277 после частичного удаления (PR #2394, 5 orphaned-модулей). Цель — убрать legacy SERP-оркестрацию, чтобы разблокировать удаление оставшихся 21 legacy scraper-модуля.

Контекст (проверено на forgejo/main 2026-07-04)

Kit-оркестрация (scraper_kit/orchestration/pipeline.py) — полный parity-покрытый mirror legacy scrape_pipeline.py (9 функций run_*), и прод уже работает на kit (docker-compose.prod.yml:187 USE_KIT_SCHEDULER=true). НО legacy scrape_pipeline.py + app/services/scheduler.py — всё ещё load-bearing:

  • main.py:92 запускает scheduler_loop() (legacy) в backend-контейнере
  • admin.py:57 импортит legacy run_avito_city_sweep/run_cian_city_sweep/run_cian_full_load/run_yandex_city_sweep/run_yandex_full_load (debug «запустить вручную»)
  • avito_detail_backfill.py:44 импортит _CHROME_HEADERS/_avito_proxies из scrape_pipeline
  • scheduler.py смешивает removable scheduler_loop с shared-джобами (import_rosreestr_dkp, _execute_cian_backfill, compute_next_run_at, has_running_run) → нужны admin/main/product_handlers; даже kit-путь транзитивно зависит через product_handlers.build_product_handlers

_run_kit_scheduler (scraper-контейнер) self-sufficient — не импортит legacy, kit-скрейпер безопасен.

Dependency-ordered план (sub-issues создаются после плана-аудита)

  • A — admin.py 5 debug run_* эндпоинтов → kit orchestration.pipeline (kit-версии существуют, parity-покрыты; DI-адаптеры RealScraperConfig/RealMatcherAdapter/RealProxyProvider уже импортятся в admin.py). Unblocks admin→scrape_pipeline.
  • B — вынести _CHROME_HEADERS/_avito_proxies из scrape_pipeline в shared/kit-модуль. Unblocks avito_detail_backfill→scrape_pipeline.
  • C — расщепить scheduler.py: scraper-scheduling (removable, прод уже на kit) vs shared-джобы (keep/relocate). Определить, нужен ли backend-у scheduler_loop вообще (SCHEDULER_ENABLE gating). deep-review — прод scheduler entry.
  • D — 6 отложенных не-оркестрационных call-sites: #2385 (newbuilding mandatory-config ×2), #2386 (imv mock-target), #2330 (build_warmed_session caller). Unblocks cian_valuation/newbuilding/avito_detail модули.
  • E — после A-D: удалить scrape_pipeline.py + legacy scheduler_loop + ставшие orphaned scraper-модули (avito.py, cian.py, yandex_realty.py, base.py, browser_fetcher.py + транзитивные). deep-review.

Риск

Высокий на C/E (прод scheduler + оркестрация). A/B/D — средний/низкий, well-precedented (Group A/E паттерны). Каждый шаг — отдельный PR, parity-тесты test_scraper_kit_pipeline_parity2.py — гейт.

Refs #2277

Umbrella. Продолжение #2277 после частичного удаления (PR #2394, 5 orphaned-модулей). Цель — убрать legacy SERP-оркестрацию, чтобы разблокировать удаление оставшихся 21 legacy scraper-модуля. ## Контекст (проверено на forgejo/main 2026-07-04) Kit-оркестрация (`scraper_kit/orchestration/pipeline.py`) — полный parity-покрытый mirror legacy `scrape_pipeline.py` (9 функций `run_*`), и **прод уже работает на kit** (`docker-compose.prod.yml:187` `USE_KIT_SCHEDULER=true`). НО legacy `scrape_pipeline.py` + `app/services/scheduler.py` — всё ещё load-bearing: - `main.py:92` запускает `scheduler_loop()` (legacy) в backend-контейнере - `admin.py:57` импортит legacy `run_avito_city_sweep`/`run_cian_city_sweep`/`run_cian_full_load`/`run_yandex_city_sweep`/`run_yandex_full_load` (debug «запустить вручную») - `avito_detail_backfill.py:44` импортит `_CHROME_HEADERS`/`_avito_proxies` из scrape_pipeline - `scheduler.py` смешивает removable `scheduler_loop` с shared-джобами (`import_rosreestr_dkp`, `_execute_cian_backfill`, `compute_next_run_at`, `has_running_run`) → нужны admin/main/product_handlers; даже kit-путь транзитивно зависит через `product_handlers.build_product_handlers` `_run_kit_scheduler` (scraper-контейнер) self-sufficient — не импортит legacy, kit-скрейпер безопасен. ## Dependency-ordered план (sub-issues создаются после плана-аудита) - **A** — admin.py 5 debug run_* эндпоинтов → kit `orchestration.pipeline` (kit-версии существуют, parity-покрыты; DI-адаптеры RealScraperConfig/RealMatcherAdapter/RealProxyProvider уже импортятся в admin.py). Unblocks admin→scrape_pipeline. - **B** — вынести `_CHROME_HEADERS`/`_avito_proxies` из scrape_pipeline в shared/kit-модуль. Unblocks avito_detail_backfill→scrape_pipeline. - **C** — расщепить `scheduler.py`: scraper-scheduling (removable, прод уже на kit) vs shared-джобы (keep/relocate). Определить, нужен ли backend-у `scheduler_loop` вообще (SCHEDULER_ENABLE gating). **deep-review — прод scheduler entry.** - **D** — 6 отложенных не-оркестрационных call-sites: #2385 (newbuilding mandatory-config ×2), #2386 (imv mock-target), #2330 (build_warmed_session caller). Unblocks cian_valuation/newbuilding/avito_detail модули. - **E** — после A-D: удалить `scrape_pipeline.py` + legacy `scheduler_loop` + ставшие orphaned scraper-модули (avito.py, cian.py, yandex_realty.py, base.py, browser_fetcher.py + транзитивные). **deep-review.** ## Риск Высокий на C/E (прод scheduler + оркестрация). A/B/D — средний/низкий, well-precedented (Group A/E паттерны). Каждый шаг — отдельный PR, parity-тесты `test_scraper_kit_pipeline_parity2.py` — гейт. Refs #2277
lekss361 added the
scope/backend
scrapers
tech-debt
tradein
labels 2026-07-04 10:23:47 +00:00
Author
Owner

Progress — Part C verified + Part E (partial) done

Part C (#2402): post-deploy smoke GREEN (verified 2×). Прод на kit-scheduler единолично, тикает, джобы фаерятся, backend scheduler-free, GlitchTip чист. Реверт не потребовался.

Part E (partial) — MERGED + deployed:

  • E1 #2405 — удалён scrape_pipeline.py (3734 стр, 0 runtime-импортёров после C) + хирургия 18 orchestration-тестов. deep-review , CI . Прод 84716e61 healthy.
  • E2 #2407 — удалены 6 осиротевших scraper-модулей (cian, cian_detail, yandex_realty, domclick, domclick_exceptions, avito_houses) + 3 dead-скрипта + хирургия 21 теста. deep-review , CI .
  • Orphan-set подтверждён adversarial per-module аудитом (7 скептиков).

Follow-ups заведены: #2406 (cancel/watchdog/drain edge-cases → kit sweeps), #2408 (standalone kit-тесты SERP/houses парсеров + чистка fixtures).

Уточнение scope (по факту re-аудита на eafa305a)

Исходный план предполагал больше orphaned после C. По факту 15 legacy scrapers-модулей остаются live, т.к. их держат Part-D call-sites. Точная карта оставшихся EXTERNAL live-импортёров:

Legacy module Live external callers Part D item
avito_detail tasks/avito_detail_backfill.py:65 #2330 (build_warmed_session) + #2386 (own-session)
cian_valuation tasks/cian_history_backfill.py:41 cian_history_backfill → kit cian.valuation
cian_newbuilding cian_history_backfill.py:170, newbuilding_enrich_backfill.py:368, admin.py:1759 #2385
yandex_newbuilding admin.py:83, tasks/yandex_newbuilding_sweep.py:233 #2385

Все прочие импортёры (avito, base, browser_fetcher, cian_state_parser, yandex_helpers, avito_shared, avito_exceptions, price_brackets, house_type_normalizer, repair_state_normalizer, snapshot_writer) — scrapers-внутренние, осиротеют вместе с кластером на final E.

Next: Part D (миграция 4 call-site групп на kit, behavior-affecting → каждый свой PR + deep-review + qa) → final E (удалить оставшиеся 15 модулей + каталог scrapers/) → закрыть umbrella.

## Progress — Part C verified + Part E (partial) done **Part C** (#2402): post-deploy smoke ✅ GREEN (verified 2×). Прод на kit-scheduler единолично, тикает, джобы фаерятся, backend scheduler-free, GlitchTip чист. Реверт не потребовался. **Part E (partial) — MERGED + deployed:** - **E1** #2405 — удалён `scrape_pipeline.py` (3734 стр, 0 runtime-импортёров после C) + хирургия 18 orchestration-тестов. deep-review ✅, CI ✅. Прод `84716e61` healthy. - **E2** #2407 — удалены 6 осиротевших scraper-модулей (`cian`, `cian_detail`, `yandex_realty`, `domclick`, `domclick_exceptions`, `avito_houses`) + 3 dead-скрипта + хирургия 21 теста. deep-review ✅, CI ✅. - Orphan-set подтверждён adversarial per-module аудитом (7 скептиков). **Follow-ups заведены:** #2406 (cancel/watchdog/drain edge-cases → kit sweeps), #2408 (standalone kit-тесты SERP/houses парсеров + чистка fixtures). ## Уточнение scope (по факту re-аудита на `eafa305a`) Исходный план предполагал больше orphaned после C. По факту **15 legacy scrapers-модулей остаются live**, т.к. их держат Part-D call-sites. Точная карта оставшихся EXTERNAL live-импортёров: | Legacy module | Live external callers | Part D item | |---|---|---| | `avito_detail` | `tasks/avito_detail_backfill.py:65` | #2330 (build_warmed_session) + #2386 (own-session) | | `cian_valuation` | `tasks/cian_history_backfill.py:41` | cian_history_backfill → kit cian.valuation | | `cian_newbuilding` | `cian_history_backfill.py:170`, `newbuilding_enrich_backfill.py:368`, `admin.py:1759` | #2385 | | `yandex_newbuilding` | `admin.py:83`, `tasks/yandex_newbuilding_sweep.py:233` | #2385 | Все прочие импортёры (`avito`, `base`, `browser_fetcher`, `cian_state_parser`, `yandex_helpers`, `avito_shared`, `avito_exceptions`, `price_brackets`, `house_type_normalizer`, `repair_state_normalizer`, `snapshot_writer`) — **scrapers-внутренние**, осиротеют вместе с кластером на final E. **Next:** Part D (миграция 4 call-site групп на kit, behavior-affecting → каждый свой PR + deep-review + qa) → **final E** (удалить оставшиеся 15 модулей + каталог `scrapers/`) → закрыть umbrella.
Author
Owner

Декоммишн завершён — closing

Legacy SERP-оркестрация и весь каталог app/services/scrapers/ удалены; trade-in-скрапинг работает 100% на scraper_kit.providers.*. Verified на проде.

Merged (в порядке зависимостей)

Slice PR Что
Part C #2402 удалён scheduler_loop+27 trigger_*_run, kit — единственный scheduler-путь
E1 #2405 удалён scrape_pipeline.py (3734 стр) + 18 orchestration-тестов
E2 #2407 удалены 6 осиротевших scraper-модулей + 3 dead-скрипта + 21 тест
D1 #2410 avito_detail_backfill → kit avito.detail (build_warmed_session + config=)
D2 #2411 cian_history_backfill → kit cian.valuation+cian.newbuilding
D3 #2415 newbuilding_enrich_backfill → kit cian.newbuilding
D4 #2414 admin debug newbuilding endpoints → kit (+fix stray await)
D5 #2412 yandex_newbuilding_sweep → kit yandex.newbuilding
final E #2419 удалён весь scrapers/ каталог (16 модулей) + 7 dead-скриптов + тест-хирургия

Верификация

  • Аудит orphan-set: adversarial per-module (7 скептиков) + tech-analyst dependency-plan на живом коде.
  • deep-review: E1, E2, final E ( APPROVE каждый); Part D — batch code-review ( все 5, config-footgun invariant закрыт, 0 stale mock-targets).
  • CI: CI Trade-In / backend-tests = success на каждом head. Suite 3179 → 2255 (удалены legacy-only + golden-parity, ожидаемо).
  • Прод-smoke ×3: Part C (kit-scheduler тикает), финальный D+E (deployed 9c6afcc8, каталог gone в образе, registry 29 handlers, все 5 мигрированных task-модулей импортятся, deals_freshness_monitor run done, health 200, GlitchTip чист).
  • Config-footgun (#2322/#2330/#2306 класс): каждый мигрированный call-site получил config=RealScraperConfig(); два silent-footgun сайта (build_warmed_session, resolve_cian_zhk_url_via_search) закрыты with/without-config regression-тестами.

Follow-ups (test-only, не блокеры)

  • #2406 — cancel/watchdog/drain edge-cases на kit sweeps
  • #2408 — standalone kit-тесты SERP/houses парсеров
  • #2422 — kit standalone-покрытие после удаления golden-parity + no-app-imports guard + orphaned fixtures

Не блокировало (осознанно отложено, независимо)

  • #2385 (kit newbuilding mandatory-config type-hardening) — НЕ prerequisite (kit уже требует config на рантайме через BrowserFetcher assert); Part D упростил будущий #2385.
  • #2386 (avito/imv _base mock-target) — независимый kit-internal F4 issue, не связан с декоммишеном.

Closing. Refs #2277.

## ✅ Декоммишн завершён — closing Legacy SERP-оркестрация и весь каталог `app/services/scrapers/` удалены; trade-in-скрапинг работает 100% на `scraper_kit.providers.*`. Verified на проде. ### Merged (в порядке зависимостей) | Slice | PR | Что | |---|---|---| | Part C | #2402 | удалён `scheduler_loop`+27 `trigger_*_run`, kit — единственный scheduler-путь | | E1 | #2405 | удалён `scrape_pipeline.py` (3734 стр) + 18 orchestration-тестов | | E2 | #2407 | удалены 6 осиротевших scraper-модулей + 3 dead-скрипта + 21 тест | | D1 | #2410 | `avito_detail_backfill` → kit `avito.detail` (build_warmed_session + config=) | | D2 | #2411 | `cian_history_backfill` → kit `cian.valuation`+`cian.newbuilding` | | D3 | #2415 | `newbuilding_enrich_backfill` → kit `cian.newbuilding` | | D4 | #2414 | admin debug newbuilding endpoints → kit (+fix stray `await`) | | D5 | #2412 | `yandex_newbuilding_sweep` → kit `yandex.newbuilding` | | final E | #2419 | удалён весь `scrapers/` каталог (16 модулей) + 7 dead-скриптов + тест-хирургия | ### Верификация - **Аудит orphan-set**: adversarial per-module (7 скептиков) + tech-analyst dependency-plan на живом коде. - **deep-review**: E1, E2, final E (✅ APPROVE каждый); Part D — batch code-review (✅ все 5, config-footgun invariant закрыт, 0 stale mock-targets). - **CI**: `CI Trade-In / backend-tests` = success на каждом head. Suite 3179 → 2255 (удалены legacy-only + golden-parity, ожидаемо). - **Прод-smoke ×3**: Part C (kit-scheduler тикает), финальный D+E (deployed `9c6afcc8`, каталог gone в образе, registry 29 handlers, все 5 мигрированных task-модулей импортятся, `deals_freshness_monitor` run done, health 200, GlitchTip чист). - **Config-footgun** (#2322/#2330/#2306 класс): каждый мигрированный call-site получил `config=RealScraperConfig()`; два silent-footgun сайта (`build_warmed_session`, `resolve_cian_zhk_url_via_search`) закрыты with/without-config regression-тестами. ### Follow-ups (test-only, не блокеры) - #2406 — cancel/watchdog/drain edge-cases на kit sweeps - #2408 — standalone kit-тесты SERP/houses парсеров - #2422 — kit standalone-покрытие после удаления golden-parity + no-app-imports guard + orphaned fixtures ### Не блокировало (осознанно отложено, независимо) - #2385 (kit newbuilding mandatory-config type-hardening) — НЕ prerequisite (kit уже требует config на рантайме через `BrowserFetcher` assert); Part D упростил будущий #2385. - #2386 (avito/imv `_base` mock-target) — независимый kit-internal F4 issue, не связан с декоммишеном. Closing. Refs #2277.
Sign in to join this conversation.
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#2397
No description provided.