@blueking/open-telemetry 0.0.14 → 0.0.16

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 (49) hide show
  1. package/README.md +96 -641
  2. package/dist/bk-rum.global.js +9 -9
  3. package/dist/bk-rum.global.js.map +1 -1
  4. package/dist/core/action-activity.d.ts +28 -0
  5. package/dist/core/config.d.ts +113 -93
  6. package/dist/core/page-activity.d.ts +14 -0
  7. package/dist/core/plugin.d.ts +23 -6
  8. package/dist/core/processor.d.ts +25 -4
  9. package/dist/core/request-timing.d.ts +5 -0
  10. package/dist/core/runtime-context.d.ts +51 -3
  11. package/dist/core/sampling.d.ts +5 -1
  12. package/dist/core/sdk.d.ts +29 -10
  13. package/dist/core/url.d.ts +4 -1
  14. package/dist/index.d.ts +12 -14
  15. package/dist/index.js +2184 -1175
  16. package/dist/index.js.map +1 -1
  17. package/dist/plugins/action.d.ts +6 -2
  18. package/dist/plugins/activity.d.ts +6 -0
  19. package/dist/plugins/blank-screen.d.ts +17 -0
  20. package/dist/plugins/common.d.ts +11 -3
  21. package/dist/plugins/device.d.ts +2 -0
  22. package/dist/plugins/long-task.d.ts +3 -12
  23. package/dist/plugins/page-view.d.ts +1 -0
  24. package/dist/plugins/request-body.d.ts +14 -0
  25. package/dist/plugins/resource.d.ts +17 -1
  26. package/dist/plugins/session-state.d.ts +18 -0
  27. package/dist/plugins/session.d.ts +4 -4
  28. package/dist/plugins/web-vitals.d.ts +74 -0
  29. package/dist/schema/attributes.d.ts +31 -10
  30. package/dist/schema/span.d.ts +4 -12
  31. package/package.json +3 -7
  32. package/skills/bk-rum-otele/SKILL.md +39 -33
  33. package/skills/bk-rum-otele/evals/evals.json +3 -3
  34. package/skills/bk-rum-otele/references/api.md +247 -114
  35. package/skills/bk-rum-otele/references/architecture.md +141 -0
  36. package/skills/bk-rum-otele/references/capabilities.md +100 -0
  37. package/skills/bk-rum-otele/references/concepts.md +40 -111
  38. package/skills/bk-rum-otele/references/configuration.md +202 -254
  39. package/skills/bk-rum-otele/references/custom-plugin.md +22 -7
  40. package/skills/bk-rum-otele/references/data-model.md +17 -10
  41. package/skills/bk-rum-otele/references/framework-integration.md +25 -17
  42. package/skills/bk-rum-otele/references/getting-started.md +42 -86
  43. package/skills/bk-rum-otele/references/plugins.md +232 -138
  44. package/skills/bk-rum-otele/references/privacy.md +47 -34
  45. package/skills/bk-rum-otele/references/telemetry-reference.md +74 -45
  46. package/skills/bk-rum-otele/references/transport-sampling.md +79 -0
  47. package/skills/bk-rum-otele/references/troubleshooting.md +71 -37
  48. package/dist/plugins/http-body.d.ts +0 -3
  49. package/dist/plugins/route-timing.d.ts +0 -2
