@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.
Files changed (46) hide show
  1. package/README.md +11 -25
  2. package/dist/bk-rum.global.js +2 -12
  3. package/dist/bk-rum.global.js.map +1 -1
  4. package/dist/core/config.d.ts +10 -48
  5. package/dist/core/hash.d.ts +2 -0
  6. package/dist/core/plugin.d.ts +2 -7
  7. package/dist/core/processor.d.ts +0 -20
  8. package/dist/core/runtime-context.d.ts +1 -1
  9. package/dist/core/sdk.d.ts +2 -8
  10. package/dist/core/telemetry-attributes.d.ts +1 -2
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.js +1074 -1484
  13. package/dist/index.js.map +1 -1
  14. package/dist/plugins/common.d.ts +1 -1
  15. package/dist/plugins/csp-violation.d.ts +0 -8
  16. package/dist/plugins/device.d.ts +2 -2
  17. package/dist/plugins/error.d.ts +1 -5
  18. package/dist/plugins/long-task.d.ts +1 -3
  19. package/dist/plugins/resource.d.ts +1 -0
  20. package/dist/plugins/web-vitals.d.ts +2 -7
  21. package/dist/schema/attributes.d.ts +8 -10
  22. package/dist/schema/span.d.ts +2 -0
  23. package/package.json +1 -6
  24. package/skills/bk-rum-otele/SKILL.md +12 -14
  25. package/skills/bk-rum-otele/evals/evals.json +2 -2
  26. package/skills/bk-rum-otele/references/api.md +10 -22
  27. package/skills/bk-rum-otele/references/architecture.md +38 -118
  28. package/skills/bk-rum-otele/references/capabilities.md +26 -28
  29. package/skills/bk-rum-otele/references/concepts.md +14 -106
  30. package/skills/bk-rum-otele/references/configuration.md +28 -69
  31. package/skills/bk-rum-otele/references/custom-plugin.md +10 -13
  32. package/skills/bk-rum-otele/references/data-model.md +23 -95
  33. package/skills/bk-rum-otele/references/getting-started.md +1 -1
  34. package/skills/bk-rum-otele/references/plugins-basic.md +7 -7
  35. package/skills/bk-rum-otele/references/plugins-error-security.md +4 -7
  36. package/skills/bk-rum-otele/references/plugins-experience.md +8 -9
  37. package/skills/bk-rum-otele/references/plugins-network.md +19 -128
  38. package/skills/bk-rum-otele/references/plugins.md +3 -3
  39. package/skills/bk-rum-otele/references/privacy.md +4 -25
  40. package/skills/bk-rum-otele/references/telemetry-reference.md +49 -279
  41. package/skills/bk-rum-otele/references/transport-sampling.md +15 -50
  42. package/skills/bk-rum-otele/references/troubleshooting.md +7 -34
  43. package/dist/core/metric.d.ts +0 -2
  44. package/dist/core/signal.d.ts +0 -3
  45. package/dist/core/throttle.d.ts +0 -20
  46. package/dist/plugins/request-body.d.ts +0 -15
@@ -6,43 +6,43 @@
6
6
 
7
7
  ## 总览
8
8
 
