B 端 APM 平台的目标不是“展示所有数据”,而是让研发团队在最短路径内完成:发现问题、判断影响、定位原因、分配负责人、验证修复、防止再次劣化


一、信息架构

flowchart TB
    Home["质量概览"] --> Stability["稳定性"]
    Home --> Performance["性能体验"]
    Home --> Network["网络"]
    Home --> Session["用户会话"]
    Home --> Release["版本发布"]
    Home --> Alert["告警中心"]
    Home --> Config["SDK 配置"]

    Stability --> Crash["Crash"]
    Stability --> Watchdog["Watchdog"]
    Stability --> FOOM["FOOM"]

    Performance --> Launch["启动"]
    Performance --> View["页面"]
    Performance --> Freeze["卡顿/掉帧"]
    Performance --> Resource["资源"]

    Release --> Gray["灰度对比"]
    Release --> Gate["发布门禁"]

    Alert --> Rule["规则"]
    Alert --> Notify["通知"]
    Alert --> Silence["静默"]

一级导航不要按技术实现命名,比如 Kafka、ClickHouse、符号化任务;应该按用户任务命名,比如稳定性、性能体验、网络、发布、告警。


二、首页质量概览

首页回答三个问题:

  1. 当前版本稳不稳?
  2. 过去一段时间有没有变差?
  3. 最应该处理的 Top 问题是什么?

核心卡片:

卡片展示
稳定性Crash-free users、Crash-free sessions、异常退出率
启动冷启动 P90/P99、首屏 P90、TTI
流畅性卡顿率、Freeze 率、滚动掉帧
网络错误率、慢请求率、TTFB P90
页面体验页面秒开率、白屏率、慢页面 TopN
发布风险新版本 vs 老版本劣化项
Top Issue影响用户数、趋势、Owner、状态

所有指标都必须能按这些维度筛选:

app_id
env
release
build
os_version
device_model
device_tier
network_type
region
channel
view_name
business_module

首页设计原则:

  • 用 P90/P99 看长尾,不只看平均值。
  • 每个指标都带同比或环比。
  • 默认展示当前主版本和灰度版本。
  • 异常项必须能一键下钻。
  • 不可行动的内部平台指标不要放首页。

三、稳定性详情

3.1 Crash Issue 页

Crash Issue 页面需要展示:

标题:EXC_BAD_ACCESS in ProductViewController.dealloc
状态:Open / Assigned / Fixed / Verifying / Closed
影响:用户数、次数、Session 数、Crash-free 影响
趋势:首次出现、最近出现、版本分布
归因:堆栈、线程、异常类型、寄存器、二进制镜像
现场:Breadcrumb、页面路径、网络请求、用户操作
维度:机型、OS、地区、网络、渠道
协作:Owner、工单、备注、修复版本

详情页布局建议:

顶部:Issue 摘要 + 状态 + Owner + 操作按钮
左侧:代表性堆栈 + 线程列表
右侧:影响面 + 维度分布 + 趋势图
底部:样本事件 + Session 时间线 + 相似问题

堆栈展示要求:

  • 默认突出 in-app frame。
  • 系统栈折叠。
  • 支持 Swift demangle。
  • 支持源码链接或 Git commit 链接。
  • 支持同类样本堆栈差异对比。

3.2 Watchdog / 卡死页

Watchdog 不等于普通卡顿,页面要展示多次采样结果:

信息价值
主线程连续采样判断真正阻塞位置
线程状态是否锁等待、IO、同步派发
CPU 占用区分死循环和等待
最近页面和操作找触发场景
同时段网络和磁盘找外部等待

如果只有一次堆栈,平台要明确标记可信度,避免误导研发。

3.3 FOOM 页

FOOM 没有崩溃堆栈,必须围绕证据链设计:

上次前台状态
上次内存水位
页面路径
大对象 TopN
图片/缓存/播放器/数据库等模块内存
MetricKit memory diagnostics
机型内存档位
同版本趋势

FOOM 页面应该默认按机型内存档位切分,否则高端机和低端机会互相稀释。


四、性能体验详情

4.1 启动分析

启动页按阶段拆:

process start -> main
main -> didFinishLaunching
didFinishLaunching -> first frame
first frame -> first content
first content -> interactive

展示:

  • P50/P90/P99。
  • 冷启动、温启动、热启动、预热启动分开。
  • 按版本、机型、OS、渠道切分。
  • 慢启动样本 Session。
  • 阶段耗时瀑布图。

4.2 页面性能

页面详情要回答:

哪个页面慢?
慢在哪个阶段?
是否白屏?
是否和接口、图片、布局、主线程卡顿相关?
影响多少用户?

典型指标:

指标含义
view_load_ms页面生命周期加载耗时
first_contentful_ms首个关键内容出现
interactive_ms可交互
blank_rate白屏率
slow_view_rate慢页面率
long_task_count页面内主线程长任务数

4.3 网络分析

