From 9742219ef6365c198e26f528c513e1cb0b460808 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Mon, 11 May 2026 18:37:43 +0300 Subject: [PATCH] debug(poi-sync): DB breadcrumbs to nspd_geo_log for silent-fail diagnosis --- backend/app/workers/tasks/poi_sync.py | 43 ++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/backend/app/workers/tasks/poi_sync.py b/backend/app/workers/tasks/poi_sync.py index 0d1e08d9..445e8e38 100644 --- a/backend/app/workers/tasks/poi_sync.py +++ b/backend/app/workers/tasks/poi_sync.py @@ -2,19 +2,54 @@ import logging +from sqlalchemy import text + from app.workers.celery_app import celery_app logger = logging.getLogger(__name__) +def _log_breadcrumb(level: str, message: str) -> None: + """Записать строку в nspd_geo_log (job_id=NULL). + + Используется чтобы диагностировать что происходит с poi_sync без SSH к + worker'у (та же техника что у worker_ready breadcrumb). + """ + try: + from app.core.db import SessionLocal + + db = SessionLocal() + try: + db.execute( + text( + "INSERT INTO nspd_geo_log (job_id, level, stage, message) " + "VALUES (NULL, :lvl, 'poi_sync', :msg)" + ), + {"lvl": level, "msg": message[:500]}, + ) + db.commit() + finally: + db.close() + except Exception as e: + logger.warning("poi_sync breadcrumb failed: %s", e) + + @celery_app.task(name="tasks.poi_sync.sync_osm_poi_ekb", queue="celery") def sync_osm_poi_ekb() -> dict: """Еженедельная синхронизация OSM POI из Overpass API в osm_poi_ekb. Запускается через beat (понедельник 03:00 МСК). + Persistent breadcrumbs в nspd_geo_log чтобы видеть progress в БД. """ - from app.services.site_finder.poi_loader import sync_poi_to_db + _log_breadcrumb("info", "task started") + try: + from app.services.site_finder.poi_loader import sync_poi_to_db - result = sync_poi_to_db() - logger.info("POI sync done: %s", result) - return result + result = sync_poi_to_db() + logger.info("POI sync done: %s", result) + _log_breadcrumb("info", f"done: {result}") + return result + except Exception as e: + logger.exception("POI sync failed: %s", e) + _log_breadcrumb("error", f"{type(e).__name__}: {e}") + raise