fix(tradein/avito): брейкер добора считает долю только по отказам площадки — сайдкар/пустой пул не рвут прогон и не красят его banned #3367
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3367
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3288-breaker-block-kind"
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?
Refs #3288, часть B (часть A — PR #3357, часть C — сайдкар, отдельно). Прогон 5425: 41 из 48 «блоков» были отказами нашего тракта, а прогон оборван по
ratioи помеченbannedпри 41 живом успехе.Что сделано
backfill_block_breaker.py:record_block(kind=BAN_KIND_PLATFORM)— в окно доли толькоplatform; не-platform уходит вrecord_failure()(знаменатель окна; серия и safety-net не двигаются — иначе на коротком снапшоте тот же обрыв прилетел бы через safety_net).avito_detail_backfill.py:_iter_causes/_caused_by_empty_pool— по типу в цепочке__cause__, не по тексту (#3272); пустой пул →mark_failed("пул прокси пуст — к площадке не ходили")+counters.no_proxy_stop=1, исходfailed(тождество #3338 цело);ban_kindсчитается один раз — в брейкер и в перепись.scrape_runs.pymark_backfill_finished: диагноз впервые влияет на статус — приdominant == inframark_bannedне зовётся:mark_failed, еслиproduced == 0(наша поломка), иначеmark_done; причина называет диагноз явно. При доминировании platform — как было. Узел общий → покрывает и финализацию yandex/domclick/cian без правки их задач.Приёмка из комментария #3288 закреплена тестами: 20 подряд отказов сайдкара при снапшоте больше окна НЕ дают
abort_reason=='ratio'; 14 настоящихAvitoBlockedErrorиз 20 — дают (#3184 не изменён).Тесты
test_3288b_block_kind_ratio.py(9):106 passed, 1 skipped(-k breaker/avito_detail/3338/3184/3288). Фальсификация (откатapp/):abort_reason='ratio' при 20 отказах сайдкара — assert 'ratio' is None, прогон встал на 20 из 30 — по значению (юнит брейкера при откате даёт TypeError — «возможности нет», величину несёт бэкфилл-тест).Прод-приёмка
Следующие avito_detail_backfill: прогоны с доминирующим
infraнеbannedи не обрываются поratio;no_proxy_stop=1при пустом пуле.Deep-ревью ❌ BLOCK + полный CI (
2 failed, 5462 passed):test_3196_yandex_ban_kind.py:147(yandex 5xx = infra → ожидаетbanned, получилfailed) иtest_2764_ban_kind_no_default.py:81(ban_kinds={infra}→ ровно одинmark_banned, получил[]). Это не устаревшие ожидания: #3196 вводился ровно ради того, чтобы infra доезжал до колонкиscrape_runs.ban_kind, а её пишет толькоmark_banned(scrape_runs.py:800); читатели —admin.py:2597иSELECT ban_kind, count(*)из #2764. Понижение статуса при доминировании infra стирает диагноз из строки прогона. Плюс cian финализируется мимо этого узла (app/services/scheduler.py:174→mark_banned(ban_kind=…)) — расхождение по источникам.Решение по PR: п.3 из #3288 («не помечать
bannedпри доминировании infra») из этого PR убирается — статусная семантика остаётся прежней (banned+ban_kind='infra'), оба контракта #3196/#2764 в силе, тесты не правятся. Остаются пп.1-2:record_block(kind)— в окно доли толькоplatform;NoProxyAvailableError→no_proxy_stop/mark_failed(это не бан вовсе). Смена статуса для infra-прогонов — отдельное решение с переносомban_kindвmark_failed/mark_doneи выравниванием cian (#3288, новый пункт).Medium из ревью (у infra-прогона нет стоп-крана кроме
budget_sec— 1600 попыток при мёртвом сайдкаре) — в тот же новый пункт.Поправка к моему комментарию выше — доводка нашла более точный разделитель, и п.3 остаётся в суженном виде:
ban_kinds» (тамdominant='unknown'→bannedкак раньше), а чистый infra с нулевым результатом — ровно то, что #2764 (ban_kinds={infra}) и #3196 (yandex 5xx) закрепляют какbanned+ban_kind='infra';produced > 0: брейкер оборвал прогон, обогативший 41 карточку — это не бан площадки и не наша полная поломка. Условие сужено доdominant == infra AND produced > 0 → mark_done(неfailed); нулевой infra-прогон — прежнееbannedс диагнозом в колонкеban_kind.Контракты #3196/#2764 не тронуты, полный suite
5429 passed; добавлены контроли обратной ошибки по значению (_stays_banned,_without_census_stays_banned). Диагноз infra уdone-прогонов с результатом живёт вcounters.ban_kinds(колонкуban_kindпишет толькоmark_banned) — это осознанно: такой прогон вSELECT ban_kindсчитаться баном и не должен. Стоп-кран для infra-серий и выравнивание cian — #3288 п.5.