录制 ID
录制 ID 将一条有序的 rrweb 事件流及其元数据归为一组。大多数浏览器集成应让浏览器客户端管理它。
浏览器客户端如何选择录制 ID?
浏览器客户端会自动创建一个 UUID,并将其存储在 sessionStorage 的 rrweb-browser-client-recording-id 下。如果 ID 不存在,调用 start() 或 getRecordingId() 会创建它。如果浏览器策略使 sessionStorage 不可用,客户端将无法开始录制。
由于 sessionStorage 的作用域限定在标签页和源:
- 独立的标签页通常会获得独立的录制 ID,从而避免其事件流与另一个标签页交错。
- 标签页内的同源页面导航会保留该 ID,因此连续的页面浏览可以属于同一个录制。
stop(false)停止捕获,但保留 ID,供同一页面上稍后的start()使用。stop(true)清除存储的 ID;下一次start()会创建一个新录制。
存在一个 opener 例外:当页面打开一个带有 opener 的同源标签页时,浏览器可能将新标签页的 sessionStorage 初始化为 opener 存储的副本。之后两个存储会各自独立变化,但被复制的 rrweb-browser-client-recording-id 可能让两个标签页以相同的 ID 开始捕获。
请用 rel="noopener" 打开可录制的链接,或在 window.open() 中使用 noopener 特性。如果你的应用必须保留 opener,请在浏览器客户端启动前,在新标签页中重置被复制的 ID:
sessionStorage.removeItem('rrweb-browser-client-recording-id');仅在有意为之的新标签页或会话边界处重置。在捕获开始后移除 ID 会意外地割裂生命周期。
当应用代码需要将诊断信息与当前录制关联时,使用 getRecordingId()。不要把一个标签页的 ID 复制到另一个标签页。
要跨标签页、设备或登录会话关联录制,请保持它们的录制 ID 互不相同,并通过应用元数据附加一个共享的不透明标识符。
手动采集
任何你自行生成的 UUID,只要在同一有序事件流的每个事件和元数据请求中保持一致使用即可。
如果你保留自定义的录制器或传输方式,则必须自行创建并保存该 ID。
const storageKey = 'my-app-rrweb-recording-id';
let recordingId = sessionStorage.getItem(storageKey);
if (!recordingId) {
recordingId = crypto.randomUUID();
sessionStorage.setItem(storageKey, recordingId);
}请在产品定义的录制边界(例如明确退出登录、撤回同意或新的客服会话)生成新的 ID。绝不要为不相关的用户或并行的事件流复用 ID。经过认证的手动摄取和回滚指导参见从 rrweb 迁移。