自研技术栈与工程攻关
RTC 质量保证与监控体系
为什么监控是自研 RTC 的分水岭:SFU 谁都能搭起来,但「用户说卡、你却不知道卡在哪」才是自研团队被商业方案吊打的真实场景。商业厂商卖的从来不只是媒体转发,而是水晶球(Agora Analytics)/ 仪表盘(TRTC Dashboard)背后的质量运营能力——自研必须把这块补齐,否则永远在盲飞。
核心结论(TL;DR)
结论 1
指标必须三层分开:网络层(RTT/丢包/抖动)是「原因」,媒体层(码率/帧率/卡顿)是「过程」,体验层(MOS/进房成功率/首帧时间/投诉率)才是「结果」。只看网络层会漏掉编解码问题,只看体验层无法定位根因——告警挂体验层、定位靠下两层。
结论 2
getStats 是唯一的真相来源:浏览器/SDK 侧 W3C getStats API 暴露 200+ 字段,生产上抽 15–20 个关键字段、5–10 秒采样一次即可;开源 rtcstats 方案(webrtc-internals 自动化采集)可直接落地,不必从零造轮子。
结论 3
拨测与 RUM 缺一不可:真实用户监控(RUM)告诉你现状分布,但无法主动发现「凌晨某国节点劣化」;合成拨测探针(各区域常驻假用户互打)才能在用户投诉前发现问题。两轨数据打通到同一看板,按国家 × 运营商 × 版本三维度切片。
结论 4
弱网测试要进 CI:tc/netem 损伤注入(丢包/延迟/抖动/带宽限制的标准剧本库)+ 自动化对比基线,每次引擎改动跑全套弱网回归——RTC 的性能回退往往不在功能测试里暴露,而在 8% 丢包 + 200ms 抖动的组合剧本里现形。
一、QoS / QoE 指标体系分层
| 层 | 核心指标 | 来源 | 用途 |
|---|---|---|---|
| 网络层(QoS) | RTT(currentRoundTripTime)、丢包率(packetsLost/Sent)、抖动(jitter)、可用带宽估计(availableOutgoingBitrate)、relay 占比 | getStats candidate-pair / remote-inbound-rtp | 根因定位、调度反馈(切节点) |
| 媒体层(QoS) | 实际编码码率/帧率/分辨率、关键帧频次、NACK/FEC/PLI 计数、解码丢帧、音频 concealedSamples(PLC 隐藏比例) | getStats outbound/inbound-rtp、track | 引擎行为诊断(是网络差还是策略降的档?) |
| 体验层(QoE) | 进房成功率、进房耗时、首帧时间、音频/视频卡顿率(600ms 口径)、口到耳延迟、E-model 估算 MOS、用户评分/投诉率 | SDK 埋点 + 服务端事件流 | 告警与 SLA 的唯一挂靠层 |
MOS 怎么算才靠谱:线上无参考场景用 ITU-T G.107 E-model 从 RTT/丢包/编解码折算 R 值再映射 MOS(实时、可规模化);实验室场景用 POLQA/ViSQOL 全参考算法对录音打分(准、但需要参考信号)。两者数值不可直接互比,各用各的基线。
二、getStats 采集落地
- 采样策略:通话中每 5–10s 拉一次 getStats,增量字段(如 packetsLost)取差分变化率;通话结束补一份汇总摘要(P50/P95/max)——摘要用于看板聚合,明细按采样率抽样存(全量存成本高且没必要)
- 字段白名单(20 个够用):candidate-pair 的 currentRoundTripTime / availableOutgoingBitrate;outbound-rtp 的 bytesSent / framesPerSecond / qualityLimitationReason(重要:直接告诉你是 cpu 还是 bandwidth 限制);inbound-rtp 的 packetsLost / jitter / framesDropped / concealedSamples;track 的 frameWidth/Height
- 开源方案:rtcstats(webrtc-internals 数据自动上报)+ 后端时序库(ClickHouse/InfluxDB)+ Grafana,是社区验证过的最短路径;商用托管有 rtcStats.com、testRTC 系工具
- 移动端 SDK:libwebrtc 原生 GetStats 同构,注意 iOS 后台采集节流;上报走独立低优先级通道,严禁与媒体流抢带宽(弱网下监控流量压垮媒体是真实事故模式)
- 隐私红线:IP 截断、房间号/用户 ID 哈希后上报,出境汇聚前脱敏(呼应 部署专题 合规三件套)
三、告警阈值基准表
| 指标 | 健康 | 预警(自动降级动作) | 严重(告警+调度动作) |
|---|---|---|---|
| 丢包率 | <2% | 2–5%:FEC 升档、视频降码率 | >5% 持续 30s:降分辨率/关视频保音频 |
| RTT | <150ms | 150–400ms:NACK→FEC 策略切换 | >400ms 持续:触发调度重新选点(ICE restart) |
| 抖动 | <30ms | 30–100ms:抖动缓冲水位上调 | >100ms:同上 + 记录网络事件 |
| 进房成功率(分国聚合) | >99% | 97–99%:值班关注 | <97% 或环比跌 2pp:拉响区域告警 |
| 音频卡顿率 | <1% | 1–3% | >3%:区域级排查(大概率节点/线路问题) |
| qualityLimitationReason=cpu 占比 | <5% | 5–15%:低端机策略复查 | >15%:端侧性能回退,查最近版本 |
两条告警工程纪律:① 单用户指标永不告警(噪声太大),一律聚合到「国家 × 运营商 × 5 分钟窗」再判;② 每条告警必须绑定 runbook(第一响应动作),否则就是骚扰。
四、拨测探针与真实用户监控双轨
1. 合成拨测(主动)
- 形态:各 PoP 区域放常驻探针(无头浏览器/SDK 容器),每 5–15 分钟自动互打一轮:进房→推流→拉流→退房,全程记录指标
- 覆盖矩阵:区域内(新加坡↔新加坡)、区域间(新加坡↔圣保罗)、运营商模拟(探针挂各国 eSIM/代理出口更贴真实)
- 用途:版本发布后回归验证、凌晨低峰劣化发现、SLA 证据留存;工具可自建(Playwright + 测试页)或用 testRTC/Cyara 类商用
2. 真实用户监控 RUM(被动)
- 全量通话摘要 + 抽样明细进数仓;看板首页三件套:分国质量地图、Top 劣化维度榜、版本对比曲线
- 灰度纪律:引擎/参数改动一律带质量 AB——实验组 vs 对照组的卡顿率/MOS 差异显著才放量(呼应性能优化专题「没有测量的优化都是玄学」)
- 坏通话下钻:从投诉/低分通话一键拉出该通话的全指标时间线(getStats 时序回放),这是止损效率的决定性工具
五、弱网实验室与自动化回归
- 损伤注入:Linux tc/netem 控制丢包(随机/突发 GE 模型)、延迟+抖动、带宽限制、乱序;网关机双网卡桥接即可搭一台「弱网盒子」
- 标准剧本库(示例):① 4G 印尼剧本:RTT 80ms±40ms 抖动、丢包 3% 突发;② 拉美腹地剧本:RTT 180ms、丢包 2%、带宽 1.5Mbps;③ 电梯剧本:10s 断网再恢复;④ 跨境剧本:RTT 330ms、丢包 1.5%;⑤ 极限剧本:8% 丢包 + 200ms 抖动
- 自动化:CI 中每个剧本跑双端对打,产出 MOS(ViSQOL 对录音打分)/卡顿率/恢复时间,与基线版本对比超阈值即卡发布
- 真机池:两区域主力低端机型(安卓为主)纳入回归池——模拟器测不出硬编/发热/后台限制类问题
六、大厂质量运营实践对标
| 能力 | Agora 水晶球(Analytics) | TRTC 监控仪表盘 | 自建对标最短路径 |
|---|---|---|---|
| 通话质量调查 | 单通话全链路时间线(端→边缘→对端) | 通话详情 + 端到端指标图 | getStats 时序回放页(ClickHouse + 前端时间线) |
| 大盘与切片 | 分国/分运营商/分版本大盘 | 实时大盘 + 历史对比 | Grafana 三维度切片看板 |
| 异常自动诊断 | 100+ 规则自动标注问题类型 | 异常事件流 | 规则引擎起步(阈值+组合规则),后续再谈智能化 |
| 拨测 | 内置探测网络 | —(需自建) | Playwright 探针矩阵(第四章) |
对标结论:自建做到「时序回放 + 三维度看板 + 规则告警 + 探针矩阵」四件套,即可覆盖商业方案 80% 的日常价值;剩下 20%(海量通话的自动归因)是长期活,别在第一年追求。
七、监控体系从 0 到 1 四阶段路线图
M1
看得见(第 1 月)难度低
getStats 白名单字段上报 + 通话摘要入库 + Grafana 首版大盘(进房成功率/卡顿率/RTT 分国曲线)。
M2
能定位(第 2–3 月)难度中
单通话时序回放页 + qualityLimitationReason 归因分类 + 告警规则挂 runbook;坏通话下钻打通客服工单。
M3
能预防(第 3–5 月)难度中
拨测探针矩阵常态化 + 弱网剧本进 CI + 发布质量门禁(对比基线卡发布)。
M4
能运营(持续)难度高
质量 AB 平台化、分国分运营商周报驱动参数迭代、与调度系统闭环(质量数据反哺选点)——到这一步,监控体系开始反过来定义产品竞争力。
来源列表(12+)
- 标准W3C:Identifiers for WebRTC's Statistics API(getStats 字段标准)
- 社区webrtcHacks:getStats 客户端监控实战(卡顿/拥塞检测)
- 社区BlogGeek.me:用 rtcstats 自动采集 webrtc-internals
- 行业The Client Knows Best:getStats 与质量监控深潜
- 行业HackerNoon:从 dump 文件到生产监控的迁移实录
- 工具rtcStats.com:WebRTC 观测与 100+ 自动问题标注
- 标准ITU-T G.107:E-model(R 值→MOS 折算)
- 标准ITU-T P.863:POLQA 感知语音质量评估
- 开源Google ViSQOL:开源客观音质评分
- 官方Agora Analytics(水晶球)文档
- 社区Cyara:WebRTC 抖动/RTT 监控要点
- 论文MDPI:WebRTC QoE 客观全参考模型评估(2020)