@blueking/open-telemetry 0.0.22-beta.1 → 0.0.23

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 (45) hide show
  1. package/README.md +258 -70
  2. package/dist/bk-rum.global.js +2 -2
  3. package/dist/bk-rum.global.js.map +1 -1
  4. package/dist/core/config.d.ts +10 -10
  5. package/dist/core/runtime-context.d.ts +1 -1
  6. package/dist/core/sdk.d.ts +1 -1
  7. package/dist/index.d.ts +2 -2
  8. package/dist/index.js +608 -662
  9. package/dist/index.js.map +1 -1
  10. package/dist/plugins/blank-screen.d.ts +1 -1
  11. package/dist/plugins/common.d.ts +2 -2
  12. package/dist/plugins/device.d.ts +2 -2
  13. package/dist/plugins/resource.d.ts +1 -0
  14. package/dist/plugins/web-vitals.d.ts +1 -3
  15. package/dist/schema/attributes.d.ts +6 -7
  16. package/dist/schema/span.d.ts +24 -15
  17. package/package.json +1 -1
  18. package/skills/bk-rum-otele/SKILL.md +31 -30
  19. package/skills/bk-rum-otele/references/actions.md +166 -0
  20. package/skills/bk-rum-otele/references/api.md +248 -215
  21. package/skills/bk-rum-otele/references/architecture.md +139 -37
  22. package/skills/bk-rum-otele/references/blank-screen.md +190 -0
  23. package/skills/bk-rum-otele/references/capabilities.md +175 -83
  24. package/skills/bk-rum-otele/references/configuration.md +226 -151
  25. package/skills/bk-rum-otele/references/data-model.md +157 -24
  26. package/skills/bk-rum-otele/references/errors-security.md +168 -0
  27. package/skills/bk-rum-otele/references/extensions.md +237 -0
  28. package/skills/bk-rum-otele/references/framework-integration.md +318 -75
  29. package/skills/bk-rum-otele/references/getting-started.md +186 -70
  30. package/skills/bk-rum-otele/references/network.md +258 -0
  31. package/skills/bk-rum-otele/references/performance.md +198 -0
  32. package/skills/bk-rum-otele/references/privacy.md +236 -67
  33. package/skills/bk-rum-otele/references/production.md +266 -0
  34. package/skills/bk-rum-otele/references/session-context.md +185 -0
  35. package/skills/bk-rum-otele/references/telemetry-reference.md +500 -51
  36. package/skills/bk-rum-otele/references/transport-sampling.md +321 -32
  37. package/skills/bk-rum-otele/references/troubleshooting.md +341 -151
  38. package/skills/bk-rum-otele/references/views-routing.md +211 -0
  39. package/skills/bk-rum-otele/references/concepts.md +0 -60
  40. package/skills/bk-rum-otele/references/custom-plugin.md +0 -170
  41. package/skills/bk-rum-otele/references/plugins-basic.md +0 -135
  42. package/skills/bk-rum-otele/references/plugins-error-security.md +0 -86
  43. package/skills/bk-rum-otele/references/plugins-experience.md +0 -124
  44. package/skills/bk-rum-otele/references/plugins-network.md +0 -32
  45. package/skills/bk-rum-otele/references/plugins.md +0 -62
@@ -2,338 +2,371 @@
2
2
 
3
3
  # API 参考
4
4
 
5
- 本页只描述 `src/index.ts` 公开导出的 API。深层路径文件属于实现细节,接入方不应直接 import。
5
+ 本文只描述 `src/index.ts` 当前公开导出的 API。日常接入优先使用 `BkOpenTelemetry` 的生命周期、上下文和手动上报方法;运行时底层方法主要服务自定义插件。
6
6
 
7
7
  ## 创建实例
8
8
 
9
9
  ```ts
10
- import { BkOpenTelemetry, type BkOTOptions } from '@blueking/open-telemetry';
10
+ import { BkOpenTelemetry } from '@blueking/open-telemetry';
11
11
 
12
- const options: BkOTOptions = {
13
- application: { name: 'bk-rum-demo' },
14
- transport: { endpoint: 'https://rum-collector.example.com' },
15
- };
12
+ const rum = new BkOpenTelemetry({
13
+ application: { name: 'order-center' },
14
+ transport: { endpoint: 'https://rum.example.com' },
15
+ });
16
+ ```
17
+
18
+ 构造函数会同步完成:
19
+
20
+ 1. 校验并解析配置;
21
+ 2. 创建 Resource、`WebTracerProvider`、Session sampler、过滤处理器和 exporter;
22
+ 3. 获得 instrumentation name 为 `bk-rum` 的 Tracer;
23
+ 4. 如果 `autoStart !== false`,异步调用 `start()`。
24
+
25
+ 构造函数不会创建 MeterProvider 或 LoggerProvider。`autoStart` 的异步失败只会在控制台输出 `[bk-ot] auto start failed` 警告;如果业务必须感知启动结果,应设置 `autoStart: false` 并显式 `await rum.start()`。
16
26
 
