import time import docker import httpx from fastapi import APIRouter from config import CC_CONNECT_URL, DOCKER_HOST router = APIRouter() client = docker.DockerClient(base_url=DOCKER_HOST, timeout=5) @router.get("/health") async def cc_connect_health(): url = (CC_CONNECT_URL or "").strip() container = None try: matches = client.containers.list(all=True, filters={"name": "cc-connect"}) if matches: container = matches[0] except Exception as exc: return { "ok": False, "status": "down", "source": "docker", "container_name": None, "container_status": None, "endpoint": None, "http_status": None, "latency_ms": None, "error": f"docker check failed: {exc}", } container_name = container.name if container else None container_status = container.status if container else "not_found" container_up = container_status == "running" if not url: return { "ok": container_up, "status": "up" if container_up else "down", "source": "docker", "container_name": container_name, "container_status": container_status, "endpoint": None, "http_status": None, "latency_ms": None, "error": None if container_up else "cc-connect container is not running", } timeout = httpx.Timeout(2.0) started = time.perf_counter() try: async with httpx.AsyncClient(timeout=timeout) as http_client: response = await http_client.get(url) latency_ms = round((time.perf_counter() - started) * 1000, 1) if response.is_success and container_up: return { "ok": True, "status": "up", "source": "docker+http", "container_name": container_name, "container_status": container_status, "endpoint": url, "http_status": response.status_code, "latency_ms": latency_ms, "error": None, } if response.is_success and not container_up: return { "ok": False, "status": "down", "source": "docker+http", "container_name": container_name, "container_status": container_status, "endpoint": url, "http_status": response.status_code, "latency_ms": latency_ms, "error": "HTTP probe succeeded but cc-connect container is not running", } return { "ok": False, "status": "down", "source": "docker+http", "container_name": container_name, "container_status": container_status, "endpoint": url, "http_status": response.status_code, "latency_ms": latency_ms, "error": f"HTTP probe returned {response.status_code}", } except Exception as exc: return { "ok": False, "status": "down", "source": "docker+http", "container_name": container_name, "container_status": container_status, "endpoint": url, "http_status": None, "latency_ms": None, "error": str(exc), }