gendesign/tradein-mvp/backend/tests/test_3044_enriched_result_key.py
bot-backend 0a85fa7202
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m37s
fix(tradein/observability): результат detail-бэкфиллов доезжает до колонки total_seen (#3044)
Прод-факт: замер по avito_detail_backfill прочитал «обогащено 0 за 7 дней»
при реальных 801 — джобы пишут результат только ключом 'enriched', которого
_column_counts не знал, и колонка total_seen оставалась 0 у всех прогонов.

'enriched'-фолбэк добавлен именно в _column_counts (витринная колонка), а НЕ в
_RESULT_COUNTER_KEYS: тот список кормит zero-result-стрик, где догнавший
очередь бэкфилл стал бы непрерываемым измеренным нулём — ловушка, за которую
ревью уже выкинуло из списка 'rows_inserted' (#2703). Контракт стрик-сторожа
закреплён инвариант-тестом.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 12:23:19 +05:00

59 lines
3.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""#3044 (наблюдаемость): результат detail-бэкфиллов виден колонке total_seen.
Прод-факт (Poincare, 26.08.2026): avito_detail_backfill за 7 дней — 36 прогонов,
sum(total_seen)=0, из чего замер в issue сделал вывод «обогащено 0». Реально:
counters={'enriched': 61, ...} у прогона 25.08 09:18, а listings.detail_enriched_at
насчитал 801 обогащение за те же 7 дней. Джобы пишут результат ТОЛЬКО ключом
'enriched', которого _column_counts не знал — колонка не заполнялась ни у done,
ни у banned прогонов, и «провал и успех писали один и тот же признак» (ноль).
Фикс: 'enriched'-фолбэк в _column_counts (обе копии: app и scraper-kit) — только
для витринной колонки. В _RESULT_COUNTER_KEYS ключ НЕ добавлен намеренно: тот
список кормит zero-result-стрик, где догнавший очередь бэкфилл (attempted=0)
стал бы непрерываемым измеренным нулём — ловушка, за которую ревью уже выкинуло
из списка 'rows_inserted' (#2703, test_rosreestr_dkp_import_healthy_zero_*).
Тесты колонки красные на origin/main по ЗНАЧЕНИЮ (None вместо 61), не по импорту.
"""
from __future__ import annotations
from scraper_kit.orchestration import runs as kit_runs
from app.services import scrape_runs as app_runs
# Прод-прогон avito_detail_backfill 25.08 09:18 UTC (баном оборван, но 61 обогащён).
_AVITO_BANNED_RUN = {
"gone": 0,
"failed": 0,
"blocked": 39,
"enriched": 61,
"attempted": 100,
"duration_sec": 1600,
}
def test_column_counts_fills_total_seen_for_detail_backfill() -> None:
"""_column_counts — ровно тот путь, которым mark_done/mark_banned пишут
выделенные колонки. До фикса: (None, None) → total_seen вечно 0."""
for mod in (app_runs, kit_runs):
total_seen, new_count = mod._column_counts(_AVITO_BANNED_RUN)
assert total_seen == 61
assert new_count is None # ключей new_count/lots_inserted/... у бэкфилла нет
def test_result_keys_win_over_enriched_fallback() -> None:
"""У newbuilding_enrich рядом с 'enriched' лежит 'succeeded' — приоритет за ним:
поведение источников с настоящим result-ключом не меняется."""
for mod in (app_runs, kit_runs):
total_seen, _ = mod._column_counts({"succeeded": 7, "enriched": 3})
assert total_seen == 7
def test_zero_streak_watchdog_semantics_untouched() -> None:
"""Контракт #2703 сохранён: для стрик-сторожа 'enriched' НЕ результатная
метрика — догнавший очередь бэкфилл остаётся «не измерено» и стрик не копит.
Этот тест зелёный в обеих эрах (инвариант, а не фикс)."""
for mod in (app_runs, kit_runs):
assert mod._run_result_count({"attempted": 1600, "enriched": 0, "failed": 1600}) is None
assert mod._run_result_count({"enriched": 61, "attempted": 100}) is None