@blueking/open-telemetry 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bk-rum.global.js +2 -2
- package/dist/bk-rum.global.js.map +1 -1
- package/dist/index.js +471 -471
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
- package/skills/bk-rum-otele/SKILL.md +108 -0
- package/skills/bk-rum-otele/evals/evals.json +29 -0
- package/skills/bk-rum-otele/references/api.md +228 -0
- package/skills/bk-rum-otele/references/concepts.md +227 -0
- package/skills/bk-rum-otele/references/configuration.md +318 -0
- package/skills/bk-rum-otele/references/custom-plugin.md +158 -0
- package/skills/bk-rum-otele/references/data-model.md +122 -0
- package/skills/bk-rum-otele/references/framework-integration.md +149 -0
- package/skills/bk-rum-otele/references/getting-started.md +179 -0
- package/skills/bk-rum-otele/references/plugins.md +451 -0
- package/skills/bk-rum-otele/references/privacy.md +117 -0
- package/skills/bk-rum-otele/references/telemetry-reference.md +228 -0
- package/skills/bk-rum-otele/references/troubleshooting.md +239 -0
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 配置总览
|
|
4
|
+
|
|
5
|
+
SDK 的配置入口是 `BkOTOptions`。推荐先完成 `app`、`transport`、`sampling`、`route`、`privacy` 五类基础配置,再按需打开插件。
|
|
6
|
+
|
|
7
|
+
## 完整配置示例
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
11
|
+
|
|
12
|
+
const bkOT = new BkOpenTelemetry({
|
|
13
|
+
enabled: true,
|
|
14
|
+
autoStart: true,
|
|
15
|
+
debug: false,
|
|
16
|
+
app: {
|
|
17
|
+
name: 'bk-monitor-web',
|
|
18
|
+
environment: 'production',
|
|
19
|
+
version: '1.4.2',
|
|
20
|
+
},
|
|
21
|
+
user: {
|
|
22
|
+
id: 'user-12345',
|
|
23
|
+
},
|
|
24
|
+
transport: {
|
|
25
|
+
endpoint: 'https://rum-collector.example.com',
|
|
26
|
+
token: 'report-token',
|
|
27
|
+
headers: {
|
|
28
|
+
'x-bk-tenant-id': 'system',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
sampling: {
|
|
32
|
+
rate: 0.2,
|
|
33
|
+
},
|
|
34
|
+
route: {
|
|
35
|
+
getPathGroup: url => new URL(url).pathname.replace(/\/\d+/g, '/:id'),
|
|
36
|
+
},
|
|
37
|
+
privacy: {
|
|
38
|
+
redactUrl: url => url.replace(/([?&](token|bk_ticket)=)[^&]+/g, '$1***'),
|
|
39
|
+
redactAttributes: attributes => attributes,
|
|
40
|
+
},
|
|
41
|
+
attributes: {
|
|
42
|
+
page: () => ({
|
|
43
|
+
'biz.space_id': window.__BK_SPACE_ID__,
|
|
44
|
+
}),
|
|
45
|
+
custom: () => ({
|
|
46
|
+
'biz.app_code': 'bk-monitor',
|
|
47
|
+
}),
|
|
48
|
+
},
|
|
49
|
+
instrumentations: {
|
|
50
|
+
documentLoad: true,
|
|
51
|
+
fetch: true,
|
|
52
|
+
xhr: true,
|
|
53
|
+
userInteraction: true,
|
|
54
|
+
},
|
|
55
|
+
plugins: {
|
|
56
|
+
pageView: true,
|
|
57
|
+
resource: true,
|
|
58
|
+
error: true,
|
|
59
|
+
webVitals: true,
|
|
60
|
+
blankScreen: {
|
|
61
|
+
rootSelector: '#app',
|
|
62
|
+
checkDelay: 3000,
|
|
63
|
+
threshold: 0.8,
|
|
64
|
+
},
|
|
65
|
+
session: true,
|
|
66
|
+
device: true,
|
|
67
|
+
action: false,
|
|
68
|
+
httpBody: false,
|
|
69
|
+
longTask: false,
|
|
70
|
+
routeTiming: false,
|
|
71
|
+
cspViolation: false,
|
|
72
|
+
websocket: false,
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
export default bkOT;
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## 顶层配置
|
|
80
|
+
|
|
81
|
+
| 配置 | 默认值 | 说明 |
|
|
82
|
+
| --- | --- | --- |
|
|
83
|
+
| `enabled` | `true` | 为 `false` 时不注册 provider,也不启动插件。 |
|
|
84
|
+
| `autoStart` | `true` | 构造后自动调用 `start()`。需要注册自定义插件时建议设为 `false`。 |
|
|
85
|
+
| `debug` | `false` | 打印 exporter 输出和部分调试日志。 |
|
|
86
|
+
| `app.name` | `unknown_service` | 写入 `service.name`。 |
|
|
87
|
+
| `app.environment` | `production` | 写入 `deployment.environment.name`。 |
|
|
88
|
+
| `app.version` | `undefined` | 写入 `service.version`。 |
|
|
89
|
+
| `spanProcessor` | `batch` | 可选 `batch` 或 `simple`。本地调试可用 `simple`。 |
|
|
90
|
+
|
|
91
|
+
### 固定行为(当前不可配置)
|
|
92
|
+
|
|
93
|
+
- **Metric 上报间隔固定 60s**(`PeriodicExportingMetricReader`),暂不开放配置。
|
|
94
|
+
- SDK 会向 resource 注入固定属性:`rum.provider=blueking`、`telemetry.sdk.language=webjs`,以及由 `app` 派生的 `service.name`、`service.version`、`deployment.environment.name`。
|
|
95
|
+
|
|
96
|
+
示例:只在生产环境开启。
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
new BkOpenTelemetry({
|
|
100
|
+
enabled: import.meta.env.PROD,
|
|
101
|
+
app: {
|
|
102
|
+
name: 'bk-monitor-web',
|
|
103
|
+
environment: import.meta.env.MODE,
|
|
104
|
+
},
|
|
105
|
+
transport: {
|
|
106
|
+
endpoint: 'https://rum-collector.example.com',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Instrumentation 配置
|
|
112
|
+
|
|
113
|
+
| 配置 | 默认值 | 说明 |
|
|
114
|
+
| --- | --- | --- |
|
|
115
|
+
| `documentLoad` | `true` | 采集文档加载和导航性能 span。 |
|
|
116
|
+
| `fetch` | `true` | patch `fetch`,采集 HTTP span,并支持同源 traceparent。 |
|
|
117
|
+
| `xhr` | `true` | patch `XMLHttpRequest`,采集 HTTP span。 |
|
|
118
|
+
| `userInteraction` | `true` | 使用 OpenTelemetry 官方用户交互 instrumentation。 |
|
|
119
|
+
| `propagateTraceHeaderUrls` | `undefined`(仅同源) | 把跨域后台 API 纳入 `traceparent`(含 OpenTelemetry traceId)注入范围。 |
|
|
120
|
+
|
|
121
|
+
`propagateTraceHeaderUrls` 用于让 fetch/xhr 请求在调用后台 API 时带上 W3C `traceparent` 请求头,实现前后端 trace 串联。同源请求始终注入,该配置只用于在此基础上扩展跨域目标,取值支持:
|
|
122
|
+
|
|
123
|
+
- `'all'`:所有请求都注入(含跨域,使用前确认隐私/CORS 影响)。
|
|
124
|
+
- `string`:URL 包含该子串即注入,例如 `'api.example.com'`。
|
|
125
|
+
- `RegExp`:URL 匹配该正则即注入。
|
|
126
|
+
- 上述字符串/正则组成的数组:命中任意一个即注入。
|
|
127
|
+
- `(url: string) => boolean`:完全自定义判断。
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
new BkOpenTelemetry({
|
|
131
|
+
instrumentations: {
|
|
132
|
+
// 给所有调用 api.example.com / api.internal.com 的后台请求注入 traceparent
|
|
133
|
+
propagateTraceHeaderUrls: [/https:\/\/api\.example\.com/, 'api.internal.com'],
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
> 注意:向跨域服务注入自定义头会触发 CORS 预检,目标服务需在 `Access-Control-Allow-Headers` 中放行 `traceparent`(以及按需的 `tracestate`),否则请求会被浏览器拦截。
|
|
139
|
+
|
|
140
|
+
示例:关闭接口自动采集。
|
|
141
|
+
|
|
142
|
+
```ts
|
|
143
|
+
new BkOpenTelemetry({
|
|
144
|
+
instrumentations: {
|
|
145
|
+
fetch: false,
|
|
146
|
+
xhr: false,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 插件默认开关
|
|
152
|
+
|
|
153
|
+
| 插件 | 默认状态 | 说明 |
|
|
154
|
+
| --- | --- | --- |
|
|
155
|
+
| `pageView` | 开 | 初始页面和 SPA 路由 view。 |
|
|
156
|
+
| `resource` | 开 | 静态资源 PerformanceObserver。 |
|
|
157
|
+
| `error` | 开 | JS error、unhandledrejection、资源错误。 |
|
|
158
|
+
| `webVitals` | 开 | CLS、FCP、INP、LCP、TTFB。 |
|
|
159
|
+
| `blankScreen` | 开 | 延迟检测页面空白比例。 |
|
|
160
|
+
| `device` | 开 | 设备、浏览器、OS、viewport、网络属性。 |
|
|
161
|
+
| `session` | 开 | session.id 生成、轮换和跨 tab 同步。 |
|
|
162
|
+
| `action` | 关 | 自动采集 click、submit、keydown 等动作。 |
|
|
163
|
+
| `httpBody` | 关 | 错误路径采集请求/响应 body。 |
|
|
164
|
+
| `longTask` | 关 | Long Task API。 |
|
|
165
|
+
| `routeTiming` | 关 | SPA 路由切换渲染耗时估算。 |
|
|
166
|
+
| `cspViolation` | 关 | CSP 违规 error span。 |
|
|
167
|
+
| `websocket` | 关 | WebSocket 连接、消息、错误、关闭。 |
|
|
168
|
+
|
|
169
|
+
示例:开启高成本插件。
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
new BkOpenTelemetry({
|
|
173
|
+
plugins: {
|
|
174
|
+
longTask: {
|
|
175
|
+
threshold: 80,
|
|
176
|
+
},
|
|
177
|
+
httpBody: {
|
|
178
|
+
maxBodySize: 4096,
|
|
179
|
+
redact: ({ body, type }) => (type === 'request' ? '[redacted request body]' : body),
|
|
180
|
+
},
|
|
181
|
+
websocket: true,
|
|
182
|
+
},
|
|
183
|
+
});
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
# 上报与采样
|
|
187
|
+
|
|
188
|
+
SDK 使用 OTLP HTTP exporter 分别上报 traces、metrics、logs。默认 endpoint 是 `http://localhost:4318`,会自动拼接 `/v1/traces`、`/v1/metrics`、`/v1/logs`。
|
|
189
|
+
|
|
190
|
+
## 统一 endpoint
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
new BkOpenTelemetry({
|
|
194
|
+
transport: {
|
|
195
|
+
endpoint: 'https://rum-collector.example.com',
|
|
196
|
+
token: 'report-token',
|
|
197
|
+
},
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
实际使用的上报地址为:
|
|
202
|
+
|
|
203
|
+
- traces:`https://rum-collector.example.com/v1/traces`
|
|
204
|
+
- metrics:`https://rum-collector.example.com/v1/metrics`
|
|
205
|
+
- logs:`https://rum-collector.example.com/v1/logs`
|
|
206
|
+
|
|
207
|
+
## 分信号 endpoint
|
|
208
|
+
|
|
209
|
+
如果 traces、metrics、logs 由不同网关接收,可以使用 `transport.signals`。
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
new BkOpenTelemetry({
|
|
213
|
+
transport: {
|
|
214
|
+
endpoint: 'https://rum-collector.example.com',
|
|
215
|
+
headers: {
|
|
216
|
+
'x-bk-app-code': 'bk-monitor',
|
|
217
|
+
},
|
|
218
|
+
signals: {
|
|
219
|
+
endpoints: {
|
|
220
|
+
traces: 'https://trace-gateway.example.com/v1/traces',
|
|
221
|
+
metrics: 'https://metric-gateway.example.com/v1/metrics',
|
|
222
|
+
logs: 'https://log-gateway.example.com/v1/logs',
|
|
223
|
+
},
|
|
224
|
+
traces: {
|
|
225
|
+
timeoutMillis: 5000,
|
|
226
|
+
concurrencyLimit: 4,
|
|
227
|
+
},
|
|
228
|
+
logs: {
|
|
229
|
+
headers: {
|
|
230
|
+
'x-bk-log-source': 'browser',
|
|
231
|
+
},
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
`transport.token` 会生成默认 `Authorization: Bearer <token>`,显式配置的 `headers` 会继续合并进去。
|
|
239
|
+
|
|
240
|
+
## 避免自循环采集
|
|
241
|
+
|
|
242
|
+
SDK 内置 `FilteringSpanProcessor`,会过滤指向自身 OTLP endpoint 的 span,避免上报请求本身再次被 fetch/xhr instrumentation 采集。
|
|
243
|
+
|
|
244
|
+
示例:自定义 Collector 地址时无需手动忽略自身上报。
|
|
245
|
+
|
|
246
|
+
```ts
|
|
247
|
+
new BkOpenTelemetry({
|
|
248
|
+
transport: {
|
|
249
|
+
endpoint: 'https://rum-collector.example.com/otlp',
|
|
250
|
+
},
|
|
251
|
+
instrumentations: {
|
|
252
|
+
fetch: true,
|
|
253
|
+
xhr: true,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## 同源 traceparent 传播
|
|
259
|
+
|
|
260
|
+
fetch/xhr instrumentation 会给符合条件的同源请求注入 W3C `traceparent`,用于打通前后端 trace。跨域请求是否能传播还取决于服务端 CORS 是否允许该 header。
|
|
261
|
+
|
|
262
|
+
示例:前端请求同源 API。
|
|
263
|
+
|
|
264
|
+
```ts
|
|
265
|
+
await fetch('/api/orders/202605270001', {
|
|
266
|
+
method: 'GET',
|
|
267
|
+
});
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## 会话级 sticky 采样
|
|
271
|
+
|
|
272
|
+
`sampling.rate` 范围是 `0` 到 `1`。SDK 会将采样结果保存在 session 维度,保证同一会话内行为一致。
|
|
273
|
+
|
|
274
|
+
```ts
|
|
275
|
+
new BkOpenTelemetry({
|
|
276
|
+
sampling: {
|
|
277
|
+
rate: 0.05,
|
|
278
|
+
},
|
|
279
|
+
transport: {
|
|
280
|
+
endpoint: 'https://rum-collector.example.com',
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
需要注意:
|
|
286
|
+
|
|
287
|
+
- `rate: 1` 表示全量上报。
|
|
288
|
+
- `rate: 0` 表示 RUM 插件和手动事件都不上报。
|
|
289
|
+
- 未命中采样时,主动产生数据的 RUM 插件不会启动。
|
|
290
|
+
- 调试时建议临时设置 `rate: 1` 和 `debug: true`。
|
|
291
|
+
|
|
292
|
+
## Batch 与 Simple Processor
|
|
293
|
+
|
|
294
|
+
默认使用 batch 处理器,适合生产环境。调试时可以用 simple 处理器减少等待。
|
|
295
|
+
|
|
296
|
+
```ts
|
|
297
|
+
new BkOpenTelemetry({
|
|
298
|
+
debug: true,
|
|
299
|
+
spanProcessor: 'simple',
|
|
300
|
+
transport: {
|
|
301
|
+
endpoint: 'http://localhost:4318',
|
|
302
|
+
},
|
|
303
|
+
});
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
批量参数可以通过 `spanBatch` 调整。
|
|
307
|
+
|
|
308
|
+
```ts
|
|
309
|
+
new BkOpenTelemetry({
|
|
310
|
+
spanProcessor: 'batch',
|
|
311
|
+
spanBatch: {
|
|
312
|
+
maxQueueSize: 2048,
|
|
313
|
+
maxExportBatchSize: 256,
|
|
314
|
+
scheduledDelayMillis: 5000,
|
|
315
|
+
exportTimeoutMillis: 30000,
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
```
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 自定义插件
|
|
4
|
+
|
|
5
|
+
自定义插件适合封装业务事件、补充特定浏览器 API 采集,或接入额外 OpenTelemetry instrumentation。
|
|
6
|
+
|
|
7
|
+
## 插件契约
|
|
8
|
+
|
|
9
|
+
插件由 `createPlugin()` 创建,核心字段是 `name`、`enabled`、`init`、`flush`、`shutdown`。
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { createPlugin } from '@blueking/open-telemetry';
|
|
13
|
+
|
|
14
|
+
const bizPlugin = createPlugin({
|
|
15
|
+
name: 'biz-plugin',
|
|
16
|
+
enabled: config => config.enabled,
|
|
17
|
+
init(context) {
|
|
18
|
+
const span = context.startSpan('custom.biz_plugin_init', {
|
|
19
|
+
'biz.plugin': 'ready',
|
|
20
|
+
});
|
|
21
|
+
span.end();
|
|
22
|
+
},
|
|
23
|
+
flush() {
|
|
24
|
+
// 可在这里刷新插件内部缓存
|
|
25
|
+
},
|
|
26
|
+
shutdown() {
|
|
27
|
+
// 可在这里移除事件监听
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 注册插件
|
|
33
|
+
|
|
34
|
+
`use()` 必须在 `start()` 之前调用。
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
38
|
+
import { bizPlugin } from './biz-plugin';
|
|
39
|
+
|
|
40
|
+
const bkOT = new BkOpenTelemetry({
|
|
41
|
+
autoStart: false,
|
|
42
|
+
transport: {
|
|
43
|
+
endpoint: 'https://rum-collector.example.com',
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
bkOT.use(bizPlugin);
|
|
48
|
+
|
|
49
|
+
await bkOT.start();
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 使用 runtime context
|
|
53
|
+
|
|
54
|
+
`init(context)` 中可以访问 `tracer`、`meter`、`logger`、`startSpan()`、`emitLog()`、`getRuntimeAttributes()` 等能力。
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
const visibilityPlugin = createPlugin({
|
|
58
|
+
name: 'visibility-change',
|
|
59
|
+
init(context) {
|
|
60
|
+
const onVisibilityChange = () => {
|
|
61
|
+
context.emitLog({
|
|
62
|
+
severityText: 'INFO',
|
|
63
|
+
body: 'document.visibilitychange',
|
|
64
|
+
attributes: {
|
|
65
|
+
'document.visibility_state': document.visibilityState,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
71
|
+
|
|
72
|
+
return undefined;
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 清理事件监听
|
|
78
|
+
|
|
79
|
+
插件应在 `shutdown()` 中释放自己注册的监听器。
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
const resizePlugin = createPlugin({
|
|
83
|
+
name: 'window-resize',
|
|
84
|
+
init(context) {
|
|
85
|
+
const onResize = () => {
|
|
86
|
+
const span = context.startSpan('custom.window_resize', {
|
|
87
|
+
'window.inner_width': window.innerWidth,
|
|
88
|
+
'window.inner_height': window.innerHeight,
|
|
89
|
+
});
|
|
90
|
+
span.end();
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
window.addEventListener('resize', onResize);
|
|
94
|
+
|
|
95
|
+
this.shutdown = () => {
|
|
96
|
+
window.removeEventListener('resize', onResize);
|
|
97
|
+
};
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
更推荐使用闭包保存清理函数,避免依赖 `this`。
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
const createResizePlugin = () => {
|
|
106
|
+
let teardown = () => {};
|
|
107
|
+
|
|
108
|
+
return createPlugin({
|
|
109
|
+
name: 'window-resize',
|
|
110
|
+
init(context) {
|
|
111
|
+
const onResize = () => {
|
|
112
|
+
const span = context.startSpan('custom.window_resize');
|
|
113
|
+
span.end();
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
window.addEventListener('resize', onResize);
|
|
117
|
+
teardown = () => window.removeEventListener('resize', onResize);
|
|
118
|
+
},
|
|
119
|
+
shutdown() {
|
|
120
|
+
teardown();
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## 注册额外 instrumentation
|
|
127
|
+
|
|
128
|
+
第三方 OpenTelemetry instrumentation 属于 instrumentation 而非 bk-ot 插件,因此挂在顶层 `instrumentations.custom` 下,或通过 `useInstrumentation()` 链式注册。两者区别详见 [Plugin 与 Instrumentation 的区别](./concepts.md)。
|
|
129
|
+
|
|
130
|
+
配置式:
|
|
131
|
+
|
|
132
|
+
```ts
|
|
133
|
+
const bkOT = new BkOpenTelemetry({
|
|
134
|
+
instrumentations: {
|
|
135
|
+
custom: [new SomeWebInstrumentation()],
|
|
136
|
+
},
|
|
137
|
+
transport: {
|
|
138
|
+
endpoint: 'https://rum-collector.example.com',
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
链式(适合运行时动态追加,必须在 `start()` 之前):
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
const bkOT = new BkOpenTelemetry({
|
|
147
|
+
autoStart: false,
|
|
148
|
+
transport: {
|
|
149
|
+
endpoint: 'https://rum-collector.example.com',
|
|
150
|
+
},
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
bkOT.useInstrumentation(new SomeWebInstrumentation());
|
|
154
|
+
|
|
155
|
+
await bkOT.start();
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
> 与受采样影响的 RUM 插件不同,instrumentation 只要 SDK 启用(`enabled !== false`)就会注册,不受 `sampling.rate` 影响。
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 数据模型
|
|
4
|
+
|
|
5
|
+
SDK 的数据模型遵循“浏览器 SDK 负责低成本原始数据和单事件归一,跨事件聚合交给后端”的边界。
|
|
6
|
+
|
|
7
|
+
## 分层模型
|
|
8
|
+
|
|
9
|
+
1. OpenTelemetry 原生字段:trace、span、resource、metric、log 的标准字段。
|
|
10
|
+
2. RUM 归一字段:`span_type`、`span_subtype`、`result`、`error_type`、`duration_bucket`、`target_label` 等。
|
|
11
|
+
3. 运行时上下文:`user.id`、`session.id`、`view.id`、`view.url`、`view.url_path_group` 等。
|
|
12
|
+
4. 后端派生字段:session/view duration、count、地理信息、影响用户数、trace tree 分析等。
|
|
13
|
+
|
|
14
|
+
## Span 类型
|
|
15
|
+
|
|
16
|
+
| 类型 | 说明 | 常见来源 |
|
|
17
|
+
| --- | --- | --- |
|
|
18
|
+
| `document` | 文档加载 | documentLoad instrumentation、pageView 插件(初始加载) |
|
|
19
|
+
| `http` | 接口请求 | fetch/xhr instrumentation、httpBody 插件 |
|
|
20
|
+
| `resource` | 静态资源 | resource 插件、documentLoad instrumentation |
|
|
21
|
+
| `vital` | Web Vitals | webVitals 插件 |
|
|
22
|
+
| `error` | 错误 | error 插件、blankScreen 插件、cspViolation 插件、自定义事件错误 |
|
|
23
|
+
| `longtask` | 长任务 | longTask 插件 |
|
|
24
|
+
| `action` | 用户动作 | action 插件、reportAction |
|
|
25
|
+
| `route` | 路由切换 | pageView 插件(SPA 路由)、routeTiming 插件 |
|
|
26
|
+
| `custom` | 自定义事件 | reportCustomEvent、自定义插件、websocket 插件 |
|
|
27
|
+
|
|
28
|
+
> 每种 span 的具体 span 名(如 `browser.web_vital`、`browser.route_change`)、metric 名、log 事件名和完整属性字典见[遥测参考](./telemetry-reference.md)。
|
|
29
|
+
|
|
30
|
+
示例:自定义业务事件归一为 `custom`。
|
|
31
|
+
|
|
32
|
+
```ts
|
|
33
|
+
import { RUM_SPAN_TYPE, buildRumSpanAttributes } from '@blueking/open-telemetry';
|
|
34
|
+
|
|
35
|
+
const span = bkOT.startSpan('custom.search', {
|
|
36
|
+
...buildRumSpanAttributes({
|
|
37
|
+
spanType: RUM_SPAN_TYPE.custom,
|
|
38
|
+
spanSubtype: 'search',
|
|
39
|
+
eventLabel: '业务搜索',
|
|
40
|
+
targetLabel: 'alarm',
|
|
41
|
+
}),
|
|
42
|
+
'biz.keyword_length': 6,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
span.end();
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Result 与 Error Type
|
|
49
|
+
|
|
50
|
+
`result` 描述事件结果,取值包括:
|
|
51
|
+
|
|
52
|
+
- `success`
|
|
53
|
+
- `warning`
|
|
54
|
+
- `error`
|
|
55
|
+
- `timeout`
|
|
56
|
+
- `abort`
|
|
57
|
+
|
|
58
|
+
HTTP span 会根据状态码推导结果:`408`、`504` 为 timeout,`>= 400` 为 error,其余为 success。
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
bkOT.reportCustomEvent({
|
|
62
|
+
name: 'upload_timeout',
|
|
63
|
+
error: new Error('request timeout'),
|
|
64
|
+
attributes: {
|
|
65
|
+
'biz.file_size': 1024 * 1024,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Duration Bucket
|
|
71
|
+
|
|
72
|
+
有耗时的事件会写入 `duration_bucket`:
|
|
73
|
+
|
|
74
|
+
- `<100ms`
|
|
75
|
+
- `100~500ms`
|
|
76
|
+
- `500ms~2s`
|
|
77
|
+
- `>2s`
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { getDurationBucket } from '@blueking/open-telemetry';
|
|
81
|
+
|
|
82
|
+
console.log(getDurationBucket(80)); // <100ms
|
|
83
|
+
console.log(getDurationBucket(1200)); // 500ms~2s
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## SDK 直接采集
|
|
87
|
+
|
|
88
|
+
以下字段由浏览器 API、接入方配置或 SDK 运行期上下文直接提供:
|
|
89
|
+
|
|
90
|
+
- 应用与环境:`service.name`、`deployment.environment.name`、`service.version`
|
|
91
|
+
- 用户与会话:`user.id`、`session.id`
|
|
92
|
+
- View:`view.id`、`view.url`、`view.url_path_group`、`view.loading_type`
|
|
93
|
+
- 终端信息:`device_type`、`browser_name`、`browser_version`、`os_name`、`network.effective_type`
|
|
94
|
+
- HTTP / Resource:`http.request.method`、`http.response.status_code`、`url.full`、`transfer_size`
|
|
95
|
+
- Web Vitals:`vital.metric`、`vital.value`、`vital.rating`
|
|
96
|
+
- Error:`exception.type`、`exception.message`、`exception.stacktrace`、`exception.fingerprint`
|
|
97
|
+
|
|
98
|
+
## 后端派生
|
|
99
|
+
|
|
100
|
+
以下字段不在浏览器 SDK 中直接生成:
|
|
101
|
+
|
|
102
|
+
- Session 聚合:`session.duration`、`view_count`、`trace_count`、`error_count`、`action_count`
|
|
103
|
+
- View 聚合:`view.duration`、`request_count`、`resource_count`、`longtask_count`
|
|
104
|
+
- Trace 树:`relative_start`、`hierarchy_level`、`parent_span_name`、`is_critical_path`
|
|
105
|
+
- 影响面:`affected_user_count`
|
|
106
|
+
- 地理信息:`geo.country`、`geo.city`
|
|
107
|
+
|
|
108
|
+
## 高基数字段策略
|
|
109
|
+
|
|
110
|
+
高基数字段可以进入 span/log,但不应进入 metric 维度。比如订单 ID、用户输入、完整 URL query 都应谨慎使用。
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
bkOT.reportCustomEvent({
|
|
114
|
+
name: 'order_submit',
|
|
115
|
+
attributes: {
|
|
116
|
+
'biz.order_id': '202605270001',
|
|
117
|
+
'biz.order_type': 'normal',
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
上例中 `biz.order_id` 适合放在 span/log 中定位单次问题,不适合作为 metric 维度做长期聚合。
|