@blueking/open-telemetry 0.0.15 → 0.0.17

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 (33) hide show
  1. package/README.md +83 -244
  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 +2 -0
  5. package/dist/core/metric.d.ts +2 -0
  6. package/dist/core/sdk.d.ts +4 -0
  7. package/dist/core/signal.d.ts +3 -0
  8. package/dist/core/telemetry-attributes.d.ts +1 -0
  9. package/dist/core/throttle.d.ts +2 -2
  10. package/dist/index.js +525 -456
  11. package/dist/index.js.map +1 -1
  12. package/dist/plugins/blank-screen.d.ts +4 -0
  13. package/dist/plugins/common.d.ts +1 -0
  14. package/dist/plugins/csp-violation.d.ts +1 -1
  15. package/dist/plugins/long-task.d.ts +4 -0
  16. package/dist/plugins/request-body.d.ts +2 -1
  17. package/dist/plugins/resource.d.ts +4 -0
  18. package/dist/plugins/web-vitals.d.ts +2 -0
  19. package/package.json +1 -1
  20. package/skills/bk-rum-otele/SKILL.md +8 -3
  21. package/skills/bk-rum-otele/evals/evals.json +3 -3
  22. package/skills/bk-rum-otele/references/api.md +236 -135
  23. package/skills/bk-rum-otele/references/architecture.md +141 -0
  24. package/skills/bk-rum-otele/references/capabilities.md +100 -0
  25. package/skills/bk-rum-otele/references/concepts.md +7 -4
  26. package/skills/bk-rum-otele/references/configuration.md +221 -178
  27. package/skills/bk-rum-otele/references/custom-plugin.md +15 -3
  28. package/skills/bk-rum-otele/references/data-model.md +5 -3
  29. package/skills/bk-rum-otele/references/getting-started.md +16 -0
  30. package/skills/bk-rum-otele/references/plugins.md +100 -72
  31. package/skills/bk-rum-otele/references/privacy.md +5 -1
  32. package/skills/bk-rum-otele/references/telemetry-reference.md +14 -12
  33. package/skills/bk-rum-otele/references/transport-sampling.md +79 -0
@@ -1,137 +1,191 @@
1
1
  <!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
2
2
 
3
- # 配置总览
3
+ # 配置参考
4
4
 
5
- SDK 入口按职责分为 `application`、`transport`、`session`、`tracking`、`context`、`privacy`、`extensions`。`application.name` 与 `transport` 必填;根 `transport.endpoint` 可由所有已开启信号的独立 endpoint 取代。
5
+ `BkOpenTelemetry` 只接受当前 `BkOTOptions` 结构。`application.name` 与 `transport` 必填;所有已启用信号必须能解析到有效 Endpoint。
6
6
 
7
7
  ```ts
8
- const bkOT = new BkOpenTelemetry({
9
- application: {
10
- name: 'bk-monitor-web',
11
- environment: 'production',
12
- version: '1.4.2',
13
- },
14
- transport: {
15
- endpoint: 'https://rum-collector.example.com',
16
- token: 'report-token',
17
- signals: {
18
- traces: { processor: 'batch', batch: { maxQueueSize: 2048 } },
19
- metrics: { intervalMillis: 60_000 },
20
- },
21
- },
22
- session: {
23
- sampleRate: 0.2,
24
- },
25
- tracking: {
26
- view: {
27
- tracking: 'auto',
28
- getPathGroup: url => new URL(url, location.href).pathname.replace(/\/\d+/g, '/:id'),
29
- },
30
- request: {
31
- allowedTracingUrls: ['https://api.example.com'],
32
- excludedUrls: [/\/health$/],
33
- },
34
- longTask: false,
35
- websocket: false,
36
- },
37
- context: {
38
- user: { id: 'user-12345' },
39
- attributes: {
40
- page: () => ({ 'biz.space_id': window.__BK_SPACE_ID__ }),
41
- },
42
- },
43
- privacy: {
44
- trackingConsent: 'granted',
45
- redactAttributes: attributes => attributes,
46
- },
47
- extensions: {
48
- plugins: [],
49
- instrumentations: [],
50
- },
51
- });
8
+ import { BkOpenTelemetry, type BkOTOptions } from '@blueking/open-telemetry';
9
+
10
+ const options: BkOTOptions = {
11
+ application: { name: 'bk-monitor-web' },
12
+ transport: { endpoint: 'https://rum-collector.example.com' },
13
+ };
14
+
15
+ const bkOT = new BkOpenTelemetry(options);
52
16
  ```
