@blueking/open-telemetry 0.0.34 → 0.0.35-beta.1

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 (54) hide show
  1. package/README.md +67 -57
  2. package/dist/bk-rum.global.js +2 -2
  3. package/dist/bk-rum.global.js.map +1 -1
  4. package/dist/core/action-activity.d.ts +5 -1
  5. package/dist/core/action-target.d.ts +19 -0
  6. package/dist/core/config.d.ts +15 -5
  7. package/dist/core/event-time.d.ts +7 -0
  8. package/dist/core/performance-timing.d.ts +13 -0
  9. package/dist/core/plugin.d.ts +37 -2
  10. package/dist/core/processor.d.ts +24 -2
  11. package/dist/core/request-timing.d.ts +3 -2
  12. package/dist/core/runtime-context.d.ts +62 -2
  13. package/dist/core/sdk.d.ts +23 -1
  14. package/dist/core/session-transition.d.ts +19 -0
  15. package/dist/core/trace-context.d.ts +6 -7
  16. package/dist/core/view-location.d.ts +10 -0
  17. package/dist/index.d.ts +2 -0
  18. package/dist/index.js +2933 -1505
  19. package/dist/index.js.map +1 -1
  20. package/dist/integrations/vue-router.d.ts +25 -0
  21. package/dist/plugins/action.d.ts +1 -1
  22. package/dist/plugins/blank-screen-detection.d.ts +11 -0
  23. package/dist/plugins/blank-screen.d.ts +10 -18
  24. package/dist/plugins/common.d.ts +4 -2
  25. package/dist/plugins/document-vitals.d.ts +25 -0
  26. package/dist/plugins/page-view.d.ts +1 -1
  27. package/dist/plugins/resource.d.ts +3 -1
  28. package/dist/plugins/session-state.d.ts +14 -2
  29. package/dist/plugins/session-store.d.ts +12 -0
  30. package/dist/plugins/session.d.ts +1 -0
  31. package/dist/plugins/web-vitals-metrics.d.ts +80 -0
  32. package/dist/plugins/web-vitals.d.ts +2 -59
  33. package/dist/schema/attributes.d.ts +45 -0
  34. package/dist/schema/span.d.ts +5 -2
  35. package/package.json +9 -4
  36. package/skills/bk-rum-otele/references/actions.md +54 -37
  37. package/skills/bk-rum-otele/references/api.md +72 -51
  38. package/skills/bk-rum-otele/references/architecture.md +16 -16
  39. package/skills/bk-rum-otele/references/blank-screen.md +72 -142
  40. package/skills/bk-rum-otele/references/capabilities.md +66 -60
  41. package/skills/bk-rum-otele/references/configuration.md +101 -98
  42. package/skills/bk-rum-otele/references/data-model.md +22 -17
  43. package/skills/bk-rum-otele/references/errors-security.md +13 -13
  44. package/skills/bk-rum-otele/references/extensions.md +5 -3
  45. package/skills/bk-rum-otele/references/framework-integration.md +7 -24
  46. package/skills/bk-rum-otele/references/network.md +62 -49
  47. package/skills/bk-rum-otele/references/performance.md +62 -30
  48. package/skills/bk-rum-otele/references/privacy.md +5 -5
  49. package/skills/bk-rum-otele/references/production.md +9 -13
  50. package/skills/bk-rum-otele/references/session-context.md +67 -38
  51. package/skills/bk-rum-otele/references/span-protocol.md +692 -421
  52. package/skills/bk-rum-otele/references/telemetry-reference.md +288 -213
  53. package/skills/bk-rum-otele/references/troubleshooting.md +2 -2
  54. package/skills/bk-rum-otele/references/views-routing.md +103 -27
@@ -0,0 +1,25 @@
1
+ import type { BkOTStartViewOptions } from '../core/runtime-context';
2
+ /** 使用结构化接口,Vue Router 的 Hash/History 实例均可传入,无需把 Vue 打包进 SDK。 */
3
+ export interface BkOTVueRoute {
4
+ matched: readonly {
5
+ path: string;
6
+ }[];
7
+ path: string;
8
+ }
9
+ export interface BkOTVueRouter {
10
+ currentRoute: {
11
+ readonly value: BkOTVueRoute;
12
+ };
13
+ afterEach: (guard: (to: BkOTVueRoute, from: BkOTVueRoute, failure?: unknown) => void) => () => void;
14
+ }
15
+ export interface BkOTVueViewClient {
16
+ config: {
17
+ view: {
18
+ tracking: 'auto' | 'manual';
19
+ };
20
+ };
21
+ isViewActive: () => boolean;
22
+ startView: (options: BkOTStartViewOptions) => void;
23
+ }
24
+ /** 在 SDK start 完成后接入;成功路由提交定义 View 边界,不代表业务内容已经渲染完成。 */
25
+ export declare const trackVueRouterViews: (rum: BkOTVueViewClient, router: BkOTVueRouter) => (() => void);
@@ -1,10 +1,10 @@
1
1
  import type { BkOTPlugin } from '../core/plugin';
2
+ export { getActionNameFromElement } from '../core/action-target';
2
3
  export interface BkOTActionPluginOptions {
3
4
  actionNameAttribute?: string;
4
5
  maxDuration?: number;
5
6
  /** 默认仅采集显式 data 属性;设为 text 才会读取可访问名称和 DOM 文本。 */
6
7
  nameCollection?: 'explicit' | 'text';
7
8
  }
8
- export declare const getActionNameFromElement: (target: Element, actionNameAttribute?: string, includeText?: boolean) => string;
9
9
  export declare const isDeadClickExcluded: (target: Element) => boolean;
10
10
  export declare const createActionPlugin: (options?: BkOTActionPluginOptions) => BkOTPlugin;
@@ -0,0 +1,11 @@
1
+ export interface BlankScreenDetection {
2
+ contentCount: number;
3
+ emptyCount: number;
4
+ ignoredCount: number;
5
+ reason: 'empty_viewport' | 'missing_root';
6
+ score: number;
7
+ state: 'blank' | 'content' | 'loading' | 'unknown';
8
+ unknownCount: number;
9
+ validCount: number;
10
+ }
11
+ export declare const detectBlankScreen: (rootSelector: string, ignoredSelectors: string[], threshold?: number) => BlankScreenDetection;
@@ -1,27 +1,19 @@
1
1
  import type { BkOTPlugin } from '../core/plugin';
2
- /**
3
- * 通过视口九宫格采样估算空白比例,并在页面稳定后连续确认两次。每个 View 最多上报一次,
4
- * 避免首屏渲染、路由切换和 loading 状态造成瞬时误报。
5
- */
2
+ export { detectBlankScreen } from './blank-screen-detection';
6
3
  export interface BkOTBlankScreenPluginOptions {
7
- /** 页面活动稳定后首次检查的延迟,默认 1000ms。 */
4
+ /** 每次页面活动后的稳定等待,默认 1000ms。 */
8
5
  checkDelay?: number;
9
- /** 两次空白结果之间的确认间隔,默认 200ms。 */
6
+ /** 空白候选连续确认的间隔,默认 200ms;新活动会取消确认。 */
10
7
  confirmationDelay?: number;
11
- /** loading、骨架屏等不参与空白比例计算的元素。 */
8
+ /** loading、骨架屏选择器;追加到内置规则。 */
12
9
  ignoreSelectors?: string[];
13
- /** 应用挂载根节点,默认 body。根节点不存在时回退到 body 检测。 */
10
+ /** 文档启动或活动持续未稳定的最长等待,默认 10000ms。超时仅报告 unknown/loading。 */
11
+ maxWait?: number;
12
+ /** 主要业务内容根节点,默认 body;缺失时回退到视口。 */
14
13
  rootSelector?: string;
15
- /** 空白采样点比例阈值,默认 0.8。 */
14
+ /** 有效采样点中的空白比例,默认 0.8;有效点至少 5 个才作结论。 */
16
15
  threshold?: number;
17
16
  }
18
- interface DetectionResult {
19
- emptyCount: number;
20
- ignoredCount: number;
21
- reason: 'empty_viewport' | 'missing_root';
22
- score: number;
23
- validCount: number;
24
- }
25
- export declare const detectBlankScreen: (rootSelector: string, ignoredSelectors: string[]) => DetectionResult;
17
+ /** Sampling and scheduling share one View-scoped state machine. A healthy or unknown sample
18
+ * is not terminal: subsequent activity, visibility restoration and bounded probes can retry. */
26
19
  export declare const createBlankScreenPlugin: (options?: BkOTBlankScreenPluginOptions) => BkOTPlugin;
27
- export {};
@@ -1,11 +1,13 @@
1
1
  import type { BkOTRequestConfig, BkOTRequestContext, BkOTRequestOutcome } from '../core/config';
