前端需将SSE封装为可观测单元,覆盖请求发起、首字节到达、持续接收、异常中断/重连全生命周期,结合Performance API分段采集耗时,精准识别断线原因并统计频次,通过URL透传traceId实现全链路对齐,监控数据经sendBeacon或fetch异步上报。

前端对 SSE(Server-Sent Events)做全链路耗时监控与断线频次统计,不能只看连接建立时间,而要覆盖“发起请求 → 首字节到达 → 持续接收 → 异常中断/重连”整个生命周期,并与 traceId 对齐、支持离线复位、区分真实断线与网络抖动。核心是把 SSE 封装成可观测单元,而非裸用 EventSource。
SSE 连接阶段耗时分段采集
浏览器原生 EventSource 不暴露底层 TCP/TLS 等阶段,需结合 Performance API + 手动打点补全关键节点:
-
发起时刻:调用
new EventSource(url)前记录performance.now(),作为connectStart -
首帧响应(TTFB):监听
onopen回调,在回调内立即取performance.now() - connectStart;若 5 秒未触发,视为连接超时,按失败上报 -
首数据帧延迟:在
onmessage第一次触发时记录时间,与onopen时间差即为服务端首次推送延迟(非网络耗时,属业务逻辑) -
持续接收稳定性:用
lastEventId+ 时间戳滑动窗口(如最近 30 秒内收到消息间隔标准差),标准差 > 1.5s 视为抖动加剧
断线识别与频次归因统计
EventSource 自动重连机制会掩盖真实断线原因,必须区分是服务端关闭、网络中断、还是客户端主动销毁:
PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。
- 监听
onerror时,检查eventSource.readyState:0(关闭)不计入断线;0 以外且非 0/2(即非 closed 或 open)视为异常中断 - 捕获
onclose(需服务端返回event: close并调用eventSource.close())——此为计划性终止,不计频次 - 对每次异常中断,记录
eventSource.url、eventSource.withCredentials、当前网络类型(navigator.onLine+connection.effectiveType)、以及上一次成功onmessage时间戳 - 同一 URL 在 60 秒内连续中断 ≥ 3 次,标记为“高频断连”,并上报完整上下文(含 traceId、设备 UA、页面 visibilityState)
traceId 注入与全链路对齐
SSE 请求无法像 fetch 那样直接设置 headers,需通过 URL query 或服务端协商方式透传链路标识:
立即学习“Java免费学习笔记(深入)”;
- 初始化时从全局上下文(如
window.__TRACE__)取traceparent,拼入 URL:new EventSource(`/stream?trace=${encodeURIComponent(traceparent)}`) - 服务端需在首个
data:帧中回传该 traceId,前端在首次onmessage中校验并绑定到当前 EventSource 实例:eventSource.__traceId = event.data.traceId - 所有后续错误、耗时、重连事件上报时,强制携带该
__traceId;若重连后未收到新 traceId,则复用前序 traceId,保证链路不中断 - 断线期间若页面进入 background,需将当前 traceId + 断连时间点持久化至 localStorage,恢复 foreground 后尝试续传未上报的断线事件
上报策略与可靠性保障
SSE 监控数据本身不能依赖 SSE 上报(循环依赖),应走独立通道:
- 使用
sendBeacon提交聚合后的断线事件和耗时摘要,避免页面卸载丢失 - 每 10 秒或每 5 次断线事件,用
fetch(带 traceparent header)批量上报,失败则存入 IndexedDB 待重试 - 禁止在
onerror内同步发起 fetch,改用requestIdleCallback或setTimeout(..., 0)延迟执行,防止阻塞重连逻辑 - 上报 payload 必须包含:
type: "sse_break"或"sse_duration"、url、durationMs、breakCount、traceId、isReconnect、networkEffectiveType

















