- 新增完整的 Python 实现,替代 Go 版本 - 添加 Web 登录界面和仪表板 - 实现 JWT 认证和 API 密钥管理 - 添加数据库存储功能 - 保持与 Go 版本一致的目录结构和启动脚本 - 包含完整的文档和测试脚本
145 lines
3.9 KiB
Python
145 lines
3.9 KiB
Python
"""
|
|
健康检查处理器
|
|
提供服务健康状态检查
|
|
"""
|
|
|
|
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"} |