53
17
 
54
18
  ## 顶层配置
55
19
 
56
- | 配置 | 默认值 | 说明 |
57
- | --- | --- | --- |
58
- | `application.name` | 无 | 必填,写入 `service.name` |
59
- | `application.environment` | `production` | 写入 `deployment.environment.name` |
60
- | `application.version` | 无 | 写入 `service.version` |
61
- | `transport.endpoint` | 无 | 上报根地址;已开启信号没有独立 endpoint 时必填 |
62
- | `transport.signals.traces` | `{}` | Trace 配置;设为 `false` 关闭 |
63
- | `transport.signals.metrics` | `{}` | Metric 配置;设为 `false` 关闭 |
64
- | `transport.signals.logs` | `{}` | Log 配置;设为 `false` 关闭 |
65
- | `session.sampleRate` | `1` | Session 级确定性采样率 |
66
- | `tracking.view.tracking` | `auto` | 自动或手动 View |
67
- | `tracking.view.loadingTime` | `true` | 自动计算 View loading time |
68
- | `privacy.trackingConsent` | `granted` | 初始化授权状态 |
69
- | `enabled` | `true` | 是否启用 SDK |
70
- | `autoStart` | `true` | 构造后自动启动 |
71
- | `debug` | `false` | 输出 exporter 与插件调试信息 |
72
-
73
- Session 固定为 15 分钟无活动过期、4 小时最长生命周期。View 和 Session 是 RUM 关联边界,不能作为普通插件关闭。
74
-
75
- ## 内置采集开关
76
-
77
- 内置能力全部位于 `tracking`:
78
-
79
- | 配置 | 默认 | 说明 |
80
- | --- | --- | --- |
81
- | `view` | 开 | 初始加载、SPA、BFCache、手动 View |
82
- | `request` | 开 | Fetch/XHR 请求 span、Trace Header、body |
83
- | `resource` | 开 | 静态资源 span;PerformanceObserver 始终为 View 活动和请求 timing 服务 |
84
- | `error` | 开 | JS、Promise 与资源错误 |
85
- | `webVitals` | 开 | FCP/LCP/TTFB 及 View 级 CLS/INP |
86
- | `blankScreen` | 开 | 白屏检测 |
87
- | `device` | 开 | 浏览器、OS、屏幕与网络信息 |
88
- | `action` | 开 | 点击 Action 与活动聚合 |
89
- | `longTask` | 关 | LoAF/Long Task |
90
- | `websocket` | 关 | WebSocket 指标 |
91
- | `cspViolation` | 关 | CSP 违规 |
20
+ | 字段 | 类型 | 默认 | 说明 |
21
+ | --- | --- | --- | --- |
22
+ | `application` | `BkOTApplicationConfig` | 必填 | 应用 Resource 标识 |
23
+ | `transport` | `BkOTTransportConfig` | 必填 | 三类 OTLP HTTP 导出链路 |
24
+ | `session` | `BkOTSessionConfig` | `{ sampleRate: 1 }` | Session 存储和确定性采样 |
25
+ | `tracking` | `BkOTTrackingConfig` | `{}` | 内置采集、View 与事件 Hook |
26
+ | `context` | `BkOTContextConfig` | 无 | 初始用户与公共属性 Hook |
27
+ | `privacy` | `BkOTPrivacyConfig` | Consent 已授权、默认 URL 脱敏 | 授权、URL 和属性脱敏 |
28
+ | `extensions` | `BkOTExtensionsConfig` | 空数组 | 自定义 RUM 插件与 OTel instrumentation |
29
+ | `enabled` | `boolean` | `true` | `false` 时 `start()` 不安装采集能力 |
30
+ | `autoStart` | `boolean` | `true` | 构造后异步启动 |
31
+ | `debug` | `boolean` | `false` | 输出 exporter 数据和可诊断 warning |
92
32
 
93
- ```ts
94
- new BkOpenTelemetry({
95
- application: { name: 'demo' },
96
- transport: { endpoint: 'https://rum-collector.example.com' },
97
- tracking: {
98
- request: false,
99
- blankScreen: false,
100
- longTask: { threshold: 80 },
101
- },
102
- });
103
- ```
33
+ ## application
104
34
 