2
2
  import type { BkOTPlugin, BkOTRuntimeContext } from '../core/plugin';
3
- import type { Span } from '@opentelemetry/api';
3
+ import type { Attributes, Span } from '@opentelemetry/api';
4
4
  interface RequestDetails {
5
5
  method?: string;
6
+ ownedAttributeKeys?: string[];
7
+ relativeStartedAt?: number;
6
8
  startedAt?: number;
7
9
  url?: string;
8
10
  }
9
- export declare const decorateRequestSpan: (context: BkOTRuntimeContext, span: Span, subtype: "fetch" | "xhr", domainContext: BkOTRequestContext, outcome: BkOTRequestOutcome, details?: RequestDetails) => void;
11
+ export declare const decorateRequestSpan: (context: BkOTRuntimeContext, span: Span, subtype: "fetch" | "xhr", domainContext: BkOTRequestContext, outcome: BkOTRequestOutcome, details?: RequestDetails, performanceAttributes?: Attributes) => void;
10
12
  export declare const createCommonInstrumentationsPlugin: (option: BkOTRequestConfig | boolean | undefined) => BkOTPlugin;
11
13
  export {};
@@ -0,0 +1,25 @@
1
+ export interface DocumentVitalMetric {
2
+ activationStart: number;
3
+ attribution: Record<string, number | string | undefined>;
4
+ entries: PerformanceEntry[];
5
+ kind: 'activation' | 'document';
6
+ name: 'FCP' | 'LCP' | 'TTFB';
7
+ rating: 'good' | 'needs-improvement' | 'poor';
8
+ value: number;
9
+ }
10
+ interface DocumentVitalsOptions {
11
+ collectInitialDocument: boolean;
12
+ getTarget: (element: Element) => string | undefined;
13
+ onChange?: () => void;
14
+ onMetric: (metric: DocumentVitalMetric) => void;
15
+ }
16
+ /**
17
+ * Each collector owns its observers and listeners, so revoking consent or stopping an
18
+ * SDK actually releases them. Document identity is independent of plugin lifetime;
19
+ * BFCache callbacks carry their activation time instead of consulting a mutable View.
20
+ */
21
+ export declare const startDocumentVitals: ({ collectInitialDocument, getTarget, onChange, onMetric }: DocumentVitalsOptions) => {
22
+ flush: () => void;
23
+ stop(): void;
24
+ };
25
+ export {};
@@ -1,3 +1,3 @@
1
+ export { isViewLocationChange } from '../core/view-location';
1
2
  import type { BkOTPlugin } from '../core/plugin';
2
- export declare const isViewLocationChange: (fromUrl: string, toUrl: string) => boolean;
3
3
  export declare const createPageViewPlugin: () => BkOTPlugin;
@@ -11,7 +11,9 @@ type ResourceTimingWithStatus = PerformanceResourceTiming & {
11
11
  responseStatus?: number;
12
12
  workerCacheLookupStart?: number;
13
13
  workerFinalRouterSource?: string;
14
+ workerFinalSourceType?: string;
14
15
  workerMatchedRouterSource?: string;
16
+ workerMatchedSourceType?: string;
15
17
  workerRouterEvaluationStart?: number;
16
18
  };
17
19
  export declare const getResourceTimingAttributes: (entry: ResourceTimingWithStatus) => Record<string, number>;
@@ -29,7 +31,7 @@ export declare const getResourcePerformanceAttributes: (entry: ResourceTimingWit
29
31
  'resource.render_blocking_status'?: string | undefined;
30
32
  'resource.delivery_type'?: string | undefined;
31
33
  "resource.protocol"?: string | undefined;
32
- "resource.cache.hit": boolean | undefined;
34
+ "resource.cache.hit": true | undefined;
33
35
  };
34
36
  export declare const createResourcePlugin: (emitResourceSpans?: boolean) => BkOTPlugin;
35
37
  export {};
@@ -1,17 +1,29 @@
1
1
  export interface ActiveSessionRecord {
2
+ endedSessions?: SessionEndSnapshot[];
2
3
  expiresAt: number;
3
4
  id: string;
5
+ lastActivityAt: number;
6
+ previous?: ExpiredSessionRecord;
7
+ schemaVersion: 2;
4
8
  startedAt: number;
5
9
  status: 'active';
6
10
  }
