协议扩展
功能概述
协议扩展功能为研发、运维和产品团队提供 HTTP/HTTPS 之外的网络协议监控能力,支持 WebSocket、gRPC 等现代通信协议的性能分析,同时提供自定义协议监控的灵活扩展。帮助团队全面掌握应用的网络通信状况,快速定位协议层面的性能问题,保障实时通信和微服务架构的稳定性。
核心价值
- 全协议覆盖:支持 HTTP/HTTPS、WebSocket、gRPC 等多种协议,实现全链路监控
- 实时通信监控:专注 WebSocket 等实时协议的性能和稳定性分析
- 微服务架构支持:深度监控 gRPC 等微服务通信协议
- 灵活扩展能力:通过 API 自定义任意协议的监控指标和维度
技术要求
- SDK 版本:≥ 2.16.0
- 支持平台:Android、iOS、Harmony OS
- 数据采集:预置协议自动采集,自定义协议需埋点
使用场景
场景一:实时通信性能优化
WebSocket 作为应用核心通信协议,需要监控其连接稳定性和消息传输性能。
实践案例:
- 社交应用使用 WebSocket 实现即时通讯
- 监控发现消息延迟 P95 达 2s,失败率 5%
- 通过协议扩展定位到特定地区的连接问题
- 优化后延迟降至 500ms,失败率降至 0.5%
- 用户消息到达率提升 95%
场景二:微服务性能监控
gRPC 微服务架构下,需要监控服务间调用的性能和错误率。
实践案例:
- 应用采用 gRPC 实现移动端与微服务通信
- 发现某个 gRPC 服务调用失败率达 10%
- 通过详情列表定位到特定方法的超时问题
- 后端团队优化服务后,失败率降至 1%
- 应用整体可用性提升 3%
场景三:自定义协议监控
使用私有协议或特殊网络协议,需要自定义监控方案。
实践案例:
- IoT 应用使用 MQTT 协议通信
- 通过 SDK API 自定义 MQTT 协议监控
- 建立指标体系:连接数、消息量、传输耗时
- 发现设备端连接频繁断开重连问题
- 优化心跳机制后,连接稳定性提升 80%
支持的协议场景
预定义协议
WebSocket
- 应用场景:移动端
- 监控指标:连接耗时、消息耗时、失败率、TPM
- 数据采集:SDK 自动采集,无需额外配置
gRPC
- 应用场景:移动端
- 监控指标:调用耗时、失败率、吞吐量、错误
- 数据采集:SDK 自动采集,无需额外配置
自定义协议
自定义能力
- 自定义协议名称和类型
- 自定义监控指标(metrics)
- 自定义分析维度(tags)
- 自定义详情数据(data)
核心功能
1. 数据看板

协议扩展数据看板提供协议性能的全局视图,支持多协议对比分析。
全局过滤
支持多维度数据过滤,精准定位问题范围:
过滤维度
- 协议扩展名称:具体的协议实例(如:聊天 WebSocket、推送 WebSocket)
- 协议扩展类型:协议类别(WebSocket、gRPC、自定义)
2. 数据卡片
数据卡片展示协议的核心性能指标,提供快速概览。
基础指标
| 指标 | 说明 | 计算方式 |
|---|---|---|
| 访问次数 | 协议调用的总次数 | 统计时间段内的调用总数 |
| TPM | 每分钟访问量 | 访问次数 / 统计分钟数 |
| 平均耗时 | 协议调用的平均响应时间 | 默认展示 P75 分位值 |
| 失败率 | 调用失败的比例 | 失败次数 / 总访问次数 × 100% |
| 影响用户数 | 使用该协议的唯一用户数 | 去重统计 |
失败判定规则
WebSocket
status = -1:连接失败或异常断开- 可通过 SDK API 自定义失败判定条件
gRPC
- gRPC 状态码非 0:调用失败
- 超时未响应:调用失败
自定义协议
- 通过 SDK API 设置失败条件
- 灵活定义符合业务的失败标准
3. 趋势分析
展示协议性能指标随时间的变化趋势,帮助发现性能波动和异常。
维度分析
数据类型分布
- 展示不同协议类型的访问量分布
名称失败率分布
- 展示不同实例的失败率
失败率趋势

展示协议失败率随时间的变化趋势:
分析要点
- 突然上升:可能是服务故障或网络问题
- 持续高位:需要深度排查协议实现
- 周期性波动:可能与业务高峰或网络环境相关
- 逐步上升:可能是性能衰减或用户量增加
告警建议
- 失败率 > 5%:需要关注
- 失败率 > 10%:需要紧急处理
- 失败率环比上升 > 50%:触发告警
耗时趋势

