Skip to content

Repository files navigation

FlashCat 小程序 RUM SDK

FlashCat 小程序 RUM(Real User Monitoring)SDK,用于监控小程序的性能、错误和用户行为。

特性

  • 🚀 自动追踪:自动监控页面访问、用户交互、网络请求、错误和性能
  • 📊 丰富指标:采集完整的 RUM 数据,包括页面加载时间、请求耗时等
  • 🎯 灵活配置:支持采样率、功能开关、数据过滤等配置
  • 💡 易于使用:类似 DataFlux 的单例导出方式,无需手动关联事件
  • 📦 TypeScript:完整的类型定义支持

npm packages

本仓库包含以下小程序 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 事件

  1. 重写全局 Page 函数 - 自动拦截所有页面生命周期(onLoad、onShow、onHide 等)
  2. 拦截事件处理函数 - 自动捕获用户交互(tap、longpress 等)
  3. 封装平台 API - 自动监听网络请求(wx.request)
  4. 监听 App 生命周期 - 自动捕获应用前后台切换、错误等

所有这些都在 flashcatRum.init() 时自动完成,开发者无需编写额外代码。

Action 命名

自动采集的 action(tap / longpress / longtap)按以下优先级确定名称:

  1. 触发元素的 data-name(其次 data-contentdata-type
  2. mark:name(微信 mark 机制,事件冒泡路径上的标记会聚合)
  3. 元素 id
  4. 事件委托场景下 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;不兼容或不完整响应不会覆盖当前有效配置。

远程配置沿用现有 siteproxy。因此直连模式无需额外添加小程序合法域名;代理模式需确保现有代理同时转发 /api/v2/rum/config,并建议透传 ETag 以使用 304 Not Modified。SDK 不做定时轮询,只在初始化和新 Session 创建时拉取,失败时进行有限重试。

读取 custom

服务端响应的顶层 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。

API 文档

初始化

  • 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.tgz
  • packages/miniprogram-platform/flashcatcloud-miniprogram-platform.tgz
  • packages/miniprogram-rum/flashcatcloud-miniprogram-rum.tgz

License

MIT

About

微信小程序sdk

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages