FlashCat 小程序 RUM(Real User Monitoring)SDK,用于监控小程序的性能、错误和用户行为。
- 🚀 自动追踪:自动监控页面访问、用户交互、网络请求、错误和性能
- 📊 丰富指标:采集完整的 RUM 数据,包括页面加载时间、请求耗时等
- 🎯 灵活配置:支持采样率、功能开关、数据过滤等配置
- 💡 易于使用:类似 DataFlux 的单例导出方式,无需手动关联事件
- 📦 TypeScript:完整的类型定义支持
本仓库包含以下小程序 SDK 包:
| 包名 | npm | 说明 |
|---|---|---|
| core | @flashcatcloud/miniprogram-core |
SDK 通用核心能力,包括配置、会话、传输和批量上报 |
| miniprogram-platform | @flashcatcloud/miniprogram-platform |
小程序平台适配层,包括网络请求、生命周期和平台 API 封装 |
| miniprogram-rum | @flashcatcloud/miniprogram-rum |
小程序 RUM 入口包,业务方通常只需要安装这个包 |
npm install @flashcatcloud/miniprogram-rum安装后在微信开发者工具中点击 工具 → 构建 npm。
// app.js
const { flashcatRum } = require('@flashcatcloud/miniprogram-rum')
// 在 App() 之前初始化
flashcatRum.init({
clientToken: 'your-client-token',
applicationId: 'your-app-id',
// 方式一:使用默认 FlashCat 站点(推荐)
// 默认上报到:https://browser.flashcat.cloud/api/v2/rum
// 方式二:自定义站点域名
// site: 'custom.flashcat.cloud', // 上报到:https://custom.flashcat.cloud/api/v2/rum
// 方式三:通过代理转发数据
// proxy: 'https://proxy.example.com/path', // 拼接为:{proxy}?ddforward={encodedPath}
service: 'my-miniprogram',
env: 'production',
version: '1.0.0',
// 可选:启用 RUM 远程配置
remoteConfigurationEnabled: true,
})
App({
onLaunch() {
console.log('App launched')
},
})就这么简单!SDK 会自动追踪:
- ✅ 页面访问和生命周期
- ✅ 用户交互(点击、长按等)
- ✅ 网络请求(wx.request 等)
- ✅ 错误和异常
- ✅ 性能指标
除了自动追踪,还可以手动上报业务事件:
const { flashcatRum } = require('@flashcatcloud/miniprogram-rum')
// 上报自定义事件
flashcatRum.addCustomEvent('商品购买', {
productId: '12345',
price: 99.99,
})
// 上报用户操作
flashcatRum.addAction('点击分享按钮', 'share')
// 上报错误
flashcatRum.addError('加载失败', 'custom')
// 上报性能指标
flashcatRum.addTiming('数据加载完成', 1500)
// 设置用户信息
flashcatRum.setUser({
id: 'user-123',
name: 'Zhang San',
})
// 设置全局上下文
flashcatRum.setGlobalContext({
platform: 'wechat',
channel: 'official',
})SDK 通过以下机制实现自动追踪,无需手动关联 APP 事件:
- 重写全局
Page函数 - 自动拦截所有页面生命周期(onLoad、onShow、onHide 等) - 拦截事件处理函数 - 自动捕获用户交互(tap、longpress 等)
- 封装平台 API - 自动监听网络请求(wx.request)
- 监听 App 生命周期 - 自动捕获应用前后台切换、错误等
所有这些都在 flashcatRum.init() 时自动完成,开发者无需编写额外代码。
自动采集的 action(tap / longpress / longtap)按以下优先级确定名称:
- 触发元素的
data-name(其次data-content、data-type) mark:name(微信 mark 机制,事件冒泡路径上的标记会聚合)- 元素
id - 事件委托场景下
event.target的 dataset / id
都取不到时 action 名称显示为 unknown。小程序事件对象拿不到元素文本,建议给关键交互元素加 data-name:
<button bindtap="handleBuy" data-name="购买按钮">购买</button>业务关键动作也可以直接用 flashcatRum.addAction('purchase_submitted') 手动上报。
| 配置项 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
clientToken |
string | ✅ | - | 客户端 Token |
applicationId |
string | ✅ | - | 应用 ID |
site |
string | ❌ | browser.flashcat.cloud |
FlashCat 站点域名,自动拼接为 https://{site}/api/v2/rum |
proxy |
string / function | ❌ | - | 代理地址或 URL 构建函数(优先级高于 site) |
service |
string | ❌ | - | 服务名称 |
env |
string | ❌ | - | 环境(dev/test/prod) |
version |
string | ❌ | - | 应用版本号 |
sessionSampleRate |
number | ❌ | 100 | 会话采样率(0-100) |
remoteConfigurationEnabled |
boolean | ❌ | false | 是否启用远程配置(会话采样率与 custom) |
beforeSampling |
function | ❌ | - | 创建新 Session 前同步调整采样率 |
flushInterval |
number | ❌ | 15000 | 上报间隔(毫秒) |
trackPages |
boolean | ❌ | true | 是否追踪页面 |
trackActions |
boolean | ❌ | true | 是否追踪用户交互 |
trackRequests |
boolean | ❌ | true | 是否追踪网络请求 |
trackErrors |
boolean | ❌ | true | 是否追踪错误 |
trackPerformance |
boolean | ❌ | true | 是否追踪性能 |
debug |
boolean | ❌ | false | 是否开启调试模式 |
beforeSend |
function | ❌ | - | 数据过滤钩子 |
设置 remoteConfigurationEnabled: true 后,SDK 会在初始化时同步读取上次缓存的有效配置,并在初始化完成后及每次新 Session 创建时异步请求 /api/v2/rum/config。同一时刻只保留一条包含重试在内的请求链;配置请求不阻塞初始化和事件采集,也不会被记录为 RUM resource 或 error 事件。
远程配置只消费两个字段:rum.sessionSampleRate 和顶层 custom;追踪采样率、回放采样率和隐私等级等字段会被忽略。
会话采样只在创建 Session 时执行一次:
- 冷启动已有有效缓存时,首个新 Session 直接使用缓存中的采样率。
- 没有缓存时,首个 Session 使用初始化的
sessionSampleRate;随后拉取到的正数采样率变更通常只影响之后创建的 Session。 - 采样率在
0和正数之间双向切换时立即结束当前普通 Session,下一次事件使用新配置创建 Session;0调到正数后按新比例重新抽签,并不保证当前用户一定中签。正数之间调整不改变当前 Session。 - 已生效的强制 Session 是上述即时切换的唯一例外。其他情况下也可调用
flashcatRum.stopSession(),让下一次事件创建的新 Session 使用最新配置。 - 配置接口不可用、响应非法或缓存不可读时,SDK 安全回退到初始化采样率,不影响正常采集。
- 200 响应必须包含
schema_version: 1、非负整数version和布尔值enabled;不兼容或不完整响应不会覆盖当前有效配置。
远程配置沿用现有 site 或 proxy。因此直连模式无需额外添加小程序合法域名;代理模式需确保现有代理同时转发 /api/v2/rum/config,并建议透传 ETag 以使用 304 Not Modified。SDK 不做定时轮询,只在初始化和新 Session 创建时拉取,失败时进行有限重试。
服务端响应的顶层 custom 供宿主自行决策,不参与 RUM 事件字段:
const custom = flashcatRum.getRemoteConfig()
// 未启用远程配置、尚未拉取成功且无缓存、或服务端未下发 custom 时返回 undefined
if (custom?.featureFlags?.newCart) {
// ...
}custom 只接受对象;非对象会被安全忽略,且不影响会话采样。每次调用都会返回一份副本,修改返回值不会影响 SDK 内部状态。为避免旧缓存固化历史初始化采样率,本版本会忽略并清理 v1 远程配置缓存。
custom 的生命周期与采样快照一致:200 响应中缺少 custom 会清除已有值,304 Not Modified 保留缓存值,服务端下发 enabled: false 会清除 custom 和采样覆盖值,但保留配置版本与 ETag,便于后续 304 和生效面统计。
beforeSampling 在创建新 Session、执行抽签之前同步调用,可以基于远程 custom 覆盖本次采样率:
flashcatRum.init({
// ...
remoteConfigurationEnabled: true,
beforeSampling: ({ sessionSampleRate, custom }) => {
// 返回 0-100 的数字覆盖采样率;返回 undefined 表示不修改
if (custom?.vipUsers?.includes(getUserId())) {
return 100
}
return sessionSampleRate
},
})sessionSampleRate是本次将要使用的采样率:有远程值时为远程值,否则为初始化值。custom是远程custom的副本,没有时为null。- 回调抛错、返回非有限数字或超出
0-100范围时,回退到传入的sessionSampleRate。
排障场景下可以用 setForcedSession() 让下一个 Session 必定被采集,无需修改采样率:
flashcatRum.setForcedSession()
flashcatRum.stopSession() // 结束当前 Session,之后创建的新 Session 会被强制采集- 标记只作用于下一个新建的 Session,当前 Session 的抽签结果永不翻转。因此 support flow 需要在
setForcedSession()之后结束当前 Session,才会开始强制采集。 - 标记在 Session 创建后立即消耗,之后恢复常规抽样。
- 优先级高于
beforeSampling:被标记的 Session 即使采样率为 0 也会被采集。 - 初始化前调用会被保留到首个已创建 Session 之后的下一次 Session,不会追溯改变首个 Session。
flashcatRum.init(config)- 初始化 SDK
flashcatRum.startPage(name?)- 手动上报页面访问flashcatRum.addAction(name, type?)- 手动上报用户操作flashcatRum.addError(message, source?, stack?)- 手动上报错误flashcatRum.addTiming(name, value?)- 手动上报性能指标flashcatRum.addCustomEvent(name, context?)- 上报自定义事件
flashcatRum.setGlobalContext(context)- 设置全局上下文flashcatRum.setUser(context)- 设置用户信息
flashcatRum.stopSession()- 结束当前会话flashcatRum.setForcedSession()- 标记下一个新建会话必定被采集flashcatRum.getInitConfiguration()- 获取初始化配置
flashcatRum.getRemoteConfig()- 获取远程配置中的custom,不可用时返回undefined
如果接入后没有数据上报,开启调试模式:
flashcatRum.init({
// ...
debug: true, // 开启调试模式,会在控制台输出详细日志
flushInterval: 5000, // 可选:缩短上报间隔方便测试
})查看控制台中 [FlashCat RUM] 开头的日志来诊断问题。
yarn install
yarn build
yarn test如需在本地小程序 demo 中验证未发布版本,可以先构建并打包:
yarn pack:all打包产物会生成在各 package 目录中:
packages/core/flashcatcloud-miniprogram-core.tgzpackages/miniprogram-platform/flashcatcloud-miniprogram-platform.tgzpackages/miniprogram-rum/flashcatcloud-miniprogram-rum.tgz
MIT