17
- const bkOT = new BkOpenTelemetry(options);
27
+ CDN bundle 的默认导出会挂到:
28
+
29
+ ```js
30
+ window.BkOpenTelemetry
18
31
  ```
19
32
 
20
- 构造函数同步解析配置并创建三个 OpenTelemetry Provider;`autoStart: true` 时随后异步启动采集。完整配置见[配置参考](./configuration.md)。
33
+ ## 生命周期 API
21
34
 
22
- ## 生命周期方法
35
+ ### `start(): Promise<void>`
23
36
 
24
- ### start()
37
+ 安装内置/自定义插件、全局 OTel context/propagator,并启用 extensions 中的 instrumentation。
25
38
 
26
39
  ```ts
27
- const bkOT = new BkOpenTelemetry({
28
- application: { name: 'bk-rum-demo' },
40
+ const rum = new BkOpenTelemetry({
41
+ application: { name: 'order-center' },
42
+ transport: { endpoint: 'https://rum.example.com' },
29
43
  autoStart: false,
30
- transport: { endpoint: 'https://rum-collector.example.com' },
31
44
  });
32
45
 
33
- bkOT.use(myPlugin);
34
- await bkOT.start();
46
+ await rum.start();
35
47
  ```
36
48
 
37
- 启动 Session、View、内置插件、接入方插件和 instrumentations,并安装页面隐藏时的 flush 监听。重复调用 `start()` 不会重复启动。
49
+ 行为:
50
+
51
+ - 已启动或正在启动时重复调用会直接返回;
52
+ - `enabled: false` 时把实例标记为已启动,但不安装采集;
53
+ - Consent 为 `not-granted` 时不安装采集,之后可授权启动;
54
+ - 单个插件初始化失败不会阻断其余插件,`debug: true` 时打印警告;
55
+ - 整体启动异常会清理已安装内容并恢复到可再次启动的 idle 状态;
56
+ - `shutdown()` 后再次调用会抛错,必须创建新实例。
38
57
 
39
- ### flush()
58
+ ### `flush(): Promise<void>`
59
+
60
+ 并行调用已启动插件的 `flush()`,然后 `forceFlush()` Trace Provider。
40
61
 
41
62
  ```ts
42
- await bkOT.flush();
63
+ await rum.flush();
43
64
  ```
44
65
 
45
- 先并行调用已启动插件的 `flush()`,再 force flush Trace Provider。SDK 已在 `pagehide` 和页面变为 hidden 时触发 flush;业务只需在关键流程完成后按需主动调用。
66
+ 适用于测试、关键跳转前尽力发送和联调。它不是服务端持久化确认,也无法突破浏览器退出时的网络限制。
67
+
68
+ ### `shutdown(): Promise<void>`
46
69
 
47
- ### shutdown()
70
+ 按插件启动顺序的逆序执行 shutdown,关闭 instrumentations,flush Provider,移除页面生命周期监听并销毁 Provider。
48
71
 
49
72
  ```ts
50
- await bkOT.shutdown();
73
+ await rum.shutdown();
51
74
  ```
52
75
 
53
- 反向关闭插件、结束待处理事件、刷新 Provider 并清理浏览器 patch/监听。该方法幂等;关闭后不能重新启动同一实例,再调用 `start()` 会抛错。
76
+ 重复调用安全。关闭后实例不可重启,也不应继续上报。
54
77
 
55
- ## Consent
56
-
57
- ### setTrackingConsent(consent)
78
+ ### `setTrackingConsent(consent): Promise<void>`
58
79
 
59
80
  ```ts
60
- const bkOT = new BkOpenTelemetry({
61
- application: { name: 'consent-demo' },
62
- privacy: { trackingConsent: 'not-granted' },
63
- transport: { endpoint: 'https://rum-collector.example.com' },
64
- });
65
-
66
- await bkOT.setTrackingConsent('granted');
67
- await bkOT.setTrackingConsent('not-granted');
81
+ await rum.setTrackingConsent('granted');
82
+ await rum.setTrackingConsent('not-granted');
68
83
  ```
69
84
 