105
- ## 请求配置
35
+ | 字段 | 类型 | 默认 | Resource Attribute |
36
+ | --- | --- | --- | --- |
37
+ | `name` | `string` | 必填且非空 | `service.name` |
38
+ | `environment` | `string` | `production` | `deployment.environment.name` |
39
+ | `version` | `string` | 无 | `service.version` |
106
40
 
107
- `tracking.request.allowedTracingUrls` 是严格白名单,同源请求也必须命中后才注入 `traceparent`。关闭 Trace 时不会注入。`excludedUrls` 命中后完全不采集。SDK 自身已开启 signal endpoint 始终排除。
41
+ SDK 还会固定写入 `rum.provider=blueking`、`rum.schema.version=1`、`telemetry.sdk.name=@blueking/open-telemetry` 和 `telemetry.sdk.language=webjs`。
42
+
43
+ ## transport
108
44
 
109
45
  ```ts
110
- new BkOpenTelemetry({
111
- application: { name: 'request-demo' },
112
- transport: { endpoint: 'https://rum-collector.example.com' },
113
- tracking: {
114
- request: {
115
- allowedTracingUrls: [/https:\/\/api\.example\.com/],
116
- excludedUrls: [/\/health(?:\?|$)/],
117
- beforeSend: (event, context) => {
118
- event.attributes['request.transport'] = context.type;
119
- return true;
120
- },
121
- body: {
122
- capture: 'errors',
123
- redact: ({ body }) => body.replace(/token=[^&]+/g, 'token=***'),
46
+ transport: {
47
+ endpoint: 'https://collector.example.com',
48
+ token: 'report-token',
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,
124
59
  },
60
+ timeoutMillis: 10_000,
61
+ concurrencyLimit: 10,
62
+ },
63
+ metrics: {
64
+ intervalMillis: 60_000,
125
65
  },
66
+ logs: {},
126
67
  },
127
- });
68
+ }
128
69
  ```
129
70
 
130
- 跨域注入 Trace Header 可能触发 CORS 预检,服务端需要放行 `traceparent`。
71
+ ### 根字段
72
+
73
+ | 字段 | 类型 | 默认 | 说明 |
74
+ | --- | --- | --- | --- |
75
+ | `endpoint` | `string` | 无 | 根地址,去掉末尾 `/` 后拼默认信号路径 |
76
+ | `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` |
95
+
96
+ `batch` 支持 `maxQueueSize`、`maxExportBatchSize`、`scheduledDelayMillis`、`exportTimeoutMillis`。未提供时使用 OpenTelemetry `BatchSpanProcessor` 默认值。
97
+
98
+ 校验规则:
99
+
100
+ - 三类信号不能全部为 `false`。
101
+ - 每个已开启信号必须配置单独 Endpoint,或能回退到根 `transport.endpoint`。
102
+ - 关闭 Trace 后不创建 Trace exporter/processor,不记录可导出的 Span,也不注入 `traceparent`。
103
+ - 关闭 Metric 后不创建 reader;关闭 Log 后不创建 log processor,Request Body 配置也不会产生 Log。
104
+
105
+ 更多行为见[传输与采样](./transport-sampling.md)。
106
+
107
+ ## session
108
+
109
+ | 字段 | 类型 | 默认 | 说明 |
110
+ | --- | --- | --- | --- |
111
+ | `sampleRate` | `number` | `1` | Session 确定性采样;有限数值限制到 `0..1`,非有限值回退 `1` |
112
+ | `storageKey` | `string` | 按应用名和 Endpoint host hash | Session localStorage key |
113
+
114
+ Session 固定为 15 分钟无活动过期、4 小时最长生命周期,不开放超时配置。localStorage 不可用时退回进程内存。
115
+
116
+ ## tracking.view
131
117
 
132
- ## 全局 beforeSend
118
+ | 字段 | 类型 | 默认 | 说明 |
119
+ | --- | --- | --- | --- |
120
+ | `tracking` | `'auto' \| 'manual'` | `auto` | 自动观察 History/hash,或由业务调用 `startView()` |
121
+ | `loadingTime` | `boolean` | `true` | 计算 View 页面活动稳定耗时 |
122
+ | `getPathGroup` | `(url) => string \| undefined` | URL pathname | 返回低基数 `view.url_path_group` |
123
+ | `excludedActivityUrls` | matcher 或 matcher[] | 无 | 命中请求/资源不延长 View/Action 活动窗口 |
133
124
 
