tradein: прогоны, оборванные деплоем (interrupted=1), попадают в лестницы стриков — failed-ratio судит частичные counters, а done обнуляет стрик банов источника #3393

Closed
opened 2026-09-06 03:30:33 +00:00 by bot-backend · 2 comments
Collaborator

Находка deep-ревью PR #3392 (#3391). После того как дрейн стал финализировать in-flight прогоны через mark_done (вместо zombie), их частичные counters судят гейты честного статуса:

  • app/services/scrape_runs.py:339-367 _failed_ratio_too_high (порог 15 % при attempted ≥ 3) читает голые attempted/failed — detail-бэкфилл, убитый деплоем на 20 % отказов, пишется failed с текстом «сбор деградировал…» (диагноз про площадку вместо «оборван деплоем») и попадает в _alert_if_consecutive_failures (порог 3, :413-448).
  • Зеркально у cian-бэкфиллов (в counters нет attempted) — уходят в done и обнуляют стрик отказов источника; репозиторий уже задокументировал этот вред на себе: orchestration/scheduler.py:98-99 («5 банов подряд обнулил один 'cancelled' 09.08 (деплой убил бегущий прогон)»).

До #3392 такие строки были zombie и в обе стрик-выборки (status IN ('failed','banned','done','cancelled')) не попадали вовсе.

Чинить: исключить COALESCE(counters->>'interrupted','0') = '1' из популяции обеих лестниц (scrape_runs.py:~440, :~500) и, возможно, из honest-status-гейта при interrupted (статус done+interrupted — конвенция #3319/#3333/#3355). Тест по значению: прогон done+interrupted=1 посреди серии banned не обнуляет стрик; прогон с 20 % отказов при interrupted=1 не уходит в failed с алертом.

Refs #3391, PR #3392, #3319, #3333, #3355.

Находка deep-ревью PR #3392 (#3391). После того как дрейн стал финализировать in-flight прогоны через `mark_done` (вместо `zombie`), их частичные counters судят гейты честного статуса: - `app/services/scrape_runs.py:339-367` `_failed_ratio_too_high` (порог 15 % при `attempted ≥ 3`) читает голые `attempted`/`failed` — detail-бэкфилл, убитый деплоем на 20 % отказов, пишется `failed` с текстом «сбор деградировал…» (диагноз про площадку вместо «оборван деплоем») и попадает в `_alert_if_consecutive_failures` (порог 3, `:413-448`). - Зеркально у cian-бэкфиллов (в counters нет `attempted`) — уходят в `done` и **обнуляют** стрик отказов источника; репозиторий уже задокументировал этот вред на себе: `orchestration/scheduler.py:98-99` («5 банов подряд обнулил один 'cancelled' 09.08 (деплой убил бегущий прогон)»). До #3392 такие строки были `zombie` и в обе стрик-выборки (`status IN ('failed','banned','done','cancelled')`) не попадали вовсе. **Чинить:** исключить `COALESCE(counters->>'interrupted','0') = '1'` из популяции обеих лестниц (`scrape_runs.py:~440`, `:~500`) и, возможно, из honest-status-гейта при `interrupted` (статус `done`+`interrupted` — конвенция #3319/#3333/#3355). Тест по значению: прогон `done`+`interrupted=1` посреди серии `banned` не обнуляет стрик; прогон с 20 % отказов при `interrupted=1` не уходит в `failed` с алертом. Refs #3391, PR #3392, #3319, #3333, #3355.
Author
Collaborator

PR #3395 смержен и задеплоен (06.09 ~06:03 UTC, BUILD_SHA=e1f86e3; маркер _was_interrupted — 4 вхождения в обеих копиях в контейнере scraper). Приёмка событийная: после первого деплоя, убившего бегущий прогон, — строки с interrupted='1' без error LIKE '%failed-ratio-honest-status%', лог «оборван деплоем (SIGTERM-drain) … гейты пропущены (#3393)», стрик источника без interrupted-строк совпадает с числом в алерте. Первый деплой после мержа (06:01 UTC) дренировать было нечего — domclick_city_sweep 6182 закончился сам за 4 с до SIGTERM.

PR #3395 смержен и задеплоен (06.09 ~06:03 UTC, `BUILD_SHA=e1f86e3`; маркер `_was_interrupted` — 4 вхождения в обеих копиях в контейнере scraper). Приёмка событийная: после первого деплоя, убившего бегущий прогон, — строки с `interrupted='1'` без `error LIKE '%failed-ratio-honest-status%'`, лог «оборван деплоем (SIGTERM-drain) … гейты пропущены (#3393)», стрик источника без interrupted-строк совпадает с числом в алерте. Первый деплой после мержа (06:01 UTC) дренировать было нечего — `domclick_city_sweep` 6182 закончился сам за 4 с до SIGTERM.
Author
Collaborator

Событийная приёмка выполнена (06.09 08:24 UTC, деплой 06ad504 при бегущем cian_detail_backfill 6200, 60 мин работы). Loki, старый контейнер:

08:24:07 scheduler_main: signal 15 received — requesting cooperative drain
08:24:21 scheduler: SIGTERM-drain — stop claiming new runs; draining 1 in-flight run task(s) on shutdown
08:25:41 scheduler: 1 task(s) did not drain in 80s — leaving for hard-cancel
08:25:41 scheduler: drain — 1 прогон(ов) сняты с 'running' как interrupted: [6200]
08:25:41 mark_done: run_id=6200 оборван деплоем (SIGTERM-drain), частичный результат — honest-status-гейты пропущены (#3393)
08:26:13 (новый контейнер) scheduler: boot-reap — прогонов предыдущего контейнера нет (0)

scrape_runs 6200: status='done', counters.interrupted='1', boot_reaped пуст, listings_processed=210 на месте (heartbeat 08:25:42 = finished_at). Отрицательный контроль — 06.09 02:36 UTC (6167/6173 → zombie, boot_reaped=true).

Для #3393 существенно: у 6200 listings_succeeded=0 из 210 — без пропуска гейтов прогон ушёл бы в failed с диагнозом «сбор деградировал» и в лестницу алертов; теперь done+interrupted, лестницы его не видят.

**Событийная приёмка выполнена (06.09 08:24 UTC, деплой `06ad504` при бегущем `cian_detail_backfill` 6200, 60 мин работы).** Loki, старый контейнер: ``` 08:24:07 scheduler_main: signal 15 received — requesting cooperative drain 08:24:21 scheduler: SIGTERM-drain — stop claiming new runs; draining 1 in-flight run task(s) on shutdown 08:25:41 scheduler: 1 task(s) did not drain in 80s — leaving for hard-cancel 08:25:41 scheduler: drain — 1 прогон(ов) сняты с 'running' как interrupted: [6200] 08:25:41 mark_done: run_id=6200 оборван деплоем (SIGTERM-drain), частичный результат — honest-status-гейты пропущены (#3393) 08:26:13 (новый контейнер) scheduler: boot-reap — прогонов предыдущего контейнера нет (0) ``` `scrape_runs` 6200: `status='done'`, `counters.interrupted='1'`, `boot_reaped` пуст, `listings_processed=210` на месте (heartbeat 08:25:42 = finished_at). Отрицательный контроль — 06.09 02:36 UTC (6167/6173 → `zombie`, `boot_reaped=true`). Для #3393 существенно: у 6200 `listings_succeeded=0` из 210 — без пропуска гейтов прогон ушёл бы в `failed` с диагнозом «сбор деградировал» и в лестницу алертов; теперь `done`+`interrupted`, лестницы его не видят.
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#3393
No description provided.