7
- export interface ExpiredSessionRecord {
11
+ export interface ExpiredSessionRecord extends SessionEndSnapshot {
12
+ endedSessions?: SessionEndSnapshot[];
13
+ schemaVersion: 2;
14
+ status: 'expired';
15
+ }
16
+ export interface SessionEndSnapshot {
8
17
  expiredAt: number;
9
18
  previousId: string;
10
19
  reason: SessionExpireReason;
11
- status: 'expired';
12
20
  }
13
21
  export type SessionExpireReason = 'inactivity' | 'maxLifetime';
14
22
  export type SessionRecord = ActiveSessionRecord | ExpiredSessionRecord;
23
+ export declare const MAX_SESSION_END_SNAPSHOTS = 100;
24
+ /** A known boundary must come from the committed shared state, never a stale local deadline. */
25
+ export declare const findSessionEnd: (record: null | SessionRecord, id: string) => SessionEndSnapshot | undefined;
26
+ export declare const expireSessionRecord: (record: ActiveSessionRecord, reason: SessionExpireReason) => ExpiredSessionRecord;
15
27
  export declare const createActiveSessionRecord: (id: string, now: number, idleTimeoutMs: number, maxDurationMs: number) => ActiveSessionRecord;
16
28
  export declare const getSessionExpireReason: (record: ActiveSessionRecord, now: number, maxDurationMs: number) => SessionExpireReason | undefined;
17
29
  export declare const expandActiveSession: (record: ActiveSessionRecord, now: number, idleTimeoutMs: number, maxDurationMs: number) => ActiveSessionRecord;
@@ -0,0 +1,12 @@
1
+ import type { SessionRecord } from './session-state';
2
+ /** Shared writes are serialized by the browser, never by a localStorage pseudo-lock. */
3
+ export declare const createSessionStore: (owner: Window, key: string, maxDuration: number) => {
4
+ isShared: () => boolean;
5
+ matches: (event: StorageEvent) => boolean;
6
+ read: () => SessionRecord | null;
7
+ transact<T>(operation: (record: null | SessionRecord) => {
8
+ record: null | SessionRecord;
9
+ result: T;
10
+ }): Promise<T | undefined>;
11
+ stop(): void;
12
+ };
@@ -2,6 +2,7 @@ import type { BkOTPlugin } from '../core/plugin';
2
2
  export interface BkOTSessionConfig {
3
3
  /** 以 0~1 表示的 Session 采样率,默认 1。 */
4
4
  sampleRate?: number;
5
+ /** 应用隔离 key;实际存储增加协议版本后缀,避免旧 SDK 继续续期。 */
5
6
  storageKey?: string;
6
7
  }
7
8
  export declare const createSessionPlugin: (options?: BkOTSessionConfig) => BkOTPlugin;
@@ -0,0 +1,80 @@
1
+ import { type Attributes } from '@opentelemetry/api';
2
+ export interface EventTimingEntry extends PerformanceEntry {
3
+ interactionId?: number;
4
+ processingEnd?: number;
5
+ processingStart?: number;
6
+ target?: EventTarget | null;
7
+ }
8
+ export interface InpCandidate {
9
+ duration: number;
10
+ inputDelay: number;
11
+ interactionId: number;
12
+ interactionTarget?: string;
13
+ interactionType: string;
14
+ presentationDelay: number;
15
+ processingDuration: number;
16
+ rawDuration: number;
17
+ startTime: number;
18
+ targetSelector?: string;
19
+ }
20
+ interface InpProcessingGroup {
21
+ processingEnd: number;
22
+ processingStart: number;
23
+ referenceRenderTime: number;
24
+ startTime: number;
25
+ }
26
+ export type VitalTargetResolver = (target: EventTarget | Node | null | undefined, entry: EventTimingEntry) => {
27
+ name?: string;
28
+ selector?: string;
29
+ } | undefined;
30
+ export interface LayoutShiftEntry extends PerformanceEntry {
31
+ hadRecentInput?: boolean;
32
+ sources?: Array<{
33
+ currentRect?: DOMRectReadOnly;
34
+ node?: Node;
35
+ previousRect?: DOMRectReadOnly;
36
+ }>;
37
+ value?: number;
38
+ }
39
+ export interface ViewVitalState {
40
+ cls: number;
41
+ clsAttribution?: Attributes;
42
+ clsMaxWindowValue?: number;
43
+ clsWindowEnd?: number;
44
+ clsWindowStart?: number;
45
+ clsWindowValue: number;
46
+ clsWindowLargestShift?: {
47
+ attribution: Attributes;
48
+ value: number;
49
+ };
50
+ endedAt?: number;
51
+ foreignInteractionCount?: number;
52
+ id: string;
53
+ inpCandidates: InpCandidate[];
54
+ inpGroups?: Map<number, InpProcessingGroup>;
55
+ interactionCountAtEnd?: number;
56
+ interactionCountAtStart?: number;
57
+ interactionIdMax: number;
58
+ interactionIdMin: number;
59
+ metrics: Map<string, {
60
+ id: string;
61
+ signature: string;
62
+ version: number;
63
+ }>;
64
+ nativeLateCount?: number;
65
+ /** 与 PerformanceEntry.startTime 共用相对时钟;epoch 时间仅用于事件上下文。 */
66
+ relativeEndedAt?: number;
67
+ relativeStartedAt: number;
68
+ retainedUntil?: number;
69
+ runtimeAttributes: Attributes;
70
+ startedAt: number;
71
+ }
72
+ export declare const getRating: (name: "CLS" | "INP", value: number) => "good" | "needs-improvement" | "poor";
73
+ export declare const getTarget: (target: EventTarget | Node | null | undefined) => import("../core/action-target").ActionTargetSnapshot | undefined;
74
+ export declare const countInteraction: (view: ViewVitalState, entry: EventTimingEntry) => void;
75
+ export declare const getInteractionCount: () => number | undefined;
76
+ export declare const updateViewCls: (view: ViewVitalState, entry: LayoutShiftEntry) => void;
77
+ export declare const updateViewInp: (view: ViewVitalState, entries: EventTimingEntry | readonly EventTimingEntry[], resolveTarget?: VitalTargetResolver) => void;
78
+ export declare const getViewInteractionCount: (view: ViewVitalState) => number;
79
+ export declare const getViewInp: (view: ViewVitalState) => InpCandidate | undefined;
80
+ export {};
@@ -1,61 +1,4 @@
1
- /**
2
- * Web Vitals 插件
3
- *
4
- * 基于 google/web-vitals 库(attribution 版本)采集 Core Web Vitals:
5
- * CLS / FCP / INP / LCP / TTFB
6
- *
7
- * Span 使用大写 vital.metric 命名,并带 vital.id(唯一)、vital.value 与 attribution 详情
8
- * (LCP 元素 url / CLS shift target / INP interaction target 等高基数字段),
9
- * 方便按个例排查"哪个元素拖累了 LCP"
10
- *
11
- * 数值语义:CLS 是无量纲分数,FCP/INP/LCP/TTFB 的 vital.value 单位为 ms。
12
- *
13
- * View 边界:FCP/LCP/TTFB 使用 web-vitals 的条目时间回查历史 View;CLS/INP 按 SDK View 重置,
14
- * CLS 使用 session window,INP 使用当前 View 的 p98 交互候选。
15
- *
16
- * 生命周期保护:
17
- * - disposed 标志位:shutdown 后所有回调入口 early return,避免向已销毁的 provider 上报
18
- * - dynamic import 完成后再次检查 disposed:处理"start() 完成前 shutdown()"的 race
19
- * - dynamic import 自身 try/catch:与 PluginManager 的 per-plugin 隔离形成纵深防御,
20
- * 即使加载失败也不影响整体启动
21
- */
22
- import { type Attributes } from '@opentelemetry/api';
23
1
  import type { BkOTPlugin } from '../core/plugin';
24
- interface EventTimingEntry extends PerformanceEntry {
25
- interactionId?: number;
26
- processingEnd?: number;
27
- processingStart?: number;
28
- target?: EventTarget | null;
29
- }
30
- interface InpCandidate {
31
- duration: number;
32
- inputDelay: number;
33
- interactionId: number;
34
- interactionTarget?: string;
35
- interactionType: string;
36
- presentationDelay: number;
37
- processingDuration: number;
38
- }
39
- interface LayoutShiftEntry extends PerformanceEntry {
40
- hadRecentInput?: boolean;
41
- value?: number;
42
- }
43
- interface ViewVitalState {
44
- cls: number;
45
- clsWindowEnd?: number;
46
- clsWindowStart?: number;
47
- clsWindowValue: number;
48
- id: string;
49
- inpCandidates: InpCandidate[];
50
- interactionCountAtStart?: number;
51
- interactionIdMax: number;
52
- interactionIdMin: number;
53
- runtimeAttributes: Attributes;
54
- startedAt: number;
55
- }
56
- export declare const isSameViewId: (currentViewId: string | undefined, nextViewId: string | undefined) => boolean;
57
- export declare const updateViewCls: (view: ViewVitalState, entry: LayoutShiftEntry) => void;
58
- export declare const updateViewInp: (view: ViewVitalState, entry: EventTimingEntry) => void;
59
- export declare const getViewInp: (view: ViewVitalState) => InpCandidate | undefined;
2
+ export { getViewInp, updateViewCls, updateViewInp } from './web-vitals-metrics';
3
+ export declare const isSameViewId: (current: string | undefined, next: string | undefined) => boolean;
60
4
  export declare const createWebVitalsPlugin: () => BkOTPlugin;
61
- export {};
@@ -6,9 +6,19 @@
6
6
  export declare const RUM_ATTRIBUTES: {
7
7
  readonly actionFrustrationType: "action.frustration.type";
8
8
  readonly actionId: "action.id";
9
+ readonly actionIds: "action.ids";
10
+ readonly actionEndReason: "action.end_reason";
11
+ readonly actionLoadingTime: "action.loading_time";
9
12
  readonly actionName: "action.name";
13
+ readonly actionNameSource: "action.name_source";
14
+ readonly actionPositionX: "action.position.x";
15
+ readonly actionPositionY: "action.position.y";
16
+ readonly actionTargetHeight: "action.target.height";
10
17
  readonly actionTargetName: "action.target.name";
18
+ readonly actionTargetPath: "action.target.path";
19
+ readonly actionTargetSelector: "action.target.selector";
11
20
  readonly actionTargetTag: "action.target.tag";
21
+ readonly actionTargetWidth: "action.target.width";
12
22
  readonly actionType: "action.type";
13
23
  readonly deploymentEnvironmentName: "deployment.environment.name";
14
24
  readonly cacheHit: "resource.cache.hit";
@@ -19,6 +29,7 @@ export declare const RUM_ATTRIBUTES: {
19
29
  readonly networkEffectiveType: "network.effective_type";
20
30
  readonly networkStatus: "network.status";
21
31
  readonly nextHopProtocol: "resource.protocol";
32
+ readonly resourceInitiatorType: "resource.initiator_type";
22
33
  readonly outcomeType: "outcome.type";
23
34
  readonly resourceTimingConnectEnd: "resource.timing.connect_end";
24
35
  readonly resourceTimingConnectStart: "resource.timing.connect_start";
@@ -42,31 +53,65 @@ export declare const RUM_ATTRIBUTES: {
42
53
  readonly serviceVersion: "service.version";
43
54
  readonly sessionHasReplay: "session.has_replay";
44
55
  readonly sessionId: "session.id";
56
+ readonly sessionStartTime: "session.start_time";
57
+ readonly sessionLastActivityTime: "session.last_activity_time";
45
58
  readonly sessionSampleRate: "session.sample_rate";
46
59
  readonly sessionPhase: "session.phase";
47
60
  readonly sessionType: "session.type";
48
61
  readonly spanType: "span_type";
62
+ readonly tabId: "tab.id";
63
+ readonly timingActivationStart: "timing.activation_start";
64
+ readonly timingConnectEnd: "timing.connect_end";
65
+ readonly timingConnectStart: "timing.connect_start";
66
+ readonly timingDomContentLoadedEventEnd: "timing.dom_content_loaded_event_end";
67
+ readonly timingDomContentLoadedEventStart: "timing.dom_content_loaded_event_start";
68
+ readonly timingDomainLookupEnd: "timing.domain_lookup_end";
69
+ readonly timingDomainLookupStart: "timing.domain_lookup_start";
70
+ readonly timingFetchStart: "timing.fetch_start";
71
+ readonly timingFinalResponseHeadersStart: "timing.final_response_headers_start";
72
+ readonly timingLoadEventEnd: "timing.load_event_end";
73
+ readonly timingLoadEventStart: "timing.load_event_start";
74
+ readonly timingRedirectEnd: "timing.redirect_end";
75
+ readonly timingRedirectStart: "timing.redirect_start";
76
+ readonly timingRequestStart: "timing.request_start";
77
+ readonly timingResponseEnd: "timing.response_end";
78
+ readonly timingResponseStart: "timing.response_start";
79
+ readonly timingSecureConnectionStart: "timing.secure_connection_start";
80
+ readonly timingStartTime: "timing.start_time";
81
+ readonly timingUnloadEventEnd: "timing.unload_event_end";
82
+ readonly timingUnloadEventStart: "timing.unload_event_start";
83
+ readonly timingWorkerCacheLookupStart: "timing.worker_cache_lookup_start";
84
+ readonly timingWorkerRouterEvaluationStart: "timing.worker_router_evaluation_start";
85
+ readonly timingWorkerStart: "timing.worker_start";
49
86
  readonly userId: "user.id";
50
87
  readonly userAgentName: "user_agent.name";
51
88
  readonly userAgentOsName: "user_agent.os.name";
52
89
  readonly userAgentVersion: "user_agent.version";
53
90
  readonly vitalMetric: "vital.metric";
91
+ readonly vitalId: "vital.id";
92
+ readonly vitalScope: "vital.scope";
54
93
  readonly vitalValue: "vital.value";
94
+ readonly vitalVersion: "vital.version";
55
95
  readonly viewDomComplete: "view.dom_complete";
56
96
  readonly viewDomContentLoaded: "view.dom_content_loaded";
57
97
  readonly viewDomInteractive: "view.dom_interactive";
58
98
  readonly viewFirstByte: "view.first_byte";
99
+ readonly viewEndReason: "view.end_reason";
100
+ readonly viewForegroundTime: "view.foreground_time";
59
101
  readonly viewId: "view.id";
102
+ readonly viewIsActive: "view.is_active";
60
103
  readonly viewLoadEvent: "view.load_event";
61
104
  readonly viewLoadingTime: "view.loading_time";
62
105
  readonly viewLoadingTimeSource: "view.loading_time_source";
63
106
  readonly viewLoadingType: "view.loading_type";
64
107
  readonly viewName: "view.name";
65
108
  readonly viewPhase: "view.phase";
109
+ readonly viewPageStates: "view.page_states";
66
110
  readonly viewPrevious: "view.previous";
67
111
  readonly viewPreviousUrlTemplate: "view.previous_url_template";
68
112
  readonly viewReferrer: "view.referrer";
69
113
  readonly viewStartedAt: "view.started_at";
114
+ readonly viewTimeSpent: "view.time_spent";
70
115
  readonly viewUrl: "view.url";
71
116
  readonly viewUrlTemplate: "view.url_template";
72
117
  readonly viewVersion: "view.version";
@@ -4,6 +4,7 @@ export declare const RUM_SPAN_OUTCOME: {
4
4
  readonly error: "error";
5
5
  readonly success: "success";
6
6
  readonly timeout: "timeout";
7
+ readonly unknown: "unknown";
7
8
  readonly warning: "warning";
8
9
  };
9
10
  export declare const RUM_SPAN_TYPE: {
@@ -39,13 +40,13 @@ export interface RumSpanClassification {
39
40
  outcome?: RumSpanOutcome;
40
41
  spanType: RumSpanType;
41
42
  }
43
+ export type RumSpanOutcome = (typeof RUM_SPAN_OUTCOME)[keyof typeof RUM_SPAN_OUTCOME];
44
+ export type RumSpanType = (typeof RUM_SPAN_TYPE)[keyof typeof RUM_SPAN_TYPE];
42
45
  interface RumSpanNameInput {
43
46
  attributes: Attributes;
44
47
  nameHint?: string;
45
48
  spanType: RumSpanType;
46
49
  }
47
- export type RumSpanOutcome = (typeof RUM_SPAN_OUTCOME)[keyof typeof RUM_SPAN_OUTCOME];
48
- export type RumSpanType = (typeof RUM_SPAN_TYPE)[keyof typeof RUM_SPAN_TYPE];
49
50
  /**
50
51
  * 使用稳定的领域字段生成可读 Span 名称。唯一 ID、完整 URL、错误消息和数值不参与命名,避免抬高基数。
51
52
  */
@@ -55,6 +56,8 @@ export interface RumUrlTarget {
55
56
  serverPort?: number;
56
57
  }
57
58
  export declare const getHttpOutcome: (statusCode: number | undefined) => RumSpanOutcome;
59
+ /** 请求来源与资源内容分类分开;CSS 也能发起图片/字体,不能将 initiator 当作内容类型。 */
60
+ export declare const getResourceType: (initiatorType: string, url: string) => "other" | "xhr" | "fetch" | "beacon" | "document" | "css" | "js" | "image" | "font" | "media";
58
61
  export declare const getVitalOutcome: (rating: string | undefined) => RumSpanOutcome;
59
62
  export declare const getUrlTarget: (url: string | undefined) => RumUrlTarget;
60
63
  export declare const buildRumSpanAttributes: ({ outcome, spanType, }: RumSpanClassification) => Attributes;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueking/open-telemetry",
3
- "version": "0.0.34",
3
+ "version": "0.0.35-beta.1",
4
4
  "description": "OpenTelemetry browser SDK for BK RUM",
5
5
  "author": "TencentCloud Real User Monitoring",
6
6
  "main": "dist/index.js",
@@ -23,7 +23,13 @@
23
23
  "docs:preview": "vitepress preview wikis",
24
24
  "dev": "vite dev",
25
25
  "dts": "vue-tsc --project tsconfig.dts.json",
26
- "test:rum-context": "node --experimental-default-type=module --experimental-strip-types --test tests/action-plugin.test.mjs tests/consent.test.mjs tests/experience-plugins.test.mjs tests/request-model.test.mjs tests/runtime-context.test.mjs tests/sampling.test.mjs tests/session-state.test.ts tests/session-plugin.test.mjs tests/session-page-view.test.mjs tests/session-processors.test.mjs tests/trace-context.test.mjs tests/web-vitals.test.mjs"
26
+ "test:rum-context": "node --experimental-strip-types --test tests/action-plugin.test.mjs tests/action-lifecycle.test.mjs tests/action-transition.test.mjs tests/consent.test.mjs tests/event-time.test.mjs tests/experience-plugins.test.mjs tests/init-cancellation.test.mjs tests/late-performance.test.mjs tests/request-model.test.mjs tests/request-lifecycle-regressions.test.mjs tests/request-export-lifecycle.test.mjs tests/resource-context.test.mjs tests/resource-lifecycle.test.mjs tests/request-timing.test.mjs tests/request-capacity.test.mjs tests/resource-fields.test.mjs tests/resource-url.test.mjs tests/runtime-context.test.mjs tests/sampling.test.mjs tests/session-state.test.ts tests/session-plugin.test.mjs tests/session-page-view.test.mjs tests/session-processors.test.mjs tests/session-sdk.test.mjs tests/session-view-metadata.test.mjs tests/trace-context.test.mjs tests/web-vitals.test.mjs tests/web-vitals-metrics.test.mjs tests/web-vitals-context.test.mjs tests/document-vitals.test.mjs tests/view-routing.test.mjs tests/view-lifecycle.test.mjs tests/view-vitals-lifecycle.test.mjs tests/blank-screen-detection.test.mjs tests/blank-screen-lifecycle.test.mjs tests/vue-router-views.test.mjs tests/manual-view-sdk.test.mjs",
27
+ "test:action-browser": "node node_modules/vite/bin/vite.js build --mode cdn && node --test tests/action-target.test.mjs && node scripts/verify-action-browser.mjs",
28
+ "test:request-browser": "node node_modules/vite/bin/vite.js build --mode cdn && node scripts/verify-request-browser.mjs",
29
+ "test:resource-browser": "node node_modules/vite/bin/vite.js build --mode cdn && node scripts/verify-resource-browser.mjs",
30
+ "test:vitals-browser": "node node_modules/vite/bin/vite.js build --mode cdn && node scripts/verify-vitals-browser.mjs",
31
+ "test:view-browser": "node node_modules/vite/bin/vite.js build --mode cdn && node scripts/verify-view-browser.mjs",
32
+ "test:session-browser": "node node_modules/vite/bin/vite.js build --mode cdn && node scripts/verify-session-browser.mjs"
27
33
  },
28
34
  "dependencies": {
29
35
  "@opentelemetry/api": "^1.9.1",
@@ -34,8 +40,7 @@
34
40
  "@opentelemetry/resources": "^2.7.1",
35
41
  "@opentelemetry/sdk-trace-base": "^2.7.1",
36
42
  "@opentelemetry/sdk-trace-web": "^2.7.1",
37
- "@opentelemetry/semantic-conventions": "^1.38.0",
38
- "web-vitals": "^5.0.3"
43
+ "@opentelemetry/semantic-conventions": "^1.38.0"
39
44
  },
40
45
  "devDependencies": {
41
46
  "@vitejs/plugin-vue": "^6.0.6",