134
- `tracking.beforeSend` 在 span/log 进入 exporter 前执行,可修改属性或返回 `false` 丢弃事件。内部 `bk.rum.sampled` 标记会在此之前移除。
125
+ URL matcher 支持字符串包含、`RegExp` 或 `(url) => boolean`。字符串使用 `url.includes(matcher)`,不等于 origin 精确匹配;安全白名单应使用 URL-aware 函数或带边界的正则。自动 View 只对 pathname 和非页内锚点 hash path 的变化切换,query-only 变化不切换。
126
+
127
+ ## tracking.request
128
+
129
+ `request` 可设为 `false` 完全关闭 Fetch/XHR patch;`true` 或 `{}` 使用默认配置。
130
+
131
+ | 字段 | 类型 | 默认 | 说明 |
132
+ | --- | --- | --- | --- |
133
+ | `excludedUrls` | matcher 或 matcher[] | 无 | 命中后不采集、不注入、不计入页面活动 |
134
+ | `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 |
146
+
147
+ 默认不采集 Body。Body 只在 Log 信号开启时生效,不支持 FormData、ArrayBuffer 等不可安全文本化的内容。
148
+
149
+ ## tracking 内置能力
150
+
151
+ | 字段 | 类型 | 默认 | 参数 |
152
+ | --- | --- | --- | --- |
153
+ | `resource` | `boolean` | `true` | 无;`false` 只关闭静态资源 Span,Resource Observer 仍服务请求 timing/活动 |
154
+ | `error` | `boolean \| BkOTErrorPluginOptions` | `true` | `windowMs=60_000`、`maxPerWindow=5` |
155
+ | `webVitals` | `boolean` | `true` | 无 |
156
+ | `blankScreen` | `boolean \| BkOTBlankScreenPluginOptions` | `true` | 见下表 |
157
+ | `device` | `boolean \| BkOTDevicePluginOptions` | `true` | 见下表 |
158
+ | `action` | `boolean \| BkOTActionPluginOptions` | `true` | 见下表 |
159
+ | `longTask` | `boolean \| BkOTLongTaskPluginOptions` | `false` | `threshold=50`、`warningThreshold=100` ms |
160
+ | `websocket` | `boolean` | `false` | 无 |
161
+ | `cspViolation` | `boolean` | `false` | 无,内置同指纹 60 秒最多 5 条 |
162
+
163
+ Blank Screen:
164
+
165
+ | 字段 | 默认 | 说明 |
166
+ | --- | --- | --- |
167
+ | `rootSelector` | `body` | 应用挂载根节点 |
168
+ | `threshold` | `0.8` | 九点采样的空白比例,限制到 `0..1` |
169
+ | `checkDelay` | `1000` ms | 页面活动稳定后的首次检查延迟 |
170
+ | `confirmationDelay` | `200` ms | 两次候选白屏的确认间隔 |
171
+ | `ignoreSelectors` | 内置 loading/skeleton 选择器 | 自定义数组会替换内置数组 |
172
+
173
+ Action:
174
+
175
+ | 字段 | 默认 | 说明 |
176
+ | --- | --- | --- |
177
+ | `actionNameAttribute` | `data-bk-action-name` | 向上查找的显式动作名属性 |
178
+ | `maxDuration` | `10_000` ms | 单次 Action 最大活动窗口 |
179
+ | `nameCollection` | `explicit` | 默认只取显式属性,否则退回标签名;`text` 才读取可访问名称/DOM 文本 |
180
+
181
+ Device:
182
+
183
+ | 字段 | 默认 | 说明 |
184
+ | --- | --- | --- |
185
+ | `persistentId` | `false` | `false` 时 ID 只在当前实例稳定;`true` 写 localStorage |
186
+ | `storageKey` | 按应用名 hash | 仅持久 ID 使用 |
187
+
188
+ ## tracking.beforeSend
135
189
 
136
190
  ```ts
