mirror of
https://github.com/sstent/AICyclingCoach.git
synced 2026-02-06 06:21:53 +00:00
54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
from fastapi import APIRouter
|
|
from fastapi.responses import PlainTextResponse, JSONResponse
|
|
from backend.app.services.health_monitor import HealthMonitor
|
|
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST, Gauge
|
|
from pathlib import Path
|
|
import json
|
|
|
|
router = APIRouter()
|
|
monitor = HealthMonitor()
|
|
|
|
# Prometheus metrics
|
|
SYNC_QUEUE = Gauge('sync_queue_size', 'Current Garmin sync queue size')
|
|
PENDING_ANALYSES = Gauge('pending_analyses', 'Number of pending workout analyses')
|
|
|
|
@router.get("/health")
|
|
async def get_health():
|
|
return monitor.check_system_health()
|
|
|
|
@router.get("/metrics")
|
|
async def prometheus_metrics():
|
|
# Update metrics with latest values
|
|
health_data = monitor.check_system_health()
|
|
SYNC_QUEUE.set(health_data['services'].get('sync_queue_size', 0))
|
|
PENDING_ANALYSES.set(health_data['services'].get('pending_analyses', 0))
|
|
|
|
return PlainTextResponse(
|
|
content=generate_latest(),
|
|
media_type=CONTENT_TYPE_LATEST
|
|
)
|
|
|
|
@router.get("/dashboard/health", response_class=JSONResponse)
|
|
async def health_dashboard():
|
|
"""Health dashboard endpoint with aggregated monitoring data"""
|
|
health_data = monitor.check_system_health()
|
|
|
|
# Get recent logs (last 100 lines)
|
|
log_file = Path("/app/logs/app.log")
|
|
recent_logs = []
|
|
try:
|
|
with log_file.open() as f:
|
|
lines = f.readlines()[-100:]
|
|
recent_logs = [json.loads(line.strip()) for line in lines]
|
|
except FileNotFoundError:
|
|
pass
|
|
|
|
return {
|
|
"system": health_data,
|
|
"logs": recent_logs,
|
|
"statistics": {
|
|
"log_entries": len(recent_logs),
|
|
"error_count": sum(1 for log in recent_logs if log.get('level') == 'ERROR'),
|
|
"warning_count": sum(1 for log in recent_logs if log.get('level') == 'WARNING')
|
|
}
|
|
} |