会话录制问题

各种阻止回放被捕获或正确显示的问题。

会话录制问题

录制会在会话结束后的几分钟(约 4 分钟)内显示在仪表板中。当用户关闭标签页或浏览器、断开连接(超过 2 分钟)或超过 2 小时(此时将开始一个新会话)时,会话被视为已结束。每个标签页都会生成一个新的录制,而重新加载现有标签页不会触发新的录制。

本节旨在帮助你排查会话回放中的常见问题。

在开始调试会话录制之前,请确保你正在捕获所有流量。点击 Sessions 部分中的 Manage 按钮并启用 Capture All

另一个常见错误是启动了两次 tracker,这会导致会话无法被录制。这种情况通常发生在开发者从基于脚本的设置迁移到使用 npm 包时,因此请确保你只使用其中一种方式。

如果你不确定设置是否正确,请打开浏览器的检查器并查看 Network 标签,检查是否有发往你的 IP/域名(如果你使用的是 OpenReplay Cloud,则为 *.openreplay.com)的 XHR 请求(查找 “ingest”)。

另一种方法是更新 tracker 的构造函数,并在启动时记录一条消息。

const tracker = new OpenReplay({
	projectKey: PROJECT_KEY,
	onStart: ({ sessionID }) => console.log("OpenReplay tracker started with session: ", sessionID),
});

OpenReplay 需要公共访问权限来复制你应用的部分资源(CSS、字体和图标),以便正确渲染录制。你的站点还必须使用 SSL/HTTPS,否则 tracker 将无法启动。由于这些原因,除非你应用此变通方法,否则在 localhost 中将不会捕获会话。

出于安全原因,tracker 仅在使用 SSL(HTTPS)的 Web 应用上运行。如果你的站点使用 HTTP,tracker 将不会启动。

如果你看到类似下面的错误,则说明 OpenReplay 因缺少内容安全策略而无法启动。请参阅此处了解需要添加的策略。

CSP Issue

录制脚本可能会被浏览器扩展(如广告拦截器)屏蔽。使用浏览器的检查器检查请求是否失败。如果失败,请为安装了 OpenReplay 后端的域名(如果你使用的是云端服务,则为 openreplay.com)添加例外。

当 OpenReplay 在不受支持的浏览器中运行时,会抛出异常。请参阅此处了解受支持的浏览器列表。

OpenReplay 需要访问诸如你的 css 之类的资源才能使回放正常工作。事实上,这些文件会被我们的后端复制并缓存,因此即使你的 Web 应用发生了变化,你也能查看旧的录制。这就是为什么你必须确保你的样式(以及图标和字体)是可公开访问的。如果你的资源托管在受限域名(私有或受保护)上,那么 OpenReplay 将无法复制并在回放中使用它们。你可以将它们复制到可公开访问的域名,然后使用 resourceBaseHref 选项在 tracker 的构造函数中指定该域名。

如果你的同源 iFrame 含有嵌套框架,请确保在每个嵌入的框架中使用绝对路径(在指向你的 CSS 文件的 <link> 元素中),或使用 resourceBaseHref 选项在 tracker 的构造函数中指定该域名。

如果你在 localhost 中进行测试,样式将不会被渲染,因为它们位于你的机器上,OpenReplay 无法访问。请按照本指南来解决该问题。

在极少数情况下,回放可能显示为空白(或白屏)。虽然页面不会被渲染,但你仍然可以看到用户的鼠标移动。请尝试将 disableStringDict 选项设置为 true,看看这是否有助于新的录制。这通常可以解决该问题。

如果你在前端层之上使用了 canvas(具有更高的 zIndex),你可能会在录制会话的回放过程中注意到黑屏。这是因为 Web API 尚不允许我们捕获 alpha 通道。如果你的 Web 应用存在这种情况,请将 data-openreplay-hidden HTML 属性添加到有问题的 canvas 元素上,以便将其从会话录制中完全隐藏。

与样式不同,图片不会被 OpenReplay 缓存,而是在会话回放期间被检索。因此它们应可公开访问。如果它们位于 CDN 上,请确保保留图片的旧版本,以便能够正确回放旧的会话录制。

如果你的 Web 应用包含 iframe,则你将无法在录制中回放它们的内容。你仍然可以通过包含 tracker.start() 在 iframe 内启动 OpenReplay,但它将被视为一个单独的标签页,这意味着它将被捕获到一个单独的录制中。

分布在多个子域名上的站点会为同一次访问生成多个会话。你可以通过向 tracker 的 start() 方法传递 sessionHash 将它们拼接成单个录制。sessionHash 可以被保存,然后从你的跨域存储(例如 cookie)中检索。

// Initialize the tracker as you would normally do
const tracker = new OpenReplay({
  projectKey: PROJECT_KEY
})
...
// Make sure the tracker is stopped when passing subdomains and collect the sessionHash
const sessionHash = tracker.stop(); // This can be saved in cookies or passed through URL (if needed)
...
// Initialize another tracker on the new subdomain with the same projectKey
const trackerNewDomain = new OpenReplay({
  projectKey: PROJECT_KEY
})
// Pass the sessionHash to the newly started session
trackerNewDomain.start({ 
  sessionHash, // This can be retrieved from cookies or URL (if needed)
})

如果无法继续该会话(不存在或已结束),tracker 将自动开始一个新会话。

这可以在仅访问了单个页面、并且在用户导航到另一个页面后立即结束的回放中发现。这通常发生在不是单页应用(SPA)的网站上。要解决此问题,必须在每个页面上调用 tracker.start()

如果你不是自托管 OpenReplay,而是使用我们的托管解决方案,则有可能某些会话未被录制,因为发往我们服务器的请求可能被屏蔽。这通常是由广告拦截器、VPN 或浏览器扩展引起的。

如果你对此流程有任何疑问,欢迎通过我们的 Slack 联系我们,或查看我们的论坛