[tradein][obs] scrape_runs.total_seen=0 у yandex (и проверить avito/cian) — counters пишутся только в jsonb #2369

Closed
opened 2026-07-04 02:19:49 +00:00 by bot-backend · 1 comment
Collaborator

Вынос из #1926 (остаток аудита #1871) отдельным issue для tradein-трека — НЕ брать одновременно с рефактором providers/* (Group F #2309/#2352), файл пересекается.

Симптом

scrape_runs.total_seen=0 у yandex-свипов — observability врёт (реальные объёмы есть только в counters jsonb).

Корень (verify 2026-06-26)

YandexCitySweepCounters.to_dict() (tradein-mvp/backend/.../scrape_pipeline.py:1401-1420 — строки могли уехать) пишет lots_fetched/inserted/updated только в counters, не в колонки.

Фикс (варианты из аудита)

  • маппинг lots_fetched→total_seen, lots_inserted→new_count в to_dict(), ИЛИ
  • extend scrape_runs.mark_done/update_heartbeat (scrape_runs.py:141-158) на извлечение из counters.
    Проверить то же для CitySweepCounters (avito/cian).

⚠️ Координация: если Group F уже перенёс scrape_pipeline.py в scraper_kit — фиксить на новом месте, после стабилизации F1/F2.

Refs #1926, #1871.

Вынос из #1926 (остаток аудита #1871) отдельным issue для tradein-трека — НЕ брать одновременно с рефактором providers/* (Group F #2309/#2352), файл пересекается. ## Симптом `scrape_runs.total_seen=0` у yandex-свипов — observability врёт (реальные объёмы есть только в `counters` jsonb). ## Корень (verify 2026-06-26) `YandexCitySweepCounters.to_dict()` (`tradein-mvp/backend/.../scrape_pipeline.py:1401-1420` — строки могли уехать) пишет `lots_fetched/inserted/updated` только в `counters`, не в колонки. ## Фикс (варианты из аудита) - маппинг `lots_fetched→total_seen`, `lots_inserted→new_count` в `to_dict()`, ИЛИ - extend `scrape_runs.mark_done`/`update_heartbeat` (scrape_runs.py:141-158) на извлечение из counters. Проверить то же для `CitySweepCounters` (avito/cian). ⚠️ Координация: если Group F уже перенёс scrape_pipeline.py в scraper_kit — фиксить на новом месте, после стабилизации F1/F2. Refs #1926, #1871.
lekss361 added the
bug
observability
scope/backend
tradein
labels 2026-07-04 10:23:46 +00:00
Owner

Закрываю по итогам разбора трекера 16.08.2026

Вердикт: сделано кодом.

Выбран вариант «extend mark_done/update_heartbeat»: колонки восстанавливаются из counters для всех провайдеров, а не только для yandex.

Доказательство: tradein-mvp/backend/app/services/scrape_runs.py:370-391 — _column_counts извлекает total_seen/new_count из jsonb counters (ключи total_seen/lots_fetched/unique_fetched); :583 update_heartbeat пишет колонки; комментарий :375-376 прямо ссылается на аудит #1871/#1926

Независимая проверка. Вердикт отдельно проверялся вторым проходом, задачей которого было именно опровергнуть закрытие, а не подтвердить его:

Проверил не только код, но и живые данные прода — симптом не воспроизводится. Код: app/services/scrape_runs.py:369-395 _column_counts() тянет total_seen из _RESULT_COUNTER_KEYS (total_seen/lots_fetched/unique_fetched/succeeded) и new_count из new_count/lots_inserted/saved_inserted/rows_inserted; вызывается во ВСЕХ финализаторах, а не только в одном: update_heartbeat (:589), mark_done (:677), mark_failed (:717), mark_banned (:778) — то есть выбран вариант «extend mark_done/update_heartbeat» из тела задачи, покрывающий все провайдеры. Прод (ssh gendesign → psql): за 14 дней yandex_city_sweep 14 прогонов, из них с total_seen=0 — НОЛЬ; cian_city_sweep 14/0; avito_city_sweep 16/1. Построчно: run 3956 yandex seen=2736 new=231 при counters lots_fetched=2736 lots_inserted=231 (колонки совпадают с jsonb), run 4081 cian seen=1680 new=7, run 4089 avito seen=160 new=92. Проверил и смежные источники, о которых просили «то же для CitySweepCounters»: avito_newbuilding_sweep seen=523, domclick_city_sweep seen=387, даже newbuilding_enrich seen=25 (через ключ succeeded). Расхождения колонок и counters нет ни у одного.

Если что-то из перечисленного всё же живо — переоткройте задачу, разбор мог упустить частный случай.

## Закрываю по итогам разбора трекера 16.08.2026 **Вердикт:** сделано кодом. Выбран вариант «extend mark_done/update_heartbeat»: колонки восстанавливаются из counters для всех провайдеров, а не только для yandex. **Доказательство:** tradein-mvp/backend/app/services/scrape_runs.py:370-391 — _column_counts извлекает total_seen/new_count из jsonb counters (ключи total_seen/lots_fetched/unique_fetched); :583 update_heartbeat пишет колонки; комментарий :375-376 прямо ссылается на аудит #1871/#1926 **Независимая проверка.** Вердикт отдельно проверялся вторым проходом, задачей которого было именно опровергнуть закрытие, а не подтвердить его: > Проверил не только код, но и живые данные прода — симптом не воспроизводится. Код: `app/services/scrape_runs.py:369-395` `_column_counts()` тянет total_seen из _RESULT_COUNTER_KEYS (total_seen/lots_fetched/unique_fetched/succeeded) и new_count из new_count/lots_inserted/saved_inserted/rows_inserted; вызывается во ВСЕХ финализаторах, а не только в одном: update_heartbeat (:589), mark_done (:677), mark_failed (:717), mark_banned (:778) — то есть выбран вариант «extend mark_done/update_heartbeat» из тела задачи, покрывающий все провайдеры. Прод (ssh gendesign → psql): за 14 дней yandex_city_sweep 14 прогонов, из них с total_seen=0 — НОЛЬ; cian_city_sweep 14/0; avito_city_sweep 16/1. Построчно: run 3956 yandex seen=2736 new=231 при counters lots_fetched=2736 lots_inserted=231 (колонки совпадают с jsonb), run 4081 cian seen=1680 new=7, run 4089 avito seen=160 new=92. Проверил и смежные источники, о которых просили «то же для CitySweepCounters»: avito_newbuilding_sweep seen=523, domclick_city_sweep seen=387, даже newbuilding_enrich seen=25 (через ключ succeeded). Расхождения колонок и counters нет ни у одного. Если что-то из перечисленного всё же живо — переоткройте задачу, разбор мог упустить частный случай.
Sign in to join this conversation.
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#2369
No description provided.