feat: add cc-connect dashboard health integration
Deploy Dashboard (Dev) / deploy-dev (push) Successful in 2m49s
Deploy Dashboard (Dev) / deploy-dev (push) Successful in 2m49s
Add a protected backend health endpoint and a new dashboard page/sidebar entry so cc-connect operational status is visible in the UI. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
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),
|
||||
}
|
||||
Reference in New Issue
Block a user