@blueking/open-telemetry 0.0.10 → 0.0.12
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/dist/bk-rum.global.js +2 -2
- package/dist/bk-rum.global.js.map +1 -1
- package/dist/index.js +471 -471
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
- package/skills/bk-rum-otele/SKILL.md +108 -0
- package/skills/bk-rum-otele/evals/evals.json +29 -0
- package/skills/bk-rum-otele/references/api.md +228 -0
- package/skills/bk-rum-otele/references/concepts.md +227 -0
- package/skills/bk-rum-otele/references/configuration.md +318 -0
- package/skills/bk-rum-otele/references/custom-plugin.md +158 -0
- package/skills/bk-rum-otele/references/data-model.md +122 -0
- package/skills/bk-rum-otele/references/framework-integration.md +149 -0
- package/skills/bk-rum-otele/references/getting-started.md +179 -0
- package/skills/bk-rum-otele/references/plugins.md +451 -0
- package/skills/bk-rum-otele/references/privacy.md +117 -0
- package/skills/bk-rum-otele/references/telemetry-reference.md +228 -0
- package/skills/bk-rum-otele/references/troubleshooting.md +239 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 插件总览
|
|
4
|
+
|
|
5
|
+
插件是 `@blueking/open-telemetry` 的能力边界。SDK 内部先启动官方 instrumentation,再按采样结果启动 RUM 插件。
|
|
6
|
+
|
|
7
|
+
## 默认插件组合
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
new BkOpenTelemetry({
|
|
11
|
+
instrumentations: {
|
|
12
|
+
documentLoad: true,
|
|
13
|
+
fetch: true,
|
|
14
|
+
xhr: true,
|
|
15
|
+
userInteraction: true,
|
|
16
|
+
},
|
|
17
|
+
plugins: {
|
|
18
|
+
pageView: true,
|
|
19
|
+
resource: true,
|
|
20
|
+
error: true,
|
|
21
|
+
webVitals: true,
|
|
22
|
+
blankScreen: true,
|
|
23
|
+
device: true,
|
|
24
|
+
session: true,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 能力分类
|
|
30
|
+
|
|
31
|
+
| 分类 | 插件 | 主要信号 |
|
|
32
|
+
| ---------- | ----------------------------------------------------------------- | ----------------------------- |
|
|
33
|
+
| 基础上下文 | `session`、`device`、`pageView` | log、span、runtime attributes |
|
|
34
|
+
| 性能体验 | `resource`、`webVitals`、`blankScreen`、`longTask`、`routeTiming` | span、metric、log |
|
|
35
|
+
| 错误安全 | `error`、`cspViolation` | span、log |
|
|
36
|
+
| 网络扩展 | `httpBody`、`websocket` | log、span、metric |
|
|
37
|
+
| 用户行为 | `action`、`reportAction()` | span |
|
|
38
|
+
|
|
39
|
+
## 插件启用规则
|
|
40
|
+
|
|
41
|
+
RUM 插件只在会话命中采样时启动。未命中采样时,SDK 仍可注册核心 provider,但不会启动主动产生数据的插件。
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
new BkOpenTelemetry({
|
|
45
|
+
sampling: {
|
|
46
|
+
rate: 0.1,
|
|
47
|
+
},
|
|
48
|
+
plugins: {
|
|
49
|
+
pageView: true,
|
|
50
|
+
error: true,
|
|
51
|
+
webVitals: true,
|
|
52
|
+
action: true,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 选择建议
|
|
58
|
+
|
|
59
|
+
- 首次接入:使用默认插件即可。
|
|
60
|
+
- 需要分析慢页面:开启 `longTask` 和 `routeTiming`。
|
|
61
|
+
- 需要分析接口错误体:开启 `httpBody`,并配置 `redact`。
|
|
62
|
+
- 需要分析 CSP:开启 `cspViolation`。
|
|
63
|
+
- 需要分析实时通信:开启 `websocket`,注意避免多个 SDK 实例重复 patch。
|
|
64
|
+
|
|
65
|
+
# 基础采集插件
|
|
66
|
+
|
|
67
|
+
基础插件负责建立 RUM 数据的关联上下文:哪个用户、哪个会话、哪个页面、哪个设备。
|
|
68
|
+
|
|
69
|
+
## session
|
|
70
|
+
|
|
71
|
+
`session` 插件维护 `session.id`,并在会话开始和轮换时写入 log。默认开启。
|
|
72
|
+
|
|
73
|
+
默认规则:
|
|
74
|
+
|
|
75
|
+
- 不活跃超过 30 分钟后轮换。
|
|
76
|
+
- 会话最长 24 小时。
|
|
77
|
+
- storage key 会按 endpoint host 隔离。
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
new BkOpenTelemetry({
|
|
81
|
+
plugins: {
|
|
82
|
+
session: {
|
|
83
|
+
inactivityMs: 30 * 60 * 1000,
|
|
84
|
+
maxLifetimeMs: 24 * 60 * 60 * 1000,
|
|
85
|
+
storageKey: 'bk-rum-session',
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**产出遥测**:log `session.start` / `session.rotate`,并维护运行时属性 `session.id`。
|
|
92
|
+
|
|
93
|
+
## device
|
|
94
|
+
|
|
95
|
+
`device` 插件写入设备、浏览器、系统、视口、网络等运行时属性。默认开启。
|
|
96
|
+
|
|
97
|
+
```ts
|
|
98
|
+
new BkOpenTelemetry({
|
|
99
|
+
plugins: {
|
|
100
|
+
device: {
|
|
101
|
+
storageKey: 'bk-rum-device',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
后续 span/log 会自动带上这些属性,便于按浏览器、系统、网络类型下钻。
|
|
108
|
+
|
|
109
|
+
**产出遥测**:只写入运行时属性(如 `device.id`、`browser_name`、`os_name`、`device_type`、`network.effective_type`),本身不单独产生 span/metric/log。
|
|
110
|
+
|
|
111
|
+
## pageView
|
|
112
|
+
|
|
113
|
+
`pageView` 插件负责初始页面和 SPA 路由 view。它会维护:
|
|
114
|
+
|
|
115
|
+
- `view.id`
|
|
116
|
+
- `view.url`
|
|
117
|
+
- `view.url_path_group`
|
|
118
|
+
- `view.loading_type`
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
new BkOpenTelemetry({
|
|
122
|
+
route: {
|
|
123
|
+
getPathGroup: url => {
|
|
124
|
+
const { pathname } = new URL(url, window.location.href);
|
|
125
|
+
return pathname.replace(/\/\d+/g, '/:id');
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
plugins: {
|
|
129
|
+
pageView: true,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**产出遥测**:span `browser.view`(有持续时间)与 `browser.page_view`(0ms 瞬时),并维护 `view.*` 运行时属性。
|
|
135
|
+
|
|
136
|
+
## action
|
|
137
|
+
|
|
138
|
+
`action` 插件默认关闭。开启后可以自动监听 click、submit、keydown 等事件,并生成 `action` span。
|
|
139
|
+
|
|
140
|
+
**产出遥测**:span `action.<type>`(如 `action.click`,`span_type=action`)。`reportAction()` 走同一套字段。
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
new BkOpenTelemetry({
|
|
144
|
+
plugins: {
|
|
145
|
+
action: {
|
|
146
|
+
eventNames: ['click', 'submit', 'keydown'],
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
对关键业务动作,推荐使用 `reportAction()` 显式上报,字段更稳定。
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
bkOT.reportAction({
|
|
156
|
+
type: 'click',
|
|
157
|
+
targetTag: 'button',
|
|
158
|
+
targetText: '立即支付',
|
|
159
|
+
attributes: {
|
|
160
|
+
'biz.order_id': '202605270001',
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
# 体验与性能插件
|
|
166
|
+
|
|
167
|
+
体验类插件关注页面加载、资源、核心 Web 指标、空白屏、主线程阻塞和 SPA 路由切换。
|
|
168
|
+
|
|
169
|
+
## resource
|
|
170
|
+
|
|
171
|
+
`resource` 插件默认开启,基于 PerformanceObserver 采集静态资源加载 span。
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
new BkOpenTelemetry({
|
|
175
|
+
plugins: {
|
|
176
|
+
resource: true,
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
常见字段包括 `initiator_type`、`transfer_size`、`next_hop_protocol`、`target_domain`、`target_path_template`。
|
|
182
|
+
|
|
183
|
+
**产出遥测**:span `browser.resource`(`span_type=resource`)。
|
|
184
|
+
|
|
185
|
+
## webVitals
|
|
186
|
+
|
|
187
|
+
`webVitals` 插件默认开启,采集 CLS、FCP、INP、LCP、TTFB。它会同时产生 metric 和 span:metric 用于聚合,span 用于定位具体页面和归因信息。
|
|
188
|
+
|
|
189
|
+
**产出遥测**: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
|
+
|
|
191
|
+
```ts
|
|
192
|
+
new BkOpenTelemetry({
|
|
193
|
+
plugins: {
|
|
194
|
+
webVitals: true,
|
|
195
|
+
},
|
|
196
|
+
});
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## blankScreen
|
|
200
|
+
|
|
201
|
+
`blankScreen` 插件默认开启。它会在页面加载后一段时间检查视口采样点,如果空白比例超过阈值,则上报空白屏结果。
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
new BkOpenTelemetry({
|
|
205
|
+
plugins: {
|
|
206
|
+
blankScreen: {
|
|
207
|
+
rootSelector: '#app',
|
|
208
|
+
checkDelay: 3000,
|
|
209
|
+
threshold: 0.8,
|
|
210
|
+
ignoreSelectors: ['.global-loading', '.skeleton'],
|
|
211
|
+
},
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
SPA 应用建议配置 `rootSelector`,否则默认以整个页面判断,容易受外层布局影响。
|
|
217
|
+
|
|
218
|
+
**产出遥测**(仅判定为白屏时):metric `browser.blank_screen.count` + error span `browser.blank_screen`(`span_type=error`)。
|
|
219
|
+
|
|
220
|
+
## longTask
|
|
221
|
+
|
|
222
|
+
`longTask` 插件默认关闭。开启后通过 Long Task API 采集主线程阻塞。
|
|
223
|
+
|
|
224
|
+
```ts
|
|
225
|
+
new BkOpenTelemetry({
|
|
226
|
+
plugins: {
|
|
227
|
+
longTask: {
|
|
228
|
+
threshold: 80,
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Firefox 对 Long Task API 支持有限,不支持时插件会跳过。
|
|
235
|
+
|
|
236
|
+
**产出遥测**:metric `browser.long_task.count` / `browser.long_task.duration`(unit `ms`)+ span `browser.long_task`(`span_type=longtask`)。
|
|
237
|
+
|
|
238
|
+
## routeTiming
|
|
239
|
+
|
|
240
|
+
`routeTiming` 插件默认关闭。它会监听 SPA 路由变化,并通过双 `requestAnimationFrame` 和 `setTimeout` 估算路由切换到渲染稳定的耗时。
|
|
241
|
+
|
|
242
|
+
**产出遥测**:metric `browser.route_change.duration`(unit `ms`)+ span `browser.route_change`(`span_type=route`)。tab 切到后台时数据会被丢弃,避免污染 P99。
|
|
243
|
+
|
|
244
|
+
```ts
|
|
245
|
+
new BkOpenTelemetry({
|
|
246
|
+
plugins: {
|
|
247
|
+
routeTiming: true,
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
如果业务路由有异步数据加载,建议结合自定义事件补充更精确的业务完成点。
|
|
253
|
+
|
|
254
|
+
```ts
|
|
255
|
+
const span = bkOT.startSpan('custom.route_data_ready', {
|
|
256
|
+
'route.name': 'alarm-detail',
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
await loadAlarmDetail();
|
|
260
|
+
span.end();
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
# 错误与安全插件
|
|
264
|
+
|
|
265
|
+
错误类插件帮助定位 JavaScript 异常、Promise 异常、资源加载失败、CSP 违规和空白屏等问题。
|
|
266
|
+
|
|
267
|
+
## error
|
|
268
|
+
|
|
269
|
+
`error` 插件默认开启,监听:
|
|
270
|
+
|
|
271
|
+
- `window.error`
|
|
272
|
+
- `unhandledrejection`
|
|
273
|
+
- 资源加载错误
|
|
274
|
+
|
|
275
|
+
插件会生成 error span,并使用 fingerprint 做窗口内节流,避免相同错误在短时间内刷屏。
|
|
276
|
+
|
|
277
|
+
**产出遥测**:span `browser.error`(JS 错误)、`browser.unhandledrejection`(Promise 异常)、`browser.resource_error`(资源加载失败),均为 `span_type=error`,带 `exception.*`、`error.source`、`error.window_count`。
|
|
278
|
+
|
|
279
|
+
```ts
|
|
280
|
+
new BkOpenTelemetry({
|
|
281
|
+
plugins: {
|
|
282
|
+
error: {
|
|
283
|
+
maxPerWindow: 5,
|
|
284
|
+
windowMs: 60_000,
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## 手动上报错误事件
|
|
291
|
+
|
|
292
|
+
业务捕获到错误后,可以通过 `reportCustomEvent()` 上报。
|
|
293
|
+
|
|
294
|
+
```ts
|
|
295
|
+
try {
|
|
296
|
+
await submitOrder();
|
|
297
|
+
} catch (error) {
|
|
298
|
+
bkOT.reportCustomEvent({
|
|
299
|
+
name: 'submit_order_failed',
|
|
300
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
301
|
+
attributes: {
|
|
302
|
+
'biz.order_id': '202605270001',
|
|
303
|
+
},
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## cspViolation
|
|
309
|
+
|
|
310
|
+
`cspViolation` 插件默认关闭。开启后监听浏览器 `securitypolicyviolation` 事件,并写入 error span。
|
|
311
|
+
|
|
312
|
+
**产出遥测**:span `csp.violation`(`span_type=error`),带 `csp.*` 字段;完整策略 `csp.original_policy` 仅在节流窗口首条携带。
|
|
313
|
+
|
|
314
|
+
```ts
|
|
315
|
+
new BkOpenTelemetry({
|
|
316
|
+
plugins: {
|
|
317
|
+
cspViolation: true,
|
|
318
|
+
},
|
|
319
|
+
});
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
建议与站点 CSP 响应头一起使用。
|
|
323
|
+
|
|
324
|
+
```http
|
|
325
|
+
Content-Security-Policy: default-src 'self'; report-uri /csp-report
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
## blankScreen 与错误排查
|
|
329
|
+
|
|
330
|
+
空白屏通常是错误、资源失败或首屏渲染失败的结果。建议同时开启 `blankScreen`、`error`、`resource`。
|
|
331
|
+
|
|
332
|
+
```ts
|
|
333
|
+
new BkOpenTelemetry({
|
|
334
|
+
plugins: {
|
|
335
|
+
blankScreen: {
|
|
336
|
+
rootSelector: '#app',
|
|
337
|
+
},
|
|
338
|
+
error: true,
|
|
339
|
+
resource: true,
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
通过 `view.id` 和 `session.id` 可以把空白屏、JS 错误、资源失败关联到同一次页面访问。
|
|
345
|
+
|
|
346
|
+
# 网络与扩展插件
|
|
347
|
+
|
|
348
|
+
网络类能力覆盖 fetch/xhr、HTTP body 错误路径和 WebSocket。由于这些能力会 patch 浏览器原生 API,微前端或多 SDK 实例场景需要特别注意避免重复初始化。
|
|
349
|
+
|
|
350
|
+
## fetch / xhr instrumentation
|
|
351
|
+
|
|
352
|
+
fetch 和 xhr 默认开启,会生成 HTTP span,并对 URL 做脱敏处理。
|
|
353
|
+
|
|
354
|
+
**产出遥测**:HTTP span(span 名由官方探针决定,如 `HTTP GET`,`span_type=http`),带 `http.request.method`、`http.response.status_code`、`url.full`、`status_class` 等。
|
|
355
|
+
|
|
356
|
+
```ts
|
|
357
|
+
new BkOpenTelemetry({
|
|
358
|
+
privacy: {
|
|
359
|
+
redactUrl: url => url.replace(/\/orders\/\d+/g, '/orders/:id'),
|
|
360
|
+
},
|
|
361
|
+
instrumentations: {
|
|
362
|
+
fetch: true,
|
|
363
|
+
xhr: true,
|
|
364
|
+
},
|
|
365
|
+
});
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
### traceparent 透传(前后端 trace 串联)
|
|
369
|
+
|
|
370
|
+
fetch/xhr 请求会自动给**同源**请求注入 W3C `traceparent` 请求头(内含 OpenTelemetry traceId)。后台 API 通常是跨域的,需要通过 `propagateTraceHeaderUrls` 显式纳入注入范围:
|
|
371
|
+
|
|
372
|
+
```ts
|
|
373
|
+
new BkOpenTelemetry({
|
|
374
|
+
instrumentations: {
|
|
375
|
+
// 字符串子串 / 正则 / 数组 / (url) => boolean / 'all' 均可
|
|
376
|
+
propagateTraceHeaderUrls: ['api.example.com', /\.internal\.com\//],
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
向跨域服务注入自定义头会触发 CORS 预检,目标服务需在 `Access-Control-Allow-Headers` 中放行 `traceparent`(以及按需的 `tracestate`)。`propagateTraceHeaderUrls` 的完整取值(`'all'` / 字符串 / 正则 / 数组 / 函数)见[配置总览](./configuration.md#instrumentation-配置)。
|
|
382
|
+
|
|
383
|
+
## httpBody
|
|
384
|
+
|
|
385
|
+
`httpBody` 默认关闭。开启后只在错误路径采集请求/响应 body,适合排查接口错误,但必须配置脱敏策略。
|
|
386
|
+
|
|
387
|
+
**产出遥测**:log `HTTP request completed`(成功,INFO)/ `HTTP request completed with error`(错误,ERROR,带 `http.request.body`、`http.response.body`、`http_body.*.truncated`)。
|
|
388
|
+
|
|
389
|
+
```ts
|
|
390
|
+
new BkOpenTelemetry({
|
|
391
|
+
plugins: {
|
|
392
|
+
httpBody: {
|
|
393
|
+
maxBodySize: 10 * 1024,
|
|
394
|
+
redact: ({ body, status, type }) => {
|
|
395
|
+
if (status && status < 500) {
|
|
396
|
+
return '[body hidden for non-5xx error]';
|
|
397
|
+
}
|
|
398
|
+
return type === 'request' ? '[request body redacted]' : body;
|
|
399
|
+
},
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
## websocket
|
|
406
|
+
|
|
407
|
+
`websocket` 默认关闭。开启后会用 Proxy 包装 WebSocket,采集连接、消息大小、错误和关闭事件。
|
|
408
|
+
|
|
409
|
+
**产出遥测**:span `websocket.connect`(`span_type=custom`,仅建连阶段);metric `browser.websocket.message.count` / `.message.bytes` / `.error.count` / `.connect.duration`;log `websocket.error` / `websocket.close`。
|
|
410
|
+
|
|
411
|
+
```ts
|
|
412
|
+
new BkOpenTelemetry({
|
|
413
|
+
plugins: {
|
|
414
|
+
websocket: true,
|
|
415
|
+
},
|
|
416
|
+
});
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
业务发送消息时无需改造。
|
|
420
|
+
|
|
421
|
+
```ts
|
|
422
|
+
const socket = new WebSocket('wss://message.example.com/ws');
|
|
423
|
+
|
|
424
|
+
socket.addEventListener('open', () => {
|
|
425
|
+
socket.send(JSON.stringify({ type: 'ping' }));
|
|
426
|
+
});
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
## 自定义网络事件
|
|
430
|
+
|
|
431
|
+
如果业务已有请求封装,也可以在封装层补充更稳定的业务 span。
|
|
432
|
+
|
|
433
|
+
```ts
|
|
434
|
+
export const requestWithRum = async <T>(url: string, init?: RequestInit): Promise<T> => {
|
|
435
|
+
const span = bkOT.startSpan('custom.biz_request', {
|
|
436
|
+
'biz.request.url': url.replace(/\/\d+/g, '/:id'),
|
|
437
|
+
'biz.request.method': init?.method || 'GET',
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
try {
|
|
441
|
+
const response = await fetch(url, init);
|
|
442
|
+
span.setAttribute('http.response.status_code', response.status);
|
|
443
|
+
return response.json() as Promise<T>;
|
|
444
|
+
} catch (error) {
|
|
445
|
+
span.recordException(error as Error);
|
|
446
|
+
throw error;
|
|
447
|
+
} finally {
|
|
448
|
+
span.end();
|
|
449
|
+
}
|
|
450
|
+
};
|
|
451
|
+
```
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 隐私与公共属性
|
|
4
|
+
|
|
5
|
+
RUM 数据常包含 URL、用户标识、接口路径、错误信息和业务属性。SDK 不会替接入方猜测哪些字段敏感,因此提供 `privacy` 和 `attributes` 两类入口,由业务显式控制。
|
|
6
|
+
|
|
7
|
+
## URL 脱敏
|
|
8
|
+
|
|
9
|
+
`privacy.redactUrl` 会处理写入 attribute 的 URL 类字段。
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
new BkOpenTelemetry({
|
|
13
|
+
privacy: {
|
|
14
|
+
redactUrl: url =>
|
|
15
|
+
url
|
|
16
|
+
.replace(/([?&]token=)[^&]+/g, '$1***')
|
|
17
|
+
.replace(/([?&]bk_ticket=)[^&]+/g, '$1***')
|
|
18
|
+
.replace(/\/users\/[^/?#]+/g, '/users/:id'),
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 属性脱敏
|
|
24
|
+
|
|
25
|
+
`privacy.redactAttributes` 会在 SDK 自定义插件 emit 前过滤属性,适合删除 authorization、手机号、邮箱等字段。
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
new BkOpenTelemetry({
|
|
29
|
+
privacy: {
|
|
30
|
+
redactAttributes: attributes => {
|
|
31
|
+
const next = { ...attributes };
|
|
32
|
+
delete next['http.request.header.authorization'];
|
|
33
|
+
delete next['biz.mobile'];
|
|
34
|
+
delete next['biz.email'];
|
|
35
|
+
return next;
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 公共属性
|
|
42
|
+
|
|
43
|
+
`attributes` 提供四类 hook:
|
|
44
|
+
|
|
45
|
+
- `page`:页面、动作、错误等需要页面上下文的事件。
|
|
46
|
+
- `metric`:metric 维度,必须避免高基数字段。
|
|
47
|
+
- `error`:错误事件补充属性。
|
|
48
|
+
- `custom`:手动自定义事件补充属性。
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
new BkOpenTelemetry({
|
|
52
|
+
attributes: {
|
|
53
|
+
page: () => ({
|
|
54
|
+
'biz.space_id': window.__BK_SPACE_ID__,
|
|
55
|
+
'biz.project_id': window.__BK_PROJECT_ID__,
|
|
56
|
+
}),
|
|
57
|
+
metric: () => ({
|
|
58
|
+
'biz.app_code': 'bk-monitor',
|
|
59
|
+
}),
|
|
60
|
+
error: () => ({
|
|
61
|
+
'biz.release_channel': window.__BK_RELEASE_CHANNEL__,
|
|
62
|
+
}),
|
|
63
|
+
custom: () => ({
|
|
64
|
+
'biz.scene': 'checkout',
|
|
65
|
+
}),
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 用户标识
|
|
71
|
+
|
|
72
|
+
`user.id` 由接入方提供,SDK 原样透传,不 hash、不脱敏、不改写。如果业务要求 hash 或匿名化,应在传给 SDK 前完成。
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
new BkOpenTelemetry({
|
|
76
|
+
user: {
|
|
77
|
+
id: hashUserId(window.__BK_USER__?.id),
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## HTTP body 脱敏
|
|
83
|
+
|
|
84
|
+
`httpBody` 默认关闭。开启后只在错误路径采集请求/响应 body,并支持 `redact`。
|
|
85
|
+
|
|
86
|
+
```ts
|
|
87
|
+
new BkOpenTelemetry({
|
|
88
|
+
plugins: {
|
|
89
|
+
httpBody: {
|
|
90
|
+
maxBodySize: 4096,
|
|
91
|
+
redact: ({ body, contentType, type }) => {
|
|
92
|
+
if (contentType?.includes('application/json')) {
|
|
93
|
+
return body.replace(/"password"\s*:\s*"[^"]+"/g, '"password":"***"');
|
|
94
|
+
}
|
|
95
|
+
return type === 'request' ? '[request body redacted]' : body;
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## 低基数路由
|
|
103
|
+
|
|
104
|
+
路由模板会写入 `view.url_path_group` 和部分目标路径字段。推荐把动态 ID 替换成模板,避免指标维度爆炸。
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
new BkOpenTelemetry({
|
|
108
|
+
route: {
|
|
109
|
+
getPathGroup: url => {
|
|
110
|
+
const { pathname } = new URL(url, window.location.href);
|
|
111
|
+
return pathname
|
|
112
|
+
.replace(/\/\d+/g, '/:id')
|
|
113
|
+
.replace(/\/[0-9a-f]{24}/g, '/:objectId');
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
```
|