@@ -0,0 +1,100 @@
1
+ <!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
2
+
3
+ # 能力矩阵
4
+
5
+ 本页回答四个问题:SDK 能采什么、默认是否启用、依赖哪个浏览器能力、最终上报什么。精确名称与属性请继续查[遥测参考](./telemetry-reference.md)。
6
+
7
+ ## 总览
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 | 作为公共属性 | — | 作为公共属性 |
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 有效性和单信号开关控制。
29
+
30
+ ## 能力边界
31
+
32
+ ### SDK 直接负责
33
+
34
+ - 创建和轮换 Session,划分初始加载、SPA、BFCache、手动和 Session 续期 View。
35
+ - 统一 patch Fetch/XHR;请求 span、活动计数、Trace Header、Resource Timing 和 Body 采集共用同一生命周期。
36
+ - 把浏览器事件归一为 `span_type`、`result`、`error_type`、`duration_bucket`、`target_*` 等字段。
37
+ - 自动为 Span/Log 关联 `session.id`、`view.id`,为 Metric 保留低基数 `view.url_path_group`。
38
+ - 在 exporter 前执行采样、有效上下文、自上报请求和 `tracking.beforeSend` 过滤。
39
+
40
+ ### SDK 不负责
41
+
42
+ - 不聚合 `session.duration`、影响用户数、地理信息、Trace 关键路径等后端指标。
43
+ - 不自动判断业务字段是否敏感,也不 hash `user.id`。
44
+ - 不默认采集 HTTP 请求/响应 Body。
45
+ - 不把唯一的 `session.id`、`view.id`、`action.id` 放入 Metric labels。
46
+ - 不保证浏览器未暴露的数据,例如缺少 `Timing-Allow-Origin` 的跨域资源网络阶段。
47
+
48
+ ## 默认开启与关闭
49
+
50
+ ```ts
51
+ new BkOpenTelemetry({
52
+ application: { name: 'capability-demo' },
53
+ transport: { endpoint: 'https://collector.example.com' },
54
+ tracking: {
55
+ request: true,
56
+ resource: true,
57
+ error: true,
58
+ webVitals: true,
59
+ action: true,
60
+ blankScreen: true,
61
+ device: true,
62
+ longTask: false,
63
+ websocket: false,
64
+ cspViolation: false,
65
+ },
66
+ });
67
+ ```
68
+
69
+ Session 与 View 是导出有效性边界,不提供关闭开关。`tracking.view` 只配置自动/手动模式、稳定耗时和路由分组。
70
+
71
+ ## 浏览器降级行为
72
+
73
+ | 条件 | 行为 |
74
+ | --- | --- |
75
+ | 无 `PerformanceObserver` 或不支持 `resource` | 跳过静态资源观察和请求网络阶段匹配;Fetch/XHR 本身仍可采集 |
76
+ | 不支持 Long Animation Frames | Long Task 插件尝试回退 Long Tasks API |
77
+ | 两种 Long Task API 都不支持 | 跳过 Long Task,不抛出业务异常 |
78
+ | 跨域资源无 `Timing-Allow-Origin` | 只保留浏览器可见的总耗时/体积,不伪造网络阶段 |
79
+ | 无 Network Information / UA-CH | 只写入可获得的设备字段 |
80
+ | 无 `localStorage` 或访问失败 | Session/Device 持久化退回内存 |
81
+ | 插件初始化抛错 | 隔离该插件;`debug: true` 时输出 warning,其余插件继续启动 |
82
+
83
+ ## 成本与隐私提示
84
+
85
+ | 能力 | 主要成本/风险 | 建议 |
86
+ | --- | --- | --- |
87
+ | `session.sampleRate` | 决定三类信号总体数据量 | 按应用容量设置;排障临时设为 `1` |
88
+ | Metric 自定义维度 | 高基数会放大时序数量 | 只放应用、租户类别、路由模板等低基数字段 |
89
+ | Request Body | 可能包含凭证、个人数据,且增加网络体积 | 默认关闭;开启时限制类型/大小并强制脱敏 |
90
+ | Action 文本命名 | DOM 文本可能包含用户输入 | 保持 `nameCollection: 'explicit'`,关键元素使用 `data-bk-action-name` |
91
+ | Device 持久 ID | 支持跨 Session 关联 | 默认不持久化;需取得合规依据后再开启 |
92
+ | Long Task | 产生 Span 与脚本归因信息 | 仅性能分析场景开启,结合采样控制 |
93
+ | WebSocket | Proxy 全局构造器并统计消息字节 | 同页面单实例;不采集消息内容 |
94
+
95
+ ## 下一步
96
+
97
+ - 配置每项能力:[配置参考](./configuration.md)
98
+ - 理解启动与上报链路:[架构与数据流](./architecture.md)
99
+ - 查看单个插件实现行为:[插件总览](./plugins.md)
100
+ - 查看精确遥测名称和属性:[遥测参考](./telemetry-reference.md)
@@ -10,7 +10,7 @@
10
10
 
11
11
  - Trace:用于描述一次有起止时间的行为,例如页面访问、接口请求、资源加载、用户点击、长任务。
12
12
  - Metric:用于描述可聚合的数值,例如 Web Vitals、长任务数量、WebSocket 消息大小、空白屏结果。
