""" 健康检查处理器 提供服务健康状态检查 """ from datetime import datetime from typing import Dict, Any from fastapi import APIRouter, Depends from pydantic import BaseModel from sqlalchemy.orm import Session from app.database import get_db from app.services.jenkins_service import get_jenkins_service from app.services.queue_service import get_queue_service from app.config import get_settings router = APIRouter(prefix="/health", tags=["health"]) class JenkinsStatus(BaseModel): status: str message: str = None class WorkerPoolStatus(BaseModel): active_workers: int queue_size: int total_processed: int total_failed: int class HealthResponse(BaseModel): status: str service: str version: str timestamp: datetime jenkins: JenkinsStatus worker_pool: WorkerPoolStatus database: Dict[str, Any] @router.get("/", response_model=HealthResponse) async def health_check(db: Session = Depends(get_db)): """ 健康检查端点 检查服务各个组件的状态 """ settings = get_settings() # 检查 Jenkins 连接 jenkins_service = get_jenkins_service() jenkins_status = JenkinsStatus(status="disconnected", message="Unable to connect to Jenkins server") try: if await jenkins_service.test_connection(): jenkins_status = JenkinsStatus(status="connected") except Exception as e: jenkins_status.message = f"Connection failed: {str(e)}" # 获取工作池统计 queue_service = get_queue_service() try: stats = await queue_service.get_stats() worker_pool_status = WorkerPoolStatus( active_workers=stats.get("active_workers", 0), queue_size=stats.get("queue_size", 0), total_processed=stats.get("total_processed", 0), total_failed=stats.get("total_failed", 0) ) except Exception as e: worker_pool_status = WorkerPoolStatus( active_workers=0, queue_size=0, total_processed=0, total_failed=0 ) # 检查数据库连接 database_status = {"status": "disconnected", "message": "Database connection failed"} try: # 尝试执行简单查询 db.execute("SELECT 1") database_status = {"status": "connected"} except Exception as e: database_status["message"] = f"Database error: {str(e)}" # 确定整体状态 overall_status = "healthy" if jenkins_status.status != "connected": overall_status = "unhealthy" return HealthResponse( status=overall_status, service="Gitea Webhook Ambassador", version=settings.version, timestamp=datetime.utcnow(), jenkins=jenkins_status, worker_pool=worker_pool_status, database=database_status ) @router.get("/simple") async def simple_health_check(): """ 简单健康检查端点 用于负载均衡器和监控系统 """ return { "status": "healthy", "service": "Gitea Webhook Ambassador", "version": "1.0.0" } @router.get("/ready") async def readiness_check(db: Session = Depends(get_db)): """ 就绪检查端点 检查服务是否准备好接收请求 """ try: # 检查数据库连接 db.execute("SELECT 1") # 检查 Jenkins 连接 jenkins_service = get_jenkins_service() jenkins_ready = await jenkins_service.test_connection() if jenkins_ready: return {"status": "ready"} else: return {"status": "not_ready", "reason": "Jenkins connection failed"} except Exception as e: return {"status": "not_ready", "reason": f"Database connection failed: {str(e)}"} @router.get("/live") async def liveness_check(): """ 存活检查端点 检查服务进程是否正常运行 """ return {"status": "alive"}