展示协议耗时随时间的变化趋势:
分位值分析(可通过仪表盘自定义,默认使用 P75)
- P50(中位数):50% 用户的体验水平
- P75(默认):75% 用户的体验水平
- P95:关注长尾用户体验
- P99:极端场景性能
优化方向
- 耗时突增:检查网络或服务端问题
- 持续偏高:优化协议实现或网络策略
- 波动较大:优化连接复用和心跳机制
4. 详情列表

详情列表展示所有协议的统计数据,支持深度分析和问题定位。
指标列表
默认指标(SDK 自动采集)
- 名称、数据类型、访问次数、TPM、耗时 P75、可用性
- 活跃设备数、影响用户数
自定义指标(通过 metrics 上传)
- 业务相关指标(如:消息大小、重连次数)
- 性能相关指标(如:序列化耗时、压缩率)
- 质量相关指标(如:消息丢失率、乱序率)
设备维度(可通过仪表盘自定义)
默认维度
- 设备型号、操作系统、App 版本
- 国家、省/州、城市、运营商
- 网络类型(WiFi、4G、5G)
自定义维度(通过 tag 上传)
- 业务维度(如:聊天室 ID、用户等级)
- 技术维度(如:服务器区域、协议版本)
- 环境维度(如:前台/后台、弱网/正常网)
自定义协议配置
配置流程
1. SDK 埋点定义数据
↓ 设置协议名称、指标、维度
2. 指标体系抽取
↓ 配置自定义指标和维度
3. 仪表盘配置
↓ 复制并自定义看板
4. 数据展示
↓ 查看协议监控数据
步骤一:SDK 埋点
Android SDK 示例
// 启动自定义协议监控
NBSAppAgent.startSpan(String name, String operation);
参数说明
name:协议名称(如:MQTT消息、自定义RPC)operation:操作类型(如:send、receive、connect)
iOS SDK 示例
Objective-C
// 启动自定义协议监控
+ (id<NBSSpan>)startSpanWithName:(NSString *)name
operation:(NSString *)operation;
Swift
// 启动自定义协议监控
startSpan(withName: String!, operation: String!)
参数说明
name:协议名称(如:MQTT消息、自定义RPC)operation:操作类型(如:send、receive、connect)
Harmony OS SDK 示例
import tingyun, { SpanStatuses } from '@tingyun/sdk-core'
// 1. 启动协议监控
const span = tingyun.startSpan('span_name', 'span_operation')
// 2. 设置详情数据
span.setData('dataKey', 'dataValue')
// 3. 设置自定义 维度
span.setTag('tagKey', 'tagValue')
// 4. 设置自定义指标
span.setMetric('time', 50, SpanMetricUnits.Millisecond)
// 5. 设置耗时
span.setDuration(100)
// 6. 设置状态
span.setStatus(SpanStatuses.OK)
span.setStatusCode('200')
// 7. 创建子 Span(可选)
const childSpan = span.startChild('child_span_name', 'child_span_operation')
childSpan.finish()
// 8. 结束监控
span.finish()
参数说明
span_name:协议名称span_operation:操作类型setData():设置详情数据setTag():设置自定义维度setMetric():设置自定义指标setDuration():设置耗时(毫秒)setStatus():设置状态(OK/ERROR)setStatusCode():设置状态码
步骤二:指标体系配置
进入指标体系
- 导航至:平台管理 → 指标体系
- 选择数据源:Mobile 协议扩展
- 点击【新建指标】
配置自定义指标
| 配置项 | 说明 | 示例 |
|---|---|---|
| 指标名称 | 指标的显示名称 | 消息大小 |
| 指标字段 | SDK 中 metric 的 key | message_size |
| 聚合方式 | sum/avg/max/min/count | avg |
| 单位 | 指标的单位 | KB |
配置自定义维度
| 配置项 | 说明 | 示例 |
|---|---|---|
| 维度名称 | 维度的显示名称 | 消息主题 |
| 维度字段 | SDK 中 tag 的 key | topic |
| 维度类型 | 字符串/数值 | 字符串 |
步骤三:仪表盘配置
复制默认看板
- 导航至:仪表盘
- 找到【Mobile 协议扩展看板】
- 点击【复制】按钮
- 重命名为自定义协议看板(如:Socket 监控看板)
更新图表配置
- 进入编辑模式
- 选择要修改的图表
- 更新图表配置:
- 指标:选择自定义指标
- 维度:选择自定义维度
- 过滤:添加协议类型过滤
图表配置示例
图表:Socket 消息大小趋势
- 指标:消息大小(avg)
- 维度:时间
- 过滤:协议类型 = Socket
- 图表类型:折线图
图表:消息主题分布
- 指标:访问次数
- 维度:消息主题
- 过滤:协议类型 = MQSocketTT
- 图表类型:饼图
性能优化指南
WebSocket 性能优化
问题一:连接耗时过长
现象:WebSocket 连接建立耗时 > 2s
常见原因
- DNS 解析慢
- TCP 握手慢
- SSL/TLS 握手慢
- 服务端响应慢
优化建议
-
DNS 优化:
- 使用 HTTPDNS
- 本地缓存 DNS 结果
- 预解析域名
-
连接优化:
- 连接复用和保活
- 减少握手次数
- 优化心跳策略
-
协议优化:
- 优先使用 WSS(加密)
- 启用压缩(permessage-deflate)
问题二:消息延迟高
现象:消息传输耗时 P95 > 1s
常见原因
- 消息体过大
- 网络拥塞
- 服务端处理慢
- 序列化/反序列化耗时
优化建议
-
消息优化:
- 压缩消息内容
- 使用二进制协议(如 Protocol Buffers)
- 分片传输大消息
-
网络优化:
- 选择最优服 务器节点
- 弱网下降级策略
- 消息优先级队列
-
代码优化:
- 异步处理消息
- 优化序列化性能
- 批量发送消息
问题三:连接频繁断开
现象:WebSocket 失败率 > 5%
常见原因
- 网络不稳定
- 心跳机制不合理
- 服务端主动断开
- 应用进入后台
优化建议
-
心跳机制:
- 合理设置心跳间隔(建议 30-60s)
- 心跳超时后自动重连
- 区分前台/后台心跳策略
-
重连策略:
- 指数退避重连
- 限制重连次数
- 断网时暂停重连
-
连接保活:
- 应用切后台保持连接
- 监听网络变化主动重连
- 服务端优化连接超时时间
gRPC 性能优化
问题一:调用耗时高
优化方向
- 启用 HTTP/2 多路复用
- 使用连接池
- 启用 gRPC 压缩
- 优化 Protobuf 序列化
问题二:调用失败率高
优化方向
- 配置合理的超时时间
- 实现重试机制
- 熔断降级策略
- 监控服务端健康状态
自定义协议优化
通用优化原则
-
性能优先:
- 选择高效的序列化方式
- 减少不必要的数据传输
- 优化协议握手流程
-
可靠性优先:
- 实现消息确认机制
- 设计重传策略
- 处理网络异常
-
可扩展性:
- 设计版本兼容机制
- 预留扩展字段
- 支持协议协商
最佳实践
1. 问题排查流程
1. 发现问题
↓ 失败率/耗时异常
2. 确认范围
↓ 特定协议/地域/设备
3. 分析趋势
↓ 何时开始/是否持续
4. 查看详情
↓ 错误信息/调用堆栈
5. 定位根因
↓ 客户端/网络/服务端
6. 制定方案
↓ 优化/降级/回滚
7. 验证效果
↓ 对比优化前后数据
2. 数据分析建议
多维度对比
- 不同协议性能对比
- 不同地域表现对比
- 不同网络环境对比
关联分析
- 协议性能与业务指标关联
- 协议性能与设备性能关联
- 协议性能与版本关联
趋势预测
- 基于历史数据预测未来趋势
- 提前发现性能衰减
- 规划容量和优化
常见问题 FAQ
Q1:自定义协议如何设计指标体系?
A:遵循以下原则:
核心指标(必选)
-
性能指标:
- 调用耗时(P50/P75/P95/P99)
- TPM(每分钟调用量)
- 失败率
-
业务指标:
- 与业务直接相关的指标
- 如:消息大小、队列长度、并发数
辅助指标(可选)
-
质量指标:
- 重试次数
- 消息丢失率
- 乱序率
-
资源指标:
- 流量消耗
- CPU 占用
- 内存占用
指标设计示例
MQTT 协议指标体系:
核心指标:
- 连接耗时、消息耗时、失败率、TPM
业务指标:
- 消息大小、主题数量、订阅数
质量指标:
- 重连次数、消息丢失率、QoS 分布
维度:
- 主题、QoS 等级、消息类型