13
- - Log:用于描述离散事件或诊断信息,例如错误、CSP 违规、Session 生命周期、HTTP body 错误路径。
13
+ - Log:用于描述离散事件或诊断信息,例如 Session 生命周期、View Snapshot、请求 Body 和 WebSocket 状态。
14
14
 
15
15
  示例:手动创建一个业务 span。
16
16
 
@@ -18,7 +18,7 @@
18
18
  import { BkOpenTelemetry } from '@blueking/open-telemetry';
19
19
 
20
20
  const bkOT = new BkOpenTelemetry({
21
- app: { name: 'checkout-web' },
21
+ application: { name: 'checkout-web' },
22
22
  transport: { endpoint: 'https://rum-collector.example.com' },
23
23
  });
24
24
 
@@ -36,7 +36,7 @@ SDK 会维护运行时公共上下文,并自动挂到后续 span/log 上:
36
36
 
37
37
  - `user.id`:由接入方提供,SDK 原样透传,不 hash、不脱敏、不改写。
38
38
  - `session.id`:由 session 插件生成和轮换,用于关联同一次访问会话。
39
- - `view.id` / `view.url` / `view.url_path_group`:由 pageView 插件维护,用于关联同一个页面或路由实例。
39
+ - `view.id` / `view.name` / `view.url` / `view.url_path_group`:由 View 管理器维护,用于关联同一个页面或路由实例。
40
40
 
41
41
  示例:登录后更新用户上下文。
42
42
 
@@ -46,34 +46,34 @@ bkOT.setUser({
46
46
  });
47
47
  ```
48
48
 
49
- 示例:业务路由系统主动设置 view 上下文。
49
+ 示例:手动模式由业务路由系统创建 View。
50
50
 
51
51
  ```ts