137
191
  tracking: {
@@ -142,84 +196,73 @@ tracking: {
142
196
  }
143
197
  ```
144
198
 
145
- ## 不再支持的旧入口
199
+ 该 Hook 在 Span/Log 进入底层 processor 前执行,可原地修改属性或返回 `false` 丢弃。异常会被吞掉,`debug: true` 时输出 warning。它不处理 Metric;请求专属逻辑优先使用 `tracking.request.beforeSend`。
146
200
 
147
- `app`、`sampling`、`route`、顶层 `view`、`plugins`、`instrumentations`、`attributes`、`spanProcessor`、`spanBatch` 已删除,不做兼容映射。
201
+ ## context
148
202
 
149
- # 传输与采样
203
+ | 字段 | 类型 | 默认 | 作用 |
204
+ | --- | --- | --- | --- |
205
+ | `user.id` | `string` | 无 | SDK 原样写入 `user.id` |
206
+ | `attributes.page` | `() => Attributes` | host/path | 页面、请求、错误、Action 等事件属性 |
207
+ | `attributes.metric` | `() => Attributes` | `{}` | 内置 Metric 的低基数自定义维度 |
208
+ | `attributes.error` | `() => Attributes` | `{}` | Error Span 附加属性 |
209
+ | `attributes.custom` | `() => Attributes` | `{}` | `reportCustomEvent()` 附加属性 |
150
210
 
151
- ## Endpoint
211
+ 自定义 `page` Hook 会替换默认 host/path Hook,不是合并默认实现。Metric Hook 禁止放用户 ID、订单 ID、完整 URL 等高基数字段。
152
212
 
153
- `transport.endpoint` 是可选根地址。未配置独立地址的已开启信号会基于它生成 `/v1/rum`、`/v1/metrics`、`/v1/logs`;单信号 `endpoint` 是完整 URL,不再拼接路径。
213
+ ## privacy
154
214
 
155
- ```ts
156
- new BkOpenTelemetry({
157
- application: { name: 'demo' },
158
- transport: {
159
- endpoint: 'https://collector.example.com',
160
- token: 'report-token',
161
- signals: {
162
- traces: {
163
- endpoint: 'https://trace.example.com/v1/rum',
164
- processor: 'batch',
165
- batch: {
166
- maxQueueSize: 2048,
167
- maxExportBatchSize: 512,
168
- scheduledDelayMillis: 5000,
169
- exportTimeoutMillis: 30000,
170
- },
171
- },
172
- metrics: { endpoint: 'https://metric.example.com/v1/metrics', intervalMillis: 60_000 },
173
- logs: { endpoint: 'https://log.example.com/v1/logs' },
174
- },
175
- },
176
- });
177
- ```
215
+ | 字段 | 类型 | 默认 | 说明 |
216
+ | --- | --- | --- | --- |
217
+ | `trackingConsent` | `'granted' \| 'not-granted'` | `granted` | 初始化授权状态 |
218
+ | `redactUrl` | `(url) => string` | 删除 username/password/query/hash | SDK URL 属性脱敏 |
219
+ | `redactAttributes` | `(attributes) => Attributes` | 原样返回 | SDK 创建 Span/Log 和内置插件属性脱敏 |
220
+
221
+ 第三方 instrumentation 的自有 Span 属性不保证经过 `redactAttributes`;需要在 `tracking.beforeSend` 做最终兜底。详见[隐私与公共属性](./privacy.md)。
222
+
223
+ ## extensions
178
224
 
179
- ## 独立信号开关
225
+ | 字段 | 类型 | 默认 | 说明 |
226
+ | --- | --- | --- | --- |
227
+ | `plugins` | `BkOTPlugin[]` | `[]` | 在内置插件后初始化 |
228
+ | `instrumentations` | `Instrumentation[]` | `[]` | 插件完成后注册到 SDK provider |
180
229
 
181
- 三类信号默认全部开启。设为 `false` 时,不创建对应 exporter、processor 或 metric reader:
230
+ 也可以在 `start()` 前调用 `use()` / `useInstrumentation()`。需要动态注册时设置 `autoStart: false`;启动后调用会抛错。
231
+
232
+ ## 完整配置骨架
182
233
 
183
234
  ```ts
184
235
  new BkOpenTelemetry({
185
- application: { name: 'trace-only-demo' },
236
+ application: { name: 'demo', environment: 'production', version: '1.0.0' },
186
237
  transport: {
238
+ endpoint: 'https://collector.example.com',
239
+ token: 'token',
240
+ headers: {},
187
241
  signals: {
188
- traces: { endpoint: 'https://trace.example.com/v1/rum' },
189
- metrics: false,
190
- logs: false,
242
+ traces: { processor: 'batch', batch: {} },
243
+ metrics: { intervalMillis: 60_000 },
244
+ logs: {},
191
245
  },
192
246
  },
247
+ session: { sampleRate: 1 },
248
+ tracking: {
249
+ view: { tracking: 'auto', loadingTime: true },
250
+ request: true,
251
+ resource: true,
252
+ error: true,
253
+ webVitals: true,
254
+ blankScreen: true,
255
+ device: true,
256
+ action: true,
257
+ longTask: false,
258
+ websocket: false,
259
+ cspViolation: false,
260
+ },
261
+ context: { attributes: {} },
262
+ privacy: { trackingConsent: 'granted' },
263
+ extensions: { plugins: [], instrumentations: [] },
264
+ enabled: true,
265
+ autoStart: true,
266
+ debug: false,
193
267
  });
194
268
  ```
195
-
196
- 校验规则:
197
-
198
- - 至少开启一种信号,三类不能全部为 `false`。
199
- - 每个开启信号必须有独立 endpoint,或能回退到根 `transport.endpoint`。
200
- - 关闭 Trace 后不记录 Span,也不会向 `allowedTracingUrls` 注入 `traceparent`。
201
- - 关闭 Metric 后不启动周期导出定时器。
202
- - 关闭 Log 不影响 Session/View 上下文维护,但不会产生 Session、View Snapshot、HTTP body 等 Log。
203
-
204
- 只开启 Metric 时没有精确 `view.id` 下钻链路;需要从指标定位具体 View 时,至少开启 Trace。
205
-
206
- 请求头优先级:`token` 生成的 Authorization < `transport.headers` < 单 signal `headers`。
207
-
208
- 浏览器 exporter 使用 `fetch keepalive`,SDK 在 `pagehide` 和页面进入 hidden 时触发 flush。`shutdown()` 会先结束 View 和插件,再 flush final Snapshot,最后关闭 provider。
209
-
210
- ## Session 级确定性采样
211
-
212
- ```ts
213
- new BkOpenTelemetry({
214
- application: { name: 'demo' },
215
- transport: { endpoint: 'https://collector.example.com' },
216
- session: { sampleRate: 0.05 },
217
- });
218
- ```
219
-
220
- - `1` 表示全量,`0` 表示全部丢弃。
221
- - 决定由 `application.name + session.id` 的稳定 hash 得出。
222
- - 不写额外 sessionStorage;同一 Session 内 span/log/metric 决定一致。
223
- - Session 续期后使用新 ID 重新计算。
224
-
225
- Metric exporter 只接受带内部采样标记的数据点,并在传输前移除该标记。Metric 只保留低基数 `view.url_path_group`,精确 View 关联由 span/log/View Snapshot 的 `view.id` 提供。
@@ -54,7 +54,11 @@ await bkOT.start();
54
54
 
55
55
  `init(context)` 中可以访问 `tracer`、`meter`、`logger`、`startSpan()`、`emitLog()`、`getRuntimeAttributes()` 等能力。
56
56
 
57
+ 优先使用 `context.startSpan()` 和 `context.emitLog()`:它们会合并事件发生时的运行时上下文并应用 SDK 脱敏。直接调用 `context.logger.emit()` 的 Log 不会自动获得这些能力,可能因缺少有效 Session/View 被导出过滤器丢弃。
58
+
57
59
  ```ts
60
+ let teardownVisibility = () => {};
61
+
58
62
  const visibilityPlugin = createPlugin({
59
63
  name: 'visibility-change',
60
64
  init(context) {
@@ -69,8 +73,10 @@ const visibilityPlugin = createPlugin({
69
73
  };
70
74
 
71
75
  document.addEventListener('visibilitychange', onVisibilityChange);
72
-
73
- return undefined;
76
+ teardownVisibility = () => document.removeEventListener('visibilitychange', onVisibilityChange);
77
+ },
78
+ shutdown() {
79
+ teardownVisibility();
74
80
  },
75
81
  });
76
82
  ```
@@ -158,4 +164,10 @@ bkOT.useInstrumentation(new SomeWebInstrumentation());
158
164
  await bkOT.start();
159
165
  ```
160
166
 
161
- > Extension instrumentation 与采集生命周期一致:未授权或 SDK 停止时不会注册;授权后注册。它产生的 RUM 数据仍受 Session sampler 和导出过滤约束。
167
+ > Extension instrumentation 与采集生命周期一致:未授权或 SDK 停止时不会注册;授权后注册。它产生的 Span 受 Session sampler 和导出过滤约束;第三方 instrumentation Metric 因没有公开采样 helper,默认会被过滤。
168
+
169
+ ## 自定义 Metric 注意事项
170
+
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。
172
+
173
+ 如果需求是记录一次具体业务行为,使用 Span 或 Log。确实需要自定义 Metric 时,应先为 SDK 设计并公开低基数、采样安全的 Metric API,而不是绕过当前过滤约束。
@@ -18,11 +18,11 @@ SDK 的数据模型遵循“浏览器 SDK 负责低成本原始数据和单事
18
18
  | `document` | 文档加载 | View 管理器(初始加载) |
19
19
  | `resource` | Fetch/XHR 请求与静态资源 | request、resource 采集 |
20
20
  | `vital` | Web Vitals | webVitals 插件 |
21
- | `error` | 错误 | error 插件、blankScreen 插件、cspViolation 插件、自定义事件错误 |
21
+ | `error` | 浏览器与体验错误 | error 插件、blankScreen 插件、cspViolation 插件 |
22
22
  | `longtask` | 长任务 | longTask 插件 |
23
23
  | `action` | 用户动作 | action 插件、reportAction |
24
24
  | `route` | 路由切换 | View 管理器(SPA/手动 View) |
25
- | `custom` | 自定义事件 | reportCustomEvent、自定义插件、websocket 插件 |
25
+ | `custom` | 自定义事件 | reportCustomEvent、自定义插件、websocket 插件;`reportCustomEvent({ error })` 仍属于此类型 |
26
26
 
27
27
  > 每种 span 的具体 span 名、metric 名、log 事件名和完整属性字典见[遥测参考](./telemetry-reference.md)。
28
28
 
@@ -56,6 +56,8 @@ span.end();
56
56
 
57
57
  请求 Resource Span 会根据状态码推导结果:`408`、`504` 为 timeout,`>= 400` 为 error,其余为 success。
58
58
 
59
+ `reportCustomEvent({ error })` 会设置 `result=error` 和 OpenTelemetry Span Status ERROR,但不会把 `span_type` 从 `custom` 改为 `error`。`span_type` 描述事件类别,`result` 描述结果,两者不要混用。
60
+
59
61
  ```ts
60
62
  bkOT.reportCustomEvent({
61
63
  name: 'upload_timeout',
@@ -92,7 +94,7 @@ console.log(getDurationBucket(1200)); // 500ms~2s
92
94
  - 终端信息:`device.type`、`browser.name`、`browser.version`、`os.name`、`network.effective_type`
93
95
  - HTTP / Resource:`http.request.method`、`http.response.status_code`、`url.full`、`transfer_size`
94
96
  - Web Vitals:`vital.metric`、`vital.value`、`vital.rating`
95
- - Error:`exception.type`、`exception.message`、`exception.stacktrace`、`exception.fingerprint`
97
+ - Error Span 属性:`exception.message_short`、`exception.stack_top_frame`、`exception.fingerprint`;完整异常位于标准 `exception` Span Event
96
98
 
97
99
  ## 后端派生
98
100
 
@@ -18,6 +18,8 @@
18
18
  3. `schema`:负责 RUM 字段、span 类型、结果、耗时分桶等归一化模型。
19
19
  4. `browser` / `index`:分别提供 CDN 全局入口(`https://unpkg.com/@blueking/open-telemetry/dist/bk-rum.global.js`)和 ESM 模块入口(`@blueking/open-telemetry`)。
20
20
 
21
+ 完整能力、默认开关与信号产出见[能力矩阵](./capabilities.md),初始化顺序、上下文和导出过滤见[架构与数据流](./architecture.md)。
22
+
21
23
  ## 最小示例
22
24
 
23
25
  ```ts
@@ -90,6 +92,20 @@ await bkOT.start();
90
92
 
91
93
  `use()`、`useInstrumentation()` 和 `extensions` 注册都必须发生在 `start()` 前。
92
94
 
95
+ 手动 View 也应在 `await start()` 建立 Session 后创建:
96
+
97
+ ```ts
98
+ const bkOT = new BkOpenTelemetry({
99
+ application: { name: 'manual-view-demo' },
100
+ autoStart: false,
101
+ transport: { endpoint: 'https://rum-collector.example.com' },
102
+ tracking: { view: { tracking: 'manual' } },
103
+ });
104
+
105
+ await bkOT.start();
106
+ bkOT.startView({ name: '订单详情', url: location.href });
107
+ ```
108
+
93
109
  ## CDN
94
110
 
95
111
  ```html