@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,149 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 框架集成
|
|
4
|
+
|
|
5
|
+
SDK 不绑定具体框架。接入重点是:在应用入口初始化、提供低基数路由模板、为 blank screen 指定根节点、在登录态变化时更新用户上下文。
|
|
6
|
+
|
|
7
|
+
## Vue 3
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
// bk-ot.ts
|
|
11
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
12
|
+
|
|
13
|
+
export const bkOT = new BkOpenTelemetry({
|
|
14
|
+
autoStart: false,
|
|
15
|
+
app: {
|
|
16
|
+
name: 'vue-rum-demo',
|
|
17
|
+
environment: import.meta.env.MODE,
|
|
18
|
+
},
|
|
19
|
+
transport: {
|
|
20
|
+
endpoint: 'https://rum-collector.example.com',
|
|
21
|
+
},
|
|
22
|
+
plugins: {
|
|
23
|
+
blankScreen: {
|
|
24
|
+
rootSelector: '#app',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
// main.ts
|
|
32
|
+
import { createApp } from 'vue';
|
|
33
|
+
import { bkOT } from './bk-ot';
|
|
34
|
+
import App from './App.vue';
|
|
35
|
+
import router from './router';
|
|
36
|
+
|
|
37
|
+
router.afterEach(to => {
|
|
38
|
+
bkOT.setView({
|
|
39
|
+
url: window.location.href,
|
|
40
|
+
urlPathGroup: to.matched.at(-1)?.path || to.path,
|
|
41
|
+
loadingType: 'route_change',
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
await bkOT.start();
|
|
46
|
+
|
|
47
|
+
createApp(App).use(router).mount('#app');
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Vue Router 路由模板
|
|
51
|
+
|
|
52
|
+
如果不想在 `afterEach` 中主动 `setView()`,可以通过 `route.getPathGroup` 统一处理。
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
const routeGroups = [
|
|
56
|
+
{ group: '/alarm/:id', pattern: /^\/alarm\/[^/]+$/ },
|
|
57
|
+
{ group: '/strategy/:id/edit', pattern: /^\/strategy\/[^/]+\/edit$/ },
|
|
58
|
+
];
|
|
59
|
+
|
|
60
|
+
new BkOpenTelemetry({
|
|
61
|
+
route: {
|
|
62
|
+
getPathGroup: url => {
|
|
63
|
+
const pathname = new URL(url, window.location.href).pathname;
|
|
64
|
+
return routeGroups.find(route => route.pattern.test(pathname))?.group || pathname.replace(/\/\d+/g, '/:id');
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## React Router
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
74
|
+
import { useEffect } from 'react';
|
|
75
|
+
import { useLocation, useMatches } from 'react-router-dom';
|
|
76
|
+
|
|
77
|
+
export const bkOT = new BkOpenTelemetry({
|
|
78
|
+
app: { name: 'react-rum-demo' },
|
|
79
|
+
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
80
|
+
plugins: {
|
|
81
|
+
blankScreen: {
|
|
82
|
+
rootSelector: '#root',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
export const RumRouteSync = () => {
|
|
88
|
+
const location = useLocation();
|
|
89
|
+
const matches = useMatches();
|
|
90
|
+
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
bkOT.setView({
|
|
93
|
+
url: window.location.href,
|
|
94
|
+
urlPathGroup: matches.at(-1)?.pathname || location.pathname,
|
|
95
|
+
loadingType: 'route_change',
|
|
96
|
+
});
|
|
97
|
+
}, [location.pathname, matches]);
|
|
98
|
+
|
|
99
|
+
return null;
|
|
100
|
+
};
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 登录态变化
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { bkOT } from './bk-ot';
|
|
107
|
+
|
|
108
|
+
export const onLoginSuccess = (user: { id: string }) => {
|
|
109
|
+
bkOT.setUser({
|
|
110
|
+
id: user.id,
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
export const onLogout = () => {
|
|
115
|
+
bkOT.setUser({
|
|
116
|
+
id: undefined,
|
|
117
|
+
});
|
|
118
|
+
};
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 微前端
|
|
122
|
+
|
|
123
|
+
微前端场景建议只在主应用初始化一次 SDK,子应用通过主应用暴露的方法上报业务事件,避免多个 SDK 实例重复 patch fetch/xhr/WebSocket。
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
// 主应用
|
|
127
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
128
|
+
|
|
129
|
+
const bkOT = new BkOpenTelemetry({
|
|
130
|
+
app: { name: 'micro-frontend-host' },
|
|
131
|
+
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
window.__BK_RUM__ = {
|
|
135
|
+
reportAction: bkOT.reportAction,
|
|
136
|
+
reportCustomEvent: bkOT.reportCustomEvent,
|
|
137
|
+
setView: bkOT.setView,
|
|
138
|
+
};
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
// 子应用
|
|
143
|
+
window.__BK_RUM__?.reportCustomEvent({
|
|
144
|
+
name: 'sub_app_mounted',
|
|
145
|
+
attributes: {
|
|
146
|
+
'biz.sub_app': 'alarm',
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
```
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
<!-- 本文件由 packages/open-telemetry/scripts/gen-skill-references.mjs 从 wikis 自动生成,请勿手改。 -->
|
|
2
|
+
|
|
3
|
+
# 简介
|
|
4
|
+
|
|
5
|
+
`@blueking/open-telemetry` 是面向浏览器真实用户监控(RUM)的 OpenTelemetry 封装 SDK。它基于 OpenTelemetry Web SDK,将页面访问、资源加载、接口请求、JavaScript 错误、Web Vitals、空白屏、会话、用户动作等浏览器事件统一转成 trace、metric、log 三类信号,并通过 OTLP HTTP 协议上报。
|
|
6
|
+
|
|
7
|
+
## 适合解决什么问题
|
|
8
|
+
|
|
9
|
+
- 统一采集前端页面性能、错误、接口请求、资源加载和用户行为。
|
|
10
|
+
- 使用 OpenTelemetry 标准协议接入已有 Collector 或蓝鲸 RUM 后端。
|
|
11
|
+
- 将浏览器事件与后端 trace 关联,定位一次访问中的慢请求、资源异常和前端错误。
|
|
12
|
+
- 通过插件逐步打开高级采集能力,控制数据量、隐私和性能成本。
|
|
13
|
+
|
|
14
|
+
## SDK 能力分层
|
|
15
|
+
|
|
16
|
+
1. `core`:负责配置解析、provider/exporter 初始化、采样、插件生命周期和运行时上下文。
|
|
17
|
+
2. `plugins`:负责浏览器 RUM 事件采集,包括页面、资源、错误、性能、会话、动作等能力。
|
|
18
|
+
3. `schema`:负责 RUM 字段、span 类型、结果、耗时分桶等归一化模型。
|
|
19
|
+
4. `browser` / `index`:分别提供 CDN 全局入口(`https://unpkg.com/@blueking/open-telemetry/dist/bk-rum.global.js`)和 ESM 模块入口(`@blueking/open-telemetry`)。
|
|
20
|
+
|
|
21
|
+
## 最小示例
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
25
|
+
|
|
26
|
+
new BkOpenTelemetry({
|
|
27
|
+
app: {
|
|
28
|
+
name: 'bk-rum-demo',
|
|
29
|
+
environment: 'production',
|
|
30
|
+
version: '1.0.0',
|
|
31
|
+
},
|
|
32
|
+
transport: {
|
|
33
|
+
endpoint: 'https://rum-collector.example.com',
|
|
34
|
+
token: 'report-token',
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
默认情况下,SDK 会自动启动,并开启 documentLoad、fetch、xhr、userInteraction 以及 pageView、resource、error、webVitals、blankScreen、device、session 等基础 RUM 插件。
|
|
40
|
+
|
|
41
|
+
# 快速上手
|
|
42
|
+
|
|
43
|
+
本页从最小接入开始,逐步打开常用配置。所有示例都可以直接放在前端应用入口文件中,例如 `main.ts`、`bootstrap.ts` 或独立的 `bk-ot.ts`。
|
|
44
|
+
|
|
45
|
+
## 安装
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pnpm add @blueking/open-telemetry
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 最小接入
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
55
|
+
|
|
56
|
+
new BkOpenTelemetry({
|
|
57
|
+
transport: {
|
|
58
|
+
endpoint: 'https://rum-collector.example.com',
|
|
59
|
+
token: 'report-token',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
这段代码会使用默认应用名 `unknown_service`、默认环境 `production`,并自动启动 SDK。生产环境建议显式声明应用信息。
|
|
65
|
+
|
|
66
|
+
## 推荐生产配置
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
70
|
+
|
|
71
|
+
const bkOT = new BkOpenTelemetry({
|
|
72
|
+
app: {
|
|
73
|
+
name: 'bk-monitor-web',
|
|
74
|
+
environment: 'production',
|
|
75
|
+
version: '1.4.2',
|
|
76
|
+
},
|
|
77
|
+
user: {
|
|
78
|
+
id: window.__BK_USER__?.id,
|
|
79
|
+
},
|
|
80
|
+
transport: {
|
|
81
|
+
endpoint: 'https://rum-collector.example.com',
|
|
82
|
+
token: window.__BK_RUM_TOKEN__,
|
|
83
|
+
},
|
|
84
|
+
sampling: {
|
|
85
|
+
rate: 0.2,
|
|
86
|
+
},
|
|
87
|
+
route: {
|
|
88
|
+
getPathGroup: url => new URL(url).pathname.replace(/\/\d+/g, '/:id'),
|
|
89
|
+
},
|
|
90
|
+
privacy: {
|
|
91
|
+
redactUrl: url => url.replace(/([?&]token=)[^&]+/g, '$1***'),
|
|
92
|
+
redactAttributes: attributes => {
|
|
93
|
+
const next = { ...attributes };
|
|
94
|
+
delete next['http.request.header.authorization'];
|
|
95
|
+
return next;
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export default bkOT;
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 手动启动
|
|
104
|
+
|
|
105
|
+
如果需要先注册自定义插件或 instrumentation,再启动 SDK,可以关闭 `autoStart`。
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
import { BkOpenTelemetry, createPlugin } from '@blueking/open-telemetry';
|
|
109
|
+
|
|
110
|
+
const bkOT = new BkOpenTelemetry({
|
|
111
|
+
autoStart: false,
|
|
112
|
+
app: { name: 'bk-rum-demo' },
|
|
113
|
+
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
bkOT.use(
|
|
117
|
+
createPlugin({
|
|
118
|
+
name: 'biz-ready',
|
|
119
|
+
init(context) {
|
|
120
|
+
const span = context.startSpan('custom.biz_ready', {
|
|
121
|
+
'biz.stage': 'bootstrap',
|
|
122
|
+
});
|
|
123
|
+
span.end();
|
|
124
|
+
},
|
|
125
|
+
}),
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
await bkOT.start();
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`use()` 和 `useInstrumentation()` 必须在 `start()` 之前调用。如果使用默认 `autoStart: true`,构造实例后会立即启动,不再允许追加插件。
|
|
132
|
+
|
|
133
|
+
## CDN 接入
|
|
134
|
+
|
|
135
|
+
构建产物提供 `dist/bk-rum.global.js`,会在浏览器上暴露全局变量 `BkOpenTelemetry`。可通过 [unpkg](https://unpkg.com/@blueking/open-telemetry/) 或 [jsDelivr](https://cdn.jsdelivr.net/npm/@blueking/open-telemetry/) 直接引用,无需本地构建。
|
|
136
|
+
|
|
137
|
+
```html
|
|
138
|
+
<!-- 最新版本 -->
|
|
139
|
+
<script src="https://unpkg.com/@blueking/open-telemetry/dist/bk-rum.global.js"></script>
|
|
140
|
+
<!-- 或锁定版本(推荐生产环境,将 <version> 替换为实际版本号,如 0.0.10) -->
|
|
141
|
+
<!-- <script src="https://unpkg.com/@blueking/open-telemetry@<version>/dist/bk-rum.global.js"></script> -->
|
|
142
|
+
<!-- jsDelivr 备选: -->
|
|
143
|
+
<!-- <script src="https://cdn.jsdelivr.net/npm/@blueking/open-telemetry/dist/bk-rum.global.js"></script> -->
|
|
144
|
+
<script>
|
|
145
|
+
new window.BkOpenTelemetry({
|
|
146
|
+
app: {
|
|
147
|
+
name: 'legacy-web',
|
|
148
|
+
environment: 'production',
|
|
149
|
+
},
|
|
150
|
+
transport: {
|
|
151
|
+
endpoint: 'https://rum-collector.example.com',
|
|
152
|
+
token: 'report-token',
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
</script>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## 手动上报业务事件
|
|
159
|
+
|
|
160
|
+
```ts
|
|
161
|
+
bkOT.reportAction({
|
|
162
|
+
type: 'click',
|
|
163
|
+
targetTag: 'button',
|
|
164
|
+
targetText: '提交订单',
|
|
165
|
+
attributes: {
|
|
166
|
+
'biz.order_id': '202605270001',
|
|
167
|
+
},
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
bkOT.reportCustomEvent({
|
|
171
|
+
name: 'checkout_success',
|
|
172
|
+
attributes: {
|
|
173
|
+
'biz.amount': 99.9,
|
|
174
|
+
'biz.currency': 'CNY',
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
未命中采样时,`reportAction()` 和 `reportCustomEvent()` 会静默丢弃。调试阶段可以设置 `sampling.rate: 1` 和 `debug: true`。
|