@blueking/open-telemetry 0.0.4 → 0.0.5

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/README.md CHANGED
@@ -0,0 +1,340 @@
1
+ # @blueking/open-telemetry
2
+
3
+ 面向浏览器 RUM 场景的 OpenTelemetry SDK 封装,默认会采集页面访问、错误、Web Vitals、设备、会话、fetch/xhr 等常用 RUM 数据,并通过 OTLP HTTP 上报。
4
+
5
+ ## 安装使用
6
+
7
+ ### npm 引入
8
+
9
+ ```javascript
10
+ import { BkOpenTelemetry } from '@blueking/open-telemetry';
11
+
12
+ const bkOT = new BkOpenTelemetry({
13
+ endpoint: 'https://your-otlp-collector',
14
+ token: 'your-report-token',
15
+ environment: 'production',
16
+ });
17
+ ```
18
+
19
+ ### CDN 引入
20
+
21
+ ```html
22
+ <script src="https://unpkg.com/@blueking/open-telemetry@0.1.0/dist/bk-rum.global.js"></script>
23
+ <script>
24
+ const bkOT = new BkOpenTelemetry({
25
+ endpoint: 'https://your-otlp-collector',
26
+ token: 'your-report-token',
27
+ environment: 'production',
28
+ });
29
+ </script>
30
+ ```
31
+
32
+ ## 最小配置
33
+
34
+ ```javascript
35
+ new BkOpenTelemetry({
36
+ endpoint: 'https://your-otlp-collector',
37
+ token: 'your-report-token',
38
+ });
39
+ ```
40
+
41
+ `endpoint` 是 OTLP collector 地址,SDK 会自动拼出三类信号地址:
42
+
43
+ - traces: `endpoint/v1/traces`
44
+ - metrics: `endpoint/v1/metrics`
45
+ - logs: `endpoint/v1/logs`
46
+
47
+ 如果三类信号需要发到不同地址,可以分别配置:
48
+
49
+ ```javascript
50
+ new BkOpenTelemetry({
51
+ endpoint: 'https://your-otlp-collector',
52
+ token: 'your-report-token',
53
+ signalEndpoints: {
54
+ traces: 'https://your-trace-collector/rum',
55
+ metrics: 'https://your-metric-collector/v1/metrics',
56
+ logs: 'https://your-log-collector/v1/logs',
57
+ },
58
+ });
59
+ ```
60
+
61
+ `signalEndpoints.traces`、`signalEndpoints.metrics`、`signalEndpoints.logs` 是完整上报地址,不会自动拼 `/v1/*`;未配置时会回退到对应的 `traces.endpoint`、`metrics.endpoint`、`logs.endpoint`,再回退到统一 `endpoint`。
62
+
63
+ `token` 会转换为上报请求头:
64
+
65
+ ```txt
66
+ Authorization: Bearer your-report-token
67
+ ```
68
+
69
+ ## 基础配置
70
+
71
+ ```javascript
72
+ new BkOpenTelemetry({
73
+ token: 'your-report-token',
74
+ environment: 'production',
75
+ enabled: true,
76
+ debug: false,
77
+ sampleRate: 1,
78
+ headers: {
79
+ 'X-Custom-Header': 'value',
80
+ },
81
+ signalEndpoints: {
82
+ traces: 'https://your-trace-collector/rum',
83
+ metrics: 'https://your-metric-collector/v1/metrics',
84
+ logs: 'https://your-log-collector/v1/logs',
85
+ },
86
+ });
87
+ ```
88
+
89
+ - `endpoint`: 上报地址BaseURL,默认 `http://localhost:4318`。
90
+ - `token`: 上报 token,会写入 `Authorization: Bearer xxx`。
91
+ - `environment`: 环境名,默认 `production`。
92
+ - `enabled`: 是否启用 SDK,默认 `true`。
93
+ - `debug`: 是否在控制台打印上报数据,默认 `false`。
94
+ - `sampleRate`: 采样率,范围 `0 - 1`,默认 `1`。
95
+ - `headers`: 附加上报请求头,显式传入的 header 可覆盖 token 生成的同名 header。
96
+ - `signalEndpoints`: 分别配置 trace、metric、log 的完整上报地址,优先级高于统一 `endpoint`。
97
+ - `traces` / `metrics` / `logs`: 分别配置 trace、metric、log 的高级请求参数;其中 `endpoint` 优先级低于 `signalEndpoints`。
98
+
99
+ ## RUM 采集配置
100
+
101
+ 所有采集能力统一放在 `rum` 下配置:
102
+
103
+ ```javascript
104
+ new BkOpenTelemetry({
105
+ endpoint: 'https://your-otlp-collector',
106
+ token: 'your-report-token',
107
+ rum: {
108
+ documentLoad: true,
109
+ fetch: true,
110
+ xhr: true,
111
+ userInteraction: true,
112
+ pageView: true,
113
+ error: true,
114
+ webVitals: true,
115
+ blankScreen: true,
116
+ device: true,
117
+ session: true,
118
+ websocket: true,
119
+ longTask: { threshold: 50 },
120
+ routeTiming: true,
121
+ cspViolation: true,
122
+ httpBody: {
123
+ maxBodySize: 4 * 1024,
124
+ redact: ({ body, type }) => (type === 'request' ? body.replace(/password/g, '***') : body),
125
+ },
126
+ },
127
+ });
128
+ ```
129
+
130
+ 默认开启:`documentLoad`、`fetch`、`xhr`、`userInteraction`、`pageView`、`error`、`webVitals`、`blankScreen`、`device`、`session`、`websocket`。
131
+
132
+ 默认关闭:`httpBody`、`longTask`、`routeTiming`、`cspViolation`。
133
+
134
+ 常用说明:
135
+
136
+ - `documentLoad`: 采集页面加载性能。
137
+ - `fetch` / `xhr`: 采集 HTTP 请求,并给同源请求注入 `traceparent`。
138
+ - `userInteraction`: 采集用户交互。
139
+ - `pageView`: 采集页面访问和 SPA 路由变化。
140
+ - `error`: 采集 JS 错误、未处理 Promise rejection、资源加载失败。
141
+ - `webVitals`: 采集 LCP、CLS、INP、FCP、TTFB。
142
+ - `blankScreen`: 检测白屏。
143
+ - `device`: 采集浏览器、系统、网络等设备信息。
144
+ - `session`: 维护匿名会话。
145
+ - `websocket`: 采集 WebSocket 连接和消息事件。
146
+ - `longTask`: 采集长任务,`threshold` 表示最小时长阈值。
147
+ - `routeTiming`: 采集 SPA 路由切换耗时。
148
+ - `cspViolation`: 采集 CSP violation。
149
+ - `httpBody`: 采集请求/响应 body,建议配合 `redact` 做脱敏。
150
+
151
+ ## 公共属性
152
+
153
+ 通过 `attributes` 给不同类型数据补充公共属性:
154
+
155
+ ```javascript
156
+ new BkOpenTelemetry({
157
+ endpoint: 'https://your-otlp-collector',
158
+ token: 'your-report-token',
159
+ attributes: {
160
+ page: () => ({
161
+ 'rum.page.host': window.location.host,
162
+ 'rum.page.path': window.location.pathname,
163
+ }),
164
+ custom: () => ({
165
+ 'biz.team': 'demo',
166
+ }),
167
+ error: () => ({
168
+ 'biz.error_source': 'browser',
169
+ }),
170
+ metric: () => ({
171
+ 'biz.metric_source': 'rum',
172
+ }),
173
+ },
174
+ });
175
+ ```
176
+
177
+ - `page`: 页面、错误、指标、自定义事件等都会常用的页面属性。
178
+ - `custom`: 自定义事件公共属性。
179
+ - `error`: 错误事件公共属性。
180
+ - `metric`: 指标类数据公共属性。
181
+
182
+ ## 脱敏配置
183
+
184
+ 通过 `redact` 统一处理敏感数据:
185
+
186
+ ```javascript
187
+ new BkOpenTelemetry({
188
+ endpoint: 'https://your-otlp-collector',
189
+ token: 'your-report-token',
190
+ redact: {
191
+ attributes: attributes => {
192
+ const result = { ...attributes };
193
+ for (const key of Object.keys(result)) {
194
+ const value = result[key];
195
+ if (typeof value === 'string' && /\b\d{15}|\d{18}\b/.test(value)) {
196
+ result[key] = value.replace(/\d/g, '*');
197
+ }
198
+ }
199
+ return result;
200
+ },
201
+ url: url => url.replace(/token=[^&]+/g, 'token=***'),
202
+ },
203
+ });
204
+ ```
205
+
206
+ - `redact.attributes`: 过滤写入 span/log 的属性。
207
+ - `redact.url`: 过滤 URL 类属性,例如 `url.full`、`document.referrer`。
208
+
209
+ `rum.httpBody.redact` 只处理请求/响应 body,适合对 body 里的密码、token 等字段做单独脱敏。
210
+
211
+ ## 自定义事件
212
+
213
+ `new BkOpenTelemetry()` 会返回 SDK 实例,可以通过 `reportCustomEvent` 上报业务自定义事件:
214
+
215
+ ```javascript
216
+ const bkOT = new BkOpenTelemetry({
217
+ endpoint: 'https://your-otlp-collector',
218
+ token: 'your-report-token',
219
+ });
220
+
221
+ bkOT.reportCustomEvent({
222
+ name: 'order.checkout',
223
+ attributes: {
224
+ 'biz.order_id': 'O20260509001',
225
+ 'biz.order_amount': 199,
226
+ },
227
+ });
228
+ ```
229
+
230
+ 如果事件失败,可以带上 `error`:
231
+
232
+ ```javascript
233
+ bkOT.reportCustomEvent({
234
+ name: 'order.checkout',
235
+ attributes: {
236
+ 'biz.order_id': 'O20260509001',
237
+ },
238
+ error: new Error('库存不足'),
239
+ });
240
+ ```
241
+
242
+ ## 自定义插件
243
+
244
+ 通过 `createPlugin` 扩展 SDK 能力:
245
+
246
+ ```javascript
247
+ import { BkOpenTelemetry, createPlugin } from '@blueking/open-telemetry';
248
+
249
+ const plugin = createPlugin({
250
+ name: 'demo-plugin',
251
+ init(context) {
252
+ context.setRuntimeAttributes({
253
+ 'biz.plugin_enabled': true,
254
+ });
255
+
256
+ const span = context.startSpan('demo.plugin_ready');
257
+ span.end();
258
+ },
259
+ });
260
+
261
+ const bkOT = new BkOpenTelemetry({
262
+ autoStart: false,
263
+ endpoint: 'https://your-otlp-collector',
264
+ token: 'your-report-token',
265
+ plugins: [plugin],
266
+ });
267
+
268
+ await bkOT.start();
269
+ ```
270
+
271
+ 也可以通过 `use(plugin)` 链式注册,`use(plugin)` 只允许在 `start()` 前调用;自定义插件场景建议显式设置 `autoStart: false`。
272
+
273
+ ## 自定义 Instrumentation
274
+
275
+ 如需接入 OpenTelemetry 原生 instrumentation,可通过 `useInstrumentation` 注册:
276
+
277
+ ```javascript
278
+ import { BkOpenTelemetry } from '@blueking/open-telemetry';
279
+ import { MyCustomInstrumentation } from './my-custom-instrumentation';
280
+
281
+ const bkOT = new BkOpenTelemetry({
282
+ autoStart: false,
283
+ endpoint: 'https://your-otlp-collector',
284
+ token: 'your-report-token',
285
+ instrumentations: [new MyCustomInstrumentation()],
286
+ });
287
+
288
+ await bkOT.start();
289
+ ```
290
+
291
+ 也可以通过 `useInstrumentation(instrumentation)` 在 `start()` 前注册。
292
+
293
+ ## 生命周期
294
+
295
+ ```javascript
296
+ const bkOT = new BkOpenTelemetry({
297
+ endpoint: 'https://your-otlp-collector',
298
+ token: 'your-report-token',
299
+ });
300
+
301
+ await bkOT.flush();
302
+ await bkOT.shutdown();
303
+ ```
304
+
305
+ - `flush`: 立即刷新插件、trace、metric、log。
306
+ - `shutdown`: 刷新后关闭 SDK,并卸载事件监听。
307
+
308
+ ## 完整示例
309
+
310
+ ```javascript
311
+ import { BkOpenTelemetry } from '@blueking/open-telemetry';
312
+
313
+ export const bkOT = new BkOpenTelemetry({
314
+ endpoint: 'https://your-otlp-collector',
315
+ token: 'your-report-token',
316
+ environment: 'production',
317
+ debug: false,
318
+ sampleRate: 1,
319
+ rum: {
320
+ fetch: true,
321
+ xhr: true,
322
+ documentLoad: true,
323
+ userInteraction: true,
324
+ longTask: { threshold: 50 },
325
+ routeTiming: true,
326
+ httpBody: {
327
+ maxBodySize: 4 * 1024,
328
+ redact: ({ body }) => body.replace(/("password"\s*:\s*)"[^"]*"/g, '$1"***"'),
329
+ },
330
+ },
331
+ attributes: {
332
+ custom: () => ({
333
+ 'biz.team': 'rum-demo',
334
+ }),
335
+ },
336
+ redact: {
337
+ url: url => url.replace(/token=[^&]+/g, 'token=***'),
338
+ },
339
+ });
340
+ ```