90 lines
3.4 KiB
Python
90 lines
3.4 KiB
Python
import asyncio
|
|
from datetime import datetime, timezone
|
|
|
|
from core.config import Settings
|
|
from operations.health.schemas import ComponentCheck, HealthStatus
|
|
|
|
|
|
async def check_database_status() -> ComponentCheck:
|
|
"""Checking the primary database connection with a timeout."""
|
|
try:
|
|
# Simulate an async DB call (replace with actual logic)
|
|
await asyncio.wait_for(asyncio.sleep(0.042), timeout=0.1)
|
|
|
|
return ComponentCheck(name = "postgres",
|
|
status = "pass",
|
|
time = datetime.now(timezone.utc),
|
|
observedValue = 42,
|
|
observedUnit = "ms")
|
|
except asyncio.TimeoutError:
|
|
return ComponentCheck(name = "postgres",
|
|
status = "fail",
|
|
time = datetime.now(timezone.utc),
|
|
output = "Check timed out")
|
|
except Exception as e:
|
|
return ComponentCheck(name = "postgres",
|
|
status = "fail",
|
|
time = datetime.now(timezone.utc),
|
|
output = str(e))
|
|
|
|
async def check_media_server_status() -> ComponentCheck:
|
|
"""Checking the media server connection with a timeout."""
|
|
try:
|
|
# Simulate a successful async queue call
|
|
await asyncio.wait_for(asyncio.sleep(0.02), timeout=0.05)
|
|
|
|
return ComponentCheck(name = "livekit",
|
|
status = "pass",
|
|
time = datetime.now(timezone.utc),
|
|
observedValue = 20,
|
|
observedUnit = "ms")
|
|
except asyncio.TimeoutError:
|
|
return ComponentCheck(name = "livekit",
|
|
status = "fail",
|
|
time = datetime.now(timezone.utc),
|
|
output = "Check timed out")
|
|
except Exception as e:
|
|
return ComponentCheck(name = "livekit",
|
|
status = "fail",
|
|
time = datetime.now(timezone.utc),
|
|
output = str(e))
|
|
|
|
async def readiness_check() -> bool:
|
|
"""
|
|
*Extend readiness_check() as dependencies are added; it must return True/False.*
|
|
"""
|
|
|
|
# Run all critical checks
|
|
db = await check_database_status()
|
|
media_server = await check_media_server_status()
|
|
|
|
# Check if all statuses are 'pass'
|
|
if db.status == 'pass' and media_server.status == 'pass':
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
async def get_detailed_health(settings: Settings) -> HealthStatus:
|
|
"""
|
|
Build detailed health payload aligned with common status formats.
|
|
|
|
status: pass | warn | fail
|
|
"""
|
|
|
|
# Run all critical checks
|
|
db = await check_database_status()
|
|
media_server = await check_media_server_status()
|
|
|
|
# Check if all statuses are 'pass'
|
|
overall = "pass"
|
|
if db.status != 'pass' or media_server.status != 'pass':
|
|
overall = "fail"
|
|
|
|
return HealthStatus(status = overall,
|
|
version = settings.version,
|
|
environment = settings.environment,
|
|
serviceName = settings.service_name,
|
|
description = settings.title,
|
|
checks = {"Database": db,
|
|
"Media Server": media_server})
|