From 3bb4104a1065b388f3cf8495822f99b821bfc9e7 Mon Sep 17 00:00:00 2001 From: ahmedoubadi Date: Tue, 29 Sep 2026 13:02:05 +0100 Subject: [PATCH] fix: improve websocket error handling and data sending logic --- deploy/docker/monitor_routes.py | 59 +++++++++++++++++---------------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/deploy/docker/monitor_routes.py b/deploy/docker/monitor_routes.py index 5faf33d60..3cb282746 100644 --- a/deploy/docker/monitor_routes.py +++ b/deploy/docker/monitor_routes.py @@ -369,41 +369,44 @@ async def websocket_endpoint(websocket: WebSocket): try: while True: - try: - # Gather all monitoring data - monitor = get_monitor() - - data = { - "timestamp": asyncio.get_event_loop().time(), - "health": await monitor.get_health_summary(), - "requests": { - "active": monitor.get_active_requests(), - "completed": monitor.get_completed_requests(limit=10) - }, - "browsers": await monitor.get_browser_list(), - "timeline": { - "memory": monitor.get_timeline_data("memory", "5m"), - "requests": monitor.get_timeline_data("requests", "5m"), - "browsers": monitor.get_timeline_data("browsers", "5m") - }, - "janitor": monitor.get_janitor_log(limit=10), - "errors": monitor.get_errors_log(limit=10) - } - - # Send update to client - await websocket.send_json(data) + # Gather all monitoring data + monitor = get_monitor() - # Wait 2 seconds before next update - await asyncio.sleep(2) + data = { + "timestamp": asyncio.get_event_loop().time(), + "health": await monitor.get_health_summary(), + "requests": { + "active": monitor.get_active_requests(), + "completed": monitor.get_completed_requests(limit=10) + }, + "browsers": await monitor.get_browser_list(), + "timeline": { + "memory": monitor.get_timeline_data("memory", "5m"), + "requests": monitor.get_timeline_data("requests", "5m"), + "browsers": monitor.get_timeline_data("browsers", "5m") + }, + "janitor": monitor.get_janitor_log(limit=10), + "errors": monitor.get_errors_log(limit=10) + } + try: + await websocket.send_json(data) except WebSocketDisconnect: logger.info("WebSocket client disconnected") break - except Exception as e: - logger.error(f"WebSocket error: {e}", exc_info=True) - await asyncio.sleep(2) # Continue trying + except RuntimeError as e: + if "websocket.close" in str(e): + logger.info("WebSocket already closed") + break + raise + + await asyncio.sleep(2) + + except WebSocketDisconnect: + logger.info("WebSocket client disconnected") except Exception as e: logger.error(f"WebSocket connection error: {e}", exc_info=True) + finally: logger.info("WebSocket connection closed")