70
- - 未授权:不创建 Session/View,不启动插件,不 patch 浏览器 API。
71
- - 授权:启动采集并建立新的 Session/View。
72
- - 撤销:关闭采集副作用并 flush 已允许的数据。
73
- - 再授权:插件会再次执行 `init()`。
85
+ 参数类型:`'granted' | 'not-granted'`。
86
+
87
+ - 实例已启动后授权:安装插件并开始新/共享 Session;
88
+ - 实例已启动后撤销:关闭插件/instrumentation、清理运行时 Session 关联并 flush;
89
+ - 实例尚未启动时:只更新配置中的授权状态,等待 `start()`;
90
+ - 重复设置相同值不执行操作。
74
91
 
75
- 该方法在 `autoStart: false` 且尚未 `start()` 时只更新状态;随后 `start()` 使用最新 Consent。
92
+ Consent 只控制 SDK 采集生命周期,不负责展示弹窗、记录法律依据或删除已被 Collector 接收的数据。
76
93
 
77
- ## User 与 View
94
+ ## 用户与 View API
78
95
 
79
- ### setUser(user)
96
+ ### `setUser(user): void`
80
97
 
81
98
  ```ts
82
- bkOT.setUser({ id: 'user-12345' });
83
- bkOT.setUser({ id: undefined });
99
+ rum.setUser({ id: 'user-001' });
100
+ rum.setUser({ id: undefined }); // 清除 user.id
84
101
  ```
85
102
 
86
- 更新后续事件的 `user.id`。SDK 不 hash、不脱敏、不改写该值。
103
+ `BkOTUserContext` 当前只有可选 `id`。更新影响后续创建的 Span,不回写已结束 Span。SDK 对 ID 原样透传,不 hash、不脱敏。
87
104
 
88
- ### startView(options?)
89
-
90
- 结束当前 View 并创建新 View,`view.id` 始终由 SDK 生成。
105
+ ### `startView(options?): void`
91
106
 
92
107
  ```ts
93
- const bkOT = new BkOpenTelemetry({
94
- application: { name: 'manual-view-demo' },
95
- autoStart: false,
96
- tracking: { view: { tracking: 'manual' } },
97
- transport: { endpoint: 'https://rum-collector.example.com' },
98
- });
99
-
100
- await bkOT.start();
101
- bkOT.startView({
108
+ rum.startView({
102
109
  name: '订单详情',
103
110
  url: location.href,
104
- attributes: { 'biz.owner': 'order-team' },
111
+ attributes: { 'biz.page_kind': 'detail' },
105
112
  });
106
113
  ```
107
114
 
108
- `BkOTStartViewOptions` 包含 `name?`、`url?`、`attributes?`。调用时必须已有采样有效的 Session;例如 `autoStart: false` 且尚未 `await start()`、未授权或未采样时,调用会被忽略。自动启动过程中、Page View 插件尚未初始化时发出的有效命令会由运行时队列交给插件消费,但接入代码仍推荐显式等待 `start()`。`attributes` 不能覆盖 SDK 的 Session/View 保留字段。
115
+ `BkOTStartViewOptions`:
116
+
117
+ | 字段 | 类型 | 说明 |
118
+ | --- | --- | --- |
119
+ | `name` | `string` | View 展示名;缺省时使用低基数 path group |
120
+ | `url` | `string` | View URL;缺省时使用当前 `location.href` |
121
+ | `attributes` | `Attributes` | 该 View 生命周期内附加到后续 Span 的自定义属性 |
109
122
 
110
- ### setViewName(name)
123
+ 只有当前 Session 命中采样时才派发命令。推荐 `tracking.view.tracking: 'manual'` 时使用。View 自定义属性不能覆盖 SDK 保护的 RUM 语义字段和采样字段;在新 View 开始时旧 View 属性会被清除。
111
124
 
112
125
  ```ts
113
- bkOT.setViewName('订单详情-只读');
126
+ const rum = new BkOpenTelemetry({
127
+ application: { name: 'manual-view-app' },
128
+ transport: { endpoint: 'https://rum.example.com' },
129
+ autoStart: false,
130
+ tracking: { view: { tracking: 'manual' } },
131
+ });
132
+
133
+ await rum.start();
134
+ rum.startView({ name: '订单详情' });
114
135
  ```
115
136
 
116
- 更新当前 View 名称,不创建新 View。后续子事件使用新名称,View Snapshot 产生 update。
137
+ ### `setViewName(name): void`
117
138
 
118
- ### setViewLoadingTime()
139
+ 更新当前 View 名称并产生 View update 生命周期 Span:
119
140
 
120
141
  ```ts
121
- await renderAsyncPage();
122
- bkOT.setViewLoadingTime();
142
+ rum.setViewName('订单详情');
123
143
  ```
124
144
 
125
- 用“当前时刻 - View 开始时刻”覆盖自动 `view.loading_time`。每次调用替换前一次值;没有有效 View 时忽略。
145
+ 没有采样 Session 时调用被忽略。
126
146
 
