@blueking/open-telemetry 0.0.13 → 0.0.15
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 +170 -554
- package/dist/bk-rum.global.js +9 -9
- package/dist/bk-rum.global.js.map +1 -1
- package/dist/core/action-activity.d.ts +28 -0
- package/dist/core/config.d.ts +113 -93
- package/dist/core/page-activity.d.ts +14 -0
- package/dist/core/plugin.d.ts +23 -6
- package/dist/core/processor.d.ts +25 -4
- package/dist/core/request-timing.d.ts +5 -0
- package/dist/core/runtime-context.d.ts +51 -3
- package/dist/core/sampling.d.ts +5 -1
- package/dist/core/sdk.d.ts +29 -10
- package/dist/core/url.d.ts +4 -1
- package/dist/index.d.ts +12 -14
- package/dist/index.js +2184 -1175
- package/dist/index.js.map +1 -1
- package/dist/plugins/action.d.ts +6 -2
- package/dist/plugins/activity.d.ts +6 -0
- package/dist/plugins/blank-screen.d.ts +17 -0
- package/dist/plugins/common.d.ts +11 -3
- package/dist/plugins/device.d.ts +2 -0
- package/dist/plugins/long-task.d.ts +3 -12
- package/dist/plugins/page-view.d.ts +1 -0
- package/dist/plugins/request-body.d.ts +14 -0
- package/dist/plugins/resource.d.ts +17 -1
- package/dist/plugins/session-state.d.ts +18 -0
- package/dist/plugins/session.d.ts +4 -4
- package/dist/plugins/web-vitals.d.ts +74 -0
- package/dist/schema/attributes.d.ts +31 -10
- package/dist/schema/span.d.ts +4 -12
- package/package.json +3 -7
- package/skills/bk-rum-otele/SKILL.md +34 -33
- package/skills/bk-rum-otele/evals/evals.json +1 -1
- package/skills/bk-rum-otele/references/api.md +45 -13
- package/skills/bk-rum-otele/references/concepts.md +38 -112
- package/skills/bk-rum-otele/references/configuration.md +135 -228
- package/skills/bk-rum-otele/references/custom-plugin.md +8 -5
- package/skills/bk-rum-otele/references/data-model.md +13 -8
- package/skills/bk-rum-otele/references/framework-integration.md +25 -17
- package/skills/bk-rum-otele/references/getting-started.md +27 -87
- package/skills/bk-rum-otele/references/plugins.md +165 -99
- package/skills/bk-rum-otele/references/privacy.md +42 -33
- package/skills/bk-rum-otele/references/telemetry-reference.md +73 -44
- package/skills/bk-rum-otele/references/troubleshooting.md +72 -38
- package/dist/plugins/http-body.d.ts +0 -3
- package/dist/plugins/route-timing.d.ts +0 -2
|
@@ -2,51 +2,49 @@
|
|
|
2
2
|
|
|
3
3
|
# 插件总览
|
|
4
4
|
|
|
5
|
-
插件是 `@blueking/open-telemetry`
|
|
5
|
+
插件是 `@blueking/open-telemetry` 的能力边界。获得采集授权后,SDK 先建立 Device、Session、View 上下文,再启动请求采集和其他 RUM 插件。
|
|
6
6
|
|
|
7
7
|
## 默认插件组合
|
|
8
8
|
|
|
9
9
|
```ts
|
|
10
10
|
new BkOpenTelemetry({
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
userInteraction: true,
|
|
16
|
-
},
|
|
17
|
-
plugins: {
|
|
18
|
-
pageView: true,
|
|
11
|
+
application: { name: 'demo' },
|
|
12
|
+
transport: { endpoint: 'https://collector.example.com' },
|
|
13
|
+
tracking: {
|
|
14
|
+
request: true,
|
|
19
15
|
resource: true,
|
|
20
16
|
error: true,
|
|
21
17
|
webVitals: true,
|
|
22
18
|
blankScreen: true,
|
|
23
19
|
device: true,
|
|
24
|
-
session: true,
|
|
25
20
|
},
|
|
26
21
|
});
|
|
27
22
|
```
|
|
28
23
|
|
|
24
|
+
`session` 和 View 生命周期是不可关闭的 RUM 基础能力;`tracking.view` 只切换自动/手动策略及 loading time。
|
|
25
|
+
|
|
29
26
|
## 能力分类
|
|
30
27
|
|
|
31
28
|
| 分类 | 插件 | 主要信号 |
|
|
32
29
|
| ---------- | ----------------------------------------------------------------- | ----------------------------- |
|
|
33
|
-
| 基础上下文 |
|
|
34
|
-
| 性能体验 |
|
|
30
|
+
| 基础上下文 | Session、View、`device` | log、span、runtime attributes |
|
|
31
|
+
| 性能体验 | View Loading Time、`resource`、`webVitals`、`blankScreen`、`longTask` | span、metric、log |
|
|
35
32
|
| 错误安全 | `error`、`cspViolation` | span、log |
|
|
36
|
-
| 网络扩展 |
|
|
33
|
+
| 网络扩展 | request instrumentation、`websocket` | span、metric |
|
|
37
34
|
| 用户行为 | `action`、`reportAction()` | span |
|
|
38
35
|
|
|
39
36
|
## 插件启用规则
|
|
40
37
|
|
|
41
|
-
|
|
38
|
+
获得采集授权后,已启用插件会启动并维护页面生命周期;Session 级确定性 sampler 与 exporter processor 统一决定数据是否导出。未授权时不会 patch 浏览器 API、创建 Session 或启动插件;运行期可通过 `setTrackingConsent()` 切换。
|
|
42
39
|
|
|
43
40
|
```ts
|
|
44
41
|
new BkOpenTelemetry({
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
application: { name: 'demo' },
|
|
43
|
+
transport: { endpoint: 'https://collector.example.com' },
|
|
44
|
+
session: {
|
|
45
|
+
sampleRate: 0.1,
|
|
47
46
|
},
|
|
48
|
-
|
|
49
|
-
pageView: true,
|
|
47
|
+
tracking: {
|
|
50
48
|
error: true,
|
|
51
49
|
webVitals: true,
|
|
52
50
|
action: true,
|
|
@@ -57,8 +55,8 @@ new BkOpenTelemetry({
|
|
|
57
55
|
## 选择建议
|
|
58
56
|
|
|
59
57
|
- 首次接入:使用默认插件即可。
|
|
60
|
-
-
|
|
61
|
-
-
|
|
58
|
+
- 需要分析慢页面:View Loading Time 默认开启;再开启 `longTask` 获取主线程与脚本归因。
|
|
59
|
+
- 需要为请求增加业务字段或过滤请求:配置 `request.beforeSend` / `request.excludedUrls`。
|
|
62
60
|
- 需要分析 CSP:开启 `cspViolation`。
|
|
63
61
|
- 需要分析实时通信:开启 `websocket`,注意避免多个 SDK 实例重复 patch。
|
|
64
62
|
|
|
@@ -66,28 +64,30 @@ new BkOpenTelemetry({
|
|
|
66
64
|
|
|
67
65
|
基础插件负责建立 RUM 数据的关联上下文:哪个用户、哪个会话、哪个页面、哪个设备。
|
|
68
66
|
|
|
67
|
+
以下片段聚焦对应的 `session` 或 `tracking` 配置,实际初始化仍需提供必填的 `application.name` 和有效的 `transport` endpoint 配置。
|
|
68
|
+
|
|
69
69
|
## session
|
|
70
70
|
|
|
71
|
-
`session`
|
|
71
|
+
`session` 维护 `session.id`,并在会话开始和轮换时写入 log。它是所有 RUM 信号的关联边界,命中采样后始终开启,不能关闭。
|
|
72
72
|
|
|
73
73
|
默认规则:
|
|
74
74
|
|
|
75
|
-
- 不活跃超过
|
|
76
|
-
- 会话最长
|
|
75
|
+
- 不活跃超过 15 分钟后过期,下一次用户交互时轮换。
|
|
76
|
+
- 会话最长 4 小时。
|
|
77
77
|
- storage key 会按 endpoint host 隔离。
|
|
78
|
+
- 页面重新可见只续期有效会话,不会复活已过期会话。
|
|
79
|
+
- 跨 Tab 共享持久化状态,但已过期的 Tab 需要自身发生用户交互后才接管新会话。
|
|
78
80
|
|
|
79
81
|
```ts
|
|
80
82
|
new BkOpenTelemetry({
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
inactivityMs: 30 * 60 * 1000,
|
|
84
|
-
maxLifetimeMs: 24 * 60 * 60 * 1000,
|
|
85
|
-
storageKey: 'bk-rum-session',
|
|
86
|
-
},
|
|
83
|
+
session: {
|
|
84
|
+
storageKey: 'bk-rum-session',
|
|
87
85
|
},
|
|
88
86
|
});
|
|
89
87
|
```
|
|
90
88
|
|
|
89
|
+
超时固定为 15 分钟无活动、4 小时最长生命周期,不开放配置。过期会结束当前 View、刷新旧 session 的待发送数据,并丢弃此后所有不带有效 `session.id` 的 span/log/metric;下一次用户交互续期时,同时创建新的 Session 和 View。Metric 使用 DELTA temporality,避免累计值跨 session 重复上报。
|
|
90
|
+
|
|
91
91
|
**产出遥测**:log `session.start` / `session.rotate`,并维护运行时属性 `session.id`。
|
|
92
92
|
|
|
93
93
|
## device
|
|
@@ -96,8 +96,9 @@ new BkOpenTelemetry({
|
|
|
96
96
|
|
|
97
97
|
```ts
|
|
98
98
|
new BkOpenTelemetry({
|
|
99
|
-
|
|
99
|
+
tracking: {
|
|
100
100
|
device: {
|
|
101
|
+
persistentId: true,
|
|
101
102
|
storageKey: 'bk-rum-device',
|
|
102
103
|
},
|
|
103
104
|
},
|
|
@@ -106,56 +107,85 @@ new BkOpenTelemetry({
|
|
|
106
107
|
|
|
107
108
|
后续 span/log 会自动带上这些属性,便于按浏览器、系统、网络类型下钻。
|
|
108
109
|
|
|
109
|
-
|
|
110
|
+
`device.id` 默认只在当前 SDK 实例内稳定;只有显式设置 `persistentId: true` 才写入 localStorage,并按应用名隔离默认 storage key。
|
|
110
111
|
|
|
111
|
-
|
|
112
|
+
**产出遥测**:只写入运行时属性(如 `device.id`、`browser.name`、`os.name`、`device.type`、`network.effective_type`),本身不单独产生 span/metric/log。
|
|
112
113
|
|
|
113
|
-
|
|
114
|
+
## View
|
|
115
|
+
|
|
116
|
+
View 管理器负责初始页面、SPA 路由、手动 View、BFCache 和 Session 续期。它与 Session 一样不可关闭,并维护:
|
|
114
117
|
|
|
115
118
|
- `view.id`
|
|
119
|
+
- `view.name`
|
|
116
120
|
- `view.url`
|
|
117
121
|
- `view.url_path_group`
|
|
118
122
|
- `view.loading_type`
|
|
123
|
+
- `view.loading_time`
|
|
119
124
|
|
|
120
125
|
```ts
|
|
121
126
|
new BkOpenTelemetry({
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
127
|
+
tracking: {
|
|
128
|
+
view: {
|
|
129
|
+
tracking: 'auto',
|
|
130
|
+
loadingTime: true,
|
|
131
|
+
excludedActivityUrls: [/\/events\/stream$/],
|
|
132
|
+
getPathGroup: url => {
|
|
133
|
+
const { pathname } = new URL(url, window.location.href);
|
|
134
|
+
return pathname.replace(/\/\d+/g, '/:id');
|
|
135
|
+
},
|
|
126
136
|
},
|
|
127
137
|
},
|
|
128
|
-
plugins: {
|
|
129
|
-
pageView: true,
|
|
130
|
-
},
|
|
131
138
|
});
|
|
132
139
|
```
|
|
133
140
|
|
|
134
|
-
|
|
141
|
+
自动模式只在 pathname 或非锚点 hash path 变化时切换 View;query-only 和页内锚点变化不会切换。手动模式使用 `view.tracking: 'manual'`,并调用 `startView({ name, url, attributes })`。
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
const bkOT = new BkOpenTelemetry({
|
|
145
|
+
application: { name: 'order-web' },
|
|
146
|
+
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
147
|
+
tracking: { view: { tracking: 'manual' } },
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
bkOT.startView({
|
|
151
|
+
name: '订单详情',
|
|
152
|
+
url: window.location.href,
|
|
153
|
+
attributes: { 'biz.owner': 'order-team' },
|
|
154
|
+
});
|
|
155
|
+
bkOT.setViewName('订单详情-只读');
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`view.id` 始终由 SDK 生成,`attributes` 不能覆盖 Session/View 等保留字段。普通 span/log 必须同时带有 `session.id` 和 `view.id` 才会进入导出链路;metric 只保留 `view.url_path_group` 等低基数维度,不携带唯一 `view.id`。手动模式在首次 `startView()` 前不会导出普通 RUM 数据。
|
|
159
|
+
|
|
160
|
+
View Loading Time 默认开启:初始加载取 `loadEventEnd` 与页面活动结束时间的较大值,SPA 路由取 View 创建到页面活动结束的耗时。请求、静态资源和 DOM 变更都属于页面活动,连续 100ms 无活动视为稳定。长轮询或埋点请求应配置到 `view.excludedActivityUrls`;业务也可在真正渲染完成时调用 `setViewLoadingTime()` 覆盖自动结果。
|
|
161
|
+
|
|
162
|
+
**产出遥测**:长 span `browser.view`(包含 `view.loading_time`)与 body 为 `browser.view` 的 create/update/final Snapshot Log,metric `browser.view.loading_time`,并维护 `view.*` 运行时属性。
|
|
135
163
|
|
|
136
164
|
## action
|
|
137
165
|
|
|
138
|
-
`action`
|
|
166
|
+
`action` 插件默认开启。它自动监听 click,观察交互后的请求、DOM 变更、资源、错误和长任务,在页面活动稳定后生成一个 `action` span。
|
|
139
167
|
|
|
140
168
|
**产出遥测**:span `action.<type>`(如 `action.click`,`span_type=action`)。`reportAction()` 走同一套字段。
|
|
141
169
|
|
|
142
170
|
```ts
|
|
143
171
|
new BkOpenTelemetry({
|
|
144
|
-
|
|
172
|
+
tracking: {
|
|
145
173
|
action: {
|
|
146
|
-
|
|
174
|
+
actionNameAttribute: 'data-bk-action-name',
|
|
175
|
+
maxDuration: 10000,
|
|
176
|
+
nameCollection: 'explicit',
|
|
147
177
|
},
|
|
148
178
|
},
|
|
149
179
|
});
|
|
150
180
|
```
|
|
151
181
|
|
|
182
|
+
自动命名默认只读取 `data-bk-action-name`、`aria-label`、`title` 等显式或无障碍名称,不读取任意文本内容。如确实需要文本命名,可显式设置 `nameCollection: 'text'`,并自行评估隐私风险。
|
|
183
|
+
|
|
152
184
|
对关键业务动作,推荐使用 `reportAction()` 显式上报,字段更稳定。
|
|
153
185
|
|
|
154
186
|
```ts
|
|
155
187
|
bkOT.reportAction({
|
|
156
|
-
|
|
157
|
-
targetTag: 'button',
|
|
158
|
-
targetText: '立即支付',
|
|
188
|
+
name: '立即支付',
|
|
159
189
|
attributes: {
|
|
160
190
|
'biz.order_id': '202605270001',
|
|
161
191
|
},
|
|
@@ -166,31 +196,51 @@ bkOT.reportAction({
|
|
|
166
196
|
|
|
167
197
|
体验类插件关注页面加载、资源、核心 Web 指标、空白屏、主线程阻塞和 SPA 路由切换。
|
|
168
198
|
|
|
199
|
+
以下片段聚焦 `tracking` 配置,实际初始化仍需提供必填的 `application.name` 和有效的 `transport` endpoint 配置。
|
|
200
|
+
|
|
169
201
|
## resource
|
|
170
202
|
|
|
171
203
|
`resource` 插件默认开启,基于 PerformanceObserver 采集静态资源加载 span。
|
|
172
204
|
|
|
173
205
|
```ts
|
|
174
206
|
new BkOpenTelemetry({
|
|
175
|
-
|
|
207
|
+
tracking: {
|
|
176
208
|
resource: true,
|
|
177
209
|
},
|
|
178
210
|
});
|
|
179
211
|
```
|
|
180
212
|
|
|
181
|
-
常见字段包括 `initiator_type`、`transfer_size`、`
|
|
213
|
+
常见字段包括 `initiator_type`、`transfer_size`、`resource.protocol`、`target_domain`、`target_path_template`。当 Resource Timing 数据可用时,还会上报:
|
|
214
|
+
|
|
215
|
+
- `resource.redirect.*`、`resource.dns.*`、`resource.connect.*`、`resource.ssl.*`
|
|
216
|
+
- `resource.first_byte.*`、`resource.download.*`、`resource.worker.*`
|
|
217
|
+
- `resource.delivery_type`、`resource.render_blocking_status`
|
|
218
|
+
|
|
219
|
+
每个网络阶段同时包含相对资源开始时刻的 `start` 与阶段 `duration`,单位均为 ms。跨域资源没有返回 `Timing-Allow-Origin` 时,浏览器不会暴露完整阶段数据,SDK 会保留资源总耗时,但不生成不可信的阶段字段。
|
|
182
220
|
|
|
183
221
|
**产出遥测**:span `browser.resource`(`span_type=resource`)。
|
|
184
222
|
|
|
223
|
+
## action 与挫败信号
|
|
224
|
+
|
|
225
|
+
`action` 默认开启。它观察点击后的请求、DOM 变更、静态资源、错误和长任务,在活动稳定后计算 `action.loading_time` 和子事件数量。
|
|
226
|
+
|
|
227
|
+
自动点击还会判断三类挫败信号:
|
|
228
|
+
|
|
229
|
+
- `rage_click`:1 秒内在同一元素 100px 范围内连续点击至少三次;滚动或文本选择会中断判定。三次点击合并为一条 action。
|
|
230
|
+
- `dead_click`:点击后没有页面活动、输入、滚动或文本选择;文本输入、链接、select、textarea、canvas、contenteditable 等无法可靠判断的元素会排除。
|
|
231
|
+
- `error_click`:点击活动窗口内产生前端错误。
|
|
232
|
+
|
|
233
|
+
信号写入 `action.frustration.type`(string[])和 `action.frustration.count`。为了完成连续点击判断,action span 最多延迟 1 秒创建;`action.id` 只在真实页面活动窗口内挂到关联事件上,不会因为这个上报等待期延长。
|
|
234
|
+
|
|
185
235
|
## webVitals
|
|
186
236
|
|
|
187
|
-
`webVitals` 插件默认开启,采集 CLS、FCP、INP、LCP、TTFB
|
|
237
|
+
`webVitals` 插件默认开启,采集 CLS、FCP、INP、LCP、TTFB。FCP/LCP/TTFB 按指标发生时刻归属 View,CLS 使用每个 View 独立的 1 秒间隔/5 秒窗口,INP 使用候选交互的近似 p98,而不是简单最大值。它会同时产生 metric 和 span:metric 用于低基数聚合,span 用于通过 `session.id`、`view.id` 定位具体页面和归因信息。
|
|
188
238
|
|
|
189
239
|
**产出遥测**:metric `browser.web_vital.cls`(unit `1`)、`browser.web_vital.duration`(unit `ms`,FCP/INP/LCP/TTFB 共用)+ span `browser.web_vital`(`span_type=vital`,含 attribution 归因)。
|
|
190
240
|
|
|
191
241
|
```ts
|
|
192
242
|
new BkOpenTelemetry({
|
|
193
|
-
|
|
243
|
+
tracking: {
|
|
194
244
|
webVitals: true,
|
|
195
245
|
},
|
|
196
246
|
});
|
|
@@ -198,14 +248,15 @@ new BkOpenTelemetry({
|
|
|
198
248
|
|
|
199
249
|
## blankScreen
|
|
200
250
|
|
|
201
|
-
`blankScreen`
|
|
251
|
+
`blankScreen` 插件默认开启。它会针对每个 View 等待页面活动稳定后执行九点分层采样;只有两次连续检测都超过阈值才上报。View 切换或页面隐藏会取消旧检测,恢复可见后重新调度。
|
|
202
252
|
|
|
203
253
|
```ts
|
|
204
254
|
new BkOpenTelemetry({
|
|
205
|
-
|
|
255
|
+
tracking: {
|
|
206
256
|
blankScreen: {
|
|
207
257
|
rootSelector: '#app',
|
|
208
|
-
checkDelay:
|
|
258
|
+
checkDelay: 1000,
|
|
259
|
+
confirmationDelay: 200,
|
|
209
260
|
threshold: 0.8,
|
|
210
261
|
ignoreSelectors: ['.global-loading', '.skeleton'],
|
|
211
262
|
},
|
|
@@ -213,55 +264,62 @@ new BkOpenTelemetry({
|
|
|
213
264
|
});
|
|
214
265
|
```
|
|
215
266
|
|
|
216
|
-
SPA 应用建议配置 `rootSelector
|
|
267
|
+
SPA 应用建议配置 `rootSelector`。根节点在确认阶段仍不存在时会以 `missing_root` 原因上报;loading 和骨架屏样本不进入空白比例分母。
|
|
217
268
|
|
|
218
269
|
**产出遥测**(仅判定为白屏时):metric `browser.blank_screen.count` + error span `browser.blank_screen`(`span_type=error`)。
|
|
219
270
|
|
|
220
271
|
## longTask
|
|
221
272
|
|
|
222
|
-
`longTask`
|
|
273
|
+
`longTask` 插件默认关闭。开启后优先通过 Long Animation Frames API 采集主线程阻塞;浏览器不支持时自动回退到 Long Tasks API,两种入口不会重复观察。
|
|
223
274
|
|
|
224
275
|
```ts
|
|
225
276
|
new BkOpenTelemetry({
|
|
226
|
-
|
|
277
|
+
tracking: {
|
|
227
278
|
longTask: {
|
|
228
|
-
threshold:
|
|
279
|
+
threshold: 50,
|
|
280
|
+
warningThreshold: 100,
|
|
229
281
|
},
|
|
230
282
|
},
|
|
231
283
|
});
|
|
232
284
|
```
|
|
233
285
|
|
|
234
|
-
|
|
286
|
+
LoAF 会补充 blocking duration、render/style/layout 阶段、最重脚本归因,并把每个脚本作为 `long_task.script` Span Event。初始化阶段的 buffered entries 延迟到后续宏任务批量处理,避免 SDK 启动自身制造阻塞。不支持 LoAF 和 Long Tasks API 的浏览器会跳过插件。
|
|
235
287
|
|
|
236
|
-
**产出遥测**:metric `browser.long_task.count` / `browser.long_task.duration`(unit `ms`)+ span `browser.long_task`(`span_type=longtask`)。
|
|
288
|
+
**产出遥测**:metric `browser.long_task.count` / `browser.long_task.duration` / `browser.long_task.blocking_duration`(unit `ms`)+ span `browser.long_task`(`span_type=longtask`)。
|
|
237
289
|
|
|
238
|
-
##
|
|
290
|
+
## View Loading Time
|
|
239
291
|
|
|
240
|
-
|
|
292
|
+
View Loading Time 属于 View 管理器,默认启用,基于页面活动结束时间计算。
|
|
241
293
|
|
|
242
|
-
|
|
294
|
+
自动计算规则:
|
|
295
|
+
|
|
296
|
+
- 初始加载:取 `navigationStart → loadEventEnd` 与 `navigationStart → 页面活动结束` 的较大值。
|
|
297
|
+
- SPA 路由:取 View 创建到页面活动结束的耗时。
|
|
298
|
+
- Fetch/XHR 进行中、静态资源完成和 DOM Mutation 都属于活动;连续 100ms 无活动视为稳定。
|
|
299
|
+
- SDK 自身上报、`view.excludedActivityUrls` 命中的请求,以及 `data-bk-excluded-activity-mutations` 节点下的 DOM 变更不参与计算。
|
|
243
300
|
|
|
244
301
|
```ts
|
|
245
302
|
new BkOpenTelemetry({
|
|
246
|
-
|
|
247
|
-
|
|
303
|
+
tracking: {
|
|
304
|
+
view: {
|
|
305
|
+
loadingTime: true,
|
|
306
|
+
excludedActivityUrls: [/\/events\/stream$/, '/analytics'],
|
|
307
|
+
},
|
|
248
308
|
},
|
|
249
309
|
});
|
|
250
310
|
```
|
|
251
311
|
|
|
252
|
-
|
|
312
|
+
如果业务有明确的异步渲染完成点,可覆盖自动结果:
|
|
253
313
|
|
|
254
314
|
```ts
|
|
255
|
-
const span = bkOT.startSpan('custom.route_data_ready', {
|
|
256
|
-
'route.name': 'alarm-detail',
|
|
257
|
-
});
|
|
258
|
-
|
|
259
315
|
await loadAlarmDetail();
|
|
260
|
-
|
|
316
|
+
bkOT.setViewLoadingTime();
|
|
261
317
|
```
|
|
262
318
|
|
|
263
319
|
# 错误与安全插件
|
|
264
320
|
|
|
321
|
+
以下片段聚焦 `tracking` 配置,实际初始化仍需提供必填的 `application.name` 和有效的 `transport` endpoint 配置。
|
|
322
|
+
|
|
265
323
|
错误类插件帮助定位 JavaScript 异常、Promise 异常、资源加载失败、CSP 违规和空白屏等问题。
|
|
266
324
|
|
|
267
325
|
## error
|
|
@@ -278,7 +336,7 @@ span.end();
|
|
|
278
336
|
|
|
279
337
|
```ts
|
|
280
338
|
new BkOpenTelemetry({
|
|
281
|
-
|
|
339
|
+
tracking: {
|
|
282
340
|
error: {
|
|
283
341
|
maxPerWindow: 5,
|
|
284
342
|
windowMs: 60_000,
|
|
@@ -313,7 +371,7 @@ try {
|
|
|
313
371
|
|
|
314
372
|
```ts
|
|
315
373
|
new BkOpenTelemetry({
|
|
316
|
-
|
|
374
|
+
tracking: {
|
|
317
375
|
cspViolation: true,
|
|
318
376
|
},
|
|
319
377
|
});
|
|
@@ -331,7 +389,7 @@ Content-Security-Policy: default-src 'self'; report-uri /csp-report
|
|
|
331
389
|
|
|
332
390
|
```ts
|
|
333
391
|
new BkOpenTelemetry({
|
|
334
|
-
|
|
392
|
+
tracking: {
|
|
335
393
|
blankScreen: {
|
|
336
394
|
rootSelector: '#app',
|
|
337
395
|
},
|
|
@@ -345,63 +403,71 @@ new BkOpenTelemetry({
|
|
|
345
403
|
|
|
346
404
|
# 网络与扩展插件
|
|
347
405
|
|
|
348
|
-
|
|
406
|
+
以下片段聚焦 `tracking` 配置,实际初始化仍需提供必填的 `application.name` 和有效的 `transport` endpoint 配置。
|
|
349
407
|
|
|
350
|
-
|
|
408
|
+
网络类能力覆盖 Fetch/XHR Resource 和 WebSocket。由于这些能力会 patch 浏览器原生 API,微前端或多 SDK 实例场景需要特别注意避免重复初始化。
|
|
351
409
|
|
|
352
|
-
|
|
410
|
+
## request instrumentation
|
|
353
411
|
|
|
354
|
-
|
|
412
|
+
request 默认开启,使用 OpenTelemetry 官方 Fetch/XHR instrumentation 生成一个请求 Resource Span,并对 URL 做脱敏。静态资源观察器会跳过 Fetch/XHR timing,因此同一请求不会重复上报。
|
|
413
|
+
|
|
414
|
+
**产出遥测**:Resource Span(如 `HTTP GET`,`span_type=resource`、`resource.type=fetch|xhr`),带 `resource.url`、`resource.method`、`resource.status_code`、网络阶段 span events 和请求/响应大小。
|
|
355
415
|
|
|
356
416
|
```ts
|
|
357
417
|
new BkOpenTelemetry({
|
|
358
418
|
privacy: {
|
|
359
419
|
redactUrl: url => url.replace(/\/orders\/\d+/g, '/orders/:id'),
|
|
360
420
|
},
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
421
|
+
tracking: {
|
|
422
|
+
request: {
|
|
423
|
+
excludedUrls: [/\/health(?:\?|$)/],
|
|
424
|
+
beforeSend: event => {
|
|
425
|
+
event.attributes['business.module'] = 'order';
|
|
426
|
+
return true;
|
|
427
|
+
},
|
|
428
|
+
},
|
|
364
429
|
},
|
|
365
430
|
});
|
|
366
431
|
```
|
|
367
432
|
|
|
368
433
|
### traceparent 透传(前后端 trace 串联)
|
|
369
434
|
|
|
370
|
-
|
|
435
|
+
只有命中 `allowedTracingUrls` 的请求才会注入 W3C `traceparent`。同源请求也不会隐式注入:
|
|
371
436
|
|
|
372
437
|
```ts
|
|
373
438
|
new BkOpenTelemetry({
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
439
|
+
tracking: {
|
|
440
|
+
request: {
|
|
441
|
+
allowedTracingUrls: ['api.example.com', /\.internal\.com\//],
|
|
442
|
+
},
|
|
377
443
|
},
|
|
378
444
|
});
|
|
379
445
|
```
|
|
380
446
|
|
|
381
|
-
向跨域服务注入自定义头会触发 CORS 预检,目标服务需在 `Access-Control-Allow-Headers` 中放行 `traceparent`(以及按需的 `tracestate
|
|
447
|
+
向跨域服务注入自定义头会触发 CORS 预检,目标服务需在 `Access-Control-Allow-Headers` 中放行 `traceparent`(以及按需的 `tracestate`)。
|
|
382
448
|
|
|
383
|
-
|
|
449
|
+
### 错误请求 body
|
|
384
450
|
|
|
385
|
-
`
|
|
386
|
-
|
|
387
|
-
**产出遥测**:log `HTTP request completed`(成功,INFO)/ `HTTP request completed with error`(错误,ERROR,带 `http.request.body`、`http.response.body`、`http_body.*.truncated`)。
|
|
451
|
+
body 默认不采集。显式配置 `request.body` 后,默认只采集 4xx/5xx、状态码 0 或网络异常请求的请求体和响应体,并生成关联原 Trace/Span 的 `browser.request.body` 诊断 Log:
|
|
388
452
|
|
|
389
453
|
```ts
|
|
390
454
|
new BkOpenTelemetry({
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
}
|
|
398
|
-
|
|
455
|
+
tracking: {
|
|
456
|
+
request: {
|
|
457
|
+
body: {
|
|
458
|
+
capture: 'errors',
|
|
459
|
+
maxSize: 10 * 1024,
|
|
460
|
+
allowedContentTypes: ['application/json', /^text\//],
|
|
461
|
+
redact: ({ body, kind }) =>
|
|
462
|
+
kind === 'request' ? body.replace(/("(?:password|token)"\s*:\s*)"[^"]*"/g, '$1"***"') : body,
|
|
399
463
|
},
|
|
400
464
|
},
|
|
401
465
|
},
|
|
402
466
|
});
|
|
403
467
|
```
|
|
404
468
|
|
|
469
|
+
Fetch Request 会在官方 request hook 中先 clone,Response 也通过 clone 限量读取,不消费业务侧原始流;XHR request body 复用官方 send patch 记录,不再增加一层原型 patch。不支持文本化的 FormData、ArrayBuffer 和二进制响应会跳过。
|
|
470
|
+
|
|
405
471
|
## websocket
|
|
406
472
|
|
|
407
473
|
`websocket` 默认关闭。开启后会用 Proxy 包装 WebSocket,采集连接、消息大小、错误和关闭事件。
|
|
@@ -410,7 +476,7 @@ new BkOpenTelemetry({
|
|
|
410
476
|
|
|
411
477
|
```ts
|
|
412
478
|
new BkOpenTelemetry({
|
|
413
|
-
|
|
479
|
+
tracking: {
|
|
414
480
|
websocket: true,
|
|
415
481
|
},
|
|
416
482
|
});
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# 隐私与公共属性
|
|
4
4
|
|
|
5
|
-
RUM 数据常包含 URL、用户标识、接口路径、错误信息和业务属性。SDK 不会替接入方猜测哪些字段敏感,因此提供 `privacy` 和 `
|
|
5
|
+
RUM 数据常包含 URL、用户标识、接口路径、错误信息和业务属性。SDK 不会替接入方猜测哪些字段敏感,因此提供 `privacy` 和 `context` 两类入口,由业务显式控制。
|
|
6
|
+
|
|
7
|
+
以下片段聚焦对应配置,实际初始化仍需提供必填的 `application.name` 和有效的 `transport` endpoint 配置。
|
|
6
8
|
|
|
7
9
|
## URL 脱敏
|
|
8
10
|
|
|
@@ -40,7 +42,7 @@ new BkOpenTelemetry({
|
|
|
40
42
|
|
|
41
43
|
## 公共属性
|
|
42
44
|
|
|
43
|
-
`attributes` 提供四类 hook:
|
|
45
|
+
`context.attributes` 提供四类 hook:
|
|
44
46
|
|
|
45
47
|
- `page`:页面、动作、错误等需要页面上下文的事件。
|
|
46
48
|
- `metric`:metric 维度,必须避免高基数字段。
|
|
@@ -49,20 +51,22 @@ new BkOpenTelemetry({
|
|
|
49
51
|
|
|
50
52
|
```ts
|
|
51
53
|
new BkOpenTelemetry({
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
context: {
|
|
55
|
+
attributes: {
|
|
56
|
+
page: () => ({
|
|
57
|
+
'biz.space_id': window.__BK_SPACE_ID__,
|
|
58
|
+
'biz.project_id': window.__BK_PROJECT_ID__,
|
|
59
|
+
}),
|
|
60
|
+
metric: () => ({
|
|
61
|
+
'biz.app_code': 'bk-monitor',
|
|
62
|
+
}),
|
|
63
|
+
error: () => ({
|
|
64
|
+
'biz.release_channel': window.__BK_RELEASE_CHANNEL__,
|
|
65
|
+
}),
|
|
66
|
+
custom: () => ({
|
|
67
|
+
'biz.scene': 'checkout',
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
66
70
|
},
|
|
67
71
|
});
|
|
68
72
|
```
|
|
@@ -73,26 +77,29 @@ new BkOpenTelemetry({
|
|
|
73
77
|
|
|
74
78
|
```ts
|
|
75
79
|
new BkOpenTelemetry({
|
|
76
|
-
|
|
77
|
-
|
|
80
|
+
context: {
|
|
81
|
+
user: {
|
|
82
|
+
id: hashUserId(window.__BK_USER__?.id),
|
|
83
|
+
},
|
|
78
84
|
},
|
|
79
85
|
});
|
|
80
86
|
```
|
|
81
87
|
|
|
82
|
-
##
|
|
88
|
+
## 请求数据边界
|
|
83
89
|
|
|
84
|
-
`
|
|
90
|
+
SDK 默认不采集请求/响应 body。显式开启 `request.body` 时必须提供 `redact`,建议保持默认的 `capture: 'errors'`,并限制 Content-Type 和最大长度。
|
|
85
91
|
|
|
86
92
|
```ts
|
|
87
93
|
new BkOpenTelemetry({
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
94
|
+
tracking: {
|
|
95
|
+
request: {
|
|
96
|
+
body: {
|
|
97
|
+
capture: 'errors',
|
|
98
|
+
maxSize: 4096,
|
|
99
|
+
allowedContentTypes: ['application/json'],
|
|
100
|
+
redact: ({ body }) => {
|
|
93
101
|
return body.replace(/"password"\s*:\s*"[^"]+"/g, '"password":"***"');
|
|
94
|
-
}
|
|
95
|
-
return type === 'request' ? '[request body redacted]' : body;
|
|
102
|
+
},
|
|
96
103
|
},
|
|
97
104
|
},
|
|
98
105
|
},
|
|
@@ -105,12 +112,14 @@ new BkOpenTelemetry({
|
|
|
105
112
|
|
|
106
113
|
```ts
|
|
107
114
|
new BkOpenTelemetry({
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
tracking: {
|
|
116
|
+
view: {
|
|
117
|
+
getPathGroup: url => {
|
|
118
|
+
const { pathname } = new URL(url, window.location.href);
|
|
119
|
+
return pathname
|
|
120
|
+
.replace(/\/\d+/g, '/:id')
|
|
121
|
+
.replace(/\/[0-9a-f]{24}/g, '/:objectId');
|
|
122
|
+
},
|
|
114
123
|
},
|
|
115
124
|
},
|
|
116
125
|
});
|