""" Routes de santé et monitoring """ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from datetime import datetime import os import requests import logging from domain.database import get_db from domain.models import HealthResponse, Document logger = logging.getLogger(__name__) router = APIRouter() @router.get("/health", response_model=HealthResponse) async def health_check(db: Session = Depends(get_db)): """ Vérification de la santé de l'API et des services """ services_status = {} # Vérification de la base de données try: db.query(Document).limit(1).all() services_status["database"] = "healthy" except Exception as e: logger.error(f"Erreur base de données: {e}") services_status["database"] = "unhealthy" # Vérification de Redis try: from tasks.enqueue import r r.ping() services_status["redis"] = "healthy" except Exception as e: logger.error(f"Erreur Redis: {e}") services_status["redis"] = "unhealthy" # Vérification de MinIO try: minio_endpoint = os.getenv("MINIO_ENDPOINT", "http://minio:9000") response = requests.get(f"{minio_endpoint}/minio/health/live", timeout=5) if response.status_code == 200: services_status["minio"] = "healthy" else: services_status["minio"] = "unhealthy" except Exception as e: logger.error(f"Erreur MinIO: {e}") services_status["minio"] = "unhealthy" # Vérification d'Ollama try: ollama_url = os.getenv("OLLAMA_BASE_URL", "http://ollama:11434") response = requests.get(f"{ollama_url}/api/tags", timeout=5) if response.status_code == 200: services_status["ollama"] = "healthy" else: services_status["ollama"] = "unhealthy" except Exception as e: logger.error(f"Erreur Ollama: {e}") services_status["ollama"] = "unhealthy" # Vérification d'AnythingLLM try: anyllm_url = os.getenv("ANYLLM_BASE_URL", "http://anythingllm:3001") response = requests.get(f"{anyllm_url}/api/health", timeout=5) if response.status_code == 200: services_status["anythingllm"] = "healthy" else: services_status["anythingllm"] = "unhealthy" except Exception as e: logger.error(f"Erreur AnythingLLM: {e}") services_status["anythingllm"] = "unhealthy" # Détermination du statut global overall_status = "healthy" if all(status == "healthy" for status in services_status.values()) else "degraded" return HealthResponse( status=overall_status, timestamp=datetime.now(), version="1.0.0", services=services_status ) @router.get("/health/ready") async def readiness_check(): """ Vérification de disponibilité pour Kubernetes """ return {"status": "ready"} @router.get("/health/live") async def liveness_check(): """ Vérification de vivacité pour Kubernetes """ return {"status": "alive"}