9
- | 能力 | 配置入口 | 默认 | 浏览器入口 | Trace | Metric | Log |
10
- | --- | --- | --- | --- | --- | --- | --- |
11
- | Session | `session` | 必选基础能力 | `localStorage`、用户活动、页面可见性 | — | — | `session.start` / `session.rotate` |
12
- | View | `tracking.view` | 自动模式 | Navigation Timing、History、hash、BFCache、DOM Mutation | `browser.view` | `browser.view.loading_time` | `browser.view` Snapshot |
13
- | Fetch/XHR | `tracking.request` | 开 | `fetch`、`XMLHttpRequest`、Resource Timing | `browser.resource` | — | 可选 `browser.request.body` |
14
- | 静态资源 | `tracking.resource` | 开 | Resource PerformanceObserver | `browser.resource` | — | — |
15
- | JS / Promise / 资源错误 | `tracking.error` | 开 | `error`、`unhandledrejection` | 三类 `browser.*error` | — | — |
16
- | Web Vitals | `tracking.webVitals` | 开 | `web-vitals`、Layout Shift、Event Timing | `browser.web_vital` | 两个 Histogram | — |
17
- | Action | `tracking.action` | 开 | click、DOM、请求与活动总线 | `action.click` | — | — |
18
- | 手动 Action | `reportAction()` | 可调用 | 业务调用 | `action.custom` | — | — |
19
- | 自定义事件 | `reportCustomEvent()` | 可调用 | 业务调用 | `custom.<name>` | — | — |
20
- | 白屏 | `tracking.blankScreen` | 开 | DOM 命中测试、View 活动 | `browser.blank_screen` | `browser.blank_screen.count` | — |
21
- | 设备 | `tracking.device` | 开 | UA、UA-CH、Screen、Network Information | Resource 与运行时公共属性 | — | Resource 与运行时公共属性 |
22
- | Long Task | `tracking.longTask` | 关 | Long Animation Frames / Long Tasks | `browser.long_task` | 三个聚合指标 | — |
23
- | WebSocket | `tracking.websocket` | 关 | `WebSocket` Proxy | `websocket.connect` | 四个聚合指标 | error / close |
24
- | CSP | `tracking.cspViolation` | 关 | `securitypolicyviolation` | `csp.violation` | — | — |
25
- | 自定义插件 | `extensions.plugins` / `use()` | 无 | 由插件决定 | 支持 | 无稳定公共辅助 API | 推荐 `emitLog()` |
26
- | OTel instrumentation | `extensions.instrumentations` / `useInstrumentation()` | 无 | 由 instrumentation 决定 | 支持 | 无稳定支持 | 取决于实现 |
27
-
28
- “默认开”表示获得 Consent 且 SDK 已启动后启用。是否真正导出还受 `enabled`、Session 采样、Session/View 有效性和单信号开关控制。
9
+ | 能力 | 配置入口 | 默认 | 浏览器入口 | 原始 RUM Span |
10
+ | --- | --- | --- | --- | --- |
11
+ | Session | `session` | 必选基础能力 | `localStorage`、用户活动、页面可见性 | `browser.session` start/rotate/end |
12
+ | View | `tracking.view` | 自动模式 | Navigation Timing、History、hash、BFCache、DOM Mutation | `browser.view` start/update/end |
13
+ | Fetch/XHR | `tracking.request` | 开 | `fetch`、`XMLHttpRequest`、Resource Timing | `browser.resource` |
14
+ | 静态资源 | `tracking.resource` | 开 | Resource PerformanceObserver | `browser.resource` |
15
+ | JS / Promise / 资源错误 | `tracking.error` | 开 | `error`、`unhandledrejection` | 三类 `browser.*error` |
16
+ | Web Vitals | `tracking.webVitals` | 开 | `web-vitals`、Layout Shift、Event Timing | `browser.web_vital` |
17
+ | Action | `tracking.action` | 开 | click、DOM、请求与活动总线 | `action.click` |
18
+ | 手动 Action | `reportAction()` | 可调用 | 业务调用 | `action.custom` |
19
+ | 自定义事件 | `reportCustomEvent()` | 可调用 | 业务调用 | `custom.<name>` |
20
+ | 白屏 | `tracking.blankScreen` | 开 | DOM 命中测试、View 活动 | `browser.blank_screen` |
21
+ | 设备 | `tracking.device` | 开 | UA、UA-CH、Screen、Network Information | Resource 与运行时公共属性 |
22
+ | Long Task | `tracking.longTask` | 关 | Long Animation Frames / Long Tasks | `browser.long_task` |
23
+ | WebSocket | `tracking.websocket` | 关 | `WebSocket` Proxy | `browser.websocket` connect/open/error/close |
24
+ | CSP | `tracking.cspViolation` | 关 | `securitypolicyviolation` | `csp.violation` |
25
+ | 自定义插件 | `extensions.plugins` / `use()` | 无 | 由插件决定 | `context.startSpan()` |
26
+ | OTel instrumentation | `extensions.instrumentations` / `useInstrumentation()` | 无 | 由 instrumentation 决定 | 支持 |
27
+
28
+ “默认开”表示获得 Consent 且 SDK 已启动后启用。是否真正导出还受 `enabled`、Session 采样和 Session/View 有效性控制。
29
29
 
30
30
  ## 能力边界
31
31
 
32
32
  ### SDK 直接负责
33
33
 
34
34
  - 创建和轮换 Session,划分初始加载、SPA、BFCache、手动和 Session 续期 View。
35
- - 统一 patch Fetch/XHR;请求 span、活动计数、Trace Header、Resource Timing 和 Body 采集共用同一生命周期。
35
+ - 统一 patch Fetch/XHR;请求 span、活动追踪、Trace Header 和 Resource Timing 共用同一生命周期。
36
36
  - 把浏览器事件归一为 `span_type`、`span_subtype`、`result`、`error_type` 等字段。
37
- - 自动为 Span/Log 关联 `session.id`、`view.id`,为 Metric 保留低基数 `view.url_path_group`。
37
+ - 自动为 Span 关联 `session.id`、`view.id` 和 `action.id`。
38
38
  - 在 exporter 前执行采样、有效上下文、自上报请求和 `tracking.beforeSend` 过滤。
39
39
 
40
40
  ### SDK 不负责
41
41
 
42
42
  - 不聚合 `session.duration`、影响用户数、地理信息、Trace 关键路径等后端指标。
43
43
  - 不自动判断业务字段是否敏感,也不 hash `user.id`。
44
- - 不默认采集 HTTP 请求/响应 Body。
45
- - 不把唯一的 `session.id`、`view.id`、`action.id` 放入 Metric labels。
44
+ - 不采集 HTTP 请求/响应 Body。
45
+ - 不在浏览器生成 Counter、Histogram、分位数、错误指纹或跨事件计数。
46
46
  - 不保证浏览器未暴露的数据,例如缺少 `Timing-Allow-Origin` 的跨域资源网络阶段。
47
47
 
48
48
  ## 默认开启与关闭
