43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
"""Healthcheck endpoint for monitoring."""
|
|
import asyncio
|
|
import json
|
|
from pathlib import Path
|
|
from aiohttp import web
|
|
from app.logger import logger
|
|
|
|
routes = web.RouteTableDef()
|
|
|
|
|
|
@routes.get("/health")
|
|
async def health(request):
|
|
"""Basic health check — returns bot status."""
|
|
health_data = {
|
|
"status": "ok",
|
|
"service": "spa-telegram-bot",
|
|
"timestamp": asyncio.get_event_loop().time(),
|
|
}
|
|
|
|
# Check if data files exist
|
|
data_dir = Path(__file__).resolve().parent.parent / "data"
|
|
health_data["data_dir_exists"] = data_dir.exists()
|
|
|
|
return web.json_response(health_data, status=200)
|
|
|
|
|
|
@routes.get("/health/ready")
|
|
async def ready(request):
|
|
"""Readiness check — can the bot accept requests?"""
|
|
return web.json_response({"status": "ready"}, status=200)
|
|
|
|
|
|
async def start_health_server(port: int = 8080):
|
|
"""Start healthcheck HTTP server on given port."""
|
|
app = web.Application()
|
|
app.add_routes(routes)
|
|
runner = web.AppRunner(app)
|
|
await runner.setup()
|
|
site = web.TCPSite(runner, "0.0.0.0", port)
|
|
await site.start()
|
|
logger.info("Healthcheck server started on port {port}", port=port)
|
|
return runner
|