Свежесть источника меряется по статусу done — источник с блоками числится мёртвым, пока приносит данные #3172

Closed
opened 2026-08-27 21:44:27 +00:00 by bot-backend · 0 comments
Collaborator

Выделено из #3118 (27.08). Из-за этой метрики был заведён P1-тикет о мёртвом источнике, который на самом деле собирал данные.

Дефект

packages/scraper-kit/src/scraper_kit/orchestration/scheduler.py:113-125, _STALE_SOURCES_SQL:

COALESCE(
    (SELECT max(r.finished_at) FROM scrape_runs r
      WHERE r.source = sch.source AND r.status = 'done'),
    sch.created_at
) AS since

Свежесть источника = возраст последнего прогона со статусом done. Но done — не единственный исход, при котором собраны данные:

  • pipeline.py:4398 переводит любой прогон с blocked в banned (осознанно, #2657: external constraint, не наш баг);
  • такой прогон при этом вставляет строки — у домклика 886 строк 25.08 и 128 строк 23.08, оба со статусом banned.

Источник, который регулярно ловит блок и столь же регулярно приносит данные, для этой метрики мёртв навсегда.

Чем проявилось

Тикет #3118 «Домклик не собирается с 5 августа» — заголовок целиком порождён этой метрикой. Реальный сбор шёл. Цена ошибки: P1-тикет, диагностика по ложному следу и риск «починки» работающего источника.

Что делать

Мерить свежесть по последнему прогону, принёсшему данные, а не по статусу. Кандидат: max(finished_at) там, где counters->>'lots_inserted' больше нуля, либо отдельная колонка-отметка «прогон дал данные», выставляемая финализатором.

Осторожно: never_ok в том же запросе опирается на ту же посылку и должен поменяться согласованно, иначе «никогда не собирал» начнёт врать в другую сторону.

Приёмка

  • Источник, который приносит строки со статусом banned, не считается устаревшим
  • Источник, который действительно ничего не приносит, по-прежнему считается устаревшим — независимо от статуса
  • never_ok согласован с новой мерой
  • Проверено на домклике: по историческим данным он перестаёт числиться мёртвым с 05.08

Refs #3118, #2657

Выделено из #3118 (27.08). Из-за этой метрики был заведён P1-тикет о мёртвом источнике, который на самом деле собирал данные. ## Дефект `packages/scraper-kit/src/scraper_kit/orchestration/scheduler.py:113-125`, `_STALE_SOURCES_SQL`: ``` COALESCE( (SELECT max(r.finished_at) FROM scrape_runs r WHERE r.source = sch.source AND r.status = 'done'), sch.created_at ) AS since ``` Свежесть источника = возраст последнего прогона со статусом **`done`**. Но `done` — не единственный исход, при котором собраны данные: - `pipeline.py:4398` переводит любой прогон с `blocked` в `banned` (осознанно, #2657: external constraint, не наш баг); - такой прогон при этом **вставляет строки** — у домклика 886 строк 25.08 и 128 строк 23.08, оба со статусом `banned`. Источник, который регулярно ловит блок и столь же регулярно приносит данные, для этой метрики мёртв навсегда. ## Чем проявилось Тикет #3118 «Домклик не собирается с 5 августа» — заголовок целиком порождён этой метрикой. Реальный сбор шёл. Цена ошибки: P1-тикет, диагностика по ложному следу и риск «починки» работающего источника. ## Что делать Мерить свежесть по последнему прогону, **принёсшему данные**, а не по статусу. Кандидат: `max(finished_at)` там, где `counters->>'lots_inserted'` больше нуля, либо отдельная колонка-отметка «прогон дал данные», выставляемая финализатором. Осторожно: `never_ok` в том же запросе опирается на ту же посылку и должен поменяться согласованно, иначе «никогда не собирал» начнёт врать в другую сторону. ## Приёмка - [ ] Источник, который приносит строки со статусом `banned`, не считается устаревшим - [ ] Источник, который действительно ничего не приносит, по-прежнему считается устаревшим — независимо от статуса - [ ] `never_ok` согласован с новой мерой - [ ] Проверено на домклике: по историческим данным он перестаёт числиться мёртвым с 05.08 Refs #3118, #2657
bot-backend added the
bug
observability
priority/p2
scope/backend
scrapers
tradein
labels 2026-08-27 21:44:27 +00:00
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#3172
No description provided.