@@ -84,13 +84,11 @@ Session 与 View 是导出有效性边界,不提供关闭开关。`tracking.vi
84
84
 
85
85
  | 能力 | 主要成本/风险 | 建议 |
86
86
  | --- | --- | --- |
87
- | `session.sampleRate` | 决定三类信号总体数据量 | 按应用容量设置;排障临时设为 `1` |
88
- | Metric 自定义维度 | 高基数会放大时序数量 | 只放应用、租户类别、路由模板等低基数字段 |
89
- | Request Body | 可能包含凭证、个人数据,且增加网络体积 | 默认关闭;开启时限制类型/大小并强制脱敏 |
87
+ | `session.sampleRate` | 决定 RUM Span 总体数据量 | 按应用容量设置;排障临时设为 `1` |
90
88
  | Action 文本命名 | DOM 文本可能包含用户输入 | 保持 `nameCollection: 'explicit'`,关键元素使用 `data-bk-action-name` |
91
89
  | Device 持久 ID | 支持跨 Session 关联 | 默认不持久化;需取得合规依据后再开启 |
92
90
  | Long Task | 产生 Span 与脚本归因信息 | 仅性能分析场景开启,结合采样控制 |
93
- | WebSocket | Proxy 全局构造器并统计消息字节 | 同页面单实例;不采集消息内容 |
91
+ | WebSocket | Proxy 全局构造器并监听连接生命周期 | 不包裹 `send()`,不采集消息内容、数量或字节数 |
94
92
 
95
93
  ## 下一步
96
94
 
@@ -2,122 +2,30 @@
2
2
 
3
3
  # 核心概念
4
4
 
5
- 理解这些概念后,再看配置和插件会更顺畅。
5
+ ## 单一原始事件通道
6
6
 
7
- ## 三类信号
7
+ SDK 只使用 OpenTelemetry Trace:浏览器事实和本地体验语义都编码为 RUM Span,通过 `/v1/rum` 上报。浏览器不创建 Counter、Histogram 或 Log;聚合由服务端完成。
8
8
 
9
- `@blueking/open-telemetry` 同时使用 OpenTelemetry 的三类信号:
9
+ ## Session、View、Action
10
10
 
11
- - Trace:用于描述一次有起止时间的行为,例如页面访问、接口请求、资源加载、用户点击、长任务。
12
- - Metric:用于描述可聚合的数值,例如 Web Vitals、长任务数量、WebSocket 消息大小、空白屏结果。
13
- - Log:用于描述离散事件或诊断信息,例如 Session 生命周期、View Snapshot、请求 Body 和 WebSocket 状态。
11
+ - `session.id` 关联一次访问会话,采样以 Session 为边界。
12
+ - `view.id` 关联初始页面、SPA 路由、BFCache 或手动 View。
13
+ - `action.id` 关联一次用户动作活动窗口。
14
+ - `user.id` 由接入方提供,SDK 原样透传。
14
15
 
15
- 示例:手动创建一个业务 span。
16
+ 生命周期事件使用 `event.id`、`event.type`、`event.phase`、`event.timestamp`。View 额外使用 `view.version` 处理更新和乱序。
16
17
 
17
- ```ts
18
- import { BkOpenTelemetry } from '@blueking/open-telemetry';
19
-
20
- const bkOT = new BkOpenTelemetry({
21
- application: { name: 'checkout-web' },
22
- transport: { endpoint: 'https://rum-collector.example.com' },
23
- });
24
-
25
- const span = bkOT.startSpan('custom.checkout_submit', {
26
- 'biz.order_id': '202605270001',
27
- 'biz.channel': 'pc',
28
- });
29
-
30
- span.end();
31
- ```
32
-
33
- ## Session、View、User
34
-
35
- SDK 会维护运行时公共上下文,并自动挂到后续 span/log 上:
36
-
37
- - `user.id`:由接入方提供,SDK 原样透传,不 hash、不脱敏、不改写。
38
- - `session.id`:由 session 插件生成和轮换,用于关联同一次访问会话。
39
- - `view.id` / `view.name` / `view.url` / `view.url_path_group`:由 View 管理器维护,用于关联同一个页面或路由实例。
40
-
41
- 示例:登录后更新用户上下文。
42
-
43
- ```ts
44
- bkOT.setUser({
45
- id: 'user-12345',
46
- });
47
- ```
48
-
49
- 示例:手动模式由业务路由系统创建 View。
50
-
51
- ```ts
52
- // 前提:autoStart: false,且已经 await bkOT.start() 建立 Session。
53
- bkOT.startView({
54
- name: '商品详情',
55
- url: window.location.href,
56
- attributes: { 'biz.owner': 'product-team' },
57
- });
58
- ```
59
-
60
- ## 内置采集与扩展
61
-
62
- SDK 将能力分为两类:
63
-
64
- 1. 内置采集:`tracking.request` 使用 SDK 自有的统一 Fetch/XHR 生命周期,负责 patch 浏览器 API、创建 `browser.resource` CLIENT Span、Trace Header 和请求 Performance Timing 匹配。
65
- 2. RUM 插件:View、Session、`resource`、`error`、`webVitals`、`blankScreen`、`device` 等,负责主动产生 RUM 归一数据。
66
-
67
- 用户交互统一由 SDK 的 `action` 插件采集。接入额外 instrumentation 时,应避免再注册覆盖 Fetch/XHR 或用户交互的探针,以免重复上报。
18
+ ## 本地计算边界
68
19
 
69
- ```ts
70
- new BkOpenTelemetry({
71
- application: { name: 'demo' },
72
- transport: { endpoint: 'https://rum-collector.example.com' },
73
- tracking: {
74
- action: {
75
- actionNameAttribute: 'data-bk-action-name',
76
- maxDuration: 10000,
77
- },
78
- },
79
- });
80
- ```
20
+ SDK 只保留必须依赖浏览器本地状态的计算:CLS、INP、View Loading Time、Action Loading Time、挫败信号和白屏判断。错误分组、计数、分位数和跨事件聚合全部交给服务端。
81
21
 
82
22
  ## 采样
83
23
 
84
- `session.sampleRate` 是会话级确定性采样。决定由 `application.name + session.id` 的稳定 hash 得出,同一 Session 的三类信号保持一致。插件仍会维护必要的浏览器生命周期,但未命中时创建或导出路径会丢弃数据,`reportAction()` 和 `reportCustomEvent()` 直接返回。
85
-
86
- 示例:生产环境按 10% 会话采样。
87
-
88
- ```ts
89
- new BkOpenTelemetry({
90
- application: { name: 'demo' },
91
- session: {
92
- sampleRate: 0.1,
93
- },
94
- transport: {
95
- endpoint: 'https://rum-collector.example.com',
96
- },
97
- });
98
- ```
99
-
100
- ## 数据归一
101
-
102
- SDK 会为 span 补充 RUM 归一字段,例如:
24
+ `session.sampleRate` 使用 `application.name + session.id` 做确定性采样。采样率同时写入 Resource 的 `session.sample_rate`,供后端修正总体指标。
103
25
 
104
- - `span_type`:`document`、`resource`、`vital`、`error`、`longtask`、`action`、`route`、`custom`
105
- - `result`:`success`、`warning`、`error`、`timeout`、`abort`
26
+ ## 扩展
106
27
 
107
- 示例:自定义 span 也可以复用归一字段构造器。
108
-
109
- ```ts
110
- import { RUM_SPAN_TYPE, buildRumSpanAttributes } from '@blueking/open-telemetry';
111
-
112
- const span = bkOT.startSpan('custom.cache_warmup', {
113
- ...buildRumSpanAttributes({
114
- spanType: RUM_SPAN_TYPE.custom,
115
- spanSubtype: 'cache_warmup',
116
- }),
117
- });
118
-
119
- span.end();
120
- ```
28
+ 自定义 RUM 插件使用 `context.startSpan()`,标准 OpenTelemetry instrumentation 通过 `extensions.instrumentations` 注册。避免重复注册 Fetch/XHR 或用户交互探针。
121
29
 
122
30
  # 内置采集与扩展
123
31
 
@@ -147,6 +55,6 @@ new BkOpenTelemetry({
147
55
 
148
56
  内置 Fetch/XHR 不再基于官方 instrumentation 叠加适配,而是由单一请求生命周期实现,避免重复 patch、重复活动计数及私有 `_addHeaders/_patchSend` 依赖。
149
57
 
150
- 当前扩展 instrumentation 的稳定能力边界是 Trace:Filtering Span Processor 会在 Span 创建时补充有效 RUM 上下文。Metric exporter 要求 SDK 内部采样标记,而包未公开对应 helper,因此第三方 instrumentation 产生的 Metric 默认会被过滤,不应作为已支持的扩展能力。
58
+ 当前扩展 instrumentation 的稳定能力边界是 Trace:Filtering Span Processor 会在 Span 创建时补充有效 RUM 上下文。SDK 不创建 Metric Provider,第三方 instrumentation 的 Metric 不属于支持范围。
151
59
 
152
60
  扩展必须在 `start()` 前注册;动态 Consent 重新授权时,插件可能再次执行 `init()`,所以插件的 `shutdown()` 应完整释放副作用。
@@ -2,7 +2,7 @@
2
2
 
3
3
  # 配置参考
4
4
 
5
- `BkOpenTelemetry` 只接受当前 `BkOTOptions` 结构。`application.name` 与 `transport` 必填;所有已启用信号必须能解析到有效 Endpoint。
5
+ `BkOpenTelemetry` 只接受当前 `BkOTOptions` 结构。`application.name` 与 `transport.endpoint` 必填。
6
6
 
7
7
  ```ts
