> ## 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 告警

> 对 RUM 页面上的指标告警：错误、无崩溃会话、Core Web Vitals、请求失败、新 issue 与回归的 issue。规则指明应用和指标，读取方式与页面相同。

[告警规则](https://docs.molesignal.com/zh-Hans/alerting)可以监控一项 **RUM 指标**，不必写查询。规则指明一个应用，可以再收窄到某个环境、页面和版本，并选择下面的一项指标。它按计划评估，对照阈值，或对照前几天的同一时间，不需要数据流，也不需要语句。

指标的读取方式与页面相同，用的是和[概览](https://docs.molesignal.com/zh-Hans/rum)、[探索](https://docs.molesignal.com/zh-Hans/rum/explorer.md)同一份聚合：视图和会话按最新版本只数一次，百分位数取的是有值的视图。所以规则监控的数字，就是页面在同一个应用、环境、页面和时间范围下显示的数字。

## 指标

| 指标 | `metric` | 含义 | 单位 | 需要的行数 |
| - | - | - | - | - |
| **会话数** | `session_count` | 在窗口内开始的会话。 | 个 | 无 |
| **视图数** | `view_count` | 在窗口内开始的页面浏览，App 里是屏幕。 | 个 | 无 |
| **错误数** | `error_count` | 在窗口内发生的错误。 | 个 | 无 |
| **错误率（出现错误的视图）** | `error_rate` | 遇到错误的视图占全部视图的比例。 | 百分比 | 100 个视图 |
| **无崩溃会话** | `crash_free_sessions` | 没有崩溃的会话占全部会话的比例。 | 百分比 | 100 个会话 |
| **受挫会话** | `frustration_rate` | 出现[受挫信号](https://docs.molesignal.com/zh-Hans/rum/frustration.md)的会话占全部会话的比例。 | 百分比 | 100 个会话 |
| **请求失败率** | `failed_request_rate` | `fetch` 和 `xhr` 请求中没有得到响应或得到 5xx 的比例。4xx 在这里不算失败。 | 百分比 | 200 个请求 |
| **LCP（p75）** | `lcp_p75` | 最大内容绘制的第 75 百分位数。 | 毫秒 | 50 个有值的视图 |
| **INP（p75）** | `inp_p75` | 交互到下一次绘制的第 75 百分位数。 | 毫秒 | 50 个有值的视图 |
| **CLS（p75）** | `cls_p75` | 累计布局偏移的第 75 百分位数。 | 得分，0.1 以内为良好 | 50 个有值的视图 |
| **首字节（p75）** | `ttfb_p75` | 首字节时间的第 75 百分位数。 | 毫秒 | 50 个有值的视图 |
| **新问题** | `new_issues` | 在窗口内首次出现的 [issue](https://docs.molesignal.com/zh-Hans/rum/errors.md)。 | 个 | 无 |
| **问题回归** | `regressed_issues` | 已解决后在窗口内又出现的 issue。 | 个 | 无 |

会话或视图属于它**开始**的那个窗口。一分钟前开始、还没有结束的会话也会计入，数的是它到目前为止的样子，所以窗口里最新的几分钟看上去会比这些会话结束后略好。窗口越长，这个影响越小。

### 指标没有值的时候

计数在为零时也是一个值，规则因此能发现流量停了。其余指标在窗口内的行数少于上表所需时**没有值**：没有任何阈值匹配，不会触发，已开启的事件会解决。这样，安静的夜里不会因为寥寥几个视图的 p75 触发规则。规则里的**最少样本**可以改变这条规则所需的行数；计数没有这一项。

## 收窄规则

| 收窄 | 哪些指标可以 |
| - | - |
| **环境** | 全部指标。 |
| **版本** | 除**新问题**和**问题回归**外的全部指标：一个 issue 会出现在很多版本里。 |
| **页面**（App 是**屏幕**） | 视图、错误、请求和 vitals：**视图数**、**错误数**、**错误率**、**请求失败率**，以及四项 vitals。会话类指标不可以（一个会话不在某一个页面上），issue 类也不可以。 |

编辑器给出该应用最近一天出现过的环境、页面和版本。页面是 URL 的路径，把会变化的部分归并，和各页面的说法一致。名称按原样比较，所以其中的 `*` 就是一个字符。

新问题和问题回归按 issue **出现的环境**数。一个 issue 属于整个应用，并记下它在每个环境里第一次出现的时间：上周在预发环境首次出现的 issue，在生产环境第一次看到它时，对生产来说就是新的。不选环境时，issue 在应用第一次看到它时是新的。

## 创建规则

打开**告警 → 告警规则**，点击**新建规则**。**阈值规则**的数据源里，**RUM 告警**与**指标告警**、**日志告警**、**链路告警**和 **APM 告警**并列。选择应用，按需收窄，选择指标，再选择评估窗口：5 分钟、15 分钟或 1 小时。编辑器给每项指标预设适合它的窗口（百分位数和比例用 1 小时），以及一条常见的告警线。创建规则需要 `alerts.manage`。

**测试规则**画出最近一段时间里指标的曲线，每个窗口一个点，并叠上阈值：窗口为 5 或 15 分钟时是 6 小时，窗口为 1 小时时是 12 小时。最后一个点就是规则此刻看到的值。行数太少的窗口没有值，也没有点。预览由评估规则的同一段代码算出，所以画出来的就是规则会做的。

换一项指标会重新给出阈值和窗口，因为它们的单位变了。不能收窄到页面或版本的指标，会在表单里说明原因。

`alert` 角色每隔 `[alert].eval_interval_secs`（默认 30 秒）对最近一个窗口评估一次规则。`for_periods` 数的是连续越过告警线的评估次数；几分钟的窗口已经平滑了指标，所以编辑器让 RUM 规则从 1 开始。见[创建规则](https://docs.molesignal.com/zh-Hans/api/alerting/create-rule.md#规则如何评估)。

## 从页面告警

**告警** 在概览、错误、性能和受挫页里，位于说明页面范围的那一行的末尾。旁边的数字是这个应用正在发生的事件数，用最严重一个的颜色，没有事件时不显示。这个按钮需要 `alerts.read`，没有这项权限的人看不到它。

它打开一个抽屉，列出这个应用的告警：页面选了环境就是这个环境，页面看的是所有环境就是所有环境。抽屉没有自己的应用和环境，跟着页面走。从上到下，最紧急的在最前。

* **正在发生** 列出这个应用状态为待处理或已确认的事件，最严重的在前。每条说明严重程度、是哪条规则、规则的告警线，以及何时开启。**打开** 在页面上方打开这个事件。
* **这个应用的规则** 列出盯着它的规则，包括所选环境的和所有环境的，触发中的在前，并说明每条的状态：**触发中**、**待定**、**正常** 或 **已停用**。**新建规则** 打开规则编辑器，应用和环境已经填好；**编辑** 打开某条规则。两者都需要 `alerts.manage`。
* **模板** 列出值得给这个应用建的规则，可以直接创建。

[性能页](https://docs.molesignal.com/zh-Hans/rum/performance.md#一个值由什么构成)里一行的抽屉有 **为它建告警**，它打开规则编辑器，指标是当前标签页的那项 vital，并收窄到这一行的页面或版本。

## 模板

模板是一条针对某项指标的规则，带着它的告警线和评估窗口。点 **创建** 立刻建好这条规则：启用、`scheduled`，模板的各条线就是各级严重度，`for_periods` 为 1，使用默认升级策略，标签与在编辑器里建的规则相同，再加上 `rum.template`，写明它来自哪个模板。规则以应用、环境和模板命名：`Storefront · prod · 页面加载变慢`。之后在 **告警 → 告警规则** 里随意修改。创建规则需要 `alerts.manage`；没有这项权限时按钮是灰的，并写明原因。

已经为当前页面的应用和环境建过的模板，会显示 **已创建，启用中** 和一个到那条规则的链接，代替按钮，所以不会建两次。换一个环境可以再建一次；为所有环境建的那条，不算某一个环境的。

每张卡片说明指标 **当前** 的值，按模板的窗口读取，用的是评估规则的同一段代码。Core Web Vitals 还会说明这个值属于良好、待改进还是差。按模板建的规则如果立刻就会触发，卡片会说明。行数不够的指标没有值，卡片会说明还差多少。

Core Web Vitals 的线是 web.dev 给出的良好与差的分界。

| 模板 | 指标 | 告警线 | 窗口 |
| - | - | - | - |
| **页面加载变慢**，建议 | LCP（p75） | 警告高于 2.5 秒，严重高于 4 秒 | 1 小时 |
| **交互变慢**，建议 | INP（p75） | 警告高于 200 毫秒，严重高于 500 毫秒 | 1 小时 |
| **页面报错率**，建议 | 错误率 | 警告高于 2%，严重高于 5% | 15 分钟 |
| **请求失败率**，建议 | 请求失败率 | 警告高于 2%，严重高于 5% | 15 分钟 |
| **出现新问题**，建议 | 新问题 | 警告高于 0 | 15 分钟 |
| **布局抖动** | CLS（p75） | 警告高于 0.1，严重高于 0.25 | 1 小时 |
| **受挫会话** | 受挫会话 | 警告高于 3%，严重高于 8% | 1 小时 |
| **问题回归** | 问题回归 | 严重高于 0 | 15 分钟 |
| **流量停了**，可选 | 会话数 | 严重低于 1 | 15 分钟 |

App 有七个，崩溃取代了 Web Vitals 的位置。**屏幕报错率** 是屏幕的错误率。

| 模板 | 指标 | 告警线 | 窗口 |
| - | - | - | - |
| **崩溃变多**，建议 | 无崩溃会话 | 警告低于 99.5%，严重低于 99% | 1 小时 |
| **屏幕报错率**，建议 | 错误率 | 警告高于 2%，严重高于 5% | 15 分钟 |
| **请求失败率**，建议 | 请求失败率 | 警告高于 2%，严重高于 5% | 15 分钟 |
| **出现新问题**，建议 | 新问题 | 警告高于 0 | 15 分钟 |
| **受挫会话** | 受挫会话 | 警告高于 3%，严重高于 8% | 1 小时 |
| **问题回归** | 问题回归 | 严重高于 0 | 15 分钟 |
| **流量停了**，可选 | 会话数 | 严重低于 1 | 15 分钟 |

**流量停了** 在窗口里一个会话都没有时告警，所以不适合夜里没有流量的应用。

## 异常规则

**异常检测规则**的数据源里有 **RUM 指标**。它把最近一个窗口的指标与前几天的同一窗口比较，基线与设置同[其他异常规则](https://docs.molesignal.com/zh-Hans/alerting)。除**新问题**和**问题回归**外的指标都可以选，这两项没有常态水平。

## 事件

在编辑器里创建的规则带有标签 `rum.application`，以及它收窄到的 `deployment.environment`、`rum.page` 和 `rum.version`，它的事件会复制这些标签。事件开启时，还会保存最多三个**样本会话**，它们是指标最差的那几个，每个有会话 ID、时间、该会话的数值和附带的信息：vitals 最差的视图和背后的元素、最新的错误和它们的消息、出现崩溃或受挫信号的会话、失败的请求和它们的路径。新问题和问题回归的样本，是这些 issue 最新错误所在的会话。流量类指标没有样本。

事件抽屉从 **正在发生**、**告警 → 事件** 或链接里打开，把它们列为 **样本会话**：发生的时间、是谁（姓名、邮箱、ID，或从未登录的访客由 SDK 保存的 ID）、浏览器和系统，以及它为什么成为样本。录制了回放的会话，**回放** 在那个时刻前 5 秒打开；没有录制的，**会话** 打开会话页。会话是谁、有没有录制，是从会话里读的，需要 `streams.query`；没有这项权限时，每行仍然会说明何时、为什么。

**在 RUM 中打开** 去到讲这项指标的页面，应用、环境和页面不变，时间范围是事件的时间：从规则读取窗口之前，到解决之后一小会儿；事件还在进行时到现在。

| 指标 | 打开 |
| - | - |
| 某项 vital | [性能](https://docs.molesignal.com/zh-Hans/rum/performance.md)，定位到这项 vital；规则写明了页面时，在这个页面的抽屉里 |
| 请求失败率 | [资源](https://docs.molesignal.com/zh-Hans/rum/performance.md#资源) |
| 错误数、错误率、新问题、问题回归、无崩溃会话 | [错误](https://docs.molesignal.com/zh-Hans/rum/errors.md) |
| 受挫会话 | [受挫](https://docs.molesignal.com/zh-Hans/rum/frustration.md) |
| 会话数、视图数 | [概览](https://docs.molesignal.com/zh-Hans/rum) |

## API 里的规则

RUM 指标的规则，在 `query` 里用 `query.rum`，不带语句和数据流。用它[创建规则](https://docs.molesignal.com/zh-Hans/api/alerting/create-rule.md)。

```json theme={null}
{
  "name": "Storefront checkout is slow",
  "kind": "scheduled",
  "query": {
    "language": "sql",
    "statement": "",
    "period_secs": 3600,
    "rum": {
      "application_id": "storefront",
      "environment": "prod",
      "page": "/checkout",
      "metric": "lcp_p75"
    }
  },
  "trigger": { "operator": "gt", "threshold": 2500, "for_periods": 1, "silence_secs": 300 },
  "thresholds": [
    { "severity": "warning", "operator": "gt", "threshold": 2500, "for_periods": 1 },
    { "severity": "critical", "operator": "gt", "threshold": 4000, "for_periods": 1 }
  ],
  "labels": { "rum.application": "storefront", "deployment.environment": "prod", "rum.page": "/checkout" },
  "annotations": {}
}
```

`period_secs` 是窗口，取 60 秒到 6 小时。应用必须存在；不能收窄到页面或版本的指标，带 `page` 或 `version` 会被拒绝。`min_samples` 可选，计数不能带。阈值用指标的单位。

RUM 页面按标签 `rum.application` 找一个应用的事件（页面看的是某个环境时，再按 `deployment.environment`），按规则的 `query.rum` 找它的规则。通过 API 创建的规则只带请求里写明的标签，所以要在页面上数出、列出它的事件，就要给它加上这两个标签。从模板建的规则还有 `rum.template`，卡片靠它知道模板已经建过。

`POST /api/v1/rum/alerts/preview` 是**测试规则**读取的接口，见 [RUM API](https://docs.molesignal.com/zh-Hans/api/rum.md#预览告警规则)。

## 权限

* `alerts.read` 让 RUM 页面显示 **告警**，抽屉里有事件、规则和模板。
* `alerts.manage` 可以创建规则：从模板、用 **新建规则**，或在规则编辑器里；也可以对规则点 **编辑**。
* `streams.query`，即读取 RUM 其余部分的权限，用于读取预览、模板说明的指标当前值，以及事件的样本会话是谁。

见 [RUM](https://docs.molesignal.com/zh-Hans/rum#权限)。


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