@blueking/open-telemetry 0.0.22-beta.1 → 0.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +258 -70
- package/dist/bk-rum.global.js +2 -2
- package/dist/bk-rum.global.js.map +1 -1
- package/dist/core/config.d.ts +10 -10
- package/dist/core/runtime-context.d.ts +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +608 -662
- package/dist/index.js.map +1 -1
- package/dist/plugins/blank-screen.d.ts +1 -1
- package/dist/plugins/common.d.ts +2 -2
- package/dist/plugins/device.d.ts +2 -2
- package/dist/plugins/resource.d.ts +1 -0
- package/dist/plugins/web-vitals.d.ts +1 -3
- package/dist/schema/attributes.d.ts +6 -7
- package/dist/schema/span.d.ts +24 -15
- package/package.json +1 -1
- package/skills/bk-rum-otele/SKILL.md +31 -30
- package/skills/bk-rum-otele/references/actions.md +166 -0
- package/skills/bk-rum-otele/references/api.md +248 -215
- package/skills/bk-rum-otele/references/architecture.md +139 -37
- package/skills/bk-rum-otele/references/blank-screen.md +190 -0
- package/skills/bk-rum-otele/references/capabilities.md +175 -83
- package/skills/bk-rum-otele/references/configuration.md +226 -151
- package/skills/bk-rum-otele/references/data-model.md +157 -24
- package/skills/bk-rum-otele/references/errors-security.md +168 -0
- package/skills/bk-rum-otele/references/extensions.md +237 -0
- package/skills/bk-rum-otele/references/framework-integration.md +318 -75
- package/skills/bk-rum-otele/references/getting-started.md +186 -70
- package/skills/bk-rum-otele/references/network.md +258 -0
- package/skills/bk-rum-otele/references/performance.md +198 -0
- package/skills/bk-rum-otele/references/privacy.md +236 -67
- package/skills/bk-rum-otele/references/production.md +266 -0
- package/skills/bk-rum-otele/references/session-context.md +185 -0
- package/skills/bk-rum-otele/references/telemetry-reference.md +500 -51
- package/skills/bk-rum-otele/references/transport-sampling.md +321 -32
- package/skills/bk-rum-otele/references/troubleshooting.md +341 -151
- package/skills/bk-rum-otele/references/views-routing.md +211 -0
- package/skills/bk-rum-otele/references/concepts.md +0 -60
- package/skills/bk-rum-otele/references/custom-plugin.md +0 -170
- package/skills/bk-rum-otele/references/plugins-basic.md +0 -135
- package/skills/bk-rum-otele/references/plugins-error-security.md +0 -86
- package/skills/bk-rum-otele/references/plugins-experience.md +0 -124
- package/skills/bk-rum-otele/references/plugins-network.md +0 -32
- package/skills/bk-rum-otele/references/plugins.md +0 -62
|
@@ -2,60 +2,162 @@
|
|
|
2
2
|
|
|
3
3
|
# 架构与数据流
|
|
4
4
|
|
|
5
|
-
SDK
|
|
5
|
+
本页解释 SDK 从构造、启动、采集到导出的完整路径。它面向需要理解运行机制、排查数据缺失或开发扩展插件的读者;配置字段见[配置参考](./configuration.md),上报字段见[遥测字段字典](./telemetry-reference.md)。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 设计边界
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
SDK 只创建 OpenTelemetry Trace Provider。Session、View、请求、资源、错误、Web Vitals、Action 等浏览器事件都编码为 Span,经唯一的 OTLP/HTTP 通道发送到 `<transport.endpoint>/v1/rum`。
|
|
10
|
+
|
|
11
|
+
浏览器端负责:
|
|
12
|
+
|
|
13
|
+
- 从浏览器 API 读取单次事件事实;
|
|
14
|
+
- 建立 Session、View、Action 关联;
|
|
15
|
+
- 计算必须依赖浏览器状态的 View/Action Loading Time、CLS、INP、挫败信号和白屏结果;
|
|
16
|
+
- 完成 Session 采样、URL/属性脱敏、过滤和发送。
|
|
17
|
+
|
|
18
|
+
浏览器端不负责:
|
|
19
|
+
|
|
20
|
+
- 创建 Metric 或 Log Provider;
|
|
21
|
+
- 计算跨事件 Counter、Histogram、分位数或错误率;
|
|
22
|
+
- 生成错误指纹、错误组、地理信息或影响用户数;
|
|
23
|
+
- 采集请求或响应 Body;
|
|
24
|
+
- 保存 Session Replay 或 Browser Profile。
|
|
25
|
+
|
|
26
|
+
## 模块职责
|
|
27
|
+
|
|
28
|
+
| 模块 | 主要职责 |
|
|
10
29
|
| --- | --- |
|
|
11
|
-
| `core/config.ts` |
|
|
12
|
-
| `core/sdk.ts` |
|
|
13
|
-
| `core/runtime-context.ts` | User
|
|
14
|
-
| `core/
|
|
15
|
-
| `
|
|
16
|
-
| `
|
|
30
|
+
| `core/config.ts` | 输入校验、默认值、Endpoint、Resource 属性与 Hook |
|
|
31
|
+
| `core/sdk.ts` | Provider、Exporter、Processor、公开 API 和 SDK 生命周期 |
|
|
32
|
+
| `core/runtime-context.ts` | User、Session、View、Action 当前快照与历史归属 |
|
|
33
|
+
| `core/plugin.ts` | 插件契约、顺序启动、并行 flush、反向 shutdown |
|
|
34
|
+
| `core/processor.ts` | 上下文补齐、自上报过滤、有效性过滤和 `beforeSend` |
|
|
35
|
+
| `core/sampling.ts` | Session 级确定性采样 |
|
|
36
|
+
| `core/page-activity.ts` | View Loading Time 共用的页面活动稳定判断 |
|
|
37
|
+
| `core/action-activity.ts` | 请求、资源、DOM、错误、Long Task 等活动总线 |
|
|
38
|
+
| `plugins/*.ts` | 浏览器 API 监听、事件归一和单项体验语义 |
|
|
39
|
+
| `schema/*.ts` | RUM 公共字段、Span 类型和结果分类 |
|
|
40
|
+
|
|
41
|
+
## 构造阶段
|
|
42
|
+
|
|
43
|
+
`new BkOpenTelemetry(options)` 会同步完成以下工作:
|
|
44
|
+
|
|
45
|
+
1. `resolveConfig()` 校验 `application.name` 和 `transport.endpoint`。
|
|
46
|
+
2. 解析应用、传输、采样、Hook 和默认配置。
|
|
47
|
+
3. 创建 OpenTelemetry Resource;默认 Device 开启时会在此同步读取 UA、OS、内存和逻辑处理器快照,这一步早于 Consent 插件生命周期。
|
|
48
|
+
4. 创建 `OTLPTraceExporter`,目标固定为 `<endpoint>/v1/rum`。
|
|
49
|
+
5. 按 `transport.processor` 创建 `BatchSpanProcessor` 或 `SimpleSpanProcessor`。
|
|
50
|
+
6. 在外层包裹 `FilteringSpanProcessor`。
|
|
51
|
+
7. 创建带 `RumSessionSampler` 的 `WebTracerProvider`。
|
|
52
|
+
8. 创建空的 `RumRuntimeContext`;此时尚无有效 `session.id` 和 `view.id`。
|
|
53
|
+
|
|
54
|
+
构造阶段不会同步安装 Fetch/XHR Patch 或事件监听。`autoStart` 默认为 `true`,构造函数会异步调用 `start()`;需要严格控制启动时机、Consent、Plugin 或 Instrumentation 注册时,应使用 `autoStart: false` 并显式 `await start()`。
|
|
55
|
+
|
|
56
|
+
## 启动顺序
|
|
57
|
+
|
|
58
|
+
获得 Consent 且 `enabled=true` 时,插件严格按以下顺序初始化:
|
|
59
|
+
|
|
60
|
+
1. `session`:创建或恢复 Session,计算当前 Session 采样决定。
|
|
61
|
+
2. `device`:写入设备、视口和网络上下文。
|
|
62
|
+
3. `activity`:安装 DOM Mutation 页面活动观察器。
|
|
63
|
+
4. `page-view`:建立初始或手动 View。
|
|
64
|
+
5. `resource`:观察 Resource Timing;Fetch/XHR Entry 只用于回填请求 Span。
|
|
65
|
+
6. `request`:Patch Fetch/XHR,负责请求 Span、Trace Header 和活动计数。
|
|
66
|
+
7. `error`。
|
|
67
|
+
8. `web-vitals`。
|
|
68
|
+
9. `blank-screen`。
|
|
69
|
+
10. `action`。
|
|
70
|
+
11. 按配置启用 `websocket`、`long-task`、`csp-violation`。
|
|
71
|
+
12. 初始化 `extensions.plugins`。
|
|
72
|
+
13. 所有插件完成后注册 `extensions.instrumentations`。
|
|
73
|
+
|
|
74
|
+
这个顺序保证大多数采集插件启动前已经存在 Session 和 View。单个插件初始化失败会被隔离:失败插件不会加入已启动列表;`debug: true` 时输出 warning,其余插件继续启动。
|
|
75
|
+
|
|
76
|
+
## SDK 生命周期状态
|
|
77
|
+
|
|
78
|
+
实例内部状态为 `idle → starting → started → stopped`:
|
|
79
|
+
|
|
80
|
+
- 重复调用 `start()` 不会重复安装插件。
|
|
81
|
+
- `enabled=false` 时 `start()` 进入 `started`,但不启动采集。
|
|
82
|
+
- `shutdown()` 幂等;完成后 Provider 已销毁,同一实例不能重新启动。
|
|
83
|
+
- `use()` 和 `useInstrumentation()` 只能在 `idle` 状态调用。
|
|
84
|
+
- `setTrackingConsent()` 可以在 `started` 状态停止或重新启动采集插件。
|
|
85
|
+
|
|
86
|
+
`shutdown()` 会按启动顺序的反方向关闭插件,再刷新并关闭 Trace Provider。插件因此必须在 `shutdown()` 中释放自己创建的监听、Observer、Timer、Patch 和未结束 Span。
|
|
87
|
+
|
|
88
|
+
## 一条事件的处理链路
|
|
89
|
+
|
|
90
|
+
内置插件生成事件时,公共路径如下:
|
|
91
|
+
|
|
92
|
+
1. 从 DOM Event、Performance Entry、网络回调或业务调用中取得真实发生时间。
|
|
93
|
+
2. 使用当前时间或 `getRuntimeAttributesAt(timestamp)` 查找事件发生时的 Session、View、Action。
|
|
94
|
+
3. 写入 `span_type`、`outcome.*` 及对应领域字段,事件时间直接使用 Span start/end。
|
|
95
|
+
4. 通过 `context.startSpan()` 创建 Span,并应用 `privacy.redactAttributes`。
|
|
96
|
+
5. OpenTelemetry Provider 在 Span 创建时执行 Session sampler。
|
|
97
|
+
6. `FilteringSpanProcessor.onStart()` 只补充 Span 尚未显式提供的运行时属性。
|
|
98
|
+
7. Span 结束后,Processor 检查采样、Session/View、内部丢弃标记和自上报 URL。
|
|
99
|
+
8. 执行 `tracking.beforeSend`;返回 `false` 时丢弃。
|
|
100
|
+
9. 进入 Batch 或 Simple Processor。
|
|
101
|
+
10. Exporter 序列化为 OTLP/HTTP JSON,通过 Fetch POST 到 `/v1/rum`。
|
|
102
|
+
|
|
103
|
+
详细 HTTP 行为见[上报协议、批处理与采样](./transport-sampling.md)。
|
|
104
|
+
|
|
105
|
+
## 运行时上下文
|
|
106
|
+
|
|
107
|
+
`RumRuntimeContext` 保存后续 Span 自动继承的属性:
|
|
108
|
+
|
|
109
|
+
- `user.id`
|
|
110
|
+
- `session.id`、`session.start_time`、`session.type`、`session.has_replay`
|
|
111
|
+
- `view.id`、`view.name`、`view.url`、`view.url_path_group`、`view.loading_type`
|
|
112
|
+
- 活动窗口内的 `action.id`
|
|
113
|
+
- Device 插件产生的视口、屏幕、网络和设备 ID
|
|
114
|
+
- View 自定义属性
|
|
17
115
|
|
|
18
|
-
|
|
116
|
+
`context.attributes.page` 不是持久运行时快照;内置插件在创建具体 Span 时读取,Instrumentation 则由 Processor 的补齐函数在 onStart 时读取。
|
|
19
117
|
|
|
20
|
-
|
|
118
|
+
上下文不仅保存当前值,还保留最多 100 个 Session、View、Action 生效区间。PerformanceObserver 可能在事件结束后才回调,插件可以按事件真实时间回查历史上下文,避免把旧页面的 Resource、Vital 或 Long Task 归到新 View。
|
|
21
119
|
|
|
22
|
-
|
|
120
|
+
## Span 导出条件
|
|
23
121
|
|
|
24
|
-
|
|
122
|
+
普通 Span 必须同时满足:
|
|
25
123
|
|
|
26
|
-
|
|
124
|
+
- 当前 SDK `enabled=true`;
|
|
125
|
+
- Session 命中 `session.sampleRate`;
|
|
126
|
+
- Span 带有效 `session.id`;
|
|
127
|
+
- Span 带有效 `view.id`;
|
|
128
|
+
- 不是 SDK 自身 `/v1/rum` 请求;
|
|
129
|
+
- 未被请求级 `beforeSend` 标记丢弃;
|
|
130
|
+
- 未被全局 `tracking.beforeSend` 丢弃。
|
|
27
131
|
|
|
28
|
-
|
|
29
|
-
2. 按事件时间关联 `session.id`、`view.id`、`action.id`。
|
|
30
|
-
3. 写入唯一 `event.id`、`event.type`、`event.timestamp`。
|
|
31
|
-
4. 创建 RUM Span,应用 URL/属性脱敏。
|
|
32
|
-
5. FilteringSpanProcessor 校验采样和有效上下文,执行 `tracking.beforeSend`。
|
|
33
|
-
6. 通过 `/v1/rum` 批量上报。
|
|
132
|
+
`browser.session` 生命周期 Span 是例外:它允许只有采样有效的 `session.id`,因为 Session start 可能早于 View 创建,Session end 可能发生在 View 已清理之后。
|
|
34
133
|
|
|
35
|
-
|
|
134
|
+
## OpenTelemetry 全局对象
|
|
36
135
|
|
|
37
|
-
|
|
38
|
-
- `browser.view`:`event.phase=start|update|end`,并携带单调递增的 `view.version`。
|
|
39
|
-
- `browser.websocket`:`event.phase=connect|open|error|close`,通过 `websocket.connection.id` 关联。
|
|
136
|
+
SDK 使用 `ZoneContextManager` 和 `W3CTraceContextPropagator`。它们是页面级全局对象,多个 SDK 实例通过引用计数共享,最后一个实例退出时才释放。
|
|
40
137
|
|
|
41
|
-
|
|
138
|
+
这不代表推荐多个实例。Fetch、XHR、WebSocket 和全局事件监听仍可能被多实例重复安装;同一页面应只运行一个 SDK 实例,微前端由主应用统一持有。
|
|
42
139
|
|
|
43
|
-
##
|
|
140
|
+
## Flush 时机
|
|
44
141
|
|
|
45
|
-
|
|
142
|
+
`flush()` 先并行调用已启动插件的 `flush()`,再调用 Trace Provider `forceFlush()`。SDK 自动在以下时机尽力刷新:
|
|
46
143
|
|
|
47
|
-
|
|
144
|
+
- `window.pagehide`
|
|
145
|
+
- `document.visibilityState` 变为 `hidden`
|
|
146
|
+
- Session 过期并结束旧生命周期
|
|
147
|
+
- 撤销 Tracking Consent
|
|
148
|
+
- `shutdown()`
|
|
48
149
|
|
|
49
|
-
|
|
50
|
-
- Counter、Histogram、P50/P75/P95/P99;
|
|
51
|
-
- 错误指纹、分组和风暴控制;
|
|
52
|
-
- 采样率修正、乱序/迟到事件合并;
|
|
53
|
-
- 基于 `event.id` 去重,基于 `view.id + view.version` 幂等更新。
|
|
150
|
+
页面生命周期触发的 flush 是尽力而为,不等于浏览器一定完成网络发送。关键业务流程可以显式 `await bkOT.flush()`。
|
|
54
151
|
|
|
55
|
-
##
|
|
152
|
+
## SDK 与服务端契约
|
|
56
153
|
|
|
57
|
-
|
|
154
|
+
服务端至少需要:
|
|
58
155
|
|
|
59
|
-
|
|
156
|
+
- 以 `traceId + spanId` 去重;
|
|
157
|
+
- 以 `session.id`、`view.id`、`action.id` 关联事件;
|
|
158
|
+
- 以 `view.id + view.version` 幂等合并 View start/update/end;
|
|
159
|
+
- 容忍网络批处理导致的乱序和迟到;
|
|
160
|
+
- 使用 `session.sample_rate` 修正聚合;
|
|
161
|
+
- 从原始 Span 派生计数、分布、分位数和错误分组。
|
|
60
162
|
|
|
61
|
-
|
|
163
|
+
字段分层和服务端派生边界见[RUM 数据模型](./data-model.md)。
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 白屏检测
|
|
4
|
+
|
|
5
|
+
Blank Screen 插件用固定成本的视口九点采样判断页面是否缺少可见业务内容。它默认开启,但只在候选结果连续两次超过阈值时上报;每个 View 最多一条 `browser.blank_screen`。
|
|
6
|
+
|
|
7
|
+
## 适用边界
|
|
8
|
+
|
|
9
|
+
白屏检测回答的是“应用根节点及视口主要区域是否缺少可见子内容”,不是截图像素分析,也不等于业务页面一定不可用。
|
|
10
|
+
|
|
11
|
+
它不能可靠识别:
|
|
12
|
+
|
|
13
|
+
- 页面有大面积背景图但 DOM 层级简单;
|
|
14
|
+
- Canvas/WebGL 内部是否真正渲染成功;
|
|
15
|
+
- 内容存在但文本与背景同色;
|
|
16
|
+
- iframe 内部内容;
|
|
17
|
+
- 业务数据错误但页面仍有结构。
|
|
18
|
+
|
|
19
|
+
这些场景需要业务自定义事件或更专用的可用性检测。
|
|
20
|
+
|
|
21
|
+
## 默认配置
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
tracking: {
|
|
25
|
+
blankScreen: {
|
|
26
|
+
rootSelector: 'body',
|
|
27
|
+
threshold: 0.8,
|
|
28
|
+
checkDelay: 1000,
|
|
29
|
+
confirmationDelay: 200,
|
|
30
|
+
ignoreSelectors: [],
|
|
31
|
+
},
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
| 字段 | 默认 | 解析规则 |
|
|
36
|
+
| --- | ---: | --- |
|
|
37
|
+
| `rootSelector` | `body` | 空字符串回退 `body` |
|
|
38
|
+
| `threshold` | `0.8` | 有限值限制到 `0..1`,非法值回退默认 |
|
|
39
|
+
| `checkDelay` | `1000ms` | 非负有限值;非法值回退默认 |
|
|
40
|
+
| `confirmationDelay` | `200ms` | 非负有限值;非法值回退默认 |
|
|
41
|
+
| `ignoreSelectors` | `[]` | 追加到内置列表,不替换 |
|
|
42
|
+
|
|
43
|
+
SPA 应优先指定在页面生命周期内稳定存在、且承载主要内容的容器,例如 `#app` 或 `#root`。如果框架会替换初始挂载元素,应让组件根元素保留该 selector,或使用默认的 `body` 检测。
|
|
44
|
+
|
|
45
|
+
## 检测时机
|
|
46
|
+
|
|
47
|
+
每次 View 变化:
|
|
48
|
+
|
|
49
|
+
1. 取消旧 View 的 Timer 和活动监听。
|
|
50
|
+
2. 等待新 View 页面活动结束。
|
|
51
|
+
3. 再等待 `checkDelay`。
|
|
52
|
+
4. 执行第一次九点采样。
|
|
53
|
+
5. 比例达到阈值后,等待 `confirmationDelay`。
|
|
54
|
+
6. 第二次采样仍达到阈值,才上报。
|
|
55
|
+
|
|
56
|
+
页面 hidden 时取消检测;恢复 visible 后,如果当前 View 尚未上报,会重新调度。View 切换会使旧回调失效,避免异步 Timer 把旧结果报到新 View。
|
|
57
|
+
|
|
58
|
+
## 九点采样
|
|
59
|
+
|
|
60
|
+
采样点是视口宽高的 20%、50%、80% 交叉位置:
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
● ● ●
|
|
64
|
+
|
|
65
|
+
● ● ●
|
|
66
|
+
|
|
67
|
+
● ● ●
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
每个点使用 `elementsFromPoint()` 获取层叠元素;浏览器不支持时退回 `elementFromPoint()`。
|
|
71
|
+
|
|
72
|
+
一个点判为有内容需要满足:
|
|
73
|
+
|
|
74
|
+
- 命中的 Element 位于检测根节点内部(优先 `rootSelector`,缺失时为 `body`);
|
|
75
|
+
- 不是 root 自身、body 或 documentElement;
|
|
76
|
+
- `display` 不是 `none`;
|
|
77
|
+
- `visibility` 不是 `hidden`;
|
|
78
|
+
- opacity 大于 0。
|
|
79
|
+
|
|
80
|
+
空白比例为:
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
emptyCount / (9 - ignoredCount)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
有效采样点为 0 时不判白屏。
|
|
87
|
+
|
|
88
|
+
## Loading 与 Skeleton 忽略
|
|
89
|
+
|
|
90
|
+
以下选择器内置忽略:
|
|
91
|
+
|
|
92
|
+
- `[data-loading="true"]`
|
|
93
|
+
- `[aria-busy="true"]`
|
|
94
|
+
- `.loading`
|
|
95
|
+
- `.is-loading`
|
|
96
|
+
- `.spinner`
|
|
97
|
+
- `.skeleton`
|
|
98
|
+
- `.bk-loading`
|
|
99
|
+
|
|
100
|
+
命中元素本身或祖先匹配任一选择器时,该采样点不进入分母。业务配置会追加:
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
tracking: {
|
|
104
|
+
blankScreen: {
|
|
105
|
+
rootSelector: '#app',
|
|
106
|
+
ignoreSelectors: ['.global-loading-mask', '.order-skeleton'],
|
|
107
|
+
},
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
非法 CSS Selector 会在匹配时被忽略,不会中断检测。
|
|
112
|
+
|
|
113
|
+
## 根节点缺失
|
|
114
|
+
|
|
115
|
+
`document.querySelector(rootSelector)` 返回空时:
|
|
116
|
+
|
|
117
|
+
- 回退到 `body` 继续执行九点采样;
|
|
118
|
+
- `body` 中存在足够的可见内容时不报告白屏;
|
|
119
|
+
- 只有回退采样的空白比例仍达到阈值,才进入二次确认;
|
|
120
|
+
- `blank_screen.reason=missing_root`
|
|
121
|
+
- `blank_screen.root_found=false`
|
|
122
|
+
- empty ratio 和采样计数来自 `body` 的实际检测结果;
|
|
123
|
+
- 二次确认仍为空白才上报。
|
|
124
|
+
|
|
125
|
+
根节点缺失本身不再作为白屏证据,避免 Vue 等框架替换初始挂载容器后,在 SPA View 切换时持续误报。`missing_root` 表示配置根节点缺失且回退后的视口也符合白屏条件;排障时仍应检查 selector 是否稳定。
|
|
126
|
+
|
|
127
|
+
## 上报字段
|
|
128
|
+
|
|
129
|
+
判定成功后创建瞬时 INTERNAL Span `browser.blank_screen`:
|
|
130
|
+
|
|
131
|
+
| 字段 | 说明 |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| `blank_screen.reason` | `missing_root` / `empty_viewport` |
|
|
134
|
+
| `blank_screen.empty_ratio` | 空白有效点比例 |
|
|
135
|
+
| `blank_screen.sample_count` | 固定 9 |
|
|
136
|
+
| `blank_screen.valid_sample_count` | 9 - ignored |
|
|
137
|
+
| `blank_screen.empty_sample_count` | 空白点数 |
|
|
138
|
+
| `blank_screen.ignored_sample_count` | Loading/Skeleton 点数 |
|
|
139
|
+
| `blank_screen.root_selector` | 当前配置 |
|
|
140
|
+
| `blank_screen.root_found` | 根节点是否存在 |
|
|
141
|
+
| `blank_screen.center_element` | 中心点最上层元素的 `tag` 或 `tag#id` |
|
|
142
|
+
|
|
143
|
+
分类固定:
|
|
144
|
+
|
|
145
|
+
- `span_type=error`
|
|
146
|
+
- `outcome.type=error`
|
|
147
|
+
- `outcome.reason=blank_screen`
|
|
148
|
+
|
|
149
|
+
Span 自动关联 Session 和 View,但插件本身不写 Error exception Event,也不设置 OpenTelemetry Status ERROR。
|
|
150
|
+
|
|
151
|
+
## 每个 View 最多一次
|
|
152
|
+
|
|
153
|
+
一旦某 View 上报成功,后续 DOM 变化或恢复可见都不会重复上报。新 View 会重置状态,即使 URL 相同也可以产生新的白屏事件。
|
|
154
|
+
|
|
155
|
+
## 配置建议
|
|
156
|
+
|
|
157
|
+
```ts
|
|
158
|
+
new BkOpenTelemetry({
|
|
159
|
+
application: { name: 'order-web' },
|
|
160
|
+
transport: { endpoint: 'https://rum.example.com' },
|
|
161
|
+
tracking: {
|
|
162
|
+
blankScreen: {
|
|
163
|
+
rootSelector: '#app',
|
|
164
|
+
threshold: 0.8,
|
|
165
|
+
checkDelay: 3000,
|
|
166
|
+
confirmationDelay: 500,
|
|
167
|
+
ignoreSelectors: ['.global-loading', '.skeleton-page'],
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
- 首屏异步渲染较慢:增加 `checkDelay`。
|
|
174
|
+
- 页面切换有短暂卸载:增加 `confirmationDelay`。
|
|
175
|
+
- 页面布局天然稀疏:提高 `threshold`。
|
|
176
|
+
- Loading 长时间存在:不要简单忽略所有内容;否则有效点可能为 0,真正卡死也不会上报。
|
|
177
|
+
|
|
178
|
+
## 排查误报
|
|
179
|
+
|
|
180
|
+
按顺序检查:
|
|
181
|
+
|
|
182
|
+
1. `reason` 是否为 `missing_root`。
|
|
183
|
+
2. `rootSelector` 是否指向真正承载内容的稳定节点。
|
|
184
|
+
3. `valid_sample_count` 是否太少。
|
|
185
|
+
4. 页面是否用 Canvas、iframe 或背景图承载主要内容。
|
|
186
|
+
5. `center_element` 是否显示遮罩或布局容器。
|
|
187
|
+
6. 异步渲染是否晚于 `checkDelay + confirmationDelay`。
|
|
188
|
+
7. View Loading Activity 是否没有覆盖业务的异步过程。
|
|
189
|
+
|
|
190
|
+
完整字段见[遥测字段字典](./telemetry-reference.md#白屏字段)。
|