52
- bkOT.setView({
53
- id: 'view-product-detail',
52
+ // 前提:autoStart: false,且已经 await bkOT.start() 建立 Session。
53
+ bkOT.startView({
54
+ name: '商品详情',
54
55
  url: window.location.href,
55
- urlPathGroup: '/product/:id',
56
- loadingType: 'route_change',
56
+ attributes: { 'biz.owner': 'product-team' },
57
57
  });
58
58
  ```
59
59
 
60
- ## Instrumentation 与插件
60
+ ## 内置采集与扩展
61
61
 
62
62
  SDK 将能力分为两类:
63
63
 
64
- 1. 官方 instrumentation:`documentLoad`、`fetch`、`xhr`、`userInteraction`,主要负责 patch 浏览器 API 或读取标准浏览器性能数据。
65
- 2. RUM 插件:`pageView`、`resource`、`error`、`webVitals`、`blankScreen`、`device`、`session` 等,负责主动产生 RUM 归一数据。
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
66
 
67
- 示例:关闭官方用户交互 instrumentation,仅使用 SDK 的 `action` 插件。
67
+ 用户交互统一由 SDK 的 `action` 插件采集。接入额外 instrumentation 时,应避免再注册覆盖 Fetch/XHR 或用户交互的探针,以免重复上报。
68
68
 
69
69
  ```ts
70
70
  new BkOpenTelemetry({
71
- instrumentations: {
72
- userInteraction: false,
73
- },
74
- plugins: {
71
+ application: { name: 'demo' },
72
+ transport: { endpoint: 'https://rum-collector.example.com' },
73
+ tracking: {
75
74
  action: {
76
- eventNames: ['click', 'submit', 'keydown'],
75
+ actionNameAttribute: 'data-bk-action-name',
76
+ maxDuration: 10000,
77
77
  },
78
78
  },
79
79
  });
@@ -81,14 +81,15 @@ new BkOpenTelemetry({
81
81
 
82
82
  ## 采样
83
83
 
84
- `sampling.rate` 是会话级 sticky 采样。一次会话命中后,RUM 插件和手动事件都会上报;未命中时,主动产生数据的插件不会启动,`reportAction()` 和 `reportCustomEvent()` 会丢弃。
84
+ `session.sampleRate` 是会话级确定性采样。决定由 `application.name + session.id` 的稳定 hash 得出,同一 Session 的三类信号保持一致。插件仍会维护必要的浏览器生命周期,但未命中时创建或导出路径会丢弃数据,`reportAction()` 和 `reportCustomEvent()` 直接返回。
85
85
 
86
86
  示例:生产环境按 10% 会话采样。
87
87
 
88
88
  ```ts
89
89
  new BkOpenTelemetry({
90
- sampling: {
91
- rate: 0.1,
90
+ application: { name: 'demo' },
91
+ session: {
92
+ sampleRate: 0.1,
92
93
  },
93
94
  transport: {
94
95
  endpoint: 'https://rum-collector.example.com',
@@ -100,7 +101,7 @@ new BkOpenTelemetry({
100
101
 
101
102
  SDK 会为 span 补充 RUM 归一字段,例如:
102
103
 
103
- - `span_type`:`document`、`http`、`resource`、`vital`、`error`、`longtask`、`action`、`route`、`custom`
104
+ - `span_type`:`document`、`resource`、`vital`、`error`、`longtask`、`action`、`route`、`custom`
104
105
  - `result`:`success`、`warning`、`error`、`timeout`、`abort`
105
106
  - `duration_bucket`:`<100ms`、`100~500ms`、`500ms~2s`、`>2s`
106
107
  - `target_label`:跨类型的主标签,用于统一检索
@@ -122,106 +123,34 @@ const span = bkOT.startSpan('custom.cache_warmup', {
122
123
  span.end();
123
124
  ```
124
125
 
125
- # Plugin 与 Instrumentation 的区别
126
-
127
- `@blueking/open-telemetry` 把采集能力拆成两类:**官方 Instrumentation** 和 **RUM 插件(Plugin)**。两者在配置入口、数据来源、生命周期和采样行为上都不同,理解差异有助于按需裁剪采集能力。
128
-
129
- ## 一句话区分
126
+ # 内置采集与扩展
130
127
 
131
- - **Instrumentation**:OpenTelemetry 官方/第三方探针,负责 patch 浏览器原生 API 或读取标准性能数据,是「数据从哪来」的底层来源。
132
- - **Plugin**:bk-ot 自研的能力单元,基于 runtime context 主动产生 RUM 归一数据,是「我们要采什么、怎么归一」的业务层。
133
-
134
- ## 配置入口
135
-
136
- 两类能力在配置上完全对称,分别挂在顶层的 `instrumentations` 和 `plugins` 下:
128
+ `tracking` 只配置 SDK 内置采集能力;`extensions` 只注册接入方提供的扩展实例。
137
129
 
138
130
  ```ts
139
131
  new BkOpenTelemetry({
140
- // 官方探针:开关 + 自定义实例
141
- instrumentations: {
142
- documentLoad: true,
143
- fetch: true,
144
- xhr: true,
145
- userInteraction: true,
146
- custom: [new MyCustomInstrumentation()],
147
- },
148
- // bk-ot 自研插件:开关 + 自定义插件
149
- plugins: {
150
- pageView: true,
132
+ application: { name: 'demo' },
133
+ transport: { endpoint: 'https://collector.example.com' },
134
+ tracking: {
135
+ request: true,
151
136
  error: true,
152
- webVitals: true,
153
- custom: [myBizPlugin],
137
+ longTask: false,
154
138
  },
155
- });
156
- ```
157
-
158
- ## 内置能力清单
159
-
160
- | 类型 | 内置项 |
161
- | --------------- | ---------------------------------------------------------------------------------------------------------------------------- |
162
- | Instrumentation | `documentLoad`、`fetch`、`xhr`、`userInteraction` |
163
- | Plugin | `pageView`、`resource`、`error`、`webVitals`、`blankScreen`、`device`、`session`、`action`、`httpBody`、`longTask`、`routeTiming`、`cspViolation`、`websocket` |
164
-
165
- ## 核心差异对比
166
-
167
- | 维度 | Instrumentation | Plugin |
168
- | ------------ | ------------------------------------------------ | --------------------------------------------------- |
169
- | 来源 | OpenTelemetry 官方包 / 第三方 | bk-ot 自研 |
170
- | 职责 | patch 原生 API、读取标准性能数据 | 基于 runtime context 主动产生 RUM 归一数据 |
171
- | 配置位置 | `instrumentations: {}` | `plugins: {}` |
172
- | 自定义扩展 | `instrumentations.custom` / `useInstrumentation()` | `plugins.custom` / `use()` / `createPlugin()` |
173
- | 启动条件 | **SDK 启用(`enabled`)即装载** | 官方探针适配插件随 SDK 启用;产生 RUM 数据的插件**仅采样命中时启动** |
174
- | 受采样影响 | 否 | 是(RUM 数据插件未命中采样时不启动) |
175
-
176
- ## 生命周期与采样
177
-
178
- 这是两者最容易混淆、也最关键的差异:
179
-
180
- - **Instrumentation 不受采样影响**。只要 `enabled !== false`,官方探针与 `instrumentations.custom` 中的实例都会在 `start()` 时注册。它们 patch 的是底层 API,需要在采样判定之前就位。
181
-
182
- > 注意:这里的"不受采样影响"指的是**是否装载/patch**。未命中采样的会话,trace sampler 的比例为 `0`,探针产生的 span 仍会在采样阶段被丢弃、不会上报。也就是说 patch 照做,但数据最终不落库。
183
- - **RUM 插件受采样影响**。`sampling.rate` 是会话级 sticky 采样,未命中的会话不会启动主动产生数据的插件,`reportAction()`、`reportCustomEvent()` 也会丢弃。
184
-
185
- > 说明:SDK 内部把官方 instrumentation 封装成一个核心适配插件(`official-instrumentations`),它与自研 RUM 插件走同一套插件生命周期,但归属于「SDK 启用即装载」的核心插件,不参与采样开关。
186
-
187
- ## 如何扩展
188
-
189
- ### 接入第三方 Instrumentation
190
-
191
- 两种等价写法,都必须在 `start()` 之前:
192
-
193
- ```ts
194
- // 写法一:配置式
195
- new BkOpenTelemetry({
196
- autoStart: false,
197
- instrumentations: {
198
- custom: [new MyCustomInstrumentation()],
139
+ extensions: {
140
+ plugins: [myRumPlugin],
141
+ instrumentations: [myOtelInstrumentation],
199
142
  },
200
143
  });
201
-
202
- // 写法二:链式(适合运行时动态追加)
203
- bkOT.useInstrumentation(new MyCustomInstrumentation());
204
- await bkOT.start();
205
144
  ```
206
145
 
207
- ### 编写自研 Plugin
208
-
209
- 通过 `createPlugin()` 访问 `tracer`、`meter`、`logger`、`startSpan()`、`emitLog()` 等 runtime context 能力,详见[自定义插件](./custom-plugin.md)。
210
-
211
- ```ts
212
- import { createPlugin } from '@blueking/open-telemetry';
146
+ | 类型 | 配置位置 | 适用场景 |
147
+ | --- | --- | --- |
148
+ | 内置采集 | `tracking` | View、请求、资源、错误、Web Vitals、Action 等 |
149
+ | RUM 插件 | `extensions.plugins` / `use()` | 需要 Session/View、日志、指标和活动总线的浏览器语义 |
150
+ | OTel instrumentation | `extensions.instrumentations` / `useInstrumentation()` | 已有标准 instrumentation,直接使用 SDK 私有 provider |
213
151
 
214
- const bizPlugin = createPlugin({
215
- name: 'biz-plugin',
216
- init(context) {
217
- const span = context.startSpan('custom.biz_ready');
218
- span.end();
219
- },
220
- });
221
- ```
152
+ 内置 Fetch/XHR 不再基于官方 instrumentation 叠加适配,而是由单一请求生命周期实现,避免重复 patch、重复活动计数及私有 `_addHeaders/_patchSend` 依赖。
222
153
 
223
- ## 选择建议
154
+ 当前扩展 instrumentation 的稳定能力边界是 Trace:Filtering Span Processor 会在 Span 创建时补充有效 RUM 上下文。Metric exporter 要求 SDK 内部采样标记,而包未公开对应 helper,因此第三方 instrumentation 产生的 Metric 默认会被过滤,不应作为已支持的扩展能力。
224
155
 
225
- - 只想 patch 一个浏览器/网络 API、拿标准遥测数据 → 用 **Instrumentation**(优先看官方是否已有现成包)。
226
- - 想产生带 RUM 归一字段(`span_type`、`result`、`target_label` 等)的业务事件、需要访问运行时上下文 → 用 **Plugin**。
227
- - 想让能力跟随采样开关、只对命中会话生效 → 必须做成 **Plugin**(RUM 数据类)。
156
+ 扩展必须在 `start()` 前注册;动态 Consent 重新授权时,插件可能再次执行 `init()`,所以插件的 `shutdown()` 应完整释放副作用。