用户访问指标检测¶
当前文档定位
本文档为检测规则配置流程中的第二步。配置完成后,请返回主文档继续第三步:事件通知。
用于监控工作空间内用户访问指标数据,支持针对 Web、Android、iOS、小程序(Miniapp)、React Native、HarmonyOS 等多类型应用的性能指标设置阈值范围,当指标超出阈值时系统自动触发告警。
适用于需要监控前端应用性能的场景。例如,针对 Web 端基于城市维度的 JS 错误率进行监控,或监控小程序的页面加载耗时、移动端应用的崩溃率等。
检测配置¶
检测频率¶
设置执行检测的时间周期。
-
预设选项:1 分钟、5 分钟、10 分钟、15 分钟、30 分钟、1 小时
-
默认选中:5 分钟
-
Crontab 模式:点击“切换到 Crontab 模式”可配置自定义周期,支持基于秒、分钟、小时、天、月、周等周期配置定时任务执行情况。
检测区间¶
设置每次检测查询的数据时间范围(❗️检测区间应大于等于检测频率,且需与数据实际上报周期匹配,避免漏检或误报)。
| 检测频率 | 检测区间(下拉可选项) |
|---|---|
| 30s | 1m/5m/15m/30m/1h/3h |
| 1m | 1m/5m/15m/30m/1h/3h |
| 5m | 5m/15m/30m/1h/3h |
| 15m | 15m/30m/1h/3h/6h |
| 30m | 30m/1h/3h/6h |
| 1h | 1h/3h/6h/12h/24h |
| 6h | 6h/12h/24h |
| 12h | 12h/24h |
| 24h | 24h |
- 自定义格式:自定义输入检测区间,如:20m(最近 20 分钟)、2h(最近 2 小时)、1d(最近 1 天)。
检测指标¶
设置检测的指标数据,可针对当前工作空间内单一应用类型下的应用指标数据进行配置(❗️请避免选择高基数字段作为检测维度。如果配置不当,触发条件过于宽松,可能会引发频繁告警。当前查询最大返回数量为 10 万条记录)。
配置要素¶
| 配置项 | 说明 |
|---|---|
| 应用类型 | 用户访问监测支持的应用类型,包括:Web、Android、iOS、Miniapp、HarmonyOS |
| 应用名称 | 基于所选应用类型获取对应的应用列表,支持选择全部或指定应用 |
| 指标 | 根据应用类型展示对应的性能指标,详见下方指标说明 |
| 筛选条件 | 基于指标的标签对检测指标的数据进行筛选,限定检测的数据范围;支持添加一个或多个标签筛选;支持模糊匹配和模糊不匹配的筛选条件 |
| 检测维度 | 配置数据里对应的字符串类型(keyword)字段都可以作为检测维度进行选择,目前检测维度最多支持选择三个字段。通过多个检测维度的字段组合,可以确定一个确定的检测对象,系统会判断某个检测对象对应的统计指标是否满足触发条件的阈值,若满足条件则产生事件。(例如选择检测维度 host 与 host_ip,则检测对象可以为 {host: host1, host_ip: 127.0.0.1}。) |
| 附加信息 | 附加字段只用作额外查询,不会用于触发条件判断,可以将它们配置到事件通知中。如果检测到多个匹配值,则会随机返回一条记录 |
Web / 小程序 指标说明¶
| 指标 | DQL 查询示例 |
|---|---|
| JS 错误数 | R::error:(count(__docid) asJS 错误数) { app_id = '<应用 ID>' } |
| JS 错误率 | Web: eval(A/B, alias='页面 JS 错误率', A="R::view:(count(view_url)) {view_error_count > 0, app_id = '<应用 ID>'}", B="R::view:(count(view_url)) { app_id = '<应用 ID>'}")小程序: eval(A/B, alias='JS 错误率', A="R::view:(count(view_name)) {view_error_count > 0, app_id = '<应用 ID>' }", B="R::view:(count(view_name)) { app_id = '<应用 ID>' }") |
| 资源错误数 | R::resource:(count(resource_url) as资源错误数) {resource_status >=400, app_id = '<应用 ID>'}" |
| 资源错误率 | eval(A/B, alias='资源错误率', A="R::resource:(count(resource_url)) { resource_status >= '400',app_id = '<应用 ID>' }", B="R::resource:(count(resource_url)) { app_id = '<应用 ID>' }") |
| 首次渲染平均时间 | R::page:(avg(page_fpt)){app_id = '<应用 ID>'} |
| 页面加载平均耗时 | R::view:(avg(loading_time)){app_id = '<应用 ID>'} |
| 页面慢加载次数 | R::resource:(count(resource_load)){app_id = '<应用 ID>',resource_load>8000000000,resource_type='document'}" |
| 资源加载平均耗时 | R::resource:(avg(resource_load) as加载耗时) {app_id = '<应用 ID>',resource_type!='document'}" |
| LCP (largest_contentful_paint) | 支持聚合函数: avg、percentileR::view:(avg(largest_contentful_paint)){app_id = '<应用 ID>'}R::view:(percentile(largest_contentful_paint,75)){app_id = '<应用 ID>'}R::view:(percentile(largest_contentful_paint,90)){app_id = '<应用 ID>'}R::view:(percentile(largest_contentful_paint,99)){app_id = '<应用 ID>'} |
| FID (first_input_delay) | 支持聚合函数: avg、percentileR::view:(avg(first_input_delay)){app_id = '<应用 ID>'}R::view:(percentile(first_input_delay,75)){app_id = '<应用 ID>'}R::view:(percentile(first_input_delay,90)){app_id = '<应用 ID>'}R::view:(percentile(first_input_delay,99)){app_id = '<应用 ID>'} |
| CLS (cumulative_layout_shift) | 支持聚合函数: avg、percentileR::view:(avg(cumulative_layout_shift)){app_id = '<应用 ID>'}R::view:(percentile(cumulative_layout_shift,75)){app_id = '<应用 ID>'}R::view:(percentile(cumulative_layout_shift,90)){app_id = '<应用 ID>'}R::view:(percentile(cumulative_layout_shift,99)){app_id = '<应用 ID>'} |
| FCP (first_contentful_paint) | 支持聚合函数: avg、percentileR::view:(avg(first_contentful_paint)){app_id = '<应用 ID>'}R::view:(percentile(first_contentful_paint,75)){app_id = '<应用 ID>'}R::view:(percentile(first_contentful_paint,90)){app_id = '<应用 ID>'}R::view:(percentile(first_contentful_paint,99)){app_id = '<应用 ID>'} |
Android / iOS 指标说明¶
| 指标 | DQL 查询示例 |
|---|---|
| 启动耗时 | R::action:(avg(duration)) { app_id = '<应用 ID>' ,action_type='app_cold_launch'}" |
| 总崩溃数 | R::error:(count(error_type)) {app_id='<应用 ID>',error_source = 'logger' and is_web_view !='true'}" |
| 总崩溃率 | eval(A.a1/B.b1, alias='总崩溃率',A="R::error:(count(error_type) as a1) {app_id='<应用 ID>',error_source = 'logger',is_web_view !='true'} ",B="R::action:(count(action_name) as b1) { app_id = '<应用 ID>',action_type in [launch_cold,launch_hot,launch_warm]} ")" |
| 资源错误数 | R::resource:(count(resource_url) as资源错误数) {resource_status >=400, app_id = '<应用 ID>'}" |
| 资源错误率 | eval(A/B, alias='资源错误率', A="R::resource:(count(resource_url)) { resource_status >= '400',app_id = '<应用 ID>' }", B="R::resource:(count(resource_url)) { app_id = '<应用 ID>' }") |
| 平均 FPS | R::view:(avg(fps_avg)) { app_id = '<应用 ID>' }" |
| 页面加载平均耗时 | R::view:(avg(loading_time)) { app_id = '<应用 ID>' }" |
| 资源加载平均耗时 | R::resource:(avg(duration)) { app_id = '<应用 ID>' }" |
| 卡顿次数 | R::long_task:(count(view_id)) { app_id = '<应用 ID>' }" |
| 页面错误率 | eval(A/B, alias='页面错误率',A="R::view:(count(view_name)) {view_error_count > 0, app_id = '<应用 ID>' }",B="R::view:(count(view_name)) { app_id = '<应用 ID>' }")" |
触发条件¶
配置触发条件及严重程度。当查询结果为多个值时,任一值满足触发条件则产生事件。
支持配置致命、严重、重要、警告四级阈值,以及正常恢复条件。
| 等级 | 配置 | 说明 |
|---|---|---|
| 致命 | 当 Result >= [值] |
最高等级告警,需立即处理 |
| 严重 | 当 Result >= [值] |
高等级告警,需优先处理 |
| 重要 | 当 Result >= [值] |
中等级告警,需关注 |
| 警告 | 当 Result >= [值] |
低等级告警,需留意 |
| 正常 | [N] 次检测无事件产生 |
检测规则生效后,若在配置的自定义检测次数内,数据检测结果由异常(致命、严重、重要、警告)恢复正常,则触发恢复告警事件。 ❗️ 恢复告警事件不受告警沉默限制。若未设置恢复告警事件检测次数,则告警事件不会恢复,且一直会出现在事件 > 未恢复事件列表中 |
更多详情,可参考 事件等级说明。
高级选项¶
连续触发判断¶
开启后,持续满足触发条件时才产生事件,避免瞬时波动误报(❗️最大配置上限为 10 次)。
大批量告警保护¶
系统默认开启。
当单次检测产生的告警数量超过预设阈值时,系统会自动切换到按状态汇总策略:不再逐个处理告警对象,而是根据事件状态生成少量摘要告警并进行推送。
这样既能确保通知的及时性,又能显著减少告警噪声,避免因处理过多告警而导致超时风险。
当此开关开启,后续监控器检测到异常后产生的此类事件详情中不会展示历史记录和关联事件。
数据断档¶
当检测指标在检测区间内查询结果为空时的处理策略:
| 选项 | 说明 |
|---|---|
| 不触发事件(默认) | 联动检测区间的时间范围,根据检测指标在最近若干分钟内的查询结果,判断是否生成事件。适用于允许数据缺失的场景 |
| 查询结果视为 0 | 联动检测区间的时间范围,将检测指标在最近若干分钟内的查询结果视为 0,并重新与上方触发条件中配置的阈值进行比较,以判断是否触发异常事件 |
| 自定义填充并触发事件 | 支持自定义填充检测区间值,并分别触发以下事件类型:数据断档事件、严重事件、重要事件、警告事件及恢复事件。 ❗️选择此策略时,建议自定义的数据断档时间配置 ≥ 检测区间的时间间隔;若配置时间 ≤ 检测区间时间间隔,可能会出现数据断档与异常同时满足的情况,此时将优先应用数据断档处理结果 |
同时配置触发条件、数据断档、信息生成时,按照如下优先级判断触发:数据断档 > 触发条件 > 信息事件生成。
即:先判断是否断档,再判断是否触发阈值,最后判断是否生成信息事件。
信息生成¶
开启此选项后,系统会将所有未匹配到上述触发条件的检测结果,以“信息”事件的形式进行写入。
适用于需要记录正常状态变化或低优先级信息的场景。
后续配置¶
完成上述检测配置后,请继续配置: