|
|
| """
|
| MnemoCore Healthcheck Script
|
| ============================
|
| Performs HTTP GET to /health endpoint and returns appropriate exit code.
|
| Designed to be used as Docker healthcheck.
|
|
|
| Exit codes:
|
| 0 - Service is healthy
|
| 1 - Service is unhealthy or unreachable
|
| """
|
|
|
| import os
|
| import sys
|
| import urllib.request
|
| import urllib.error
|
| import json
|
|
|
|
|
| HOST = os.environ.get("HOST", "0.0.0.0")
|
| PORT = os.environ.get("PORT", "8100")
|
| HEALTH_ENDPOINT = f"http://{HOST}:{PORT}/health"
|
| TIMEOUT_SECONDS = 5
|
|
|
|
|
| def check_health() -> bool:
|
| """
|
| Perform health check against the /health endpoint.
|
|
|
| Returns:
|
| bool: True if healthy, False otherwise
|
| """
|
| try:
|
| request = urllib.request.Request(
|
| HEALTH_ENDPOINT,
|
| method="GET",
|
| headers={"Accept": "application/json"}
|
| )
|
|
|
| with urllib.request.urlopen(request, timeout=TIMEOUT_SECONDS) as response:
|
| if response.status != 200:
|
| print(f"Health check failed: HTTP {response.status}", file=sys.stderr)
|
| return False
|
|
|
| data = json.loads(response.read().decode("utf-8"))
|
|
|
|
|
| status = data.get("status", "")
|
| if status == "healthy":
|
| print(f"Health check passed: {status}")
|
| return True
|
| elif status == "degraded":
|
|
|
| print(f"Health check passed (degraded): {data}")
|
| return True
|
| else:
|
| print(f"Health check failed: unexpected status '{status}'", file=sys.stderr)
|
| return False
|
|
|
| except urllib.error.URLError as e:
|
| print(f"Health check failed: connection error - {e.reason}", file=sys.stderr)
|
| return False
|
| except urllib.error.HTTPError as e:
|
| print(f"Health check failed: HTTP {e.code} - {e.reason}", file=sys.stderr)
|
| return False
|
| except json.JSONDecodeError as e:
|
| print(f"Health check failed: invalid JSON response - {e}", file=sys.stderr)
|
| return False
|
| except TimeoutError:
|
| print(f"Health check failed: timeout after {TIMEOUT_SECONDS}s", file=sys.stderr)
|
| return False
|
| except Exception as e:
|
| print(f"Health check failed: unexpected error - {e}", file=sys.stderr)
|
| return False
|
|
|
|
|
| def main():
|
| """Main entry point for healthcheck script."""
|
| is_healthy = check_health()
|
| exit_code = 0 if is_healthy else 1
|
| sys.exit(exit_code)
|
|
|
|
|
| if __name__ == "__main__":
|
| main()
|
|
|