From 906c9bbdf422f17458d0f8d54590c7d5785c4ecc Mon Sep 17 00:00:00 2001 From: Untone Date: Sat, 30 Aug 2025 21:18:48 +0300 Subject: [PATCH] search-index-metric --- main.py | 1 + services/search.py | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index 01a88b75..be7597d5 100644 --- a/main.py +++ b/main.py @@ -74,6 +74,7 @@ graphql_app = GraphQL( # Оборачиваем GraphQL-обработчик для лучшей обработки ошибок + async def graphql_handler(request: Request) -> Response: """ Обработчик GraphQL запросов с поддержкой middleware и обработкой ошибок. diff --git a/services/search.py b/services/search.py index 77330c6a..a307f45f 100644 --- a/services/search.py +++ b/services/search.py @@ -9,6 +9,26 @@ import numpy as np from settings import MUVERA_INDEX_NAME, SEARCH_MAX_BATCH_SIZE, SEARCH_PREFETCH_SIZE from utils.logger import root_logger as logger +# Простые метрики производительности поиска +class SearchMetrics: + def __init__(self): + self.indexing_start_time: float | None = None + self.documents_indexed: int = 0 + + def start_indexing(self, doc_count: int): + self.indexing_start_time = time.time() + self.documents_indexed = doc_count + print(f"🔍 Индексация {doc_count} документов...") + + def end_indexing(self): + if self.indexing_start_time: + duration = time.time() - self.indexing_start_time + rate = self.documents_indexed / duration if duration > 0 else 0 + print(f"✅ Индексация завершена за {duration:.2f}s ({rate:.1f} doc/s)") + +# Глобальный экземпляр метрик +search_metrics = SearchMetrics() + # Global collection for background tasks background_tasks: List[asyncio.Task] = [] @@ -127,7 +147,12 @@ class SearchService: # Get Muvera service info if self.muvera_client: muvera_info = await self.muvera_client.info() - return {"status": "enabled", "provider": "muvera", "mode": "local", "muvera_info": muvera_info} + return { + "status": "enabled", + "provider": "muvera", + "mode": "local", + "muvera_info": muvera_info + } return {"status": "error", "message": "Muvera client not available"} except Exception: logger.exception("Failed to get search info") @@ -280,6 +305,8 @@ class SearchService: ) return + # Запускаем метрики индексации + search_metrics.start_indexing(len(shouts)) start_time = time.time() logger.info(f"Starting Muvera bulk indexing of {len(shouts)} documents") @@ -291,7 +318,7 @@ class SearchService: try: # Prepare document data for Muvera doc_data: Dict[str, Any] = { - "id": str(shout.id), + "id": str(getattr(shout, "id", "")), "title": getattr(shout, "title", "") or "", "body": "", "metadata": {}, @@ -351,6 +378,8 @@ class SearchService: f"Muvera bulk indexing completed in {elapsed:.2f}s: " f"{len(documents)} documents indexed, {total_skipped} shouts skipped" ) + # Завершаем метрики индексации + search_metrics.end_indexing() except Exception as e: logger.exception(f"Muvera bulk indexing failed: {e}") else: