> ## Documentation Index
> Fetch the complete documentation index at: https://docs.molesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# RUM 错误与 issue

> 把应用的错误归并成有状态、团队和处理人的 issue，并看到已解决的 issue 在更新的版本再现。

**用户体验 → 错误** 把应用的错误按 issue 列出。issue 是相似的错误合成的一件事：它有状态、团队、处理人，以及何时、在哪些版本出现过的记录。每条错误仍在 `rum_errors` 流里，并在 `error.issue_id` 里带着所属 issue 的 id，所以[探索](https://docs.molesignal.com/zh-Hans/rum/explorer.md)和查询两边都能看到。

## 错误怎样成为 issue

错误到达时，服务端算出它所属的 issue。id 是这些内容的哈希：

* 应用和 `error.source`，
* 错误的类型、类别，以及去掉了每次都会变的部分的消息，
* 应用自己代码的前三个帧；上传了该版本的 source map、mapping 或符号文件时，用还原后的帧（见 [Source Maps 与符号](https://docs.molesignal.com/zh-Hans/rum/source-maps.md)），
* 请求失败时，请求的方法、路径和状态码。

消息里的数字、UUID、八位及以上的十六进制哈希、邮箱地址，以及网址的查询串和片段都会被去掉，所以 `Loading chunk 482 failed.` 和 `Loading chunk 17 failed.` 是同一个 issue。依赖包、框架和运行时的帧不算应用自己的代码；应用有自己的帧时，它们不参与归并。

要按别的方式归并，发送 `error.fingerprint`（最长 128 个字符）。同一应用里 fingerprint 相同的错误是同一个 issue，不管消息和堆栈是否相同。SDK 不会设置它；在上报错误的调用里传入。

> [!NOTE]
>
> 生成 id 的规则带有版本号。以后调整归并方式会得到新的 id，所以已有的 issue 不会在原处被重新归并。issue 出现之前到达的错误没有 `error.issue_id`，不会列出。错误在其版本的 source map 上传之前到达，按原始帧归并；在上传之后到达，按还原后的帧归并：同一个问题可能是两个 issue。已有的 issue 不会被合并。

## 列表

列表显示一个应用、一个环境在时间范围内有错误的 issue。每行显示：

| 列 | 内容 |
| - | - |
| **问题** | 第一条错误的类型和消息，以及应用自己代码的第一个帧。 |
| **状态** | 正在怎样处理。见[状态](#状态)。 |
| **指派** | 处理它的人；没有人时是团队。 |
| **会话** | 时间范围内有多少会话遇到了它。 |
| **用户** | 有多少人遇到了它。没有用户 id 的访客按 SDK 的匿名 id 计。 |
| **趋势** | 时间范围等分成 12 段，每段出现的次数。 |
| **版本** | 第一次出现的版本和最近一次的版本。 |
| **最近出现** | 最近一次出现的时间，不限时间范围。 |

列表默认显示**待处理**的 issue：待处理、调查中和回归。在筛选里选别的状态，或**全部 issue**。可以按类型、消息或位置里的词、处理人缩小列表；有多种客户端上报错误时，还可以按来源缩小。点击**状态**、**会话**、**用户**或**最近出现**给行排序，再点一次反向。页面状态在地址里，所以视图可以分享。

列表读取会话（或用户、出现次数，按所选排序）最多的 250 个 issue，再用筛选缩小，所以筛选不会触及排在它们之后的 issue。最多显示 100 个 issue。

列表上方的**出现在哪里**把所列 issue 的会话按版本、页面和浏览器拆开。点击一个值，把列表缩小到发生在那里的错误，各列随之缩小。再点一次放开。

## issue

点击一行，在抽屉里打开 issue。地址里带着这个 issue，所以抽屉可以从地址再次打开。

* 头部设置状态、团队和处理人。**在探索中查看**用这个 issue 的错误打开探索。
* 概况行显示状态、时间范围内的会话和人数、issue 第一次和最近一次出现的时间，以及版本。
* **出现趋势**显示最近 14 天的会话，按天、按版本堆叠。虚线标出标为已解决的那一天。
* **出现在哪里**把这个 issue 的会话按浏览器、系统和国家拆开。
* **抛出位置**列出最近一条带堆栈的错误的帧：应用自己的帧用粗体，依赖库的帧变淡。调试产物还原过帧时，可以在**还原后**和**原始**之间切换。
* **样本会话**列出最近三个遇到该 issue 的会话，各有回放和时间线的入口；**受影响用户**列出遇到次数最多的人。没被保留的会话的错误是单独保存的，所以在会话入口的位置写着 *会话未保留*。见 [RUM 数据采样](https://docs.molesignal.com/zh-Hans/rum/sampling.md#保留所有错误)。

issue 列表里的类型、消息和位置，保持第一条错误到达时的样子，经过写入时的脱敏规则。

## 状态

| 状态 | 含义 | 谁设置 |
| - | - | - |
| **待处理** | 还没有人看。新 issue 从这里开始。 | 服务端和人。 |
| **调查中** | 有人在查。 | 人。 |
| **回归** | 已解决，又在更新的版本出现。 | 只有服务端。 |
| **已解决** | 原因已修复。 | 人。 |
| **已忽略** | 不需要处理。 | 人。 |

待处理、调查中和回归的 issue 是未解决的。

### 回归

标为已解决时，记下时间、操作的人，以及当时应用最新的版本。版本的先后按各自第一次出现的时间排，与版本号怎么写无关。已解决的 issue 只有在出现的错误属于比它更晚首次出现的版本时，才重新打开为**回归**。没有升级的用户会一直遇到旧版本，所以同一版本或更旧版本上的错误不会重开它。

不带版本的应用没有先后可依：解决之后出现的任何错误都会重开。没有写明版本的错误，不会重开在某个版本上标为已解决的 issue。

改变回归的 issue 的状态，就结束了这次回归。再次标为已解决，会再次记下最新的版本。

issue 属于整个应用，在每个环境里都是它。服务端记下让它重新打开的那条错误所在的环境，以及每个环境第一次看到它的时间。[告警规则](https://docs.molesignal.com/zh-Hans/rum/alerts.md)据此数出某个环境的新问题和问题回归。

接收错误的那一端会把 issue 记住最多一分钟，所以人设置的状态最多过一分钟才传到它那里。更新版本上的错误如果在它还记着旧状态时到达，不会重开这个 issue；过了这一分钟的下一个错误会重开。

## 每小时新开的 issue

一个应用每小时最多新开**每小时新开 issue 数**个 issue，默认 100。超过之后，这一小时里还不属于任何 issue 的错误合并计入一个叫**其余错误**的 issue，这样消息从不重复的应用也不会撑满列表。在应用里修改这个数：**用户体验 → 应用**，**Issue** 部分，范围 1 到 10,000。修改在半分钟内生效。

## 权限

* `streams.query` 打开列表和 issue。
* `rum.manage` 设置状态、团队和处理人。所有者、管理员和编辑者拥有它。没有它时，控件只显示已设置的内容。

接口见 [RUM API](https://docs.molesignal.com/zh-Hans/api/rum.md#issue)。

> **[Source Maps 与符号](https://docs.molesignal.com/zh-Hans/rum/source-maps.md)**
>
> 还原错误的帧，让 issue 按抛出它的代码区分。

> **[RUM 探索](https://docs.molesignal.com/zh-Hans/rum/explorer.md)**
>
> 用 `error.issue_id` 搜索某个 issue 的错误。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.