fix(tradein/scraper): сводка «что сейчас не собирает» — лестница вех не видит стрик 0 (#2670) #2806
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2806
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2670-stale-digest"
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?
Что не так
#2720 вылечил «алерт ровно один раз за серию» — теперь вехи 3, 6, 12, 24, 48… Но лестница шагает по подряд идущим завершённым failed/banned прогонам, и на проде 2026-08-10 это не отвечает на вопрос «что сломано сейчас».
Шесть источников не имели успешного прогона дольше 3× своего такта. Трое худших лестнице недоступны, и лишь один из трёх — из-за редких вех:
avito_full_load_exhaustivecancelled09.08 (деплой убил бегущий прогон)cian_history_backfillskipped, cian_cookies_expired)avito_full_loadinterval_days=7→ +17 прогонов ≈ 119 сутокavito_detail_backfilldomclick_city_sweepdomclick_detail_backfillПоэтому уплотнение вех отвергнуто, а не отложено. Оно чинит только третью строку: у первых двух стрик равен нулю — уплотнять нечего. «Замолчал» там означает «перестал производить завершённые прогоны», а не «серия длиннее последней вехи». Ограничение вех по времени («не реже раза в неделю») не помогает по той же причине: без стрика нечего таймить.
Что сделано
Сводка из второго варианта задачи — та, которую вы называли более честной. Раз в сутки одно событие: источники, у которых
max(finished_at) при status='done'старше3× interval_daysих расписания.cancelled, и редкую веху.rosreestr_quarter_pollнорма, у суточногоdomclick_city_sweepавария.default_params.interval_days, которым расписание себя двигает (compute_next_run_at), дефолт 1.created_atи помечается явно — «никогда не собирал» не должно выглядеть как «судить нечем».scheduler_loopрядом сreap_zombies; best-effort, тик уронить не может.Лестница не тронута. Она отвечает на другой вопрос («что сломалось только что»), стоит дёшево и после сводки её редкие вехи перестают быть проблемой:
avito_full_loadтеперь называется каждый день.Заодно: шапка модуля утверждала, что прод крутит legacy
app.services.scheduler. Эта ветка удалена в #2397 Part C — строка пережила собственную правду и посылает правку сторожей не в тот файл.Известный потолок
Момент последнего выпуска помнится в памяти процесса → рестарт scheduler'а (деплой) даёт лишний выпуск. Осознанный размен: альтернатива — таблица состояния (миграция) ради анти-спама у механизма, который заводится против молчания. Помечено
# ponytail:с путём апгрейда.Получателей в GlitchTip по-прежнему 0 (#2673) — сводка означает «событие записано», не «кто-то узнал».
Test plan
tradein-mvp/backend/tests/test_2670_stale_source_digest.py, снимок прода 2026-08-10 (10 расписаний: 6 просроченных + 4 контрольных).test_ladder_is_silent_for_the_worst_two(контроль: показывает, что лестница на трёх худших молчит, — он зелёный и до, и после).test_2670_streak_and_partial_coverage+test_scraper_kit_scheduler_parity+test_2703_zero_result_watchdog+test_scrape_skip_visibility— 140 passed.Критерий приёмки на проде (записан ДО факта)
2026-08-11, в первые сутки после деплоя в логе
tradein-scraperобязана появиться ровно одна строкаscheduler: N источников не собирают дольше 3× своего такта, и в ней обязаны быть названыcian_history_backfillиavito_full_load_exhaustive— те двое, у кого стрик 0. Нет строки → сводка не работает. Есть, но без этих двоих → порог посчитан не тем тактом.Встречная проверка:
rosreestr_quarter_poll(такт 28 сут, 24 сут без сбора) в списке быть не должен.Refs #2670