# /opt/docker/dev/service_finder/backend/app/tests_internal/diagnostics/diagnose_system.py """ đŸ›°ïž SENTINEL SYSTEM DIAGNOSTICS - MB2.0 (2026) --------------------------------------------- CÉL: A rendszer mĂ©lyszintƱ integritĂĄsĂĄnak Ă©s mƱködƑkĂ©pessĂ©gĂ©nek auditĂĄlĂĄsa. FƐBB TESZTEK: 1. AdatbĂĄzis Kapcsolat: PostgreSQL aszinkron elĂ©rĂ©s ellenƑrzĂ©se. 2. SĂ©ma IntegritĂĄs: Kritikus Master Data tĂĄblĂĄk Ă©s mezƑk meglĂ©tĂ©nek vizsgĂĄlata. 3. Rendszer ParamĂ©terek: A Sentinel központi konfigurĂĄciĂłs tĂĄblĂĄjĂĄnak ellenƑrzĂ©se. 4. i18n Motor: Nyelvi gyorsĂ­tĂłtĂĄr (Cache) Ă©s fordĂ­tĂĄsi mechanizmus tesztje. 5. Robot Pipeline: Staging (Hunter) Ă©s Gold (Catalog) rekordok szĂĄmlĂĄlĂĄsa. FUTTATÁS: docker compose exec api python -m app.tests_internal.diagnostics.diagnose_system """ import asyncio import sys import logging from datetime import datetime from sqlalchemy import text, select, func # đŸ› ïž KRITIKUS IMPORT KÖRNYEZET ELLENƐRZÉSE try: from app.core.config import settings # MegjegyzĂ©s: A projekt struktĂșrĂĄjĂĄtĂłl fĂŒggƑen AsyncSessionLocal az app.database-ben van from app.database import AsyncSessionLocal from app.services.translation_service import translation_service from app.models.system import SystemParameter from app.models.identity import User from app.models.organization import Organization from app.models.asset import AssetCatalog from app.models.vehicle_definitions import VehicleModelDefinition except ImportError as e: print(f"\n❌ [KRITIKUS HIBA] Az importĂĄlĂĄs nem sikerĂŒlt: {e}") print("💡 Javaslat: EllenƑrizd a PYTHONPATH-t Ă©s a __init__.py fĂĄjlok meglĂ©tĂ©t!") sys.exit(1) # SQL logolĂĄs nĂ©mĂ­tĂĄsa a tiszta kimenet Ă©rdekĂ©ben logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING) async def diagnose(): start_time = datetime.now() print("\n" + "═"*70) print(f"đŸ›°ïž SENTINEL SYSTEM DIAGNOSTICS - MB2.0 | {start_time.strftime('%Y-%m-%d %H:%M:%S')}") print("═"*70 + "\n") async with AsyncSessionLocal() as session: # --- 1. CSATLAKOZÁS ÉS ADATBÁZIS PING --- print("1ïžâƒŁ KapcsolĂłdĂĄsi teszt...") try: await session.execute(text("SELECT 1")) print(" [✅ OK] PostgreSQL aszinkron kapcsolat aktĂ­v.") except Exception as e: print(f" [❌ HIBA] Nem sikerĂŒlt kapcsolĂłdni az adatbĂĄzishoz: {e}") return # --- 2. SÉMA INTEGRITÁS (Master Data Audit) --- print("\n2ïžâƒŁ SĂ©ma integritĂĄs ellenƑrzĂ©se (Kritikus mezƑk)...") # TĂĄbla neve (sĂ©mĂĄval) | ElvĂĄrt oszlopok listĂĄja tables_to_check = [ ("identity.users", ["preferred_language", "scope_id", "is_active"]), ("fleet.organizations", ["org_type", "folder_slug", "is_active"]), ("data.assets", ["owner_org_id", "catalog_id", "vin"]), # "asset_catalog" helyett "vehicle_catalog" ("vehicle.vehicle_catalog", ["make", "model", "factory_data"]), ("vehicle.vehicle_model_definitions", ["status", "raw_search_context"]) ] for table, columns in tables_to_check: try: schema_name, table_name = table.split('.') query = text(f""" SELECT column_name FROM information_schema.columns WHERE table_schema = '{schema_name}' AND table_name = '{table_name}'; """) res = await session.execute(query) existing_cols = [row[0] for row in res.fetchall()] if not existing_cols: print(f" [❌ HIBA] A tĂĄbla NEM lĂ©tezik: {table}") continue missing = [c for c in columns if c not in existing_cols] if not missing: print(f" [✅ OK] {table:35} (Minden mezƑ rendben)") else: print(f" [⚠ HIÁNY] {table:35} | HiĂĄnyzĂł mezƑk: {', '.join(missing)}") except Exception as e: print(f" [❌ HIBA] Hiba a(z) {table} ellenƑrzĂ©sekor: {e}") # --- 3. RENDSZER PARAMÉTEREK (Sentinel Config) --- print("\n3ïžâƒŁ System Parameters (Sentinel Config) ellenƑrzĂ©se...") try: res = await session.execute(select(SystemParameter)) params = res.scalars().all() if params: print(f" [✅ OK] TalĂĄlt paramĂ©terek: {len(params)} db") # Kritikus kulcsok, amiknek illik lenniĂŒk critical_keys = ["SECURITY_MAX_RECORDS_PER_HOUR", "VEHICLE_LIMIT"] existing_keys = [p.key for p in params] for ck in critical_keys: status = "✔" if ck in existing_keys else "❌ (HiĂĄnyzik)" print(f" {status} {ck}") else: print(" [⚠ FIGYELEM] A system_parameters tĂĄbla ĂŒres! Futtasd a seedert.") except Exception as e: print(f" [❌ HIBA] SystemParameter lekĂ©rdezĂ©si hiba: {e}") # --- 4. i18n ÉS CACHE MOTOR --- print("\n4ïžâƒŁ Nyelvi motor Ă©s i18n Cache ellenƑrzĂ©se...") try: # GyorsĂ­tĂłtĂĄr frissĂ­tĂ©se az adatbĂĄzisbĂłl await translation_service.load_cache(session) test_key = "COMMON.SAVE" test_val = translation_service.get_text(test_key, "hu") # Ha a visszakapott Ă©rtĂ©k nem egyezik a kulccsal, akkor van fordĂ­tĂĄs if test_val and test_val != f"[{test_key}]": print(f" [✅ OK] FordĂ­tĂĄs sikeres (HU): '{test_key}' -> '{test_val}'") else: print(f" [❌ HIBA] FordĂ­tĂĄs nem mƱködik. Nincs betöltött adat vagy hibĂĄs a cache.") except Exception as e: print(f" [❌ HIBA] Nyelvi motor hiba: {e}") # --- 5. ROBOT ELƐKÉSZÜLETEK (Pipeline MDM) --- print("\n5ïžâƒŁ Robot Pipeline (MDM Staging) ĂĄllapot...") try: # Hunter robot eredmĂ©nyei (nyers adatok) res_hunter = await session.execute( select(func.count(VehicleModelDefinition.id)).where(VehicleModelDefinition.status == 'unverified') ) unverified_count = res_hunter.scalar() or 0 # Catalog robot eredmĂ©nyei (tisztĂ­tott adatok) res_gold = await session.execute(select(func.count(AssetCatalog.id))) gold_count = res_gold.scalar() or 0 print(f" [📊 STAT] Feldolgozatlan rekordok (Staging): {unverified_count} db") print(f" [📊 STAT] ValidĂĄlt arany rekordok (Catalog): {gold_count} db") except Exception as e: print(f" [❌ HIBA] Robot-statisztika hiba: {e}") duration = (datetime.now() - start_time).total_seconds() print("\n" + "═"*70) print(f"🏁 DIAGNOSZTIKA BEFEJEZƐDÖTT | IdƑtartam: {duration:.2f} mp") print("═"*70 + "\n") if __name__ == "__main__": try: asyncio.run(diagnose()) except KeyboardInterrupt: print("\n🛑 Diagnosztika megszakĂ­tva a felhasznĂĄlĂł ĂĄltal.") sys.exit(0)