2025-08-20 【架构】监控上报采样率思考

背景

由于腾讯云 RUM 上报免费额度为 50w 条/日,为保障监控稳定运行与成本考量,特此对上报率进行有效规划及优化。

对于日活(UV)3000+、日访问量(PV)1.5 万+的小程序来说,应属于中小型应用,但考虑用户量周增长 2k 左右,为后期用户量爆发打好提前量。在当前体量下,设置采样率的核心逻辑不是为了节省昂贵的服务器成本(因为总量并不大),而是为了在“数据代表性”与“上报干扰”之间取得平衡

采样率优化逻辑

1. 核心采样原则:分层采样

不要全站统一设置一个采样率,而应根据数据的重要性进行分层。

监控维度 推荐采样率 采样逻辑说明
JS 异常 / 渲染崩溃 100% 错误必须全量捕获。 日均 1.5w PV 下,即使报错率在 1%,也就 150 条数据,后端完全能承受。
接口请求 (API) 20% - 50% 接口报错应 100% 上报,但成功的请求建议采样。日均 1.5w PV 若每个页面 3 个接口,全量上报会有 4.5w 条记录,采样 20% 即可分析性能趋势。
性能指标 (Lighthouse/FMP) 10% - 20% 性能数据具有统计学意义。3000 UV 下,采样 10% 就能获得约 300 个样本,足以反映各机型、网络环境下的平均表现。
业务埋点 (点击/转化) 100% 业务逻辑相关的埋点(如支付、下单)通常不建议采样,否则会导致财务和运营报表不准。

2. 详细配置建议:当前数据量为例

计算预估上报量:

  • PV 采样 (10%): 条/日
  • API 采样 (20%): 假设每 PV 产生 3 个 API 条/日
  • 异常全量: 假设报错率 0.5% 条/日
  • 总计: 日均约 1.1 万条 上报数据。

结论:对于目前的监控服务(如 Sentry, 腾讯云 RUM, 阿里云 ARMS),日均 1.1 万条数据通常在免费额度最低计费档位内。因此,你可以大胆提高采样率以获得更精准的画像。


3. 技术实现建议:如何动态控制?

为了灵活调整,不要在代码里写死采样率,而是通过后台配置下发。

方案一:基于用户维度的随机采样

确保同一个用户在一次会话中采样行为一致,避免数据碎片化。

1
2
3
4
5
6
7
8
9
// 基于用户 ID 的简易采样算法
const USER_ID = getStorageSync("uid");
const SAMPLING_RATE = 0.2; // 20%

function shouldReport(rate) {
// 使用哈希或简单的取模
const hash = parseInt(USER_ID.slice(-2), 16) || Math.random() * 100;
return hash < rate * 100;
}

方案二:错误驱动的“全量上报”

对于性能监控,平时只报 10%,但如果检测到当前环境发生错误,可以临时开启该用户本次会话的全量链路追踪。


4. 特殊情况:小程序环境的限制

  • 并发限制:小程序 wx.request 有并发限制(通常为 10 个)。高频的监控上报可能会占用请求通道。
  • 解决方法
  1. 内存缓冲:将上报数据存入数组,达到 5 条或页面切换时再合并发送一次请求。
  2. **使用 wx.reportMonitor**:如果是微信自家的性能监控,优先使用官方 API,不占请求数。

对于 3000 日活的小程序:

  1. 错误监控:请保持 100%,因为每个错误对你都很珍贵。
  2. 性能监控:设置 20% 左右,足以支撑你做性能优化决策。
  3. 策略:优先保证高价值用户(如已登录、有支付记录的用户)的采样权重。

RUM 配置优化实践

针对 25 万用户量 / 3000 UV / 1.5 万 PV 的体量,建议采用 “客户端基础过滤 + 后端动态限额” 的双重配置策略。

在腾讯云 RUM (Real User Monitoring) 中配置采样率,主要通过初始化 SDK 时的参数以及腾讯云后台的“限额管理”来实现。


1. 客户端 SDK 初始化配置

在小程序 app.js 中引入 RUM SDK 时,通过 sample 属性进行细粒度控制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const Aegis = require("aegis-mp-sdk");

const aegis = new Aegis({
id: "项目ID",
reportApiSpeed: true, // 接口测速
reportAssetSpeed: true, // 静态资源测速

// 【核心配置】采样率设置
// 按照你的体量,建议设置如下:
sample: {
api: 0.2, // 接口请求采样 20%
asset: 0.1, // 静态资源采样 10%
pvs: 1.0, // PV 全量统计(为了准确计算 UV/PV)
performance: 0.2, // 性能指标采样 20%
un_hy_performance: 0.2, // 异常性能数据采样
},

// 【异常处理】错误信息建议 100% 上报,不在此处设置采样
// Aegis 默认会对 JS Error 进行全量捕获
});

2. 腾讯云控制台的“黑科技”配置

除了代码层的设置,腾讯云 RUM 后台提供了动态调整能力,这对于应对突发流量非常有效。

A. 动态采样与限额

进入 腾讯云控制台 -> 应用性能观测 -> 选定应用 -> 设置 -> 限额管理

  • 上报限额:建议设置为每天 20,000 条 左右(略高于你的预估量)。这可以防止代码 Bug 导致死循环上报,产生额外费用。
  • 白名单功能:在开发调试阶段,可以将开发者的 OpenID 放入白名单。无论采样率如何设置,白名单用户的日志都会 100% 上报,方便排查问题。

B. API 聚合与过滤

API 详情设置 中:

  • 将一些高频但无意义的接口(如日志心跳、埋点上报接口本身)加入 “忽略列表”,避免占用采样名额。

3. 针对“上报干扰”的进阶优化

由于小程序有并发连接限制,RUM 上报如果太频繁会挤占业务接口。

  • 合并上报 (Batch Report)
    腾讯云 Aegis 支持合并上报。在初始化时增加:
1
2
3
4
5
const aegis = new Aegis({
// ...其他配置
delay: 3000, // 延迟 3s 上报,会将 3s 内产生的多条日志合并为一个请求
maxLength: 5, // 达到 5 条日志时立即上报一次
});

4. 验证采样是否生效

配置完成后,你可以通过以下方式验证:

  1. 控制台预览:打开小程序真机调试,观察网络面板(Network)中 aegis.gtimg.com 的请求频率。
  2. RUM 概览页:对比“PV 统计”与“上报日志总数”。如果日志总数远低于 PV 数,说明采样成功。

2025-08-20 【架构】监控上报采样率思考
https://zhangyingxuan.github.io/2025-08-20 【架构】监控上报采样率思考/
作者
blowsysun
许可协议