网络页要从用户视角展示真实耗时,而不是只看服务端接口耗时。

DNS
TCP
TLS
request
TTFB
download
total

必备下钻:

  • host / path template。
  • HTTP status。
  • URLSession error。
  • 网络类型。
  • 地区和运营商。
  • trace_id 关联后端。
  • 页面和 Action 来源。

五、用户会话

Session 页面是 RUM 的核心呈现。

时间线示例:

10:01:02  Session Start  cold_launch
10:01:03  View Home appear
10:01:04  Resource GET /home 340ms 200
10:01:08  Action tap_product
10:01:09  View ProductDetail appear
10:01:10  Resource GET /product/{id} 1.2s 200
10:01:12  LongTask main 680ms
10:01:15  Action tap_buy
10:01:16  Resource POST /order 3.2s 500
10:01:17  Error EXC_BAD_ACCESS

Session 页要支持:

能力说明
时间线页面、操作、网络、错误、卡顿按时间排序
过滤只看 error、resource、long task
上下文设备、系统、版本、网络、地区
关联跳转 Issue、接口详情、页面详情
隐私用户身份匿名化,敏感字段不可见

不要做屏幕录像回放,除非合规、授权和脱敏能力非常成熟。多数 APM 场景下,结构化 Session 时间线已经足够。


六、告警中心

告警设计目标是“少而准,可行动”。

规则类型:

类型示例
阈值Crash 率 > 0.2%
环比新版本启动 P90 劣化 15%
变点10 分钟内网络错误率突增
SLOCrash-free users < 99.9%
灰度灰度组指标显著差于对照组
Top Issue单 Issue 影响用户数进入 TopN

告警内容必须包含:

发生了什么
影响多少用户
从什么时候开始
影响哪些版本/机型/地区
疑似原因或 Top 维度
Owner 是谁
下一步入口链接

告警收敛:

  • 同 Issue 合并。
  • 同版本同规则合并。
  • 静默窗口。
  • 恢复通知。
  • 升级策略。
  • 误报反馈。

不可行动的指标只进报表,不进告警。


七、发布防劣化

发布页围绕“新版本是否可以继续放量”设计。

flowchart LR
    A["灰度开始"] --> B["采集新旧版本指标"]
    B --> C["同维度对照"]
    C --> D{"是否劣化"}
    D -->|否| E["继续放量"]
    D -->|是| F["暂停放量"]
    F --> G["通知 Release Owner"]
    G --> H["定位 Top Issue / Top 指标"]

对照要控制变量:

变量说明
时间窗口新旧版本同一时间段
机型同设备档位
OS同系统版本
网络同网络类型
地区同地域
渠道同发布渠道

门禁指标:

Crash-free users
FOOM rate
Watchdog rate
Launch P90
View slow rate
Network error rate
Key business path success rate

八、SDK 配置后台

B 端必须能反控 C 端 SDK。

配置项:

配置示例
插件开关crash、network、fps、memory_graph
采样率按 App、版本、设备、地区配置
阈值卡顿阈值、慢请求阈值、慢页面阈值
黑白名单URL、页面、用户 hash、设备
隐私策略URL query、header、body、PII
熔断上报失败率、SDK CPU、队列大小

配置发布流程:

编辑 -> 校验 -> 灰度 -> 观察 SDK health -> 全量 -> 可回滚

配置后台必须有审计日志。APM SDK 配置改错,可能造成全量数据丢失或端侧性能问题。


九、权限与合规

权限模型:

权限能力
Viewer查看聚合大盘
Developer查看自己模块 Issue 和脱敏样本
Maintainer修改 Issue 状态、Owner、告警规则
Release Manager发布门禁、灰度规则
AdminSDK 配置、权限、数据保留策略

合规要求:

  • 默认脱敏。
  • 用户 ID hash 化。
  • 敏感字段不可搜索。
  • 样本事件访问留审计。
  • 大附件下载需要权限。
  • 数据保留期限按地区和业务配置。

十、B 端性能

APM 平台自身也是高频工具,查询体验要好。

设计建议:

  • 首页只查预聚合表。
  • 明细查询必须限制时间范围。
  • 大查询异步化。
  • 维度筛选使用字典表和缓存。
  • Session 时间线按需加载。
  • 堆栈和大附件懒加载。
  • 常用视图保存为 Dashboard。

常见反模式:

反模式后果
首页实时扫明细表页面慢、数据库压力大
所有维度都支持任意组合查询不可控
Issue 详情加载全部样本页面卡死
告警规则直接跑 SQL规则延迟和成本不可控

十一、总结

B 端 APM 平台的成熟度不看图表数量,而看闭环能力:

能发现
能下钻
能归因
能分发
能验证
能拦截
能审计

如果一个平台只能看趋势图,它只是监控看板;如果它能让问题自动进入研发流程,并在发布阶段阻止劣化进入全量,它才是 APM 治理平台。