8
8
  import { BkOpenTelemetry, type BkOTOptions } from '@blueking/open-telemetry';
@@ -20,7 +20,7 @@ const bkOT = new BkOpenTelemetry(options);
20
20
  | 字段 | 类型 | 默认 | 说明 |
21
21
  | --- | --- | --- | --- |
22
22
  | `application` | `BkOTApplicationConfig` | 必填 | 应用 Resource 标识 |
23
- | `transport` | `BkOTTransportConfig` | 必填 | 三类 OTLP HTTP 导出链路 |
23
+ | `transport` | `BkOTTransportConfig` | 必填 | 单一 RUM OTLP HTTP 导出链路 |
24
24
  | `session` | `BkOTSessionConfig` | `{ sampleRate: 1 }` | Session 存储和确定性采样 |
25
25
  | `tracking` | `BkOTTrackingConfig` | `{}` | 内置采集、View 与事件 Hook |
26
26
  | `context` | `BkOTContextConfig` | 无 | 初始用户与公共属性 Hook |
@@ -47,24 +47,15 @@ transport: {
47
47
  endpoint: 'https://collector.example.com',
48
48
  token: 'report-token',
49
49
  headers: { 'X-Tenant': 'blueking' },
50
- signals: {
51
- traces: {
52
- endpoint: 'https://trace.example.com/v1/rum',
53
- processor: 'batch',
54
- batch: {
55
- maxQueueSize: 2048,
56
- maxExportBatchSize: 512,
57
- scheduledDelayMillis: 5000,
58
- exportTimeoutMillis: 30000,
59
- },
60
- timeoutMillis: 10_000,
61
- concurrencyLimit: 10,
62
- },
63
- metrics: {
64
- intervalMillis: 60_000,
65
- },
66
- logs: {},
50
+ processor: 'batch',
51
+ batch: {
52
+ maxQueueSize: 2048,
53
+ maxExportBatchSize: 512,
54
+ scheduledDelayMillis: 5000,
55
+ exportTimeoutMillis: 30000,
67
56
  },
57
+ timeoutMillis: 10_000,
58
+ concurrencyLimit: 10,
68
59
  }
69
60
  ```
70
61
 
@@ -72,35 +63,17 @@ transport: {
72
63
 
73
64
  | 字段 | 类型 | 默认 | 说明 |
74
65
  | --- | --- | --- | --- |
75
- | `endpoint` | `string` | 无 | 根地址,去掉末尾 `/` 后拼默认信号路径 |
66
+ | `endpoint` | `string` | 无 | 根地址,去掉末尾 `/` 后拼 `/v1/rum` |
76
67
  | `token` | `string` | 无 | 生成 `Authorization: Bearer <token>` |
77
- | `headers` | `Record<string,string>` | 无 | 所有信号的公共 Header |
78
- | `signals` | `SignalExportersInputConfig` | 三类开启 | 单信号开关和覆盖项 |
79
-
80
- 默认路径:Trace `/v1/rum`、Metric `/v1/metrics`、Log `/v1/logs`。单信号 `endpoint` 是完整 URL,不再拼路径。
81
-
82
- Header 覆盖顺序为 `token` < 根 `headers` < 单信号 `headers`。同名字段由右侧配置覆盖。
83
-
84
- ### 单信号字段
85
-
86
- | 字段 | Trace | Metric | Log | SDK 默认 |
87
- | --- | --- | --- | --- | --- |
88
- | `endpoint` | 支持 | 支持 | 支持 | 回退根 Endpoint |
89
- | `headers` | 支持 | 支持 | 支持 | 回退根 Header |
90
- | `timeoutMillis` | 支持 | 支持 | 支持 | 交给 OTel exporter |
91
- | `concurrencyLimit` | 支持 | 支持 | 支持 | 交给 OTel exporter |
92
- | `processor` | `'batch' \| 'simple'` | — | — | `batch` |
93
- | `batch` | `BkOTBatchConfig` | — | — | 交给 `BatchSpanProcessor` |
94
- | `intervalMillis` | — | number | — | `60_000` |
68
+ | `headers` | `Record<string,string>` | 无 | RUM 请求 Header |
69
+ | `timeoutMillis` | `number` | OTel 默认 | Exporter 超时 |
70
+ | `concurrencyLimit` | `number` | OTel 默认 | Exporter 并发数 |
71
+ | `processor` | `'batch' \| 'simple'` | `batch` | Span Processor 模式 |
72
+ | `batch` | `BkOTBatchConfig` | OTel 默认 | BatchSpanProcessor 参数 |
95
73
 
96
74
  `batch` 支持 `maxQueueSize`、`maxExportBatchSize`、`scheduledDelayMillis`、`exportTimeoutMillis`。未提供时使用 OpenTelemetry `BatchSpanProcessor` 默认值。
97
75
 
98
- 校验规则:
99
-
100
- - 三类信号不能全部为 `false`。
101
- - 每个已开启信号必须配置单独 Endpoint,或能回退到根 `transport.endpoint`。
102
- - 关闭 Trace 后不创建 Trace exporter/processor,不记录可导出的 Span,也不注入 `traceparent`。
103
- - 关闭 Metric 后不创建 reader;关闭 Log 后不创建 log processor,Request Body 配置也不会产生 Log。
76
+ SDK 不提供 Logs/Metrics 开关或 Provider,所有 RUM 原始事件只走 `/v1/rum`。
104
77
 
105
78
  更多行为见[传输与采样](./transport-sampling.md)。
106
79
 
@@ -132,33 +105,23 @@ URL matcher 支持字符串包含、`RegExp` 或 `(url) => boolean`。字符串
132
105
  | --- | --- | --- | --- |
133
106
  | `excludedUrls` | matcher 或 matcher[] | 无 | 命中后不采集、不注入、不计入页面活动 |
134
107
  | `allowedTracingUrls` | matcher 或 matcher[] | 无 | W3C Trace Context 显式白名单;同源请求也必须命中,推荐 URL-aware 函数 |
135
- | `beforeSend` | `(event, context) => boolean \| void` | 无 | 修改请求属性;返回 `false` 丢弃 Span,并跳过该请求的 Body Log |
136
- | `body` | `BkOTRequestBodyConfig` | 关闭 | 请求/响应 Body Log |
137
-
138
- Request Body:
139
-
140
- | 字段 | 类型 | 默认 | 说明 |
141
- | --- | --- | --- | --- |
142
- | `capture` | `'errors' \| 'all'` | `errors` | 错误包括状态未知、0 或 `>=400` |
143
- | `maxSize` | `number` | `10 * 1024` | 每个最终 Body 的最大字符数;无效值回退默认 |
144
- | `allowedContentTypes` | `(string \| RegExp)[]` | text、json、urlencoded、graphql | Response 必须命中;无 Content-Type 的 Request 允许读取 |
145
- | `redact` | `(payload) => string \| undefined` | 必填 | 返回脱敏文本;`undefined` 跳过当前 Body |
108
+ | `beforeSend` | `(event, context) => boolean \| void` | 无 | 修改请求属性;返回 `false` 丢弃 Span |
146
109
 
147
- 默认不采集 Body。Body 只在 Log 信号开启时生效,不支持 FormData、ArrayBuffer 等不可安全文本化的内容。
110
+ SDK 不读取或上报请求/响应 Body。
148
111
 
149
112
  ## tracking 内置能力
150
113
 
151
114
  | 字段 | 类型 | 默认 | 参数 |
152
115
  | --- | --- | --- | --- |
153
116
  | `resource` | `boolean` | `true` | 无;`false` 只关闭静态资源 Span,Resource Observer 仍服务请求 timing/活动 |
154
- | `error` | `boolean \| BkOTErrorPluginOptions` | `true` | `windowMs=60_000`、`maxPerWindow=5` |
117
+ | `error` | `boolean` | `true` | 无;每条原始错误都生成 Span |
155
118
  | `webVitals` | `boolean` | `true` | 无 |
156
119
  | `blankScreen` | `boolean \| BkOTBlankScreenPluginOptions` | `true` | 见下表 |
157
120
  | `device` | `boolean \| BkOTDevicePluginOptions` | `true` | 见下表 |
158
121
  | `action` | `boolean \| BkOTActionPluginOptions` | `true` | 见下表 |
159
- | `longTask` | `boolean \| BkOTLongTaskPluginOptions` | `false` | `threshold=50`、`warningThreshold=100` ms |
122
+ | `longTask` | `boolean \| BkOTLongTaskPluginOptions` | `false` | `threshold=50` ms |
160
123
  | `websocket` | `boolean` | `false` | 无 |
161
- | `cspViolation` | `boolean` | `false` | 无,内置同指纹 60 秒最多 5 条 |
124
+ | `cspViolation` | `boolean` | `false` | 无;每条 CSP 违规都生成 Span |
162
125
 
163
126
  Blank Screen:
164
127
 
@@ -168,7 +131,7 @@ Blank Screen:
168
131
  | `threshold` | `0.8` | 九点采样的空白比例,限制到 `0..1` |
169
132
  | `checkDelay` | `1000` ms | 页面活动稳定后的首次检查延迟 |
170
133
  | `confirmationDelay` | `200` ms | 两次候选白屏的确认间隔 |
171
- | `ignoreSelectors` | 内置 loading/skeleton 选择器 | 自定义数组会替换内置数组 |
134
+ | `ignoreSelectors` | 内置 loading/skeleton 选择器 | 自定义数组会追加到内置数组 |
172
135
 
173
136
  Action:
174
137
 
@@ -196,7 +159,7 @@ tracking: {
196
159
  }
197
160
  ```
198
161
 
199
- 该 Hook 在 Span/Log 进入底层 processor 前执行,可原地修改属性或返回 `false` 丢弃。异常会被吞掉,`debug: true` 时输出 warning。它不处理 Metric;请求专属逻辑优先使用 `tracking.request.beforeSend`。
162
+ 该 Hook 在 Span 进入底层 processor 前执行,可原地修改属性或返回 `false` 丢弃。异常会被吞掉,`debug: true` 时输出 warning;请求专属逻辑优先使用 `tracking.request.beforeSend`。
200
163
 
201
164
  ## context
202
165
 
@@ -204,11 +167,10 @@ tracking: {
204
167
  | --- | --- | --- | --- |
205
168
  | `user.id` | `string` | 无 | SDK 原样写入 `user.id` |
206
169
  | `attributes.page` | `() => Attributes` | host/path | 页面、请求、错误、Action 等事件属性 |
207
- | `attributes.metric` | `() => Attributes` | `{}` | 内置 Metric 的低基数自定义维度 |
208
170
  | `attributes.error` | `() => Attributes` | `{}` | Error Span 附加属性 |
209
171
  | `attributes.custom` | `() => Attributes` | `{}` | `reportCustomEvent()` 附加属性 |
210
172
 
211
- 自定义 `page` Hook 会替换默认 host/path Hook,不是合并默认实现。Metric Hook 禁止放用户 ID、订单 ID、完整 URL 等高基数字段。
173
+ 自定义 `page` Hook 会替换默认 host/path Hook,不是合并默认实现。
212
174
 
213
175
  ## privacy
214
176
 
@@ -216,7 +178,7 @@ tracking: {
216
178
  | --- | --- | --- | --- |
217
179
  | `trackingConsent` | `'granted' \| 'not-granted'` | `granted` | 初始化授权状态 |
218
180
  | `redactUrl` | `(url) => string` | 删除 username/password/query/hash | SDK URL 属性脱敏 |
219
- | `redactAttributes` | `(attributes) => Attributes` | 原样返回 | Resource、SDK 创建的 Span/Log 和内置插件属性脱敏 |
181
+ | `redactAttributes` | `(attributes) => Attributes` | 原样返回 | Resource、SDK 创建的 Span 和内置插件属性脱敏 |
220
182
 
221
183
  第三方 instrumentation 的自有 Span 属性不保证经过 `redactAttributes`;需要在 `tracking.beforeSend` 做最终兜底。详见[隐私与公共属性](./privacy.md)。
222
184
 
@@ -238,11 +200,8 @@ new BkOpenTelemetry({
238
200
  endpoint: 'https://collector.example.com',
239
201
  token: 'token',
240
202
  headers: {},
241
- signals: {
242
- traces: { processor: 'batch', batch: {} },
243
- metrics: { intervalMillis: 60_000 },
244
- logs: {},
245
- },
203
+ processor: 'batch',
204
+ batch: {},
246
205
  },
247
206
  session: { sampleRate: 1 },
248
207
  tracking: {
@@ -52,9 +52,9 @@ await bkOT.start();
52
52
 
53
53
  ## 使用 runtime context
54
54
 
55
- `init(context)` 中可以访问 `tracer`、`meter`、`logger`、`startSpan()`、`emitLog()`、`getRuntimeAttributes()` 等能力。
55
+ `init(context)` 中可以访问 `tracer`、`startSpan()`、`getRuntimeAttributes()` 等能力。
56
56
 
57
- 优先使用 `context.startSpan()` 和 `context.emitLog()`:它们会合并事件发生时的运行时上下文并应用 SDK 脱敏。直接调用 `context.logger.emit()` 的 Log 不会自动获得这些能力,可能因缺少有效 Session/View 被导出过滤器丢弃。
57
+ 优先使用 `context.startSpan()`:它会合并事件发生时的运行时上下文并应用 SDK 脱敏。
58
58
 
59
59
  ```ts
60
60
  let teardownVisibility = () => {};
@@ -63,13 +63,12 @@ const visibilityPlugin = createPlugin({
63
63
  name: 'visibility-change',
64
64
  init(context) {
65
65
  const onVisibilityChange = () => {
66
- context.emitLog({
67
- severityText: 'INFO',
68
- body: 'document.visibilitychange',
69
- attributes: {
66
+ const occurredAt = Date.now();
67
+ context.startSpan('document.visibilitychange', {
68
+ 'event.type': 'custom',
69
+ 'event.timestamp': occurredAt,
70
70
  'document.visibility_state': document.visibilityState,
71
- },
72
- });
71
+ }, { startTime: occurredAt }).end(occurredAt);
73
72
  };
74
73
 
75
74
  document.addEventListener('visibilitychange', onVisibilityChange);
@@ -164,10 +163,8 @@ bkOT.useInstrumentation(new SomeWebInstrumentation());
164
163
  await bkOT.start();
165
164
  ```
166
165
 
167
- > Extension instrumentation 与采集生命周期一致:未授权或 SDK 停止时不会注册;授权后注册。它产生的 Span 受 Session sampler 和导出过滤约束;第三方 instrumentation Metric 因没有公开采样 helper,默认会被过滤。
168
-
169
- ## 自定义 Metric 注意事项
166
+ > Extension instrumentation 与采集生命周期一致:未授权或 SDK 停止时不会注册;授权后注册。它产生的 Span 受 Session sampler 和导出过滤约束。
170
167
 
171
- 内置 Metric 会主动带上内部采样标记与低基数 `view.url_path_group`。当前包没有导出稳定的自定义 Metric helper 或采样属性;自定义插件直接调用 `context.meter` 创建的数据点默认无法通过 `FilteringMetricExporter`。不要依赖内部 `bk.rum.sampled` 字段,也不要把 `context.getRuntimeAttributes()` 整体复制到 Metric attributes,否则还会把唯一的 `session.id`、`view.id`、`action.id` 变成高基数 labels。
168
+ ## 自定义信号边界
172
169
 
173
- 如果需求是记录一次具体业务行为,使用 Span 或 Log。确实需要自定义 Metric 时,应先为 SDK 设计并公开低基数、采样安全的 Metric API,而不是绕过当前过滤约束。
170
+ SDK 插件上下文不提供 Meter、Logger 或 `emitLog()`。具体业务行为使用 Span;计数、分布和分位数由服务端从 Span 派生。
@@ -2,110 +2,38 @@
2
2
 
3
3
  # 数据模型
4
4
 
5
- SDK 的数据模型遵循“浏览器 SDK 负责低成本原始数据和单事件归一,跨事件聚合交给后端”的边界。
5
+ 数据模型遵循“浏览器上报原始事件,服务端派生聚合”的边界。
6
6
 
7
- ## 分层模型
7
+ ## 四层字段
8
8
 
9
- 1. OpenTelemetry 原生字段:trace、span、resource、metric、log 的标准字段。
10
- 2. RUM 归一字段:`span_type`、`span_subtype`、`result`、`error_type` 等。
11
- 3. 运行时上下文:`user.id`、`session.id`、`view.id`、`view.url`、`view.url_path_group` 等。
12
- 4. 后端派生字段:session/view duration、count、地理信息、影响用户数、trace tree 分析等。
9
+ 1. OpenTelemetry Resource/Span 标准字段。
10
+ 2. RUM 事件字段:`event.id/type/phase/timestamp`。
11
+ 3. 关联上下文:`user.id`、`session.id`、`view.id`、`action.id`。
12
+ 4. 单事件语义:`span_type`、`span_subtype`、`result`、`error_type` 和插件原始字段。
13
13
 
14
14
  ## Span 类型
15
15
 
16
- | 类型 | 说明 | 常见来源 |
17
- | --- | --- | --- |
18
- | `document` | 文档加载 | View 管理器(初始加载) |
19
- | `resource` | Fetch/XHR 请求与静态资源 | request、resource 采集 |
20
- | `vital` | Web Vitals | webVitals 插件 |
21
- | `error` | 浏览器与体验错误 | error 插件、blankScreen 插件、cspViolation 插件 |
22
- | `longtask` | 长任务 | longTask 插件 |
23
- | `action` | 用户动作 | action 插件、reportAction |
24
- | `route` | 路由切换 | View 管理器(SPA/手动 View) |
25
- | `custom` | 自定义事件 | reportCustomEvent、自定义插件、websocket 插件;`reportCustomEvent({ error })` 仍属于此类型 |
16
+ `document`、`route`、`session`、`resource`、`vital`、`error`、`longtask`、`action`、`websocket`、`custom`。
26
17
 
27
- > 每种 span 的具体 span 名、metric 名、log 事件名和完整属性字典见[遥测参考](./telemetry-reference.md)。
18
+ ## 浏览器直接产生
28
19
 
29
- 示例:自定义业务事件归一为 `custom`。
20
+ - Session/View/Action 标识和生命周期;
21
+ - URL、HTTP 状态、资源体积与 Resource Timing;
22
+ - Error/CSP 原始字段和标准 exception event;
23
+ - Web Vitals 值与 attribution;
24
+ - WebSocket 连接生命周期;
25
+ - 设备、浏览器、系统和网络上下文。
30
26
 
31
- ```ts
32
- import { RUM_SPAN_TYPE, buildRumSpanAttributes } from '@blueking/open-telemetry';
27
+ ## 浏览器本地语义
33
28
 
34
- const span = bkOT.startSpan('custom.search', {
35
- ...buildRumSpanAttributes({
36
- spanType: RUM_SPAN_TYPE.custom,
37
- spanSubtype: 'search',
38
- }),
39
- 'biz.keyword_length': 6,
40
- });
29
+ CLS、INP、View Loading Time、Action Loading Time、挫败信号和白屏判断依赖 DOM、Performance API 或页面活动窗口,由 SDK 计算后上报。
41
30
 
42
- span.end();
43
- ```
31
+ ## 服务端派生
44
32
 
45
- ## Result 与 Error Type
33
+ - Session/View duration 和各类 count;
34
+ - 错误率、错误 fingerprint/group;
35
+ - Histogram 与 P50/P75/P95/P99;
36
+ - 影响用户数、地理信息和采样修正;
37
+ - 迟到/乱序关联和 View 版本合并。
46
38
 
47
- `result` 描述事件结果,取值包括:
48
-
49
- - `success`
50
- - `warning`
51
- - `error`
52
- - `timeout`
53
- - `abort`
54
-
55
- 请求 Resource Span 会根据状态码推导结果:`408`、`504` 为 timeout,`>= 400` 为 error,其余为 success。
56
-
57
- `reportCustomEvent({ error })` 会设置 `result=error` 和 OpenTelemetry Span Status ERROR,但不会把 `span_type` 从 `custom` 改为 `error`。`span_type` 描述事件类别,`result` 描述结果,两者不要混用。
58
-
59
- ```ts
60
- bkOT.reportCustomEvent({
61
- name: 'upload_timeout',
62
- error: new Error('request timeout'),
63
- attributes: {
64
- 'biz.file_size': 1024 * 1024,
65
- },
66
- });
67
- ```
68
-
69
- ## SDK 直接采集
70
-
71
- 以下字段由浏览器 API、接入方配置或 SDK 运行期上下文直接提供:
72
-
73
- - 应用与环境:`service.name`、`deployment.environment.name`、`service.version`
74
- - 用户与会话:`user.id`、`session.id`
75
- - View:`view.id`、`view.name`、`view.url`、`view.url_path_group`、`view.loading_type`
76
- - 终端信息:`device.type`、`browser.name`、`browser.version`、`os.name`、`network.effective_type`
77
- - HTTP / Resource:`http.request.method`、`http.response.status_code`、`url.full`、`resource.size`
78
- - Web Vitals:`vital.metric`、`vital.value`、`vital.rating`
79
- - Error Span 属性:`exception.message_short`、`exception.stack_top_frame`、`exception.fingerprint`;完整异常位于标准 `exception` Span Event
80
-
81
- ## 后端派生
82
-
83
- 以下字段不在浏览器 SDK 中直接生成:
84
-
85
- - Session 聚合:`session.duration`、`view_count`、`trace_count`、`error_count`、`action_count`
86
- - View 聚合:`view.duration`、`request_count`、`resource_count`、`longtask_count`
87
- - Trace 树:`relative_start`、`hierarchy_level`、`parent_span_name`、`is_critical_path`
88
- - 影响面:`affected_user_count`
89
- - 地理信息:`geo.country`、`geo.city`
90
-
91
- ## 高基数字段策略
92
-
93
- 高基数字段可以进入 span/log,但不应进入 metric 维度。比如订单 ID、用户输入、完整 URL query 都应谨慎使用。
94
-
95
- ```ts
96
- bkOT.reportCustomEvent({
97
- name: 'order_submit',
98
- attributes: {
99
- 'biz.order_id': '202605270001',
100
- 'biz.order_type': 'normal',
101
- },
102
- });
103
- ```
104
-
105
- 上例中 `biz.order_id` 适合放在 span/log 中定位单次问题,不适合作为 metric 维度做长期聚合。
106
-
107
- ## Metric 与 View 的关联
108
-
109
- Metric 不携带唯一的 `view.id`、`session.id` 或 `action.id`,只保留 `view.url_path_group`、`view.loading_type` 等低基数维度。这样可以按页面类型聚合,又不会因为每次访问生成新的时序而造成基数爆炸。
110
-
111
- 需要定位某一次 View 时,使用同一指标对应的 span(例如 `browser.web_vital`)或 View Snapshot Log;它们携带精确的 `session.id` 和 `view.id`。后端需要从聚合指标跳转到样本时,应通过 exemplar 或 span/log 派生聚合建立关联,而不是把 `view.id` 放进 metric labels。
39
+ 服务端应使用 `event.id` 去重,使用 `view.id + view.version` 幂等处理 View 更新。
@@ -2,7 +2,7 @@
2
2
 
3
3
  # 简介
4
4
 
5
- `@blueking/open-telemetry` 是面向浏览器真实用户监控(RUM)的 OpenTelemetry 封装 SDK。它基于 OpenTelemetry Web SDK,将页面访问、资源加载、接口请求、JavaScript 错误、Web Vitals、空白屏、会话、用户动作等浏览器事件统一转成 trace、metric、log 三类信号,并通过 OTLP HTTP 协议上报。
5
+ `@blueking/open-telemetry` 是面向浏览器真实用户监控(RUM)的 OpenTelemetry 封装 SDK。它将页面访问、资源加载、接口请求、JavaScript 错误、Web Vitals、空白屏、会话和用户动作等浏览器事件统一转成原始 RUM Span,通过单一 OTLP HTTP 通道上报。
6
6
 
7
7
  ## 适合解决什么问题
8
8