@blueking/open-telemetry 0.0.21 → 0.0.22-beta.1
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 +8 -44
- 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/sdk.d.ts +1 -7
- package/dist/core/telemetry-attributes.d.ts +1 -2
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1045 -1471
- 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/error.d.ts +1 -5
- package/dist/plugins/long-task.d.ts +1 -3
- package/dist/plugins/web-vitals.d.ts +1 -4
- 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 +3 -3
- 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 +25 -66
- 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 +1 -1
- package/skills/bk-rum-otele/references/plugins-experience.md +4 -5
- 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
|
@@ -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
|
|
|
@@ -2,285 +2,55 @@
|
|
|
2
2
|
|
|
3
3
|
# 遥测参考
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
| `
|
|
21
|
-
| `
|
|
22
|
-
| `
|
|
23
|
-
| `
|
|
24
|
-
| `
|
|
25
|
-
| `
|
|
26
|
-
| `browser.name` / `browser.version` | Resource | string | 归一化浏览器信息 | 是 |
|
|
27
|
-
| `os.name` | Resource | string | 操作系统 | 是 |
|
|
28
|
-
| `device.memory_gib` | Resource | number | 浏览器暴露的近似设备内存(GiB) | 是 |
|
|
29
|
-
| `device.logical_processor_count` | Resource | number | 浏览器暴露的逻辑处理器数量 | 是 |
|
|
30
|
-
| `user.id` | Runtime | string | 接入方提供,原样透传 | 否 |
|
|
31
|
-
| `session.id` | Runtime | string | session 插件生成/轮换 | 否 |
|
|
32
|
-
| `session.has_replay` | Runtime | boolean | 当前固定 `false` | 是 |
|
|
33
|
-
| `view.id` | Runtime | string | View 管理器生成的实例 ID | 否 |
|
|
34
|
-
| `view.name` | Runtime | string | 自动模式默认使用路由分组;手动模式可指定 | 是 |
|
|
35
|
-
| `view.url` | Runtime | string | 当前 view URL(已脱敏) | 否 |
|
|
36
|
-
| `view.url_path_group` | Runtime | string | 低基数路由模板 | 是 |
|
|
37
|
-
| `view.loading_type` | Runtime | string | `initial_load` / `route_change` / `session_renewal` / `bf_cache` | 是 |
|
|
38
|
-
| `device.id` | Runtime | string | 当前实例或持久化匿名设备 ID | 否 |
|
|
39
|
-
| `network.effective_type` | Runtime | string | 网络质量(`4g` 等) | 是 |
|
|
40
|
-
|
|
41
|
-
> span 还会带上 `span_type` / `span_subtype` / `result` / `error_type` 等归一字段(见下方[归一字段](#归一字段))。接入方可通过 `context.attributes.page` 注入额外的页面属性。
|
|
5
|
+
SDK 只产出 RUM Span,不产出 OpenTelemetry Metric 或 Log。计数、直方图、分位数和错误分组由服务端从原始 Span 派生。
|
|
6
|
+
|
|
7
|
+
## 公共字段
|
|
8
|
+
|
|
9
|
+
| 字段 | 类型 | 说明 |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| `event.id` | string | 每条原始事件的唯一 ID,服务端去重键 |
|
|
12
|
+
| `event.type` | string | `session`、`view`、`resource`、`error`、`vital`、`action`、`websocket` 等 |
|
|
13
|
+
| `event.phase` | string | 生命周期事件阶段;非生命周期事件可不带 |
|
|
14
|
+
| `event.timestamp` | number | 浏览器事件发生的 epoch ms |
|
|
15
|
+
| `session.id` | string | Session 关联 ID |
|
|
16
|
+
| `session.start_time` | number | Session 开始时间 |
|
|
17
|
+
| `session.type` | string | 当前为 `user` |
|
|
18
|
+
| `session.sample_rate` | number | Resource 字段,范围 `0..1` |
|
|
19
|
+
| `view.id` | string | View 关联 ID |
|
|
20
|
+
| `view.name` | string | View 名称 |
|
|
21
|
+
| `view.url` | string | 脱敏后的 URL |
|
|
22
|
+
| `view.url_path_group` | string | 服务端聚合用路由模板 |
|
|
23
|
+
| `action.id` | string/string[] | Action 关联 ID |
|
|
24
|
+
| `span_type` / `span_subtype` | string | RUM 分类 |
|
|
25
|
+
| `result` / `error_type` | string | 单事件结果分类 |
|
|
42
26
|
|
|
43
27
|
## Span 清单
|
|
44
28
|
|
|
45
|
-
|
|
|
46
|
-
| --- | --- | --- |
|
|
47
|
-
| `browser.
|
|
48
|
-
| `browser.
|
|
49
|
-
| `browser.resource` | `resource` |
|
|
50
|
-
| `browser.
|
|
51
|
-
| `browser.
|
|
52
|
-
| `browser.
|
|
53
|
-
| `browser.
|
|
54
|
-
| `
|
|
55
|
-
| `
|
|
56
|
-
| `
|
|
57
|
-
| `
|
|
58
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
| `browser.long_task.blocking_duration` | Histogram | `ms` | 同上 | longTask,仅 LoAF |
|
|
74
|
-
| `browser.websocket.message.count` | Counter | - | `server.address`、`server.port`、`url.scheme`、`websocket.direction`(in/out) | websocket |
|
|
75
|
-
| `browser.websocket.message.bytes` | Counter | `By` | 同上 | websocket |
|
|
76
|
-
| `browser.websocket.error.count` | Counter | - | `server.address`、`server.port`、`url.scheme`、`websocket.error.phase`(connect/runtime) | websocket |
|
|
77
|
-
| `browser.websocket.connect.duration` | Histogram | `ms` | `server.address`、`server.port`、`url.scheme` | websocket,仅成功建连 |
|
|
78
|
-
|
|
79
|
-
> 各 metric 只会合并 `context.attributes.metric` hook 返回的自定义低基数维度,不会合并 `context.attributes.page`,也不会携带 `session.id`、`view.id` 或 `action.id`。`view.url_path_group` 中明显的数字 ID、UUID、长十六进制段会归一为 `:id`。精确 View 关联请查询对应 span 或 View Snapshot Log。**metric 维度务必保持低基数**,不要把 URL、订单号、用户输入等放进来。
|
|
80
|
-
|
|
81
|
-
## Log 事件清单
|
|
82
|
-
|
|
83
|
-
| eventName / body | severity | 来源 | 关键属性 |
|
|
84
|
-
| --- | --- | --- | --- |
|
|
85
|
-
| `session.start` | INFO | session 插件(首次新建) | `session.id`、`session.start_time`、`session.rotate.reason=init` |
|
|
86
|
-
| `session.rotate` | INFO | session 插件(轮换) | + `session.previous_id`、`session.rotate.reason`(`inactivity` / `maxLifetime`) |
|
|
87
|
-
| `browser.view` | INFO | View 管理器 | `view.snapshot.type=create\|update\|final`、`view.document_version`、`view.duration`、`view.is_active`、`view.loading_time` |
|
|
88
|
-
| `browser.request.body` | ERROR(错误请求)/ INFO(`capture: 'all'` 的成功请求) | Fetch/XHR request patch(仅显式配置 `request.body`) | 通过 OTel Log Context 关联 Trace/Span;属性含 `request.body` / `response.body`、`*.body.content_type`、`*.body.truncated` |
|
|
89
|
-
| `websocket.error` | ERROR | websocket 插件 | `url.full`、`websocket.error.phase`、`websocket.error.window_occurrence_index` |
|
|
90
|
-
| `websocket.close` | INFO | websocket 插件 | `websocket.close.code`、`websocket.close.reason`、`websocket.close.was_clean` |
|
|
91
|
-
|
|
92
|
-
> 内置 Log 的 `eventName` 与 `body` 当前使用同一个事件名;查询与 `tracking.beforeSend` 应优先使用 `eventName`。
|
|
93
|
-
|
|
94
|
-
> 错误主数据统一走 `error` span(见 Span 清单),SDK **不再**为同一个错误额外 emit error log,避免重复计数。
|
|
95
|
-
|
|
96
|
-
## 属性字典
|
|
97
|
-
|
|
98
|
-
### 归一字段
|
|
99
|
-
|
|
100
|
-
由 `buildRumSpanAttributes` 等构造器写入,用于跨事件类型统一检索。
|
|
101
|
-
|
|
102
|
-
| key | 类型 | 说明 | 低基数 |
|
|
103
|
-
| --- | --- | --- | --- |
|
|
104
|
-
| `span_type` | string | `document`/`resource`/`vital`/`error`/`longtask`/`action`/`route`/`custom` | 是 |
|
|
105
|
-
| `span_subtype` | string | 子类型,如 `fetch`/`xhr`/`js`/`promise`/`lcp` | 是 |
|
|
106
|
-
| `result` | string | `success`/`warning`/`error`/`timeout`/`abort` | 是 |
|
|
107
|
-
| `error_type` | string | 错误细分,如 `http_5xx`/`network_timeout`/`slow`/`none` | 是 |
|
|
108
|
-
|
|
109
|
-
### View / Navigation
|
|
110
|
-
|
|
111
|
-
| key | 类型 | 出现位置 | 说明 |
|
|
112
|
-
| --- | --- | --- | --- |
|
|
113
|
-
| `view.id` / `view.name` / `view.url` / `view.url_path_group` | string | Span / Log | View 标识、名称、脱敏 URL 与低基数路由模板 |
|
|
114
|
-
| `view.loading_type` | string | Span / Log / Metric | `initial_load` / `route_change` / `session_renewal` / `bf_cache` |
|
|
115
|
-
| `view.loading_time` | number | Span / Log;同时作为 Metric 值 | View 从开始到页面活动稳定的耗时(ms) |
|
|
116
|
-
| `view.loading_time.source` | string | Span / Log | `auto` / `manual` |
|
|
117
|
-
| `view.first_byte` | number | 初始 View Span / Log | Navigation Timing 的 `responseStart`(相对 `performance.timeOrigin`,ms) |
|
|
118
|
-
| `view.dom_interactive` / `view.dom_content_loaded` | number | 初始 View Span / Log | DOM interactive / DOMContentLoaded 时间(相对 `performance.timeOrigin`,ms) |
|
|
119
|
-
| `view.dom_complete` / `view.load_event` | number | 初始 View Span / Log | DOM complete / load event 时间(相对 `performance.timeOrigin`,ms) |
|
|
120
|
-
| `url.previous` | string | Span / Log | 前一个 View URL(已脱敏) |
|
|
121
|
-
| `document.referrer` | string | 初始 View Span / Log | 页面 referrer(已脱敏) |
|
|
122
|
-
| `event.source` | string | Span / Log | View 创建触发源,如 `load`、`pushState`、`popstate`、`manual`、`bfCache`、`sessionRenewal` |
|
|
123
|
-
| `view.end_reason` | string | Span / final Log | 下一 View 的触发源,或 `pagehide` / `session_expired` / `shutdown` |
|
|
124
|
-
| `event.type` | string | Log | 固定 `view` |
|
|
125
|
-
| `view.snapshot.type` | string | Log | `create` / `update` / `final` |
|
|
126
|
-
| `view.document_version` | number | Log | 当前 View Snapshot 的递增版本号 |
|
|
127
|
-
| `view.duration` | number | Log | 从 View 开始到 Snapshot 的耗时(ms) |
|
|
128
|
-
| `view.is_active` | boolean | Log | 非 final Snapshot 为 `true` |
|
|
129
|
-
|
|
130
|
-
### HTTP / Resource
|
|
131
|
-
|
|
132
|
-
| key | 类型 | 说明 |
|
|
133
|
-
| --- | --- | --- |
|
|
134
|
-
| `http.request.method` | string | 请求方法(大写) |
|
|
135
|
-
| `http.response.status_code` | number | 响应状态码 |
|
|
136
|
-
| `url.full` | string | 完整 URL(已脱敏) |
|
|
137
|
-
| `server.address` | string | 目标主机名 |
|
|
138
|
-
| `server.port` | number | 目标显式端口(存在时) |
|
|
139
|
-
| `resource.type` | string | `fetch`/`xhr` 或静态资源 initiator type |
|
|
140
|
-
| `resource.redirect.start/duration` | number | 重定向阶段相对开始时间 / 耗时(ms) |
|
|
141
|
-
| `resource.dns.start/duration` | number | DNS 阶段相对开始时间 / 耗时(ms) |
|
|
142
|
-
| `resource.connect.start/duration` | number | TCP 建连阶段相对开始时间 / 耗时(ms) |
|
|
143
|
-
| `resource.ssl.start/duration` | number | TLS 握手阶段相对开始时间 / 耗时(ms) |
|
|
144
|
-
| `resource.first_byte.start/duration` | number | 等待首字节阶段相对开始时间 / 耗时(ms) |
|
|
145
|
-
| `resource.download.start/duration` | number | 响应下载阶段相对开始时间 / 耗时(ms) |
|
|
146
|
-
| `resource.worker.start/duration` | number | Service Worker 阶段相对开始时间 / 耗时(ms) |
|
|
147
|
-
| `resource.delivery_type` | string | `cache` / `navigational-prefetch` 等浏览器交付类型 |
|
|
148
|
-
| `resource.render_blocking_status` | string | `blocking` / `non-blocking` |
|
|
149
|
-
| `resource.size` | number | 传输字节数 |
|
|
150
|
-
| `url.previous` | string | 跳转前 URL |
|
|
151
|
-
| `resource.cache.hit` | boolean | 是否命中缓存 |
|
|
152
|
-
| `resource.protocol` | string | 协议,如 `h2` |
|
|
153
|
-
| `resource.encoded_body_size` / `resource.decoded_body_size` | number | 资源体积 |
|
|
154
|
-
| `request.body` / `response.body` | string | 仅 `browser.request.body` Log;经过接入方 `redact` 且受长度限制 |
|
|
155
|
-
| `request.body.content_type` / `response.body.content_type` | string | body Content-Type(可获取时) |
|
|
156
|
-
| `request.body.truncated` / `response.body.truncated` | boolean | body 是否因长度限制而截断 |
|
|
157
|
-
|
|
158
|
-
### Web Vitals
|
|
159
|
-
|
|
160
|
-
| key | 类型 | 说明 |
|
|
161
|
-
| --- | --- | --- |
|
|
162
|
-
| `vital.metric` | string | `cls`/`fcp`/`inp`/`lcp`/`ttfb` |
|
|
163
|
-
| `vital.value` | number | 指标值 |
|
|
164
|
-
| `vital.rating` | string | `good`/`needs-improvement`/`poor` |
|
|
165
|
-
| `vital.id` | string | 单条度量唯一 ID(仅 span) |
|
|
166
|
-
| `rum.navigation.type` | string | 导航类型,含 `back-forward-cache` 等 |
|
|
167
|
-
| `vital.lcp.*` / `vital.cls.*` / `vital.inp.*` / `vital.fcp.*` / `vital.ttfb.*` | mixed | attribution 归因明细(仅 span) |
|
|
168
|
-
|
|
169
|
-
### 错误 / 异常
|
|
170
|
-
|
|
171
|
-
以下字段位于 Error Span 顶层属性:
|
|
172
|
-
|
|
173
|
-
| key | 类型 | 说明 |
|
|
174
|
-
| --- | --- | --- |
|
|
175
|
-
| `exception.message_short` | string | 消息前 80 字符 |
|
|
176
|
-
| `exception.stack_top_frame` | string | 栈顶帧 |
|
|
177
|
-
| `exception.fingerprint` | string | 节流分组指纹(djb2 hash) |
|
|
178
|
-
| `error.source` | string | `window.error`/`unhandledrejection`/`resource`/`csp` |
|
|
179
|
-
| `error.handled` | boolean | 是否被业务捕获(自动采集恒为 `false`) |
|
|
180
|
-
| `error.window_occurrence_index` | number | 当前节流窗口内该已上报 span 的触发序号;总量查询 `browser.error.count` |
|
|
181
|
-
| `error.cross_origin` | boolean | 跨域脚本错误(`Script error.`) |
|
|
182
|
-
| `code.filepath` / `code.lineno` / `code.column` | string/number | JS 错误位置 |
|
|
183
|
-
| `html.tag` | string | 资源错误的元素标签 |
|
|
184
|
-
|
|
185
|
-
`error.subtype` 仅作为 `browser.error.count` Metric 维度,取值为 `js` / `promise` / `resource_load`,不写入 Error Span 顶层属性。
|
|
186
|
-
|
|
187
|
-
完整异常由 `recordException()` 写入名为 `exception` 的标准 Span Event,不在 Span 顶层属性中:
|
|
188
|
-
|
|
189
|
-
| Event 属性 | 类型 | 说明 |
|
|
190
|
-
| --- | --- | --- |
|
|
191
|
-
| `exception.type` | string | 异常类型/名称 |
|
|
192
|
-
| `exception.message` | string | 异常消息 |
|
|
193
|
-
| `exception.stacktrace` | string | 堆栈(存在时) |
|
|
194
|
-
|
|
195
|
-
### 设备 / 浏览器 / 网络
|
|
196
|
-
|
|
197
|
-
| key | 类型 | 说明 |
|
|
198
|
-
| --- | --- | --- |
|
|
199
|
-
| `device.id` | string | 匿名设备标识;默认仅当前 SDK 实例稳定,`tracking.device.persistentId=true` 时持久化 |
|
|
200
|
-
| `device.memory_gib` | number | Resource 中的近似设备内存(GiB) |
|
|
201
|
-
| `device.logical_processor_count` | number | Resource 中的逻辑处理器数量 |
|
|
202
|
-
| `browser.viewport.width` / `browser.viewport.height` | number | 视口尺寸 |
|
|
203
|
-
| `browser.screen.width` / `browser.screen.height` | number | 屏幕尺寸 |
|
|
204
|
-
| `network.effective_type` | string | 网络质量,如 `4g` |
|
|
205
|
-
| `network.connection_type` / `network.downlink` / `network.rtt` / `network.save_data` | mixed | 网络信息 |
|
|
206
|
-
| `browser.name` / `browser.version` / `os.name` | string | Resource 中的 UA 解析结果 |
|
|
207
|
-
| `device.type` | string | Resource 中的 `mobile` / `desktop` |
|
|
208
|
-
|
|
209
|
-
### 用户动作 / 会话
|
|
210
|
-
|
|
211
|
-
| key | 类型 | 说明 |
|
|
212
|
-
| --- | --- | --- |
|
|
213
|
-
| `action.type` | string | 动作类型 |
|
|
214
|
-
| `action.id` | string / string[] | action 自身 ID;关联事件上为 action ID 数组 |
|
|
215
|
-
| `action.name` | string | 可读动作名称 |
|
|
216
|
-
| `action.target.name` | string | 自动 action 的目标元素名称 |
|
|
217
|
-
| `action.target.tag` | string | 自动 action 的目标元素标签 |
|
|
218
|
-
| `action.loading_time` | number | 点击后页面活动稳定耗时(ms) |
|
|
219
|
-
| `action.resource.count` | number | action 关联资源数 |
|
|
220
|
-
| `action.error.count` | number | action 关联错误数 |
|
|
221
|
-
| `action.long_task.count` | number | action 关联长任务数 |
|
|
222
|
-
| `action.frustration.type` | string[] | `rage_click` / `dead_click` / `error_click` |
|
|
223
|
-
| `action.frustration.count` | number | 当前 action 的挫败信号数量 |
|
|
224
|
-
| `session.start_time` | number | 会话开始时间戳 |
|
|
225
|
-
| `session.previous_id` | string | 轮换前的 session.id |
|
|
226
|
-
| `session.rotate.reason` | string | `init`/`inactivity`/`maxLifetime` |
|
|
227
|
-
|
|
228
|
-
### Long Task
|
|
229
|
-
|
|
230
|
-
| key | 类型 | 说明 |
|
|
231
|
-
| --- | --- | --- |
|
|
232
|
-
| `long_task.id` | string | 长任务或长动画帧 ID |
|
|
233
|
-
| `long_task.entry_type` | string | `long-animation-frame` / `long-task` |
|
|
234
|
-
| `long_task.start_time` | number | LoAF 相对 `performance.timeOrigin` 的开始时间(ms) |
|
|
235
|
-
| `long_task.duration` / `long_task.blocking_duration` | number | 总耗时 / 主线程阻塞耗时(ms) |
|
|
236
|
-
| `long_task.is_frozen_frame` | boolean | 总耗时是否达到 700ms |
|
|
237
|
-
| `long_task.culprit` | string | 最重脚本 URL、函数或 legacy attribution |
|
|
238
|
-
| `long_task.script.count` | number | LoAF 脚本数 |
|
|
239
|
-
| `long_task.first_ui_event_timestamp` | number | LoAF 首个 UI Event 时间戳 |
|
|
240
|
-
| `long_task.render_start` / `long_task.style_and_layout_start` | number | LoAF 渲染与样式布局阶段起点 |
|
|
241
|
-
| `long_task.culprit.*` | mixed | 最重脚本的耗时、强制布局耗时、函数名与 invoker 类型 |
|
|
242
|
-
| `long_task.script.*` | mixed | `long_task.script` Span Event 上的脚本耗时、URL、函数、invoker 和强制布局归因 |
|
|
243
|
-
|
|
244
|
-
### CSP
|
|
245
|
-
|
|
246
|
-
| key | 类型 | 说明 |
|
|
247
|
-
| --- | --- | --- |
|
|
248
|
-
| `csp.blocked_uri` | string | 被拦截资源(URL 类值已脱敏) |
|
|
249
|
-
| `csp.violated_directive` / `csp.effective_directive` | string | 违反的指令 |
|
|
250
|
-
| `csp.disposition` | string | `enforce` / `report` |
|
|
251
|
-
| `csp.source_file` | string | 触发脚本(已脱敏) |
|
|
252
|
-
| `csp.line_number` / `csp.column_number` | number | 位置 |
|
|
253
|
-
| `csp.status_code` | number | 状态码 |
|
|
254
|
-
| `csp.fingerprint` / `csp.window_occurrence_index` | string/number | 节流指纹与该已上报 span 的窗口触发序号 |
|
|
255
|
-
| `csp.original_policy` | string | 完整策略,仅窗口首条携带 |
|
|
256
|
-
|
|
257
|
-
### WebSocket
|
|
258
|
-
|
|
259
|
-
| key | 类型 | 说明 |
|
|
260
|
-
| --- | --- | --- |
|
|
261
|
-
| `url.scheme` | string | `ws` / `wss` |
|
|
262
|
-
| `server.address` | string | 目标 hostname,不包含端口 |
|
|
263
|
-
| `server.port` | number | 目标显式端口(存在时) |
|
|
264
|
-
| `network.protocol.name` | string | 固定 `websocket` |
|
|
265
|
-
| `websocket.direction` | string | `in` / `out`(仅 metric) |
|
|
266
|
-
| `websocket.error.phase` | string | `connect` / `runtime` |
|
|
267
|
-
| `websocket.error.window_occurrence_index` | number | 该已上报错误日志在节流窗口内的触发序号;总量查询 `browser.websocket.error.count` |
|
|
268
|
-
| `websocket.close.code` / `websocket.close.reason` / `websocket.close.was_clean` | mixed | 关闭事件详情 |
|
|
269
|
-
|
|
270
|
-
### 白屏
|
|
271
|
-
|
|
272
|
-
| key | 类型 | 说明 |
|
|
273
|
-
| --- | --- | --- |
|
|
274
|
-
| `blank_screen.empty_ratio` | number | 有效样本中的空白比例 |
|
|
275
|
-
| `blank_screen.reason` | string | `empty_viewport` / `missing_root` |
|
|
276
|
-
| `blank_screen.root_selector` / `blank_screen.root_found` | string/boolean | 根选择器与是否存在 |
|
|
277
|
-
| `blank_screen.sample_count` / `blank_screen.valid_sample_count` | number | 总样本数 / 有效样本数 |
|
|
278
|
-
| `blank_screen.empty_sample_count` / `blank_screen.ignored_sample_count` | number | 空白样本数 / loading 忽略样本数 |
|
|
279
|
-
| `blank_screen.center_element` | string | 视口中心元素选择器 |
|
|
280
|
-
|
|
281
|
-
### 自定义事件
|
|
282
|
-
|
|
283
|
-
| key | 类型 | 说明 |
|
|
284
|
-
| --- | --- | --- |
|
|
285
|
-
| `rum.custom.name` | string | `reportCustomEvent()` 的事件名 |
|
|
286
|
-
| `rum.page.host` / `rum.page.path` | string | 默认 `context.attributes.page` 页面上下文;配置自定义 page hook 后由接入方决定字段 |
|
|
29
|
+
| Span 名 | `event.type` | 关键字段 |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `browser.session` | `session` | `event.phase=start\|rotate\|end`、`session.lifecycle.reason`、`session.previous_id` |
|
|
32
|
+
| `browser.view` | `view` | `event.phase=start\|update\|end`、`view.version`、`view.started_at`、`view.loading_type`、`view.loading_time`、`view.end_reason` |
|
|
33
|
+
| `browser.resource` | `resource` | `url.full`、`resource.type`、HTTP 状态、体积和 Resource Timing 阶段 |
|
|
34
|
+
| `browser.error` | `error` | `error.source=window.error`、`error.message`、代码位置;完整异常写入标准 exception event |
|
|
35
|
+
| `browser.unhandledrejection` | `error` | `error.source=unhandledrejection`、`error.message`、标准 exception event |
|
|
36
|
+
| `browser.resource_error` | `error` | `error.source=resource`、`url.full`、`html.tag` |
|
|
37
|
+
| `browser.web_vital` | `vital` | `vital.metric`、`vital.value`、`vital.rating`、`vital.id` 和 attribution |
|
|
38
|
+
| `action.click` | `action` | `action.loading_time`、目标和 `action.frustration.type`;不含资源/错误/长任务计数 |
|
|
39
|
+
| `action.custom` | `action` | 手动 Action 名称和属性 |
|
|
40
|
+
| `browser.blank_screen` | `error` | 白屏采样点、比例、根节点和原因 |
|
|
41
|
+
| `browser.long_task` | `long_task` | Long Task/LoAF 原始耗时与脚本 span event |
|
|
42
|
+
| `csp.violation` | `error` | CSP violation 原始字段;不做指纹或客户端节流 |
|
|
43
|
+
| `browser.websocket` | `websocket` | `event.phase=connect\|open\|error\|close`、`websocket.connection.id`、关闭码;不采集消息 |
|
|
44
|
+
| `custom.<name>` | `custom` | 手动自定义事件属性和可选异常 |
|
|
45
|
+
|
|
46
|
+
## View 本地语义
|
|
47
|
+
|
|
48
|
+
`view.loading_time`、CLS、INP、Action Loading Time、挫败信号和白屏必须依赖浏览器活动窗口或 DOM/Performance API,在 SDK 本地计算后作为事件语义上报。View 的每次 start/update/end 都增加 `view.version`;服务端应按 `view.id + view.version` 幂等合并,并容忍乱序到达。
|
|
49
|
+
|
|
50
|
+
## 服务端派生要求
|
|
51
|
+
|
|
52
|
+
- 使用 `event.id` 去重。
|
|
53
|
+
- 通过 `session.id`、`view.id`、`action.id` 关联事件。
|
|
54
|
+
- 从原始事件计算 View/Session 时长、资源/错误/Action 数量和错误率。
|
|
55
|
+
- 从 `vital.value`、资源/长任务耗时计算 Histogram 与分位数。
|
|
56
|
+
- 在服务端生成错误指纹、错误组和风暴控制,不在浏览器丢弃原始错误。
|