teoat's picture
fix(backend): fix port and health check robustness
d29a5a0 verified
"""
Monitoring API Endpoints
Production monitoring and metrics endpoints
"""
from fastapi import APIRouter, Depends, HTTPException, status
from typing import Any
from datetime import datetime
from app.services.monitoring_collector import MonitoringCollector
from monitoring.config import MonitoringConfig
router = APIRouter(prefix="/monitoring", tags=["monitoring"])
# Dependency to get monitoring collector
async def get_monitoring_collector():
"""Get monitoring collector instance"""
collector = MonitoringCollector()
return collector
@router.get("/health", response_model=dict[str, Any])
async def get_system_health(
collector: MonitoringCollector = Depends(get_monitoring_collector)
):
"""Get overall system health status"""
try:
health_status = collector.get_health_status()
return {
"success": True,
"data": health_status,
"timestamp": datetime.utcnow().isoformat()
}
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to get health status: {str(e)}"
)
@router.get("/performance", response_model=dict[str, Any])
async def get_performance_metrics(
minutes: int = 5,
collector: MonitoringCollector = Depends(get_monitoring_collector)
):
"""Get performance metrics for the last N minutes"""
try:
if minutes > 60:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Maximum time range is 60 minutes"
)
metrics = collector.get_performance_metrics(minutes)
return {
"success": True,
"data": metrics,
"timestamp": datetime.utcnow().isoformat()
}
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to get performance metrics: {str(e)}"
)
@router.get("/security", response_model=dict[str, Any])
async def get_security_metrics(
minutes: int = 5,
collector: MonitoringCollector = Depends(get_monitoring_collector)
):
"""Get security metrics for the last N minutes"""
try:
if minutes > 60:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Maximum time range is 60 minutes"
)
metrics = collector.get_security_metrics(minutes)
return {
"success": True,
"data": metrics,
"timestamp": datetime.utcnow().isoformat()
}
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to get security metrics: {str(e)}"
)
@router.get("/business", response_model=dict[str, Any])
async def get_business_metrics(
minutes: int = 5,
collector: MonitoringCollector = Depends(get_monitoring_collector)
):
"""Get business metrics for the last N minutes"""
try:
if minutes > 60:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Maximum time range is 60 minutes"
)
metrics = collector.get_business_metrics(minutes)
return {
"success": True,
"data": metrics,
"timestamp": datetime.utcnow().isoformat()
}
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to get business metrics: {str(e)}"
)
@router.get("/dashboard", response_model=dict[str, Any])
async def get_dashboard_metrics(
collector: MonitoringCollector = Depends(get_monitoring_collector)
):
"""Get comprehensive dashboard metrics"""
try:
health = collector.get_health_status()
performance = collector.get_performance_metrics(5)
security = collector.get_security_metrics(5)
business = collector.get_business_metrics(5)
return {
"success": True,
"data": {
"health": health,
"performance": performance,
"security": security,
"business": business
},
"timestamp": datetime.utcnow().isoformat()
}
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to get dashboard metrics: {str(e)}"
)
@router.get("/status", response_model=dict[str, Any])
async def get_monitoring_status():
"""Get monitoring system status"""
try:
return {
"success": True,
"data": {
"monitoring_enabled": True,
"environment": MonitoringConfig.ENVIRONMENT,
"api_version": "1.0.0",
"features": {
"performance_monitoring": MonitoringConfig.ENABLE_PERFORMANCE_MONITORING,
"security_monitoring": MonitoringConfig.ENABLE_SECURITY_MONITORING,
"business_metrics": MonitoringConfig.ENABLE_BUSINESS_METRICS
},
"alert_thresholds": MonitoringConfig.ALERT_THRESHOLDS
},
"timestamp": datetime.utcnow().isoformat()
}
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Failed to get monitoring status: {str(e)}"
)