feat(alerts): 添加微信告警、WebSocket实时推送和地图功能
- 新增微信告警服务(wechat_service)和告警任务(alert_tasks) - 新增 WebSocket 实时推送端点 - 新增监控管理模块(monitor) - 增强统计仪表板:趋势图、区域分布、光功率历史 - 设备管理:添加坐标信息、标签系统、复合索引优化 - 前端:重构Dashboard/Charts页面,新增业务组件 - 新增5个数据库迁移(坐标、复合索引、标签、光功率历史、显示名) - 更新部署配置和脚本 - 新增测试框架基础结构
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
"""WebSocket 实时推送"""
|
||||
import asyncio
|
||||
import json
|
||||
import logging
|
||||
import redis.asyncio as aioredis
|
||||
from fastapi import APIRouter, WebSocket, WebSocketDisconnect
|
||||
from app.core.config import settings
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
REDIS_CHANNEL = "h3c_onu:status_updates"
|
||||
_connected: set[WebSocket] = set()
|
||||
|
||||
|
||||
async def _redis_listener():
|
||||
"""监听 Redis pub/sub 并广播给所有 WebSocket 客户端"""
|
||||
try:
|
||||
r = aioredis.from_url(settings.REDIS_URL)
|
||||
pubsub = r.pubsub()
|
||||
await pubsub.subscribe(REDIS_CHANNEL)
|
||||
logger.info("WebSocket Redis 监听已启动")
|
||||
async for msg in pubsub.listen():
|
||||
if msg["type"] == "message":
|
||||
dead: set[WebSocket] = set()
|
||||
for ws in _connected:
|
||||
try:
|
||||
await ws.send_text(msg["data"].decode())
|
||||
except Exception:
|
||||
dead.add(ws)
|
||||
_connected -= dead
|
||||
except Exception as e:
|
||||
logger.error(f"Redis 监听异常: {e}")
|
||||
|
||||
|
||||
@router.websocket("/ws/dashboard")
|
||||
async def dashboard_ws(ws: WebSocket):
|
||||
await ws.accept()
|
||||
_connected.add(ws)
|
||||
try:
|
||||
while True:
|
||||
await ws.receive_text() # keep-alive, 忽略客户端消息
|
||||
except WebSocketDisconnect:
|
||||
pass
|
||||
finally:
|
||||
_connected.discard(ws)
|
||||
Reference in New Issue
Block a user