127
- ## 手动事件
147
+ ### `setViewLoadingTime(): void`
128
148
 
129
- ### reportAction(payload)
149
+ 以调用时刻减 View 开始时刻作为手动 `view.loading_time`,并产生 View update:
130
150
 
131
151
  ```ts
132
- bkOT.reportAction({
133
- name: '保存',
134
- attributes: { 'biz.form': 'alarm-strategy' },
135
- });
152
+ requestAnimationFrame(() => rum.setViewLoadingTime());
136
153
  ```
137
154
 
138
- 创建并立即结束 `action.custom` Span,写入新的 `action.id`、`action.name` 和 `action.type=custom`。它不会触发自动点击的活动耗时、关联计数或挫败信号计算。
155
+ 适用于业务明确知道页面“可用”时刻的场景。它不接受数值参数,时间点就是调用当下;没有采样 Session 时被忽略。
139
156
 
140
- ### reportCustomEvent(payload)
157
+ ## 手动事件 API
141
158
 
142
- ```ts
143
- bkOT.reportCustomEvent({
144
- name: 'strategy_saved',
145
- attributes: { 'biz.strategy_id': '10001' },
146
- });
159
+ 两个手动 API 都不维护启动前队列。默认构造函数触发的 autoStart 是异步的;构造后立即同步调用可能发生在 View 插件建立上下文之前。需要可靠接收首个业务事件时,设置 `autoStart: false`,先 `await start()`;manual View 再调用 `startView()`,最后才调用手动事件 API。
160
+
161
+ ### `reportAction(payload): void`
147
162
 
148
- bkOT.reportCustomEvent({
149
- name: 'strategy_save_failed',
150
- error: new Error('validation failed'),
163
+ ```ts
164
+ rum.reportAction({
165
+ name: '立即购买',
166
+ attributes: {
167
+ 'biz.product_type': 'subscription',
168
+ },
151
169
  });
152
170
  ```
153
171
 
154
- 创建 `custom.<name>` Span,并合并 `context.attributes.page`、`context.attributes.custom` 与 payload attributes。传入 `error` 时记录 exception、设置 Span Status/`result=error`,但 `span_type` 仍为 `custom`。
155
-
156
- 两类方法均受 Session 采样控制;未采样时直接返回。`debug: true` 仅对被丢弃的 Custom Event 输出 warning。
157
-
158
- ## 自定义信号
159
-
160
- ### startSpan(name, attributes?, options?)
172
+ 参数:
161
173
 
162
174
  ```ts
163
- const startedAt = Date.now();
164
- const span = bkOT.startSpan(
165
- 'custom.cache_warmup',
166
- { 'biz.cache': 'homepage' },
167
- { startTime: startedAt, contextTime: startedAt },
168
- );
169
-
170
- span.end();
175
+ interface BkOTActionEventPayload {
176
+ name: string;
177
+ attributes?: Attributes;
178
+ }
171
179
  ```
172
180
 
173
- 自动合并事件发生时的运行时上下文,并应用 `privacy.redactAttributes`。第三个参数的内部形状名为 `BkOTStartSpanOptions`,但该类型没有从包根导出,接入方直接按下表传对象即可,不要生成对它的 import:
181
+ 立即创建并结束 `action.custom` Span,写入新的 `action.id`、`action.type=custom`、`span_type=action` 和 `outcome.type=success`。事件标识和时间直接使用 OTLP Span ID 与开始时间。它不是一个持续的自动 Action 窗口,不会等待或关联调用之后的请求。
174
182
 
175
- | 字段 | 说明 |
176
- | --- | --- |
177
- | `startTime` | OpenTelemetry `TimeInput`;常用 epoch ms |
178
- | `contextTime` | 用该 epoch ms 从历史快照解析 Session/View/Action;数字型 `startTime` 默认同时作为该值 |
179
- | `kind` | OpenTelemetry `SpanKind`,默认 `INTERNAL` |
180
-
181
- 只有已采样且同时带有效 `session.id`、`view.id` 的 Span 会导出。
182
-
183
- ### tracer
184
-
185
- 实例公开 SDK 私有 Provider 对应的 OpenTelemetry `Tracer`。SDK 不创建或公开 `Meter`、`Logger`,自定义 RUM 事件使用 `startSpan()`。
183
+ 未命中 Session 采样时静默丢弃。
186
184
 
187
- ## 扩展注册
188
-
189
- ### use(plugin)
185
+ ### `reportCustomEvent(payload): void`
190
186
 
191
187
  ```ts
