Base code
This commit is contained in:
129
backend/alwrity_utils/health_checker.py
Normal file
129
backend/alwrity_utils/health_checker.py
Normal file
@@ -0,0 +1,129 @@
|
||||
"""
|
||||
Health Check Module
|
||||
Handles health check endpoints and database health verification.
|
||||
"""
|
||||
|
||||
from fastapi import HTTPException
|
||||
from datetime import datetime
|
||||
from typing import Dict, Any
|
||||
from loguru import logger
|
||||
|
||||
|
||||
class HealthChecker:
|
||||
"""Manages health check functionality for ALwrity backend."""
|
||||
|
||||
def __init__(self):
|
||||
self.startup_time = datetime.utcnow()
|
||||
|
||||
def basic_health_check(self) -> Dict[str, Any]:
|
||||
"""Basic health check endpoint."""
|
||||
try:
|
||||
return {
|
||||
"status": "healthy",
|
||||
"message": "ALwrity backend is running",
|
||||
"timestamp": datetime.utcnow().isoformat(),
|
||||
"uptime": str(datetime.utcnow() - self.startup_time)
|
||||
}
|
||||
except Exception as e:
|
||||
logger.error(f"Health check failed: {e}")
|
||||
return {
|
||||
"status": "error",
|
||||
"message": f"Health check failed: {str(e)}",
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
def database_health_check(self) -> Dict[str, Any]:
|
||||
"""Database health check endpoint including persona tables verification."""
|
||||
try:
|
||||
from services.database import get_db_session
|
||||
from models.persona_models import (
|
||||
WritingPersona,
|
||||
PlatformPersona,
|
||||
PersonaAnalysisResult,
|
||||
PersonaValidationResult
|
||||
)
|
||||
|
||||
session = get_db_session()
|
||||
if not session:
|
||||
return {
|
||||
"status": "error",
|
||||
"message": "Could not get database session",
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
# Test all persona tables
|
||||
tables_status = {}
|
||||
try:
|
||||
session.query(WritingPersona).first()
|
||||
tables_status["writing_personas"] = "ok"
|
||||
except Exception as e:
|
||||
tables_status["writing_personas"] = f"error: {str(e)}"
|
||||
|
||||
try:
|
||||
session.query(PlatformPersona).first()
|
||||
tables_status["platform_personas"] = "ok"
|
||||
except Exception as e:
|
||||
tables_status["platform_personas"] = f"error: {str(e)}"
|
||||
|
||||
try:
|
||||
session.query(PersonaAnalysisResult).first()
|
||||
tables_status["persona_analysis_results"] = "ok"
|
||||
except Exception as e:
|
||||
tables_status["persona_analysis_results"] = f"error: {str(e)}"
|
||||
|
||||
try:
|
||||
session.query(PersonaValidationResult).first()
|
||||
tables_status["persona_validation_results"] = "ok"
|
||||
except Exception as e:
|
||||
tables_status["persona_validation_results"] = f"error: {str(e)}"
|
||||
|
||||
session.close()
|
||||
|
||||
# Check if all tables are ok
|
||||
all_ok = all(status == "ok" for status in tables_status.values())
|
||||
|
||||
return {
|
||||
"status": "healthy" if all_ok else "warning",
|
||||
"message": "Database connection successful" if all_ok else "Some persona tables may have issues",
|
||||
"persona_tables": tables_status,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Database health check failed: {e}")
|
||||
return {
|
||||
"status": "error",
|
||||
"message": f"Database health check failed: {str(e)}",
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
def comprehensive_health_check(self) -> Dict[str, Any]:
|
||||
"""Comprehensive health check including all services."""
|
||||
try:
|
||||
# Basic health
|
||||
basic_health = self.basic_health_check()
|
||||
|
||||
# Database health
|
||||
db_health = self.database_health_check()
|
||||
|
||||
# Determine overall status
|
||||
overall_status = "healthy"
|
||||
if basic_health["status"] != "healthy" or db_health["status"] == "error":
|
||||
overall_status = "unhealthy"
|
||||
elif db_health["status"] == "warning":
|
||||
overall_status = "degraded"
|
||||
|
||||
return {
|
||||
"status": overall_status,
|
||||
"basic": basic_health,
|
||||
"database": db_health,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Comprehensive health check failed: {e}")
|
||||
return {
|
||||
"status": "error",
|
||||
"message": f"Comprehensive health check failed: {str(e)}",
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
Reference in New Issue
Block a user