Remove mcp-gateway/gateway-proxy/dashboard_routes.py
This commit is contained in:
parent
61724cddb4
commit
1a9c884612
1 changed files with 0 additions and 159 deletions
|
|
@ -1,159 +0,0 @@
|
|||
"""
|
||||
Dashboard routes for MCP Gateway status monitoring
|
||||
Exposes service health, tool counts, and response metrics
|
||||
"""
|
||||
|
||||
import json
|
||||
import time
|
||||
import aiohttp
|
||||
from datetime import datetime
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
# Define backend services with their details
|
||||
BACKEND_SERVICES = {
|
||||
"erpnext": {
|
||||
"url": "http://mcp-erpnext:32802/mcp",
|
||||
"display_name": "ERPNext",
|
||||
"description": "ERP System Integration"
|
||||
},
|
||||
"truenas": {
|
||||
"url": "http://mcp-truenas:8100/mcp",
|
||||
"display_name": "TrueNAS",
|
||||
"description": "NAS Storage Management"
|
||||
},
|
||||
"homeassistant": {
|
||||
"url": "http://mcp-homeassistant:8200/mcp",
|
||||
"display_name": "Home Assistant",
|
||||
"description": "Home Automation"
|
||||
},
|
||||
"wave": {
|
||||
"url": "http://mcp-wave:8300/mcp",
|
||||
"display_name": "Wave Finance",
|
||||
"description": "Financial Management"
|
||||
},
|
||||
"linkedin": {
|
||||
"url": "http://mcp-linkedin:3000/mcp",
|
||||
"display_name": "LinkedIn",
|
||||
"description": "LinkedIn Integration"
|
||||
}
|
||||
}
|
||||
|
||||
SERVICE_CACHE = {}
|
||||
CACHE_TTL = 30 # Cache for 30 seconds
|
||||
|
||||
|
||||
async def get_service_status() -> Dict:
|
||||
"""
|
||||
Get status of all MCP services
|
||||
Returns health, tool count, response time, and other metrics
|
||||
"""
|
||||
services = []
|
||||
|
||||
for service_key, service_config in BACKEND_SERVICES.items():
|
||||
service_data = {
|
||||
"name": service_config.get("display_name", service_key),
|
||||
"key": service_key,
|
||||
"url": service_config["url"],
|
||||
"status": "unknown",
|
||||
"toolCount": 0,
|
||||
"responseTime": None,
|
||||
"lastCheck": None,
|
||||
"error": None
|
||||
}
|
||||
|
||||
try:
|
||||
start_time = time.time()
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
# Try to fetch tools list
|
||||
tools_url = f"{service_config['url']}/tools"
|
||||
|
||||
async with session.get(tools_url, timeout=aiohttp.ClientTimeout(total=5)) as response:
|
||||
elapsed = (time.time() - start_time) * 1000 # Convert to ms
|
||||
service_data["responseTime"] = round(elapsed, 2)
|
||||
|
||||
if response.status == 200:
|
||||
try:
|
||||
data = await response.json()
|
||||
tools = data.get("tools", [])
|
||||
service_data["toolCount"] = len(tools)
|
||||
service_data["status"] = "healthy"
|
||||
except json.JSONDecodeError:
|
||||
service_data["status"] = "warning"
|
||||
service_data["error"] = "Invalid JSON response"
|
||||
elif response.status == 503:
|
||||
service_data["status"] = "warning"
|
||||
service_data["error"] = "Service unavailable"
|
||||
else:
|
||||
service_data["status"] = "unhealthy"
|
||||
service_data["error"] = f"HTTP {response.status}"
|
||||
|
||||
except asyncio.TimeoutError:
|
||||
service_data["status"] = "unhealthy"
|
||||
service_data["error"] = "Connection timeout"
|
||||
service_data["responseTime"] = 5000
|
||||
except aiohttp.ClientConnectorError:
|
||||
service_data["status"] = "unhealthy"
|
||||
service_data["error"] = "Connection refused"
|
||||
except Exception as e:
|
||||
service_data["status"] = "unhealthy"
|
||||
service_data["error"] = str(e)
|
||||
|
||||
service_data["lastCheck"] = datetime.utcnow().isoformat()
|
||||
services.append(service_data)
|
||||
|
||||
return {
|
||||
"timestamp": datetime.utcnow().isoformat(),
|
||||
"services": services,
|
||||
"summary": {
|
||||
"total": len(services),
|
||||
"healthy": len([s for s in services if s["status"] == "healthy"]),
|
||||
"warning": len([s for s in services if s["status"] == "warning"]),
|
||||
"unhealthy": len([s for s in services if s["status"] == "unhealthy"]),
|
||||
"totalTools": sum(s["toolCount"] for s in services)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async def setup_dashboard_routes(app):
|
||||
"""
|
||||
Register dashboard routes with the FastAPI app
|
||||
"""
|
||||
from fastapi.responses import FileResponse, JSONResponse
|
||||
from fastapi import APIRouter
|
||||
import asyncio
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@router.get("/dashboard")
|
||||
async def get_dashboard():
|
||||
"""Serve the dashboard HTML"""
|
||||
try:
|
||||
return FileResponse("dashboard/dashboard.html", media_type="text/html")
|
||||
except FileNotFoundError:
|
||||
return JSONResponse(
|
||||
{"error": "Dashboard not found"},
|
||||
status_code=404
|
||||
)
|
||||
|
||||
@router.get("/mcp/status")
|
||||
async def get_mcp_status():
|
||||
"""Get status of all MCP services"""
|
||||
status = await get_service_status()
|
||||
return JSONResponse(status)
|
||||
|
||||
@router.get("/mcp/status/{service_name}")
|
||||
async def get_service_status_by_name(service_name: str):
|
||||
"""Get status of a specific service"""
|
||||
status = await get_service_status()
|
||||
|
||||
for service in status["services"]:
|
||||
if service["key"] == service_name or service["name"].lower() == service_name.lower():
|
||||
return JSONResponse(service)
|
||||
|
||||
return JSONResponse(
|
||||
{"error": f"Service '{service_name}' not found"},
|
||||
status_code=404
|
||||
)
|
||||
|
||||
return router
|
||||
Loading…
Reference in a new issue