192
- bkOT.use(
193
- createPlugin({
194
- name: 'biz-plugin',
195
- init(context) {
196
- context.startSpan('custom.biz_plugin_ready').end();
197
- },
198
- }),
199
- );
188
+ rum.reportCustomEvent({
189
+ name: 'order.checkout',
190
+ attributes: { 'biz.payment_method': 'card' },
191
+ });
192
+
193
+ rum.reportCustomEvent({
194
+ name: 'order.checkout_failed',
195
+ error: new Error('payment rejected'),
196
+ });
200
197
  ```
201
198
 
202
- ### useInstrumentation(instrumentation)
199
+ 参数:
203
200
 
204
201
  ```ts
205
- bkOT.useInstrumentation(new SomeWebInstrumentation());
202
+ interface BkOTCustomEventPayload {
203
+ name: string;
204
+ attributes?: Attributes;
205
+ error?: Error;
206
+ }
206
207
  ```
207
208
 
208
- 两者都必须在 `start()` 前调用;使用默认自动启动时没有可靠的动态注册窗口,推荐配置 `autoStart: false`。完整插件契约见[自定义插件](./custom-plugin.md)。
209
-
210
- 额外 instrumentation 的稳定扩展边界是 Trace;SDK 不注册 Metric Provider。
209
+ 产出 Span 名为 `custom.<name>`,同时写 `rum.custom.name=<name>` 和 `span_type=custom`。有 `error` 时记录 exception Event,将 `outcome.type` 和 Span Status 设为 error;没有 error 时 `outcome.type=success`。
211
210
 
212
- ## 运行时与诊断成员
211
+ `name` 会进入 Span name 和字段,必须使用非空的有限枚举,不要拼订单号、URL、用户输入等高基数内容。运行时没有非空校验:空字符串会生成 `custom.` Span 和空的 `rum.custom.name`,不会仅因 name 为空抛错或自动丢弃,但这类数据没有可用语义。未采样时静默丢弃;`debug: true` 会额外打印 dropped warning。
213
212
 
214
- | 成员 | 返回/作用 |
215
- | --- | --- |
216
- | `config` | `resolveConfig()` 解析后的 `ResolvedBkOTConfig` |
217
- | `applyRedact(attributes)` | 执行 `privacy.redactAttributes` |
218
- | `getRuntimeAttributes()` | 当前公共属性快照 |
219
- | `getRuntimeAttributesAt(timestamp)` | 指定 epoch ms 的历史公共属性快照 |
220
- | `setRuntimeAttributes(attributes, changedAt?)` | 写入公共属性;高级扩展 API,谨慎避免覆盖 SDK 字段 |
221
- | `isSampled()` | 当前 Session 是否命中采样 |
222
- | `isSessionActive()` | 是否存在有效 Session |
223
- | `isViewActive()` | 是否存在有效 View |
224
- | `onSessionLifecycle(listener)` | 订阅 Session renewed/expired,返回取消函数 |
225
- | `notifySessionLifecycle(event)` | 向运行时分发生命周期事件;主要供高级插件使用 |
213
+ ## 扩展注册 API
226
214
 
227
- ## createPlugin(plugin)
215
+ ### `use(plugin): BkOpenTelemetry`
228
216
 
229
- `createPlugin()` 是保留完整类型推导的恒等构造器。
217
+ 链式注册 `BkOTPlugin`:
230
218
 
231
219
  ```ts
