@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.
- package/README.md +83 -244
- package/dist/bk-rum.global.js +2 -2
- package/dist/bk-rum.global.js.map +1 -1
- package/dist/core/config.d.ts +2 -0
- package/dist/core/metric.d.ts +2 -0
- package/dist/core/sdk.d.ts +4 -0
- package/dist/core/signal.d.ts +3 -0
- package/dist/core/telemetry-attributes.d.ts +1 -0
- package/dist/core/throttle.d.ts +2 -2
- package/dist/index.js +525 -456
- package/dist/index.js.map +1 -1
- package/dist/plugins/blank-screen.d.ts +4 -0
- package/dist/plugins/common.d.ts +1 -0
- package/dist/plugins/csp-violation.d.ts +1 -1
- package/dist/plugins/long-task.d.ts +4 -0
- package/dist/plugins/request-body.d.ts +2 -1
- package/dist/plugins/resource.d.ts +4 -0
- package/dist/plugins/web-vitals.d.ts +2 -0
- package/package.json +1 -1
- package/skills/bk-rum-otele/SKILL.md +8 -3
- package/skills/bk-rum-otele/evals/evals.json +3 -3
- package/skills/bk-rum-otele/references/api.md +236 -135
- package/skills/bk-rum-otele/references/architecture.md +141 -0
- package/skills/bk-rum-otele/references/capabilities.md +100 -0
- package/skills/bk-rum-otele/references/concepts.md +7 -4
- package/skills/bk-rum-otele/references/configuration.md +221 -178
- package/skills/bk-rum-otele/references/custom-plugin.md +15 -3
- package/skills/bk-rum-otele/references/data-model.md +5 -3
- package/skills/bk-rum-otele/references/getting-started.md +16 -0
- package/skills/bk-rum-otele/references/plugins.md +100 -72
- package/skills/bk-rum-otele/references/privacy.md +5 -1
- package/skills/bk-rum-otele/references/telemetry-reference.md +14 -12
- package/skills/bk-rum-otele/references/transport-sampling.md +79 -0
package/dist/plugins/common.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import type { BkOTPlugin } from '../core/plugin';
|
|
|
6
6
|
* 节流策略:
|
|
7
7
|
* - 同 fingerprint(`violatedDirective + blockedURI + sourceFile + lineNumber`)
|
|
8
8
|
* 在 60s 窗口内最多上报 5 条,避免风暴打爆 collector(如某段被拦截的 inline 脚本被反复渲染)。
|
|
9
|
-
* -
|
|
9
|
+
* - `browser.csp_violation.count` counter 在节流前累计所有违规,span 只保留窗口触发序号。
|
|
10
10
|
*
|
|
11
11
|
* 体积优化:
|
|
12
12
|
* - `csp.original_policy`(完整 CSP 策略,可能数 KB)仅在窗口首条上报,后续同 fingerprint 不再重复携带。
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { BkOTPlugin } from '../core/plugin';
|
|
2
|
+
/**
|
|
3
|
+
* 主线程阻塞优先使用 Long Animation Frame API 获取脚本归因,不支持时回退到 Long Tasks API;
|
|
4
|
+
* span 保留单次诊断详情,metric 只保留低基数维度用于聚合分布。
|
|
5
|
+
*/
|
|
2
6
|
export interface BkOTLongTaskPluginOptions {
|
|
3
7
|
/** 采集阈值,默认 50ms。Performance API 本身通常只产生大于 50ms 的条目。 */
|
|
4
8
|
threshold?: number;
|
|
@@ -6,9 +6,10 @@ interface CaptureRequestBodyLogOptions {
|
|
|
6
6
|
domainContext: BkOTRequestContext;
|
|
7
7
|
event: BkOTRequestEvent;
|
|
8
8
|
fetchRequest?: Request | RequestInit;
|
|
9
|
+
occurredAt?: number;
|
|
9
10
|
runtimeContext: Pick<BkOTRuntimeContext, 'emitLog'>;
|
|
10
11
|
span: Span;
|
|
11
12
|
}
|
|
12
13
|
export declare const prepareFetchRequestBodySource: (request: Request | RequestInit) => Request | RequestInit | undefined;
|
|
13
|
-
export declare const captureRequestBodyLog: ({ bodyConfig, domainContext, event, fetchRequest, runtimeContext, span, }: CaptureRequestBodyLogOptions) => Promise<void>;
|
|
14
|
+
export declare const captureRequestBodyLog: ({ bodyConfig, domainContext, event, fetchRequest, occurredAt, runtimeContext, span, }: CaptureRequestBodyLogOptions) => Promise<void>;
|
|
14
15
|
export {};
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { BkOTPlugin } from '../core/plugin';
|
|
2
|
+
/**
|
|
3
|
+
* Resource Timing 的统一消费端:静态资源按配置生成 span;Fetch/XHR timing 转交 request 插件,
|
|
4
|
+
* 与其已创建的请求 span 合并,避免同一次网络请求重复计数。
|
|
5
|
+
*/
|
|
2
6
|
type ResourceTimingWithStatus = PerformanceResourceTiming & {
|
|
3
7
|
deliveryType?: string;
|
|
4
8
|
renderBlockingStatus?: string;
|
|
@@ -55,6 +55,7 @@ interface ViewVitalState {
|
|
|
55
55
|
interactionIdMax: number;
|
|
56
56
|
interactionIdMin: number;
|
|
57
57
|
inpCandidates: InpCandidate[];
|
|
58
|
+
id: string;
|
|
58
59
|
largestShiftTarget?: string;
|
|
59
60
|
largestShiftValue: number;
|
|
60
61
|
runtimeAttributes: Attributes;
|
|
@@ -69,6 +70,7 @@ interface InpCandidate {
|
|
|
69
70
|
presentationDelay: number;
|
|
70
71
|
processingDuration: number;
|
|
71
72
|
}
|
|
73
|
+
export declare const isSameViewId: (currentViewId: string | undefined, nextViewId: string | undefined) => boolean;
|
|
72
74
|
export declare const updateViewCls: (view: ViewVitalState, entry: LayoutShiftEntry) => void;
|
|
73
75
|
export declare const updateViewInp: (view: ViewVitalState, entry: EventTimingEntry) => void;
|
|
74
76
|
export declare const getViewInp: (view: ViewVitalState) => InpCandidate | undefined;
|
package/package.json
CHANGED
|
@@ -22,8 +22,11 @@ description: 帮助业务方在前端应用里接入、使用和配置蓝鲸 RUM
|
|
|
22
22
|
| 用户想做的事 | 读取 |
|
|
23
23
|
| ------------------------------------------------------------------------------------------- | ------------------------------------- |
|
|
24
24
|
| 第一次接入、安装、最小示例、CDN、生产推荐配置 | `references/getting-started.md` |
|
|
25
|
+
| 评估 SDK 能力边界、默认开关、浏览器 API、信号产出和降级行为 | `references/capabilities.md` |
|
|
26
|
+
| 理解源码模块、初始化顺序、运行时上下文、过滤链路和 Hook 时机 | `references/architecture.md` |
|
|
25
27
|
| 搞懂三类信号、Instrumentation vs Plugin、采样、数据归一、运行时上下文 | `references/concepts.md` |
|
|
26
|
-
| 查配置项、默认值、
|
|
28
|
+
| 查配置项、默认值、Endpoint、插件参数和 Hook | `references/configuration.md` |
|
|
29
|
+
| 查 Transport、单信号开关、批量上报、Session 采样和 traceparent 透传 | `references/transport-sampling.md` |
|
|
27
30
|
| 开关某个采集能力、看请求配置和各插件参数(request/error/blankScreen/longTask/websocket 等) | `references/plugins.md` |
|
|
28
31
|
| 写自定义插件、接入第三方 OpenTelemetry instrumentation | `references/custom-plugin.md` |
|
|
29
32
|
| 查公开 API(start/flush/shutdown/setUser/setView/reportAction/reportCustomEvent 等) | `references/api.md` |
|
|
@@ -47,12 +50,12 @@ description: 帮助业务方在前端应用里接入、使用和配置蓝鲸 RUM
|
|
|
47
50
|
|
|
48
51
|
SDK 把能力拆成两类:
|
|
49
52
|
|
|
50
|
-
- **内置采集**:统一放在 `tracking`,包括 View、请求、资源、错误、Web Vitals、Action 等;其中 Fetch/XHR
|
|
53
|
+
- **内置采集**:统一放在 `tracking`,包括 View、请求、资源、错误、Web Vitals、Action 等;其中 Fetch/XHR 由 SDK 自有的单一请求生命周期直接 patch,统一创建 `browser.resource` CLIENT Span。
|
|
51
54
|
- **扩展**:接入方的 RUM 插件放在 `extensions.plugins`,标准 OpenTelemetry instrumentation 放在 `extensions.instrumentations`。它们都使用 SDK 私有 provider,并遵循 Consent 生命周期。
|
|
52
55
|
|
|
53
56
|
### 会话级确定性采样
|
|
54
57
|
|
|
55
|
-
`session.sampleRate`(0–1,默认 1)是**会话级确定性采样**,不是 trace 级。决定由 `application.name + session.id` 的稳定 hash 得出,同一 Session 的 span/log/metric
|
|
58
|
+
`session.sampleRate`(0–1,默认 1)是**会话级确定性采样**,不是 trace 级。决定由 `application.name + session.id` 的稳定 hash 得出,同一 Session 的 span/log/metric 决定一致。插件仍维护必要的浏览器生命周期,但未命中时数据不会导出,`reportAction()`、`reportCustomEvent()` 会被静默丢弃。调试时临时设 `sampleRate: 1` 和 `debug: true`。
|
|
56
59
|
|
|
57
60
|
### 运行时上下文
|
|
58
61
|
|
|
@@ -107,3 +110,5 @@ View Loading Time 默认开启;默认关闭、按需打开:`longTask`、`csp
|
|
|
107
110
|
- **Consent**:未授权初始化时配置 `privacy.trackingConsent: 'not-granted'`,用户授权后调用 `setTrackingConsent('granted')`;撤销授权会停止采集并解除 patch。
|
|
108
111
|
- **信号开关**:`transport.signals.traces/metrics/logs` 设为 `false` 可关闭对应导出链路;关闭 Trace 后不会注入 `traceparent`。只开 Metric 时没有精确 View 下钻。
|
|
109
112
|
- **低基数路由**:用 `tracking.view.getPathGroup` 把 `/user/123` 归类成 `/user/:id`,避免高基数 URL 污染指标维度。
|
|
113
|
+
- **手动 View 的时机**:使用 `autoStart: false`,先 `await start()` 建立 Session,再调用 `startView()`;启动前调用会因没有有效采样 Session 而被忽略。
|
|
114
|
+
- **Action 命名隐私**:默认 `nameCollection: 'explicit'` 只读取 `data-bk-action-name`,否则退回标签名;只有显式设为 `text` 才读取可访问名称和 DOM 文本。
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"id": 0,
|
|
6
6
|
"name": "vue3-integration",
|
|
7
7
|
"prompt": "我们是一个 Vue3 + vue-router 的后台管理系统,想接入蓝鲸 RUM 做前端监控。collector 地址是 https://rum.example.com,token 放在 window.__RUM_TOKEN__。帮我写接入代码:要能追踪 SPA 路由切换、检测白屏(挂载点 #app),生产环境按 20% 采样,并且把 URL 里的 token 参数脱敏。",
|
|
8
|
-
"expected_output": "给出使用 @blueking/open-telemetry 的 BkOpenTelemetry 接入代码:
|
|
8
|
+
"expected_output": "给出使用 @blueking/open-telemetry 的 BkOpenTelemetry 接入代码:application/transport(endpoint+token)、session.sampleRate=0.2、tracking.blankScreen.rootSelector='#app'、privacy.redactUrl 脱敏 token、通过 tracking.view.getPathGroup 自动追踪或 manual + await start() + startView() 对接 vue-router。API/配置项名称需与 SDK 实际一致。",
|
|
9
9
|
"files": [],
|
|
10
10
|
"assertions": []
|
|
11
11
|
},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"id": 1,
|
|
14
14
|
"name": "local-no-data-troubleshoot",
|
|
15
15
|
"prompt": "我按文档接了 bk-rum,本地起了 collector 在 4318,但 Network 里没看到 /rum 请求,reportCustomEvent 也没上报,debug 我也开了。可能是什么问题?怎么排查?",
|
|
16
|
-
"expected_output": "排障应覆盖:
|
|
16
|
+
"expected_output": "排障应覆盖:session.sampleRate 是会话级确定性采样,未命中时手动事件静默丢弃(建议调试设 sampleRate:1);enabled/Consent/有效 View 是否正常;建议 transport.signals.traces.processor:'simple';检查 collector、endpoint 与 Network 中 /v1/rum、/v1/metrics、/v1/logs。",
|
|
17
17
|
"files": [],
|
|
18
18
|
"assertions": []
|
|
19
19
|
},
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"id": 2,
|
|
22
22
|
"name": "instrumentation-vs-plugin-httpbody",
|
|
23
23
|
"prompt": "配置里有 instrumentations 和 plugins 两块,fetch、error 这些好像两边都能配?它们到底有什么区别?另外我想采集接口报错时的请求/响应 body 来排查问题,该怎么配、要注意什么?",
|
|
24
|
-
"expected_output": "
|
|
24
|
+
"expected_output": "正确区分内置 tracking、RUM Plugin 与额外 OTel Instrumentation;指出当前 request 是 SDK 自有 Fetch/XHR patch,生成 browser.resource CLIENT Span,不使用官方 Fetch/XHR instrumentation;说明 excludedUrls、allowedTracingUrls、request.beforeSend;HTTP body 默认关闭,显式配置 tracking.request.body 后默认只采集错误请求,必须配置 redact,并限制 Content-Type 和大小。",
|
|
25
25
|
"files": [],
|
|
26
26
|
"assertions": []
|
|
27
27
|
}
|
|
@@ -2,50 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
# API 参考
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
本页只描述 `src/index.ts` 公开导出的 API。深层路径文件属于实现细节,接入方不应直接 import。
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## 创建实例
|
|
8
8
|
|
|
9
9
|
```ts
|
|
10
|
-
import { BkOpenTelemetry } from '@blueking/open-telemetry';
|
|
10
|
+
import { BkOpenTelemetry, type BkOTOptions } from '@blueking/open-telemetry';
|
|
11
11
|
|
|
12
|
-
const
|
|
12
|
+
const options: BkOTOptions = {
|
|
13
13
|
application: { name: 'bk-rum-demo' },
|
|
14
14
|
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
15
|
-
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const bkOT = new BkOpenTelemetry(options);
|
|
16
18
|
```
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
| --- | --- | --- |
|
|
24
|
-
| `start()` | `() => Promise<void>` | 启动 SDK,注册 provider、instrumentation 和插件。 |
|
|
25
|
-
| `shutdown()` | `() => Promise<void>` | 刷新数据、关闭 provider、清理插件;关闭后不可重启。 |
|
|
26
|
-
| `flush()` | `() => Promise<void>` | 立即刷新插件、trace、metric、log。 |
|
|
27
|
-
| `use(plugin)` | `(plugin) => this` | 注册自定义插件,须在 `start()` 前。 |
|
|
28
|
-
| `useInstrumentation(instr)` | `(instr) => this` | 注册额外 OpenTelemetry instrumentation,须在 `start()` 前。 |
|
|
29
|
-
| `setUser(user)` | `(user) => void` | 更新用户上下文(`user.id`)。 |
|
|
30
|
-
| `setTrackingConsent(consent)` | `(consent) => Promise<void>` | 授予或撤销采集授权,并启动或停止采集。 |
|
|
31
|
-
| `startView(options?)` | `(options?) => void` | 结束当前 View 并创建新 View。可在 SDK 启动前调用。 |
|
|
32
|
-
| `setViewName(name)` | `(name) => void` | 更新当前 View 名称,不创建新 View。 |
|
|
33
|
-
| `setViewLoadingTime()` | `() => void` | 使用当前时刻覆盖当前 View 的自动页面稳定耗时。 |
|
|
34
|
-
| `reportAction(payload)` | `(payload) => void` | 手动上报用户动作(受采样控制)。 |
|
|
35
|
-
| `reportCustomEvent(payload)` | `(payload) => void` | 手动上报自定义事件(受采样控制)。 |
|
|
36
|
-
| `startSpan(name, attributes?, options?)` | `(...) => Span` | 创建并返回一个 span,自动带上运行时属性与脱敏。 |
|
|
37
|
-
| `emitLog(record)` | `(record) => void` | 发送一条 log,自动合并运行时属性与脱敏。 |
|
|
38
|
-
| `getRuntimeAttributes()` | `() => Attributes` | 读取当前运行时公共属性快照。 |
|
|
39
|
-
| `setRuntimeAttributes(attributes)` | `(attributes) => void` | 写入运行时公共属性。 |
|
|
40
|
-
| `applyRedact(attributes)` | `(attributes) => Attributes` | 对属性执行一次 `privacy.redactAttributes`。 |
|
|
41
|
-
| `config` | `ResolvedBkOTConfig` | 解析后的只读配置。 |
|
|
42
|
-
| `tracer` / `meter` / `logger` | OpenTelemetry 原生对象 | 用于直接操作三类信号 provider。 |
|
|
43
|
-
|
|
44
|
-
> `startSpan` / `emitLog` / `getRuntimeAttributes` 等既是实例方法,也是自定义插件 `init(context)` 中 `context` 的能力,见[自定义插件](./custom-plugin.md)。
|
|
45
|
-
|
|
46
|
-
### start
|
|
47
|
-
|
|
48
|
-
启动 SDK,注册 provider、instrumentation 和插件。
|
|
20
|
+
构造函数同步解析配置并创建三个 OpenTelemetry Provider;`autoStart: true` 时随后异步启动采集。完整配置见[配置参考](./configuration.md)。
|
|
21
|
+
|
|
22
|
+
## 生命周期方法
|
|
23
|
+
|
|
24
|
+
### start()
|
|
49
25
|
|
|
50
26
|
```ts
|
|
51
27
|
const bkOT = new BkOpenTelemetry({
|
|
@@ -54,178 +30,250 @@ const bkOT = new BkOpenTelemetry({
|
|
|
54
30
|
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
55
31
|
});
|
|
56
32
|
|
|
33
|
+
bkOT.use(myPlugin);
|
|
57
34
|
await bkOT.start();
|
|
58
35
|
```
|
|
59
36
|
|
|
60
|
-
|
|
37
|
+
启动 Session、View、内置插件、接入方插件和 instrumentations,并安装页面隐藏时的 flush 监听。重复调用 `start()` 不会重复启动。
|
|
61
38
|
|
|
62
|
-
|
|
39
|
+
### flush()
|
|
63
40
|
|
|
64
41
|
```ts
|
|
65
|
-
await bkOT.
|
|
42
|
+
await bkOT.flush();
|
|
66
43
|
```
|
|
67
44
|
|
|
68
|
-
|
|
45
|
+
先并行调用已启动插件的 `flush()`,再 force flush Trace、Metric、Log Provider。SDK 已在 `pagehide` 和页面变为 hidden 时触发 flush;业务只需在关键流程完成后按需主动调用。
|
|
69
46
|
|
|
70
|
-
|
|
47
|
+
### shutdown()
|
|
71
48
|
|
|
72
49
|
```ts
|
|
73
|
-
|
|
74
|
-
void bkOT.flush();
|
|
75
|
-
});
|
|
50
|
+
await bkOT.shutdown();
|
|
76
51
|
```
|
|
77
52
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
注册自定义插件,必须在 `start()` 前调用。
|
|
81
|
-
|
|
82
|
-
```ts
|
|
83
|
-
bkOT.use(
|
|
84
|
-
createPlugin({
|
|
85
|
-
name: 'biz-plugin',
|
|
86
|
-
init(context) {
|
|
87
|
-
const span = context.startSpan('custom.biz_plugin_ready');
|
|
88
|
-
span.end();
|
|
89
|
-
},
|
|
90
|
-
}),
|
|
91
|
-
);
|
|
92
|
-
```
|
|
53
|
+
反向关闭插件、结束待处理事件、刷新 Provider 并清理浏览器 patch/监听。该方法幂等;关闭后不能重新启动同一实例,再调用 `start()` 会抛错。
|
|
93
54
|
|
|
94
|
-
|
|
55
|
+
## Consent
|
|
95
56
|
|
|
96
|
-
|
|
57
|
+
### setTrackingConsent(consent)
|
|
97
58
|
|
|
98
59
|
```ts
|
|
99
|
-
bkOT
|
|
100
|
-
|
|
60
|
+
const bkOT = new BkOpenTelemetry({
|
|
61
|
+
application: { name: 'consent-demo' },
|
|
62
|
+
privacy: { trackingConsent: 'not-granted' },
|
|
63
|
+
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
64
|
+
});
|
|
101
65
|
|
|
102
|
-
|
|
66
|
+
await bkOT.setTrackingConsent('granted');
|
|
67
|
+
await bkOT.setTrackingConsent('not-granted');
|
|
68
|
+
```
|
|
103
69
|
|
|
104
|
-
|
|
70
|
+
- 未授权:不创建 Session/View,不启动插件,不 patch 浏览器 API。
|
|
71
|
+
- 授权:启动采集并建立新的 Session/View。
|
|
72
|
+
- 撤销:关闭采集副作用并 flush 已允许的数据。
|
|
73
|
+
- 再授权:插件会再次执行 `init()`。
|
|
105
74
|
|
|
106
|
-
|
|
107
|
-
bkOT.setUser({
|
|
108
|
-
id: 'user-12345',
|
|
109
|
-
});
|
|
110
|
-
```
|
|
75
|
+
该方法在 `autoStart: false` 且尚未 `start()` 时只更新状态;随后 `start()` 使用最新 Consent。
|
|
111
76
|
|
|
112
|
-
|
|
77
|
+
## User 与 View
|
|
113
78
|
|
|
114
|
-
|
|
79
|
+
### setUser(user)
|
|
115
80
|
|
|
116
81
|
```ts
|
|
117
|
-
|
|
118
|
-
|
|
82
|
+
bkOT.setUser({ id: 'user-12345' });
|
|
83
|
+
bkOT.setUser({ id: undefined });
|
|
119
84
|
```
|
|
120
85
|
|
|
121
|
-
|
|
86
|
+
更新后续事件的 `user.id`。SDK 不 hash、不脱敏、不改写该值。
|
|
122
87
|
|
|
123
|
-
|
|
88
|
+
### startView(options?)
|
|
89
|
+
|
|
90
|
+
结束当前 View 并创建新 View,`view.id` 始终由 SDK 生成。
|
|
124
91
|
|
|
125
92
|
```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();
|
|
126
101
|
bkOT.startView({
|
|
127
|
-
name: '
|
|
128
|
-
url:
|
|
129
|
-
attributes: {
|
|
130
|
-
'biz.owner': 'portal-team',
|
|
131
|
-
},
|
|
102
|
+
name: '订单详情',
|
|
103
|
+
url: location.href,
|
|
104
|
+
attributes: { 'biz.owner': 'order-team' },
|
|
132
105
|
});
|
|
133
106
|
```
|
|
134
107
|
|
|
135
|
-
|
|
108
|
+
`BkOTStartViewOptions` 包含 `name?`、`url?`、`attributes?`。调用时必须已有采样有效的 Session;例如 `autoStart: false` 且尚未 `await start()`、未授权或未采样时,调用会被忽略。自动启动过程中、Page View 插件尚未初始化时发出的有效命令会由运行时队列交给插件消费,但接入代码仍推荐显式等待 `start()`。`attributes` 不能覆盖 SDK 的 Session/View 保留字段。
|
|
136
109
|
|
|
137
|
-
|
|
110
|
+
### setViewName(name)
|
|
138
111
|
|
|
139
112
|
```ts
|
|
140
|
-
bkOT.setViewName('
|
|
113
|
+
bkOT.setViewName('订单详情-只读');
|
|
141
114
|
```
|
|
142
115
|
|
|
143
|
-
|
|
116
|
+
更新当前 View 名称,不创建新 View。后续子事件使用新名称,View Snapshot 产生 update。
|
|
144
117
|
|
|
145
|
-
|
|
118
|
+
### setViewLoadingTime()
|
|
146
119
|
|
|
147
120
|
```ts
|
|
148
121
|
await renderAsyncPage();
|
|
149
122
|
bkOT.setViewLoadingTime();
|
|
150
123
|
```
|
|
151
124
|
|
|
152
|
-
|
|
125
|
+
用“当前时刻 - View 开始时刻”覆盖自动 `view.loading_time`。每次调用替换前一次值;没有有效 View 时忽略。
|
|
153
126
|
|
|
154
|
-
|
|
127
|
+
## 手动事件
|
|
128
|
+
|
|
129
|
+
### reportAction(payload)
|
|
155
130
|
|
|
156
131
|
```ts
|
|
157
132
|
bkOT.reportAction({
|
|
158
133
|
name: '保存',
|
|
159
|
-
attributes: {
|
|
160
|
-
'biz.form': 'alarm-strategy',
|
|
161
|
-
},
|
|
134
|
+
attributes: { 'biz.form': 'alarm-strategy' },
|
|
162
135
|
});
|
|
163
136
|
```
|
|
164
137
|
|
|
165
|
-
|
|
138
|
+
创建并立即结束 `action.custom` Span,写入新的 `action.id`、`action.name` 和 `action.type=custom`。它不会触发自动点击的活动耗时、关联计数或挫败信号计算。
|
|
166
139
|
|
|
167
|
-
|
|
140
|
+
### reportCustomEvent(payload)
|
|
168
141
|
|
|
169
142
|
```ts
|
|
170
143
|
bkOT.reportCustomEvent({
|
|
171
144
|
name: 'strategy_saved',
|
|
172
|
-
attributes: {
|
|
173
|
-
'biz.strategy_id': '10001',
|
|
174
|
-
},
|
|
145
|
+
attributes: { 'biz.strategy_id': '10001' },
|
|
175
146
|
});
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
带错误的自定义事件:
|
|
179
147
|
|
|
180
|
-
```ts
|
|
181
148
|
bkOT.reportCustomEvent({
|
|
182
149
|
name: 'strategy_save_failed',
|
|
183
150
|
error: new Error('validation failed'),
|
|
184
|
-
attributes: {
|
|
185
|
-
'biz.strategy_id': '10001',
|
|
186
|
-
},
|
|
187
151
|
});
|
|
188
152
|
```
|
|
189
153
|
|
|
190
|
-
|
|
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?)
|
|
161
|
+
|
|
162
|
+
```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();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
自动合并事件发生时的运行时上下文,并应用 `privacy.redactAttributes`。第三个参数的内部形状名为 `BkOTStartSpanOptions`,但该类型没有从包根导出,接入方直接按下表传对象即可,不要生成对它的 import:
|
|
174
|
+
|
|
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
|
+
### emitLog(record)
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
bkOT.emitLog({
|
|
187
|
+
severityText: 'INFO',
|
|
188
|
+
body: 'biz.cache_ready',
|
|
189
|
+
attributes: { 'biz.cache': 'homepage' },
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
自动合并运行时上下文与脱敏。自定义插件应使用 `emitLog()`,不要直接调用 `logger.emit()`。
|
|
194
|
+
|
|
195
|
+
### tracer / meter / logger
|
|
196
|
+
|
|
197
|
+
实例公开 SDK 私有 Provider 对应的原生 OpenTelemetry `Tracer`、`Meter`、`Logger`。优先使用 `startSpan()` 与 `emitLog()`。当前没有公开稳定的自定义 Metric 采样 helper,直接通过 `meter` 创建的数据点默认无法通过过滤器,不应作为接入方稳定能力;详见[架构与数据流](./architecture.md#扩展边界)。
|
|
198
|
+
|
|
199
|
+
## 扩展注册
|
|
200
|
+
|
|
201
|
+
### use(plugin)
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
bkOT.use(
|
|
205
|
+
createPlugin({
|
|
206
|
+
name: 'biz-plugin',
|
|
207
|
+
init(context) {
|
|
208
|
+
context.startSpan('custom.biz_plugin_ready').end();
|
|
209
|
+
},
|
|
210
|
+
}),
|
|
211
|
+
);
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### useInstrumentation(instrumentation)
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
bkOT.useInstrumentation(new SomeWebInstrumentation());
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
两者都必须在 `start()` 前调用;使用默认自动启动时没有可靠的动态注册窗口,推荐配置 `autoStart: false`。完整插件契约见[自定义插件](./custom-plugin.md)。
|
|
221
|
+
|
|
222
|
+
额外 instrumentation 的稳定扩展边界是 Trace。第三方 Metric 不会自动获得 SDK 内部采样标记,默认无法通过 Metric 过滤器。
|
|
223
|
+
|
|
224
|
+
## 运行时与诊断成员
|
|
225
|
+
|
|
226
|
+
| 成员 | 返回/作用 |
|
|
227
|
+
| --- | --- |
|
|
228
|
+
| `config` | `resolveConfig()` 解析后的 `ResolvedBkOTConfig` |
|
|
229
|
+
| `applyRedact(attributes)` | 执行 `privacy.redactAttributes` |
|
|
230
|
+
| `getRuntimeAttributes()` | 当前公共属性快照 |
|
|
231
|
+
| `getRuntimeAttributesAt(timestamp)` | 指定 epoch ms 的历史公共属性快照 |
|
|
232
|
+
| `setRuntimeAttributes(attributes, changedAt?)` | 写入公共属性;高级扩展 API,谨慎避免覆盖 SDK 字段 |
|
|
233
|
+
| `isSampled()` | 当前 Session 是否命中采样 |
|
|
234
|
+
| `isSessionActive()` | 是否存在有效 Session |
|
|
235
|
+
| `isViewActive()` | 是否存在有效 View |
|
|
236
|
+
| `onSessionLifecycle(listener)` | 订阅 Session renewed/expired,返回取消函数 |
|
|
237
|
+
| `notifySessionLifecycle(event)` | 向运行时分发生命周期事件;主要供高级插件使用 |
|
|
238
|
+
|
|
239
|
+
## createPlugin(plugin)
|
|
240
|
+
|
|
241
|
+
`createPlugin()` 是保留完整类型推导的恒等构造器。
|
|
191
242
|
|
|
192
243
|
```ts
|
|
193
244
|
import { createPlugin } from '@blueking/open-telemetry';
|
|
194
245
|
|
|
195
|
-
|
|
246
|
+
const plugin = createPlugin({
|
|
196
247
|
name: 'page-visible',
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
attributes: {
|
|
202
|
-
'document.visibility_state': document.visibilityState,
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
},
|
|
248
|
+
enabled: config => config.enabled,
|
|
249
|
+
init(context) {},
|
|
250
|
+
flush() {},
|
|
251
|
+
shutdown() {},
|
|
206
252
|
});
|
|
207
253
|
```
|
|
208
254
|
|
|
209
|
-
|
|
255
|
+
`BkOTPlugin` 的 `enabled` 可为布尔值或接收 `ResolvedBkOTConfig` 的函数。Plugin Manager 顺序启动、并行 flush、反向 shutdown,并隔离单个插件的初始化错误。
|
|
210
256
|
|
|
211
|
-
|
|
257
|
+
## Schema 辅助 API
|
|
212
258
|
|
|
213
|
-
|
|
214
|
-
|
|
259
|
+
### RUM_ATTRIBUTES
|
|
260
|
+
|
|
261
|
+
归一字段 key 常量。
|
|
215
262
|
|
|
263
|
+
```ts
|
|
216
264
|
bkOT.reportCustomEvent({
|
|
217
265
|
name: 'biz_event',
|
|
218
|
-
attributes: {
|
|
219
|
-
[RUM_ATTRIBUTES.targetLabel]: 'submit-order',
|
|
220
|
-
},
|
|
266
|
+
attributes: { [RUM_ATTRIBUTES.targetLabel]: 'submit-order' },
|
|
221
267
|
});
|
|
222
268
|
```
|
|
223
269
|
|
|
224
|
-
|
|
270
|
+
### RUM_SPAN_TYPE / RUM_SPAN_RESULT
|
|
225
271
|
|
|
226
|
-
|
|
227
|
-
|
|
272
|
+
分别提供标准 `span_type` 与 `result` 值。
|
|
273
|
+
|
|
274
|
+
### buildRumSpanAttributes(classification)
|
|
228
275
|
|
|
276
|
+
```ts
|
|
229
277
|
const span = bkOT.startSpan('custom.cache_hit', {
|
|
230
278
|
...buildRumSpanAttributes({
|
|
231
279
|
spanType: RUM_SPAN_TYPE.custom,
|
|
@@ -235,26 +283,79 @@ const span = bkOT.startSpan('custom.cache_hit', {
|
|
|
235
283
|
targetValue: true,
|
|
236
284
|
}),
|
|
237
285
|
});
|
|
238
|
-
|
|
239
286
|
span.end();
|
|
240
287
|
```
|
|
241
288
|
|
|
242
|
-
|
|
289
|
+
### getDurationBucket(duration)
|
|
290
|
+
|
|
291
|
+
返回 `<100ms`、`100~500ms`、`500ms~2s`、`>2s` 之一。
|
|
292
|
+
|
|
293
|
+
### buildRumSpanAttributes 相关类型
|
|
243
294
|
|
|
244
|
-
`
|
|
295
|
+
公开 `RumSpanClassification`、`RumSpanType`、`RumSpanResult`,用于扩展插件保持同一归一模型。
|
|
296
|
+
|
|
297
|
+
## resolveConfig(options)
|
|
245
298
|
|
|
246
299
|
```ts
|
|
247
300
|
import { resolveConfig } from '@blueking/open-telemetry';
|
|
248
301
|
|
|
249
302
|
const config = resolveConfig({
|
|
250
|
-
application: {
|
|
251
|
-
|
|
252
|
-
},
|
|
253
|
-
transport: {
|
|
254
|
-
endpoint: 'https://rum-collector.example.com',
|
|
255
|
-
},
|
|
303
|
+
application: { name: 'bk-rum-demo' },
|
|
304
|
+
transport: { endpoint: 'https://rum-collector.example.com' },
|
|
256
305
|
});
|
|
257
306
|
|
|
258
|
-
console.log(config.
|
|
259
|
-
console.log(config.transport.traces.endpoint);
|
|
307
|
+
console.log(config.transport.traces && config.transport.traces.endpoint);
|
|
260
308
|
```
|
|
309
|
+
|
|
310
|
+
用于预览核心解析结果和测试配置。插件自己的参数默认值在插件工厂执行时解析,不会全部展开到 `ResolvedBkOTConfig`。
|
|
311
|
+
|
|
312
|
+
## 内置插件工厂
|
|
313
|
+
|
|
314
|
+
公共入口导出以下工厂,便于自定义组合或测试:
|
|
315
|
+
|
|
316
|
+
| 工厂 | 选项类型 |
|
|
317
|
+
| --- | --- |
|
|
318
|
+
| `createSessionPlugin` | `BkOTSessionConfig` |
|
|
319
|
+
| `createDevicePlugin` | `BkOTDevicePluginOptions` |
|
|
320
|
+
| `createCommonInstrumentationsPlugin` | `BkOTRequestConfig \| boolean` |
|
|
321
|
+
| `createResourcePlugin` | 直接传 `boolean`,控制是否为静态资源创建 Span;默认 `true` |
|
|
322
|
+
| `createErrorPlugin` | `BkOTErrorPluginOptions` |
|
|
323
|
+
| `createWebVitalsPlugin` | 无 |
|
|
324
|
+
| `createBlankScreenPlugin` | `BkOTBlankScreenPluginOptions` |
|
|
325
|
+
| `createActionPlugin` | `BkOTActionPluginOptions` |
|
|
326
|
+
| `createLongTaskPlugin` | `BkOTLongTaskPluginOptions` |
|
|
327
|
+
| `createWebSocketPlugin` | 无 |
|
|
328
|
+
| `createCspViolationPlugin` | 无 |
|
|
329
|
+
|
|
330
|
+
`createCommonInstrumentationsPlugin` 名称保留,但当前实现是 SDK 自有 Fetch/XHR patch,不注册官方 Fetch/XHR instrumentation。
|
|
331
|
+
|
|
332
|
+
## 其他公共导出
|
|
333
|
+
|
|
334
|
+
`src/index.ts` 还导出以下高级能力:
|
|
335
|
+
|
|
336
|
+
- `RumRuntimeContext` 及 Session/View/User 相关类型。
|
|
337
|
+
- `PluginManager`。
|
|
338
|
+
- `FilteringSpanProcessor`、`FilteringMetricExporter`、`FilteringLogRecordProcessor`。
|
|
339
|
+
- `EXCLUDED_ACTIVITY_MUTATIONS_ATTRIBUTE`,用于标记不应延长 View Loading/Action 的 DOM 子树。
|
|
340
|
+
- 配置输入、解析结果、Transport、Hook、请求上下文等 TypeScript 类型。
|
|
341
|
+
|
|
342
|
+
这些主要服务 SDK 维护和高级扩展;常规接入只需 `BkOpenTelemetry`、`BkOTOptions` 和手动事件类型。
|
|
343
|
+
|
|
344
|
+
`BkOpenTelemetry` 具体类上还能看到 `registerInstrumentations()`,它用于 SDK 向插件运行时提供批量注册能力,但被刻意排除在 `BkOTInstance` 契约之外,也会绕过 `useInstrumentation()` 的启动阶段检查。接入方不要直接调用;使用 `extensions.instrumentations` 或 `useInstrumentation()`。
|
|
345
|
+
|
|
346
|
+
## 公共类型索引
|
|
347
|
+
|
|
348
|
+
以下名称都可以从包根路径执行 `import type`:
|
|
349
|
+
|
|
350
|
+
| 分类 | 类型 |
|
|
351
|
+
| --- | --- |
|
|
352
|
+
| 顶层配置 | `BkOTOptions`、`BkOTApplicationConfig`、`BkOTTransportConfig`、`BkOTTrackingConfig`、`BkOTTrackingConsent`、`BkOTContextConfig`、`BkOTPrivacyConfig`、`BkOTExtensionsConfig` |
|
|
353
|
+
| Transport | `BkOTBatchConfig`、`SignalExporterConfig`、`SignalExporterInputConfig`、`SignalExportersInputConfig`、`TraceExporterInputConfig`、`MetricExporterInputConfig` |
|
|
354
|
+
| View/Session/User | `BkOTViewConfig`、`BkOTSessionConfig`、`BkOTStartViewOptions`、`BkOTViewContext`、`BkOTSessionLifecycleEvent`、`BkOTUserContext` |
|
|
355
|
+
| Request | `BkOTRequestConfig`、`BkOTRequestEvent`、`BkOTRequestContext`、`BkOTRequestBodyConfig`、`BkOTRequestBodyRedactPayload`、`BkOTUrlMatcher` |
|
|
356
|
+
| 事件与 Hook | `BkOTActionEventPayload`、`BkOTCustomEventPayload`、`BkOTBeforeSendEvent`、`BkOTAttributesConfig`、`BkOTAttributeValue` |
|
|
357
|
+
| 插件 | `BkOTPlugin`、`BkOTRuntimeContext`、`BkOTActionPluginOptions`、`BkOTBlankScreenPluginOptions`、`BkOTDevicePluginOptions`、`BkOTErrorPluginOptions`、`BkOTLongTaskPluginOptions` |
|
|
358
|
+
| 实例与解析结果 | `BkOTInstance`、`PluginManager`、`ResolvedBkOTConfig`、`ResolvedApplicationConfig`、`ResolvedTransportConfig`、`ResolvedViewConfig`、`ResolvedConfigHooks` |
|
|
359
|
+
| Schema | `RumAttributeKey`、`RumSpanClassification`、`RumSpanType`、`RumSpanResult` |
|
|
360
|
+
|
|
361
|
+
如某个源码类型没有出现在本表,也没有从 `src/index.ts` 导出,则它不是包的公共契约。
|