109 lines
3.3 KiB
Python

"""
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 Document
from pydantic import BaseModel
from typing import Dict
logger = logging.getLogger(__name__)
router = APIRouter()
class HealthResponse(BaseModel):
status: str
timestamp: datetime
version: str
services: Dict[str, str]
@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 = {"api": "healthy"}
# 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
# En environnement local de test sans services externes, tolère l'absence
overall_status = "healthy" if any(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"}