232
- import { createPlugin } from '@blueking/open-telemetry';
233
-
234
- const plugin = createPlugin({
235
- name: 'page-visible',
236
- enabled: config => config.enabled,
237
- init(context) {},
238
- flush() {},
239
- shutdown() {},
220
+ const rum = new BkOpenTelemetry({
221
+ application: { name: 'demo' },
222
+ transport: { endpoint: 'https://rum.example.com' },
223
+ autoStart: false,
240
224
  });
241
- ```
242
225
 
243
- `BkOTPlugin` 的 `enabled` 可为布尔值或接收 `ResolvedBkOTConfig` 的函数。Plugin Manager 顺序启动、并行 flush、反向 shutdown,并隔离单个插件的初始化错误。
226
+ rum.use(myPlugin).use(otherPlugin);
227
+ await rum.start();
228
+ ```
244
229
 
245
- ## Schema 辅助 API
230
+ 只能在第一次 `start()` 前调用;否则抛错。也可以通过 `extensions.plugins` 在构造配置中注册。
246
231
 
247
- ### RUM_ATTRIBUTES
232
+ ### `useInstrumentation(instrumentation): BkOpenTelemetry`
248
233
 
249
- 归一字段 key 常量。
234
+ 把标准 OTel instrumentation 绑定到 SDK 私有 WebTracerProvider:
250
235
 
251
236
  ```ts
252
- const spanTypeKey = RUM_ATTRIBUTES.spanType; // 'span_type'
237
+ rum.useInstrumentation(instrumentation);
253
238
  ```
254
239
 
255
- ### RUM_SPAN_TYPE / RUM_SPAN_RESULT
240
+ 同样只能在第一次 `start()` 前调用。如果 `enabled: false`,该方法不会加入配置。Instrumentation 创建的 Span 仍必须具有有效的 Session/View/采样运行时上下文,才会通过 SDK 的过滤处理器。
256
241
 
257
- 分别提供标准 `span_type` 与 `result` 值。
242
+ ## 自定义插件运行时 API
258
243
 
259
- ### buildRumSpanAttributes(classification)
244
+ 以下方法在实例上公开,但主要面向 `BkOTPlugin.init(context)`:
260
245
 
261
- ```ts
262
- const span = bkOT.startSpan('custom.cache_hit', {
263
- ...buildRumSpanAttributes({
264
- spanType: RUM_SPAN_TYPE.custom,
265
- spanSubtype: 'cache',
266
- }),
267
- });
268
- span.end();
269
- ```
270
-
271
- ### buildRumSpanAttributes 相关类型
246
+ | API | 作用 |
247
+ | --- | --- |
248
+ | `startSpan(name, attributes?, options?)` | 按 Session 采样和历史时间上下文创建 Span |
249
+ | `getRuntimeAttributes()` | 复制当前 Session/View/User/Device/Action 属性 |
250
+ | `getRuntimeAttributesAt(timestamp)` | 按 epoch ms 回查该时刻的关联上下文 |
251
+ | `setRuntimeAttributes(attributes, changedAt?)` | 修改后续公共运行时属性 |
252
+ | `applyRedact(attributes)` | 调用配置的 `redactAttributes` |
253
+ | `isSampled()` | 当前 Session 是否命中采样 |
254
+ | `isSessionActive()` / `isViewActive()` | 是否存在有效关联 ID |
255
+ | `onSessionLifecycle(listener)` | 监听 renewed/expired,返回取消函数 |
256
+ | `notifySessionLifecycle(event)` | 发布 Session 生命周期事件,一般仅 Session 扩展使用 |
257
+ | `tracer` | SDK 私有 OTel Tracer |
258
+ | `config` | 已解析的 `ResolvedBkOTConfig` |
272
259
 
273
- 公开 `RumSpanClassification`、`RumSpanType`、`RumSpanResult`,用于扩展插件保持同一归一模型。
260
+ `BkOpenTelemetry` 类实现上还公开了 `registerInstrumentations()`,但 `BkOTInstance` 接口有意不把它作为普通实例契约;自定义扩展应通过 Plugin Context 的同名方法调用,常规接入应使用启动前的 `useInstrumentation()`。
274
261
 
275
- ## resolveConfig(options)
262
+ ### `startSpan()`
276
263
 
277
264
  ```ts
278
- import { resolveConfig } from '@blueking/open-telemetry';
279
-
280
- const config = resolveConfig({
281
- application: { name: 'bk-rum-demo' },
282
- transport: { endpoint: 'https://rum-collector.example.com' },
283
- });
265
+ const span = context.startSpan(
266
+ 'custom.operation',
267
+ { 'biz.operation': 'calculate' },
268
+ {
269
+ startTime: occurredAt,
270
+ contextTime: occurredAt,
271
+ kind: SpanKind.INTERNAL,
272
+ },
273
+ );
284
274
 
285
- console.log(config.transport.endpoint);
275
+ span.end(endedAt);
286
276
  ```
287
277
 
288
- 用于预览核心解析结果和测试配置。插件自己的参数默认值在插件工厂执行时解析,不会全部展开到 `ResolvedBkOTConfig`。
289
-
290
- ## 内置插件工厂
278
+ `BkOTStartSpanOptions`:
291
279
 
292
- 公共入口导出以下工厂,便于自定义组合或测试:
293
-
294
- | 工厂 | 选项类型 |
280
+ | 字段 | 说明 |
295
281
  | --- | --- |
296
- | `createSessionPlugin` | `BkOTSessionConfig` |
297
- | `createDevicePlugin` | `BkOTDevicePluginOptions` |
298
- | `createCommonInstrumentationsPlugin` | `BkOTRequestConfig \| boolean` |
299
- | `createResourcePlugin` | 直接传 `boolean`,控制是否为静态资源创建 Span;默认 `true` |
300
- | `createErrorPlugin` | 无 |
301
- | `createWebVitalsPlugin` | 无 |
302
- | `createBlankScreenPlugin` | `BkOTBlankScreenPluginOptions` |
303
- | `createActionPlugin` | `BkOTActionPluginOptions` |
304
- | `createLongTaskPlugin` | `BkOTLongTaskPluginOptions` |
305
- | `createWebSocketPlugin` | 无 |
306
- | `createCspViolationPlugin` | 无 |
282
+ | `startTime` | OTel `TimeInput`;浏览器场景常用 epoch milliseconds |
283
+ | `contextTime` | 用哪个 epoch ms 回查 Session/View/Action;缺省时复用数字型 `startTime` |
284
+ | `kind` | SpanKind,默认 `INTERNAL` |
307
285
 
308
- `createCommonInstrumentationsPlugin` 名称保留,但当前实现是 SDK 自有 Fetch/XHR patch,不注册官方 Fetch/XHR instrumentation。
286
+ 运行时属性先合并,显式 `attributes` 后合并,因此显式同名字段优先;整体再经过 `redactAttributes`。未采样时返回 OTel non-recording Span,调用方仍可安全 `end()`。
309
287
 
310
- ## 其他公共导出
288
+ 延迟到达的 PerformanceEntry 应同时设置真实 `startTime` 和 `contextTime`,避免把旧事件错误关联到新的 View。
311
289
 
312
- `src/index.ts` 还导出以下高级能力:
290
+ ### `setRuntimeAttributes()` 的边界
313
291
 
314
- - `RumRuntimeContext` 及 Session/View/User 相关类型。
315
- - `PluginManager`。
316
- - `FilteringSpanProcessor`。
317
- - `EXCLUDED_ACTIVITY_MUTATIONS_ATTRIBUTE`,用于标记不应延长 View Loading/Action 的 DOM 子树。
318
- - 配置输入、解析结果、Transport、Hook、请求上下文等 TypeScript 类型。
292
+ 它是扩展底层能力,不是常规业务标签 API。传入 `session.id` 会触发采样决定重算;错误修改 `view.*` 或 `action.id` 会破坏关联历史。普通业务字段更适合通过 context Hook、View attributes 或事件 payload 添加。
319
293
 
320
- 这些主要服务 SDK 维护和高级扩展;常规接入只需 `BkOpenTelemetry`、`BkOTOptions` 和手动事件类型。
294
+ ## 配置解析函数
295
+
296
+ ```ts
297
+ import { resolveConfig } from '@blueking/open-telemetry';
298
+ ```
321
299
 
322
- `BkOpenTelemetry` 具体类上还能看到 `registerInstrumentations()`,它用于 SDK 向插件运行时提供批量注册能力,但被刻意排除在 `BkOTInstance` 契约之外,也会绕过 `useInstrumentation()` 的启动阶段检查。接入方不要直接调用;使用 `extensions.instrumentations` 或 `useInstrumentation()`。
300
+ `resolveConfig(options)` 校验必填项、补默认值、构造最终 `/v1/rum` URL、合并鉴权头,并生成 Resource attributes。它主要用于测试和高级集成,不会启动 SDK。
323
301
 
324
- ## 公共类型索引
302
+ ## 根入口的运行时导出
325
303
 
326
- 以下名称都可以从包根路径执行 `import type`:
304
+ 以下值可以从 `@blueking/open-telemetry` 在运行时 import:
327
305
 
328
- | 分类 | 类型 |
306
+ | 导出 | 用途 |
329
307
  | --- | --- |
330
- | 顶层配置 | `BkOTOptions`、`BkOTApplicationConfig`、`BkOTTransportConfig`、`BkOTTrackingConfig`、`BkOTTrackingConsent`、`BkOTContextConfig`、`BkOTPrivacyConfig`、`BkOTExtensionsConfig` |
331
- | Transport | `BkOTBatchConfig`、`SignalExporterConfig` |
332
- | View/Session/User | `BkOTViewConfig`、`BkOTSessionConfig`、`BkOTStartViewOptions`、`BkOTViewContext`、`BkOTSessionLifecycleEvent`、`BkOTUserContext` |
333
- | Request | `BkOTRequestConfig`、`BkOTRequestEvent`、`BkOTRequestContext`、`BkOTUrlMatcher` |
334
- | 事件与 Hook | `BkOTActionEventPayload`、`BkOTCustomEventPayload`、`BkOTBeforeSendEvent`、`BkOTAttributesConfig`、`BkOTAttributeValue` |
335
- | 插件 | `BkOTPlugin`、`BkOTRuntimeContext`、`BkOTActionPluginOptions`、`BkOTBlankScreenPluginOptions`、`BkOTDevicePluginOptions`、`BkOTLongTaskPluginOptions` |
336
- | 实例与解析结果 | `BkOTInstance`、`PluginManager`、`ResolvedBkOTConfig`、`ResolvedApplicationConfig`、`ResolvedTransportConfig`、`ResolvedViewConfig`、`ResolvedConfigHooks` |
337
- | Schema | `RumAttributeKey`、`RumSpanClassification`、`RumSpanType`、`RumSpanResult` |
338
-
339
- 如某个源码类型没有出现在本表,也没有从 `src/index.ts` 导出,则它不是包的公共契约。
308
+ | `BkOpenTelemetry` | SDK 主类 |
309
+ | `resolveConfig` | 解析并校验 `BkOTOptions`,不启动 SDK |
310
+ | `createPlugin` | 保留传入 Plugin 对象及其类型推断 |
311
+ | `FilteringSpanProcessor` | SDK 的 RUM 上下文与导出过滤 Processor |
312
+ | `RumRuntimeContext` | User/Session/View/Action 运行时快照和历史关联实现 |
313
+ | `createActionPlugin` | 内置自动 Action 插件工厂 |
314
+ | `createBlankScreenPlugin` | 内置白屏插件工厂 |
315
+ | `createCommonInstrumentationsPlugin` | 内置 Fetch/XHR 插件工厂;名称保留,但当前不是标准 instrumentation 集合 |
316
+ | `createCspViolationPlugin` | 内置 CSP 插件工厂 |
317
+ | `createDevicePlugin` | 内置 Device 运行时插件工厂 |
318
+ | `createErrorPlugin` | 内置 Error 插件工厂 |
319
+ | `createLongTaskPlugin` | 内置 Long Task 插件工厂 |
320
+ | `createResourcePlugin` | 内置 Resource Timing 插件工厂 |
321
+ | `createSessionPlugin` | 内置 Session 插件工厂 |
322
+ | `createWebVitalsPlugin` | 内置 Web Vitals 插件工厂 |
323
+ | `createWebSocketPlugin` | 内置 WebSocket 插件工厂 |
324
+ | `EXCLUDED_ACTIVITY_MUTATIONS_ATTRIBUTE` | 值为 `data-bk-excluded-activity-mutations`,标记不延长页面活动的 DOM 子树 |
325
+ | `RUM_ATTRIBUTES` | SDK 公共字段 key 常量表 |
326
+ | `RUM_SPAN_TYPE` | RUM Span 大类常量表 |
327
+ | `RUM_SPAN_OUTCOME` | success/warning/error/timeout/abort 常量表 |
328
+ | `buildRumSpanAttributes` | 根据 spanType/outcome/outcomeReason 生成分类属性 |
329
+
330
+ 内置插件工厂适合 SDK 定制或组合插件。普通接入使用 `tracking` 开关即可;不要把同一个内置工厂再放进 `extensions.plugins`,否则可能重复监听和上报。
331
+
332
+ ## 根入口的 TypeScript 类型导出
333
+
334
+ 配置:
335
+
336
+ - `BkOTOptions`
337
+ - `BkOTApplicationConfig`
338
+ - `BkOTTransportConfig`、`BkOTBatchConfig`
339
+ - `BkOTTrackingConfig`、`BkOTViewConfig`、`BkOTRequestConfig`
340
+ - `BkOTPrivacyConfig`、`BkOTTrackingConsent`
341
+ - `BkOTContextConfig`、`BkOTAttributesConfig`
342
+ - `BkOTExtensionsConfig`
343
+ - `BkOTUrlMatcher`、`BkOTAttributeValue`
344
+ - `BkOTBeforeSendEvent`、`BkOTRequestEvent`、`BkOTRequestContext`、`BkOTRequestOutcome`
345
+ - `BkOTActionEventPayload`、`BkOTCustomEventPayload`
346
+ - `ResolvedApplicationConfig`、`ResolvedBkOTConfig`、`ResolvedConfigHooks`、`ResolvedTransportConfig`、`ResolvedViewConfig`
347
+
348
+ 实例与运行时:
349
+
350
+ - `BkOTInstance`
351
+ - `BkOTUserContext`
352
+ - `BkOTStartViewOptions`、`BkOTViewContext`
353
+ - `BkOTSessionLifecycleEvent`
354
+ - `BkOTPlugin`、`BkOTRuntimeContext`
355
+ - `PluginManager`:当前是 type-only 导出,不能从根入口 `new PluginManager()`
356
+
357
+ 插件参数:
358
+
359
+ - `BkOTActionPluginOptions`
360
+ - `BkOTBlankScreenPluginOptions`
361
+ - `BkOTDevicePluginOptions`
362
+ - `BkOTLongTaskPluginOptions`
363
+ - `BkOTSessionConfig`
364
+
365
+ 模型:
366
+
367
+ - `RumAttributeKey`
368
+ - `RumSpanClassification`
369
+ - `RumSpanOutcome`
370
+ - `RumSpanType`
371
+
372
+ `BkOTStartSpanOptions` 当前用于方法签名,但没有从 package 根入口单独导出;调用方通常由 `context.startSpan()` 的参数类型自动推导。