@blueking/open-telemetry 0.0.21 → 0.0.22
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 +11 -25
- package/dist/bk-rum.global.js +2 -12
- package/dist/bk-rum.global.js.map +1 -1
- package/dist/core/config.d.ts +10 -48
- package/dist/core/hash.d.ts +2 -0
- package/dist/core/plugin.d.ts +2 -7
- package/dist/core/processor.d.ts +0 -20
- package/dist/core/runtime-context.d.ts +1 -1
- package/dist/core/sdk.d.ts +2 -8
- package/dist/core/telemetry-attributes.d.ts +1 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1074 -1484
- package/dist/index.js.map +1 -1
- package/dist/plugins/common.d.ts +1 -1
- package/dist/plugins/csp-violation.d.ts +0 -8
- package/dist/plugins/device.d.ts +2 -2
- package/dist/plugins/error.d.ts +1 -5
- package/dist/plugins/long-task.d.ts +1 -3
- package/dist/plugins/resource.d.ts +1 -0
- package/dist/plugins/web-vitals.d.ts +2 -7
- package/dist/schema/attributes.d.ts +8 -10
- package/dist/schema/span.d.ts +2 -0
- package/package.json +1 -6
- package/skills/bk-rum-otele/SKILL.md +12 -14
- package/skills/bk-rum-otele/evals/evals.json +2 -2
- package/skills/bk-rum-otele/references/api.md +10 -22
- package/skills/bk-rum-otele/references/architecture.md +38 -118
- package/skills/bk-rum-otele/references/capabilities.md +26 -28
- package/skills/bk-rum-otele/references/concepts.md +14 -106
- package/skills/bk-rum-otele/references/configuration.md +28 -69
- package/skills/bk-rum-otele/references/custom-plugin.md +10 -13
- package/skills/bk-rum-otele/references/data-model.md +23 -95
- package/skills/bk-rum-otele/references/getting-started.md +1 -1
- package/skills/bk-rum-otele/references/plugins-basic.md +7 -7
- package/skills/bk-rum-otele/references/plugins-error-security.md +4 -7
- package/skills/bk-rum-otele/references/plugins-experience.md +8 -9
- package/skills/bk-rum-otele/references/plugins-network.md +19 -128
- package/skills/bk-rum-otele/references/plugins.md +3 -3
- package/skills/bk-rum-otele/references/privacy.md +4 -25
- package/skills/bk-rum-otele/references/telemetry-reference.md +49 -279
- package/skills/bk-rum-otele/references/transport-sampling.md +15 -50
- package/skills/bk-rum-otele/references/troubleshooting.md +7 -34
- package/dist/core/metric.d.ts +0 -2
- package/dist/core/signal.d.ts +0 -3
- package/dist/core/throttle.d.ts +0 -20
- package/dist/plugins/request-body.d.ts +0 -15
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
## session
|
|
10
10
|
|
|
11
|
-
`session` 维护 `session.id
|
|
11
|
+
`session` 维护 `session.id`,并在会话开始、轮换和结束时写入 `browser.session` 生命周期 Span。它是所有 RUM 事件的关联边界,获得 Consent 后始终开启,不能关闭;是否导出由 Session 采样决定。
|
|
12
12
|
|
|
13
13
|
默认规则:
|
|
14
14
|
|
|
@@ -26,9 +26,9 @@ new BkOpenTelemetry({
|
|
|
26
26
|
});
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
超时固定为 15 分钟无活动、4 小时最长生命周期,不开放配置。过期会结束当前 View、刷新旧
|
|
29
|
+
超时固定为 15 分钟无活动、4 小时最长生命周期,不开放配置。过期会结束当前 View、刷新旧 Session 的待发送数据,并丢弃此后所有不带有效 `session.id` 的 Span;下一次用户交互续期时,同时创建新的 Session 和 View。
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
**产出遥测**:`browser.session` start/rotate/end Span,并维护 `session.id`、`session.start_time`、`session.type`。
|
|
32
32
|
|
|
33
33
|
## device
|
|
34
34
|
|
|
@@ -45,11 +45,11 @@ new BkOpenTelemetry({
|
|
|
45
45
|
});
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
稳定的浏览器、系统和硬件能力写入 Resource;设备 ID、视口和网络信息保留为运行时属性,后续 Span 会自动携带。
|
|
49
49
|
|
|
50
50
|
`device.id` 默认只在当前 SDK 实例内稳定;只有显式设置 `persistentId: true` 才写入 localStorage,并按应用名隔离默认 storage key。
|
|
51
51
|
|
|
52
|
-
**产出遥测**:写入 Resource 属性(如 `browser.name`、`os.name`、`device.type`、`device.memory_gib`)和运行时属性(如 `device.id`、`browser.viewport.*`、`network.effective_type`),本身不单独产生
|
|
52
|
+
**产出遥测**:写入 Resource 属性(如 `browser.name`、`os.name`、`device.type`、`device.memory_gib`)和运行时属性(如 `device.id`、`browser.viewport.*`、`network.effective_type`),本身不单独产生 Span。
|
|
53
53
|
|
|
54
54
|
## View
|
|
55
55
|
|
|
@@ -97,11 +97,11 @@ bkOT.startView({
|
|
|
97
97
|
bkOT.setViewName('订单详情-只读');
|
|
98
98
|
```
|
|
99
99
|
|
|
100
|
-
`view.id` 始终由 SDK 生成,`attributes` 不能覆盖 Session/View 等保留字段。普通
|
|
100
|
+
`view.id` 始终由 SDK 生成,`attributes` 不能覆盖 Session/View 等保留字段。普通 Span 必须同时带有 `session.id` 和 `view.id` 才会进入导出链路。手动模式在首次 `startView()` 前不会导出普通 RUM 数据。
|
|
101
101
|
|
|
102
102
|
View Loading Time 默认开启:初始加载取 `loadEventEnd` 与页面活动结束时间的较大值,SPA 路由取 View 创建到页面活动结束的耗时。请求、静态资源和 DOM 变更都属于页面活动,连续 100ms 无活动视为稳定。长轮询或埋点请求应配置到 `view.excludedActivityUrls`;业务也可在真正渲染完成时调用 `setViewLoadingTime()` 覆盖自动结果。
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
**产出遥测**:`browser.view` start/update/end 原始生命周期 Span。每次事件携带 `view.version`,Loading Time 就绪或 View 名称变化时产生 update。
|
|
105
105
|
|
|
106
106
|
## action
|
|
107
107
|
|
|
@@ -14,17 +14,14 @@
|
|
|
14
14
|
- `unhandledrejection`
|
|
15
15
|
- 资源加载错误
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
插件对每条原始错误生成 error Span,不在浏览器做错误指纹、计数或节流。
|
|
18
18
|
|
|
19
|
-
**产出遥测**:
|
|
19
|
+
**产出遥测**:Span `browser.error`(JS 错误)、`browser.unhandledrejection`(Promise 异常)、`browser.resource_error`(资源加载失败),均为 `span_type=error`,带原始 `error.message`、`error.source` 和标准 exception event。
|
|
20
20
|
|
|
21
21
|
```ts
|
|
22
22
|
new BkOpenTelemetry({
|
|
23
23
|
tracking: {
|
|
24
|
-
error:
|
|
25
|
-
maxPerWindow: 5,
|
|
26
|
-
windowMs: 60_000,
|
|
27
|
-
},
|
|
24
|
+
error: true,
|
|
28
25
|
},
|
|
29
26
|
});
|
|
30
27
|
```
|
|
@@ -51,7 +48,7 @@ try {
|
|
|
51
48
|
|
|
52
49
|
`cspViolation` 插件默认关闭。开启后监听浏览器 `securitypolicyviolation` 事件,并写入 error span。
|
|
53
50
|
|
|
54
|
-
**产出遥测**:
|
|
51
|
+
**产出遥测**:Span `csp.violation`(`span_type=error`),每条都携带浏览器提供的 `csp.*` 字段和 `csp.original_policy`。
|
|
55
52
|
|
|
56
53
|
```ts
|
|
57
54
|
new BkOpenTelemetry({
|
|
@@ -30,21 +30,21 @@ new BkOpenTelemetry({
|
|
|
30
30
|
|
|
31
31
|
## action 与挫败信号
|
|
32
32
|
|
|
33
|
-
`action` 默认开启。它观察点击后的请求、DOM 变更、静态资源、错误和长任务,在活动稳定后计算 `action.loading_time
|
|
33
|
+
`action` 默认开启。它观察点击后的请求、DOM 变更、静态资源、错误和长任务,在活动稳定后计算 `action.loading_time`,不在浏览器统计子事件数量。
|
|
34
34
|
|
|
35
35
|
自动点击还会判断三类挫败信号:
|
|
36
36
|
|
|
37
|
-
- `rage_click`:1 秒内在同一元素 100px
|
|
37
|
+
- `rage_click`:1 秒内在同一元素 100px 范围内连续点击至少三次;滚动或文本选择会中断判定。每次原始点击都保留独立 Action Span,并附加 rage 语义。
|
|
38
38
|
- `dead_click`:点击后没有页面活动、输入、滚动或文本选择;文本输入、链接、select、textarea、canvas、contenteditable 等无法可靠判断的元素会排除。
|
|
39
39
|
- `error_click`:点击活动窗口内产生前端错误。
|
|
40
40
|
|
|
41
|
-
信号写入 `action.frustration.type`(string[]
|
|
41
|
+
信号写入 `action.frustration.type`(string[]),不生成挫败计数。为了完成连续点击判断,Action Span 最多延迟 1 秒创建;`action.id` 只在真实页面活动窗口内挂到关联事件上,不会因为这个上报等待期延长。
|
|
42
42
|
|
|
43
43
|
## webVitals
|
|
44
44
|
|
|
45
|
-
`webVitals` 插件默认开启,采集 CLS、FCP、INP、LCP、TTFB。FCP/LCP/TTFB 按指标发生时刻归属 View,CLS 使用每个 View 独立的 1 秒间隔/5 秒窗口,INP 使用候选交互的近似 p98
|
|
45
|
+
`webVitals` 插件默认开启,采集 CLS、FCP、INP、LCP、TTFB。FCP/LCP/TTFB 按指标发生时刻归属 View,CLS 使用每个 View 独立的 1 秒间隔/5 秒窗口,INP 使用候选交互的近似 p98,而不是简单最大值。它只产生带 `session.id`、`view.id` 和 attribution 的原始 Span,聚合由服务端完成。
|
|
46
46
|
|
|
47
|
-
**产出遥测**:
|
|
47
|
+
**产出遥测**:span `browser.web_vital`(`span_type=vital`,含 attribution 归因)。
|
|
48
48
|
|
|
49
49
|
```ts
|
|
50
50
|
new BkOpenTelemetry({
|
|
@@ -74,7 +74,7 @@ new BkOpenTelemetry({
|
|
|
74
74
|
|
|
75
75
|
SPA 应用建议配置 `rootSelector`。根节点在确认阶段仍不存在时会以 `missing_root` 原因上报;loading 和骨架屏样本不进入空白比例分母。
|
|
76
76
|
|
|
77
|
-
**产出遥测**(仅判定为白屏时):
|
|
77
|
+
**产出遥测**(仅判定为白屏时):error span `browser.blank_screen`(`span_type=error`)。
|
|
78
78
|
|
|
79
79
|
## longTask
|
|
80
80
|
|
|
@@ -85,15 +85,14 @@ new BkOpenTelemetry({
|
|
|
85
85
|
tracking: {
|
|
86
86
|
longTask: {
|
|
87
87
|
threshold: 50,
|
|
88
|
-
warningThreshold: 100,
|
|
89
88
|
},
|
|
90
89
|
},
|
|
91
90
|
});
|
|
92
91
|
```
|
|
93
92
|
|
|
94
|
-
LoAF
|
|
93
|
+
LoAF 会补充浏览器原生的 blocking duration、render/style/layout 阶段、最重脚本归因,并把每个脚本作为 `long_task.script` Span Event。回退到 Long Tasks API 时不伪造 blocking duration,每条浏览器 attribution 都作为 `long_task.attribution` Span Event 保留。初始化阶段的 buffered entries 延迟到后续宏任务批量处理,避免 SDK 启动自身制造阻塞。不支持 LoAF 和 Long Tasks API 的浏览器会跳过插件。
|
|
95
94
|
|
|
96
|
-
**产出遥测**:
|
|
95
|
+
**产出遥测**:span `browser.long_task`(`span_type=longtask`),计数与耗时分布由服务端派生。
|
|
97
96
|
|
|
98
97
|
## View Loading Time
|
|
99
98
|
|
|
@@ -1,141 +1,32 @@
|
|
|
1
1
|
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# 网络扩展
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Fetch/XHR
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
`tracking.request` 默认开启。SDK 使用单层 patch 创建 `browser.resource` CLIENT Span:
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
1. `excludedUrls` 命中时完全跳过。
|
|
10
|
+
2. 创建带 `event.id/event.timestamp/event.type=resource` 的请求 Span。
|
|
11
|
+
3. `allowedTracingUrls` 命中时注入 W3C Trace Context。
|
|
12
|
+
4. 请求完成后补充状态、错误和 Resource Timing。
|
|
13
|
+
5. `request.beforeSend` 可修改属性或返回 `false` 丢弃 Span。
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
SDK 不读取或上报请求/响应 Body。
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
## 静态资源
|
|
14
18
|
|
|
15
|
-
|
|
19
|
+
`tracking.resource` 默认开启,使用 Resource PerformanceObserver 创建 `browser.resource` Span。Fetch/XHR 的 PerformanceEntry 只回填已有请求 Span,不重复上报。
|
|
16
20
|
|
|
17
|
-
|
|
18
|
-
2. 创建名为 `browser.resource`、kind 为 `CLIENT` 的 Span。
|
|
19
|
-
3. 记录 View/Action 页面活动;`view.excludedActivityUrls` 可只排除活动等待,不丢弃 Span。
|
|
20
|
-
4. `allowedTracingUrls` 命中且 Trace 开启时进入传播 Header 注入分支;默认 W3C propagator 注入 `traceparent`,宿主已有全局 propagator 时以实际实现为准。
|
|
21
|
-
5. 请求完成后写入状态、结果、错误和 `request.beforeSend` 属性。
|
|
22
|
-
6. 等待最多 200ms 匹配 Resource Timing,把网络阶段补回同一 Span。
|
|
23
|
-
7. 如已配置 Body 且 Log 开启,异步生成关联原 `trace.id` / `span.id` 的诊断 Log。
|
|
21
|
+
## WebSocket
|
|
24
22
|
|
|
25
|
-
|
|
23
|
+
`tracking.websocket` 默认关闭。启用后通过 Proxy 保持原生静态常量、`instanceof` 和子类行为,只监听连接生命周期:
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
tracking: {
|
|
32
|
-
request: {
|
|
33
|
-
excludedUrls: [/\/health(?:\?|$)/],
|
|
34
|
-
beforeSend(event, context) {
|
|
35
|
-
event.attributes['request.transport'] = context.type;
|
|
36
|
-
return event.resource.statusCode !== 404;
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
```
|
|
25
|
+
- `browser.websocket` `event.phase=connect`
|
|
26
|
+
- `browser.websocket` `event.phase=open`
|
|
27
|
+
- `browser.websocket` `event.phase=error`
|
|
28
|
+
- `browser.websocket` `event.phase=close`
|
|
42
29
|
|
|
43
|
-
`
|
|
30
|
+
同一连接通过 `websocket.connection.id` 关联。SDK 不包裹 `send()`,不采集消息内容、数量或字节数,也不在客户端聚合建连时长。
|
|
44
31
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
| 配置 | 是否创建 Span | 是否计入 View/Action 活动 | 适用场景 |
|
|
48
|
-
| --- | --- | --- | --- |
|
|
49
|
-
| `tracking.request.excludedUrls` | 否 | 否 | 探活、埋点、无需采集的请求 |
|
|
50
|
-
| `tracking.view.excludedActivityUrls` | 是 | 否 | 长轮询、SSE、流式接口,不应阻塞页面稳定 |
|
|
51
|
-
|
|
52
|
-
两者都支持字符串包含、RegExp 和函数 matcher。
|
|
53
|
-
|
|
54
|
-
### traceparent 注入条件
|
|
55
|
-
|
|
56
|
-
只有 `allowedTracingUrls` 命中且 Trace 信号开启时才进入传播 Header 注入分支;默认 W3C propagator 会注入 `traceparent`,同源请求也不隐式放行。
|
|
57
|
-
|
|
58
|
-
```ts
|
|
59
|
-
tracking: {
|
|
60
|
-
request: {
|
|
61
|
-
allowedTracingUrls: [
|
|
62
|
-
url => new URL(url).origin === 'https://api.example.com',
|
|
63
|
-
/^https:\/\/[^/]+\.internal\.example\.com\//,
|
|
64
|
-
],
|
|
65
|
-
},
|
|
66
|
-
}
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
字符串 matcher 使用包含匹配,例如 `'https://api.example.com'` 也会命中 `https://api.example.com.evil/`,不适合作为安全 origin 边界。需要精确控制时使用上面的 URL-aware 函数或带 `/` 边界的正则。
|
|
70
|
-
|
|
71
|
-
跨域注入会触发 CORS 预检,目标服务必须在 `Access-Control-Allow-Headers` 放行实际使用的 Trace Header。SDK 成功注册自己的默认 W3C propagator 时通常注入 `traceparent`,并可能透传已有 `tracestate`;如果宿主已注册全局 propagator,实际 Header 由该 propagator 决定,可能还包含其他传播字段。
|
|
72
|
-
|
|
73
|
-
### Resource Timing
|
|
74
|
-
|
|
75
|
-
Fetch/XHR 与静态资源共用一个 Resource PerformanceObserver:
|
|
76
|
-
|
|
77
|
-
- `initiatorType=fetch|xmlhttprequest` 的 entry 只用于匹配请求 Span,不再创建静态资源 Span。
|
|
78
|
-
- 通过 URL 与时间窗口匹配;找不到 entry 时请求 Span 仍正常结束。
|
|
79
|
-
- 跨域接口缺少 `Timing-Allow-Origin` 时,浏览器不会提供完整阶段字段。
|
|
80
|
-
- Trace 关闭时跳过 timing 等待,因为不存在可导出的请求 Span。
|
|
81
|
-
|
|
82
|
-
### 请求/响应 Body
|
|
83
|
-
|
|
84
|
-
Body 默认关闭。开启时必须提供 `redact`,默认只采集状态未知、0 或 `>=400` 的请求:
|
|
85
|
-
|
|
86
|
-
```ts
|
|
87
|
-
tracking: {
|
|
88
|
-
request: {
|
|
89
|
-
body: {
|
|
90
|
-
capture: 'errors',
|
|
91
|
-
maxSize: 10 * 1024,
|
|
92
|
-
allowedContentTypes: ['application/json', /^text\//],
|
|
93
|
-
redact({ body, kind }) {
|
|
94
|
-
if (kind === 'request') {
|
|
95
|
-
return body.replace(/("(?:password|token)"\s*:\s*)"[^"]*"/g, '$1"***"');
|
|
96
|
-
}
|
|
97
|
-
return body;
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
**产出遥测**:Log `browser.request.body`,错误请求为 ERROR,`capture: 'all'` 下成功请求为 INFO。
|
|
105
|
-
|
|
106
|
-
- Fetch 的 Request/Response 通过 clone 限量读取,不消费业务原始流。
|
|
107
|
-
- XHR 支持文本与 JSON 响应。
|
|
108
|
-
- string、URLSearchParams、Blob 等可文本化请求可读取;FormData、ArrayBuffer 和二进制响应跳过。
|
|
109
|
-
- 默认 Content-Type:`text/*`、包含 `json`、`application/x-www-form-urlencoded`、`application/graphql`。
|
|
110
|
-
- `redact` 返回 `undefined` 时只跳过当前 request 或 response Body。
|
|
111
|
-
- Log 信号关闭时 Body 配置不生效。
|
|
112
|
-
|
|
113
|
-
## websocket
|
|
114
|
-
|
|
115
|
-
`tracking.websocket` 默认关闭。开启后用 Proxy 包装 `window.WebSocket`,保留静态常量、`instanceof` 与子类化行为。
|
|
116
|
-
|
|
117
|
-
```ts
|
|
118
|
-
new BkOpenTelemetry({
|
|
119
|
-
application: { name: 'realtime-demo' },
|
|
120
|
-
transport: { endpoint: 'https://collector.example.com' },
|
|
121
|
-
tracking: { websocket: true },
|
|
122
|
-
});
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
**产出遥测**:
|
|
126
|
-
|
|
127
|
-
- Span `websocket.connect`:只覆盖建连阶段,成功/失败后结束,不用长 Span 覆盖整个连接。
|
|
128
|
-
- Metric `browser.websocket.message.count`、`browser.websocket.message.bytes`:按 `in/out` 分组。
|
|
129
|
-
- Metric `browser.websocket.error.count`:按 `connect/runtime` 分组。
|
|
130
|
-
- Metric `browser.websocket.connect.duration`:只记录成功建连耗时。
|
|
131
|
-
- Log `websocket.error`、`websocket.close`:记录错误阶段和关闭详情。
|
|
132
|
-
|
|
133
|
-
插件不读取消息内容,只计算数量和字节数。超过 64KB 的字符串使用 `string.length` 近似字节数,避免编码开销;CJK/emoji 会低估。相同 URL 的错误 Log 在 60 秒内最多 5 条,Error Counter 不受节流影响。
|
|
134
|
-
|
|
135
|
-
SDK shutdown 后新建连接不再采集;已存在连接上的包装会保留,但回调立即返回。若其他库后来替换了 `window.WebSocket`,shutdown 不会强行覆盖后来者。
|
|
136
|
-
|
|
137
|
-
## 与额外 instrumentation 的关系
|
|
138
|
-
|
|
139
|
-
`extensions.instrumentations` 适合已有标准 OpenTelemetry instrumentation。不要再注册覆盖 Fetch/XHR 或用户交互的 instrumentation,否则可能与内置 request/action 重复 patch、重复 Span。
|
|
140
|
-
|
|
141
|
-
需要 Session/View、`emitLog()`、页面活动或 RUM 归一字段时,优先写自定义插件,见[内置采集与扩展](./concepts.md)与[自定义插件](./custom-plugin.md)。
|
|
32
|
+
需要 Session/View 关联或活动总线时使用自定义 RUM 插件和 `context.startSpan()`;标准第三方采集可通过 OpenTelemetry instrumentation 扩展。
|
|
@@ -28,10 +28,10 @@ new BkOpenTelemetry({
|
|
|
28
28
|
|
|
29
29
|
| 分类 | 插件 | 主要信号 |
|
|
30
30
|
| ---------- | ----------------------------------------------------------------- | ----------------------------- |
|
|
31
|
-
| 基础上下文 | Session、View、`device` |
|
|
32
|
-
| 性能体验 | View Loading Time、`resource`、`webVitals`、`blankScreen`、`longTask` | span
|
|
31
|
+
| 基础上下文 | Session、View、`device` | span、runtime attributes |
|
|
32
|
+
| 性能体验 | View Loading Time、`resource`、`webVitals`、`blankScreen`、`longTask` | span |
|
|
33
33
|
| 错误安全 | `error`、`cspViolation` | span |
|
|
34
|
-
| 网络扩展 | Fetch/XHR request patch、`websocket` | span
|
|
34
|
+
| 网络扩展 | Fetch/XHR request patch、`websocket` | span |
|
|
35
35
|
| 用户行为 | `action`、`reportAction()` | span |
|
|
36
36
|
|
|
37
37
|
## 插件启用规则
|
|
@@ -24,7 +24,7 @@ new BkOpenTelemetry({
|
|
|
24
24
|
|
|
25
25
|
## 属性脱敏
|
|
26
26
|
|
|
27
|
-
`privacy.redactAttributes` 会处理 Resource、通过 SDK `startSpan()
|
|
27
|
+
`privacy.redactAttributes` 会处理 Resource、通过 SDK `startSpan()` 以及内置插件显式应用的属性,适合删除 authorization、手机号、邮箱等字段。Resource 在 SDK 构造时处理一次,后续不会动态更新。
|
|
28
28
|
|
|
29
29
|
```ts
|
|
30
30
|
new BkOpenTelemetry({
|
|
@@ -40,16 +40,15 @@ new BkOpenTelemetry({
|
|
|
40
40
|
});
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
第三方 OpenTelemetry instrumentation 自己生成的 Span 属性不保证经过这一构造路径。需要统一清理第三方 Span 时,在 `tracking.beforeSend`
|
|
43
|
+
第三方 OpenTelemetry instrumentation 自己生成的 Span 属性不保证经过这一构造路径。需要统一清理第三方 Span 时,在 `tracking.beforeSend` 做最终兜底。
|
|
44
44
|
|
|
45
45
|
`redactAttributes` 应返回完整可用的属性对象,不要只返回被修改的单个字段。
|
|
46
46
|
|
|
47
47
|
## 公共属性
|
|
48
48
|
|
|
49
|
-
`context.attributes`
|
|
49
|
+
`context.attributes` 提供三类 hook:
|
|
50
50
|
|
|
51
51
|
- `page`:页面、动作、错误等需要页面上下文的事件。
|
|
52
|
-
- `metric`:metric 维度,必须避免高基数字段。
|
|
53
52
|
- `error`:错误事件补充属性。
|
|
54
53
|
- `custom`:手动自定义事件补充属性。
|
|
55
54
|
|
|
@@ -61,9 +60,6 @@ new BkOpenTelemetry({
|
|
|
61
60
|
'biz.space_id': window.__BK_SPACE_ID__,
|
|
62
61
|
'biz.project_id': window.__BK_PROJECT_ID__,
|
|
63
62
|
}),
|
|
64
|
-
metric: () => ({
|
|
65
|
-
'biz.app_code': 'bk-monitor',
|
|
66
|
-
}),
|
|
67
63
|
error: () => ({
|
|
68
64
|
'biz.release_channel': window.__BK_RELEASE_CHANNEL__,
|
|
69
65
|
}),
|
|
@@ -91,24 +87,7 @@ new BkOpenTelemetry({
|
|
|
91
87
|
|
|
92
88
|
## 请求数据边界
|
|
93
89
|
|
|
94
|
-
SDK
|
|
95
|
-
|
|
96
|
-
```ts
|
|
97
|
-
new BkOpenTelemetry({
|
|
98
|
-
tracking: {
|
|
99
|
-
request: {
|
|
100
|
-
body: {
|
|
101
|
-
capture: 'errors',
|
|
102
|
-
maxSize: 4096,
|
|
103
|
-
allowedContentTypes: ['application/json'],
|
|
104
|
-
redact: ({ body }) => {
|
|
105
|
-
return body.replace(/"password"\s*:\s*"[^"]+"/g, '"password":"***"');
|
|
106
|
-
},
|
|
107
|
-
},
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
});
|
|
111
|
-
```
|
|
90
|
+
SDK 不读取或上报请求/响应 Body。
|
|
112
91
|
|
|
113
92
|
## 低基数路由
|
|
114
93
|
|