@blueking/open-telemetry 0.0.5 → 0.0.7

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.
@@ -1,6 +1,18 @@
1
1
  import type { BkOTPlugin } from './plugin';
2
+ import type { BkOTUserContext } from './runtime-context';
2
3
  import type { Attributes } from '@opentelemetry/api';
3
4
  import type { Instrumentation } from '@opentelemetry/instrumentation';
5
+ export interface BkOTActionEventPayload {
6
+ attributes?: Attributes;
7
+ targetTag?: string;
8
+ targetText?: string;
9
+ type: 'click' | 'custom' | 'input' | 'keydown' | 'pointerdown' | 'scroll' | 'submit' | string;
10
+ }
11
+ export interface BkOTAppConfig {
12
+ environment?: string;
13
+ name?: string;
14
+ version?: string;
15
+ }
4
16
  export interface BkOTAttributesConfig {
5
17
  custom?: () => Attributes;
6
18
  error?: () => Attributes;
@@ -14,26 +26,6 @@ export interface BkOTBatchConfig {
14
26
  maxQueueSize?: number;
15
27
  scheduledDelayMillis?: number;
16
28
  }
17
- export interface BkOTConfig {
18
- attributes?: BkOTAttributesConfig;
19
- autoStart?: boolean;
20
- debug?: boolean;
21
- enabled?: boolean;
22
- endpoint?: string;
23
- environment?: string;
24
- headers?: Record<string, string>;
25
- instrumentations?: Instrumentation[];
26
- logs?: SignalExporterInputConfig;
27
- metrics?: SignalExporterInputConfig;
28
- plugins?: BkOTPlugin[];
29
- redact?: BkOTRedactConfig;
30
- rum?: BkOTRumConfig;
31
- sampleRate?: number;
32
- signalEndpoints?: SignalEndpointsConfig;
33
- spanBatch?: BkOTBatchConfig;
34
- token?: string;
35
- traces?: SignalExporterInputConfig;
36
- }
37
29
  export interface BkOTCustomEventPayload {
38
30
  attributes?: Attributes;
39
31
  error?: Error;
@@ -60,20 +52,52 @@ export interface BkOTInstrumentationsConfig {
60
52
  };
61
53
  xhr?: boolean;
62
54
  }
63
- export interface BkOTRedactConfig {
64
- attributes?: (attributes: Attributes) => Attributes;
65
- url?: (url: string) => string;
55
+ export interface BkOTOptions {
56
+ app?: BkOTAppConfig;
57
+ attributes?: BkOTAttributesConfig;
58
+ autoStart?: boolean;
59
+ debug?: boolean;
60
+ enabled?: boolean;
61
+ instrumentations?: Instrumentation[];
62
+ plugins?: BkOTPlugin[];
63
+ privacy?: BkOTPrivacyConfig;
64
+ route?: BkOTRouteConfig;
65
+ rum?: BkOTRumOptions;
66
+ sampling?: BkOTSamplingConfig;
67
+ spanBatch?: BkOTBatchConfig;
68
+ spanProcessor?: BkOTSpanProcessorMode;
69
+ transport?: BkOTTransportConfig;
70
+ user?: BkOTUserContext;
71
+ }
72
+ export interface BkOTPrivacyConfig {
73
+ redactAttributes?: (attributes: Attributes) => Attributes;
74
+ redactUrl?: (url: string) => string;
75
+ }
76
+ export interface BkOTRouteConfig {
77
+ /**
78
+ * 返回低基数路由分组,例如 `/trace/:id`。
79
+ * SDK 默认退化为 URL pathname;复杂业务路由建议接入方显式提供模板。
80
+ */
81
+ getPathGroup?: (url: string) => string | undefined;
66
82
  }
67
- export interface BkOTRumConfig extends BkOTInstrumentationsConfig {
83
+ export interface BkOTRumOptions {
84
+ instrumentations?: BkOTInstrumentationsConfig;
85
+ plugins?: BkOTRumPluginOptions;
86
+ }
87
+ export interface BkOTRumPluginOptions {
68
88
  cspViolation?: boolean;
69
89
  device?: boolean | {
70
90
  storageKey?: string;
71
91
  };
72
92
  httpBody?: BkOTHttpBodyConfig | boolean;
73
93
  pageView?: boolean;
94
+ resource?: boolean;
74
95
  routeTiming?: boolean;
75
96
  websocket?: boolean;
76
97
  webVitals?: boolean;
98
+ action?: boolean | {
99
+ eventNames?: Array<'click' | 'input' | 'keydown' | 'pointerdown' | 'scroll' | 'submit'>;
100
+ };
77
101
  blankScreen?: {
78
102
  checkDelay?: number;
79
103
  ignoreSelectors?: string[];
@@ -89,35 +113,103 @@ export interface BkOTRumConfig extends BkOTInstrumentationsConfig {
89
113
  } | boolean;
90
114
  session?: {
91
115
  inactivityMs?: number;
116
+ maxLifetimeMs?: number;
92
117
  storageKey?: string;
93
118
  } | boolean;
94
119
  }
95
- export interface NormalizedBkOTConfig extends Omit<BkOTConfig, 'attributes' | 'autoStart' | 'debug' | 'enabled' | 'endpoint' | 'environment' | 'instrumentations' | 'logs' | 'metrics' | 'plugins' | 'redact' | 'signalEndpoints' | 'token' | 'traces'> {
120
+ export interface BkOTSamplingConfig {
121
+ rate?: number;
122
+ }
123
+ export type BkOTSpanProcessorMode = 'batch' | 'simple';
124
+ export interface BkOTTransportConfig {
125
+ endpoint?: string;
126
+ headers?: Record<string, string>;
127
+ signals?: SignalExportersInputConfig;
128
+ token?: string;
129
+ }
130
+ export interface ResolvedAppConfig {
131
+ environment: string;
132
+ name: string;
133
+ version?: string;
134
+ }
135
+ export interface ResolvedBkOTConfig {
136
+ app: ResolvedAppConfig;
96
137
  autoStart: boolean;
97
138
  debug: boolean;
98
139
  enabled: boolean;
99
- endpoint: string;
100
- environment: string;
140
+ hooks: ResolvedConfigHooks;
101
141
  instrumentations: Instrumentation[];
102
- logs: SignalExporterConfig;
103
142
  metricIntervalMillis: number;
104
- metrics: SignalExporterConfig;
105
143
  plugins: BkOTPlugin[];
106
144
  resourceAttributes: Attributes;
107
- sampleRate: number;
108
- traces: SignalExporterConfig;
145
+ rum: ResolvedRumConfig;
146
+ sampling: ResolvedSamplingConfig;
147
+ spanBatch?: BkOTBatchConfig;
148
+ spanProcessor: BkOTSpanProcessorMode;
149
+ transport: ResolvedTransportConfig;
150
+ user?: BkOTUserContext;
151
+ }
152
+ export interface ResolvedConfigHooks {
109
153
  getCustomAttributes: () => Attributes;
110
154
  getErrorAttributes: () => Attributes;
111
155
  getMetricAttributes: () => Attributes;
112
156
  getPageAttributes: () => Attributes;
157
+ getViewPathGroup: (url: string) => string;
113
158
  redactAttributes: (attributes: Attributes) => Attributes;
114
159
  redactUrl: (url: string) => string;
115
- commonInstrumentations: Required<Pick<BkOTInstrumentationsConfig, 'documentLoad' | 'fetch' | 'xhr'>> & {
160
+ }
161
+ export type ResolvedPluginOption<TConfig extends object = object> = (TConfig & {
162
+ enabled: true;
163
+ }) | {
164
+ enabled: false;
165
+ };
166
+ export interface ResolvedRumConfig {
167
+ plugins: ResolvedRumPluginConfig;
168
+ instrumentations: Required<Pick<BkOTInstrumentationsConfig, 'documentLoad' | 'fetch' | 'xhr'>> & {
116
169
  userInteraction: BkOTInstrumentationsConfig['userInteraction'];
117
170
  };
118
- rum: Omit<Required<BkOTRumConfig>, 'documentLoad' | 'fetch' | 'httpBody' | 'userInteraction' | 'xhr'> & {
119
- httpBody: false | Required<BkOTHttpBodyConfig>;
120
- };
171
+ }
172
+ export interface ResolvedRumPluginConfig {
173
+ cspViolation: ResolvedPluginOption;
174
+ device: ResolvedPluginOption<{
175
+ storageKey?: string;
176
+ }>;
177
+ error: ResolvedPluginOption<{
178
+ maxPerWindow: number;
179
+ windowMs: number;
180
+ }>;
181
+ httpBody: ResolvedPluginOption<Required<BkOTHttpBodyConfig>>;
182
+ longTask: ResolvedPluginOption<{
183
+ threshold: number;
184
+ }>;
185
+ pageView: ResolvedPluginOption;
186
+ resource: ResolvedPluginOption;
187
+ routeTiming: ResolvedPluginOption;
188
+ websocket: ResolvedPluginOption;
189
+ webVitals: ResolvedPluginOption;
190
+ action: ResolvedPluginOption<{
191
+ eventNames: Array<'click' | 'input' | 'keydown' | 'pointerdown' | 'scroll' | 'submit'>;
192
+ }>;
193
+ blankScreen: ResolvedPluginOption<{
194
+ checkDelay: number;
195
+ ignoreSelectors?: string[];
196
+ rootSelector?: string;
197
+ threshold: number;
198
+ }>;
199
+ session: ResolvedPluginOption<{
200
+ inactivityMs: number;
201
+ maxLifetimeMs: number;
202
+ storageKey?: string;
203
+ }>;
204
+ }
205
+ export interface ResolvedSamplingConfig {
206
+ rate: number;
207
+ }
208
+ export interface ResolvedTransportConfig {
209
+ endpoint: string;
210
+ logs: SignalExporterConfig;
211
+ metrics: SignalExporterConfig;
212
+ traces: SignalExporterConfig;
121
213
  }
122
214
  export interface SignalEndpointsConfig {
123
215
  logs?: string;
@@ -131,4 +223,10 @@ export interface SignalExporterConfig {
131
223
  timeoutMillis?: number;
132
224
  }
133
225
  export type SignalExporterInputConfig = Partial<SignalExporterConfig>;
134
- export declare const normalizeConfig: (config: BkOTConfig) => NormalizedBkOTConfig;
226
+ export interface SignalExportersInputConfig {
227
+ endpoints?: SignalEndpointsConfig;
228
+ logs?: SignalExporterInputConfig;
229
+ metrics?: SignalExporterInputConfig;
230
+ traces?: SignalExporterInputConfig;
231
+ }
232
+ export declare const resolveConfig: (config: BkOTOptions) => ResolvedBkOTConfig;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * 生成随机 ID。优先用 `crypto.randomUUID`(standards-compliant UUID v4),不可用时回退到
3
+ * `${prefix}-${timestamp}-${rand}` 形式。
4
+ *
5
+ * 注意:fallback 实现使用 Math.random,**不是密码学安全**,仅适用于设备/会话/事件标识等场景,
6
+ * 不要复用此函数生成 token、CSRF 防护等安全相关的值。
7
+ */
8
+ export declare const createRandomId: (prefix: string) => string;
@@ -1,15 +1,16 @@
1
- import type { NormalizedBkOTConfig } from './config';
2
- import type { Attributes, Meter, Span, Tracer } from '@opentelemetry/api';
1
+ import type { ResolvedBkOTConfig } from './config';
2
+ import type { BkOTUserContext, BkOTViewContext } from './runtime-context';
3
+ import type { Attributes, Meter, Span, TimeInput, Tracer } from '@opentelemetry/api';
3
4
  import type { Logger, LogRecord } from '@opentelemetry/api-logs';
4
5
  export interface BkOTPlugin {
5
- enabled?: ((config: NormalizedBkOTConfig) => boolean) | boolean;
6
+ enabled?: ((config: ResolvedBkOTConfig) => boolean) | boolean;
6
7
  name: string;
7
8
  flush?: () => Promise<void> | void;
8
9
  init: (context: BkOTRuntimeContext) => Promise<void> | void;
9
10
  shutdown?: () => Promise<void> | void;
10
11
  }
11
12
  export interface BkOTRuntimeContext {
12
- config: NormalizedBkOTConfig;
13
+ config: ResolvedBkOTConfig;
13
14
  logger: Logger;
14
15
  meter: Meter;
15
16
  tracer: Tracer;
@@ -19,9 +20,26 @@ export interface BkOTRuntimeContext {
19
20
  emitLog: (record: LogRecord) => void;
20
21
  getRuntimeAttributes: () => Attributes;
21
22
  setRuntimeAttributes: (attributes: Attributes) => void;
22
- startSpan: (name: string, attributes?: Attributes) => Span;
23
+ /** 更新用户上下文;user.id 由接入方传入,SDK 原样透传 */
24
+ setUser: (user: BkOTUserContext) => void;
25
+ /** 更新当前 View 上下文,后续 span/log 会自动带上 view.* 关联字段 */
26
+ setView: (view: BkOTViewContext) => void;
27
+ startSpan: (name: string, attributes?: Attributes, options?: BkOTStartSpanOptions) => Span;
23
28
  }
24
- export declare const isPluginEnabled: (plugin: BkOTPlugin, config: NormalizedBkOTConfig) => boolean;
29
+ /**
30
+ * startSpan 的扩展选项。
31
+ *
32
+ * 用于"事件实际发生在过去某个时刻,但 span 现在才创建"的场景:
33
+ * 例如 route-timing 在 raf+setTimeout 链路结束后才上报,但希望 span 的时间窗
34
+ * 反映真实的"路由切换瞬间到渲染完成"区间,方便 trace 视图与并发请求对齐。
35
+ *
36
+ * startTime 接受 OT TimeInput;常用 epoch 毫秒(performance.timeOrigin + performance.now())。
37
+ * 配合 span.end(endTime?) 可控制结束时间。
38
+ */
39
+ export interface BkOTStartSpanOptions {
40
+ startTime?: TimeInput;
41
+ }
42
+ export declare const isPluginEnabled: (plugin: BkOTPlugin, config: ResolvedBkOTConfig) => boolean;
25
43
  export declare const createPlugin: (plugin: BkOTPlugin) => BkOTPlugin;
26
44
  export declare class PluginManager {
27
45
  private readonly plugins;
@@ -1,4 +1,4 @@
1
- import type { NormalizedBkOTConfig } from './config';
1
+ import type { ResolvedBkOTConfig } from './config';
2
2
  import type { Context } from '@opentelemetry/api';
3
3
  import type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-base';
4
4
  /**
@@ -8,7 +8,7 @@ import type { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace
8
8
  export declare class FilteringSpanProcessor implements SpanProcessor {
9
9
  private readonly inner;
10
10
  private readonly config;
11
- constructor(inner: SpanProcessor, config: NormalizedBkOTConfig);
11
+ constructor(inner: SpanProcessor, config: ResolvedBkOTConfig);
12
12
  forceFlush(): Promise<void>;
13
13
  onEnd(span: ReadableSpan): void;
14
14
  onStart(span: Span, parentContext: Context): void;
@@ -0,0 +1,30 @@
1
+ import type { Attributes } from '@opentelemetry/api';
2
+ export interface BkOTUserContext {
3
+ /** 由接入方传入并由 SDK 原样透传;SDK 不 hash、不脱敏、不改写。 */
4
+ id?: string;
5
+ }
6
+ export interface BkOTViewContext {
7
+ id?: string;
8
+ loadingType?: 'initial_load' | 'route_change';
9
+ url?: string;
10
+ urlPathGroup?: string;
11
+ }
12
+ /**
13
+ * 管理 SDK 运行期公共属性快照。
14
+ *
15
+ * 这里仅保存“后续事件都需要带上”的低成本上下文,Session/View/用户切换时更新快照,
16
+ * 插件发 span/log 时读取当前快照即可,避免每个插件重复维护公共字段。
17
+ */
18
+ export declare class RumRuntimeContext {
19
+ private readonly attributes;
20
+ private readonly setOptionalAttribute;
21
+ private user;
22
+ private view;
23
+ getAttributes: () => Attributes;
24
+ getUser: () => BkOTUserContext;
25
+ getView: () => BkOTViewContext;
26
+ setAttributes: (attributes: Attributes) => void;
27
+ setUser: (user: BkOTUserContext) => void;
28
+ setView: (view: BkOTViewContext) => void;
29
+ constructor(initialAttributes?: Attributes, user?: BkOTUserContext);
30
+ }
@@ -1,2 +1,2 @@
1
- import type { NormalizedBkOTConfig } from './config';
2
- export declare const isBkOTSampled: ({ sampleRate }: Pick<NormalizedBkOTConfig, "sampleRate">) => boolean;
1
+ import type { ResolvedBkOTConfig } from './config';
2
+ export declare const isBkOTSampled: ({ sampling }: Pick<ResolvedBkOTConfig, "sampling">) => boolean;
@@ -1,11 +1,15 @@
1
1
  import { type Attributes, type Span } from '@opentelemetry/api';
2
2
  import { type Instrumentation } from '@opentelemetry/instrumentation';
3
- import { type BkOTConfig, type BkOTCustomEventPayload, type NormalizedBkOTConfig } from './config';
4
- import { type BkOTPlugin, type BkOTRuntimeContext } from './plugin';
3
+ import { type BkOTActionEventPayload, type BkOTCustomEventPayload, type BkOTOptions, type ResolvedBkOTConfig } from './config';
4
+ import { type BkOTPlugin, type BkOTRuntimeContext, type BkOTStartSpanOptions } from './plugin';
5
+ import { type BkOTUserContext, type BkOTViewContext } from './runtime-context';
5
6
  import type { LogRecord } from '@opentelemetry/api-logs';
6
7
  export interface BkOTInstance extends BkOTRuntimeContext {
7
8
  flush: () => Promise<void>;
9
+ reportAction: (payload: BkOTActionEventPayload) => void;
8
10
  reportCustomEvent: (payload: BkOTCustomEventPayload) => void;
11
+ setUser: (user: BkOTUserContext) => void;
12
+ setView: (view: BkOTViewContext) => void;
9
13
  shutdown: () => Promise<void>;
10
14
  start: () => Promise<void>;
11
15
  use: (plugin: BkOTPlugin) => BkOTInstance;
@@ -18,27 +22,28 @@ export declare class BkOpenTelemetry implements BkOTInstance {
18
22
  private readonly pluginManager;
19
23
  private readonly plugins;
20
24
  private readonly registeredInstrumentations;
21
- private readonly runtimeAttributes;
25
+ private readonly runtimeContext;
22
26
  private readonly sampled;
23
27
  private readonly teardownCallbacks;
24
28
  private readonly tracerProvider;
25
29
  private assertBeforeStart;
26
30
  readonly applyRedact: (attributes: Attributes) => Attributes;
27
- readonly config: NormalizedBkOTConfig;
31
+ readonly config: ResolvedBkOTConfig;
28
32
  readonly emitLog: (record: LogRecord) => void;
29
33
  readonly flush: () => Promise<void>;
30
- readonly getRuntimeAttributes: () => {
31
- [attributeKey: string]: import("@opentelemetry/api").AttributeValue | undefined;
32
- };
34
+ readonly getRuntimeAttributes: () => Attributes;
33
35
  readonly logger: BkOTRuntimeContext['logger'];
34
36
  readonly meter: BkOTRuntimeContext['meter'];
37
+ readonly reportAction: ({ attributes, targetTag, targetText, type }: BkOTActionEventPayload) => void;
35
38
  readonly reportCustomEvent: ({ attributes, error, name }: BkOTCustomEventPayload) => void;
36
39
  readonly setRuntimeAttributes: (attributes: Attributes) => void;
40
+ readonly setUser: (user: BkOTUserContext) => void;
41
+ readonly setView: (view: BkOTViewContext) => void;
37
42
  readonly shutdown: () => Promise<void>;
38
43
  readonly start: () => Promise<void>;
39
- readonly startSpan: (name: string, attributes?: Attributes) => Span;
44
+ readonly startSpan: (name: string, attributes?: Attributes, options?: BkOTStartSpanOptions) => Span;
40
45
  readonly tracer: BkOTRuntimeContext['tracer'];
41
46
  readonly use: (plugin: BkOTPlugin) => this;
42
47
  readonly useInstrumentation: (instrumentation: Instrumentation) => this;
43
- constructor(inputConfig: BkOTConfig);
48
+ constructor(inputConfig: BkOTOptions);
44
49
  }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 简易 djb2 字符串 hash。结果稳定、短(base36),足以区分常见 fingerprint 字符串组合。
3
+ * 不是密码学安全 hash,仅用于事件聚合分组场景。
4
+ */
5
+ export declare const hashString: (input: string) => string;
6
+ export interface ThrottleResult {
7
+ /** 是否允许本次上报 */
8
+ allowed: boolean;
9
+ /** 当前窗口内同 fingerprint 的总触发次数(含本次,含被丢弃次数),便于下游感知是否被节流 */
10
+ count: number;
11
+ }
12
+ /**
13
+ * 时间窗节流:同一 key 在 windowMs 窗口内最多允许 maxPerWindow 次通过;
14
+ * 超出则被拦截,但 `count` 仍累加,便于下游感知风暴规模。
15
+ *
16
+ * 长会话场景下避免 records 无限累积——按窗口长度节奏轻量清理一次过期 entry。
17
+ */
18
+ export declare const createThrottle: (windowMs: number, maxPerWindow: number) => {
19
+ allow(key: string): ThrottleResult;
20
+ };
@@ -1,4 +1,4 @@
1
- import type { NormalizedBkOTConfig } from './config';
2
- export declare const isBkOTEndpoint: (config: NormalizedBkOTConfig, url: string) => boolean;
3
- export declare const shouldIgnoreUrl: (config: NormalizedBkOTConfig, url: string) => boolean;
4
- export declare const shouldPropagateTraceHeader: (_config: NormalizedBkOTConfig, url: string) => boolean;
1
+ import type { ResolvedBkOTConfig } from './config';
2
+ export declare const isBkOTEndpoint: (config: ResolvedBkOTConfig, url: string) => boolean;
3
+ export declare const shouldIgnoreUrl: (config: ResolvedBkOTConfig, url: string) => boolean;
4
+ export declare const shouldPropagateTraceHeader: (_config: ResolvedBkOTConfig, url: string) => boolean;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- export { type BkOTAttributesConfig, type BkOTAttributeValue, type BkOTBatchConfig, type BkOTConfig, type BkOTCustomEventPayload, type BkOTHttpBodyConfig, type BkOTHttpBodyRedactPayload, type BkOTRedactConfig, type BkOTRumConfig, normalizeConfig, type NormalizedBkOTConfig, type SignalExporterConfig, } from './core/config';
1
+ export { type BkOTActionEventPayload, type BkOTAppConfig, type BkOTAttributesConfig, type BkOTAttributeValue, type BkOTBatchConfig, type BkOTCustomEventPayload, type BkOTHttpBodyConfig, type BkOTHttpBodyRedactPayload, type BkOTInstrumentationsConfig, type BkOTOptions, type BkOTPrivacyConfig, type BkOTRumOptions, type BkOTRumPluginOptions, type BkOTSamplingConfig, type BkOTTransportConfig, resolveConfig, type ResolvedBkOTConfig, type ResolvedConfigHooks, type ResolvedPluginOption, type ResolvedRumConfig, type ResolvedRumPluginConfig, type ResolvedTransportConfig, type SignalExporterConfig, type SignalExportersInputConfig, } from './core/config';
2
2
  export { type BkOTPlugin, type BkOTRuntimeContext, createPlugin, type PluginManager } from './core/plugin';
3
3
  export { FilteringSpanProcessor } from './core/processor';
4
+ export { type BkOTUserContext, type BkOTViewContext, RumRuntimeContext } from './core/runtime-context';
4
5
  export { BkOpenTelemetry, type BkOTInstance } from './core/sdk';
6
+ export { RUM_ATTRIBUTES, type RumAttributeKey } from './schema/attributes';
7
+ export { buildRumSpanAttributes, getDurationBucket, RUM_SPAN_RESULT, RUM_SPAN_TYPE, type RumSpanClassification, type RumSpanResult, type RumSpanType, } from './schema/span';
8
+ export { createActionPlugin } from './plugins/action';
5
9
  export { createBlankScreenPlugin } from './plugins/blank-screen';
6
10
  export { createCommonInstrumentationsPlugin } from './plugins/common';
7
11
  export { createCspViolationPlugin } from './plugins/csp-violation';
@@ -10,6 +14,7 @@ export { createErrorPlugin } from './plugins/error';
10
14
  export { createHttpBodyPlugin } from './plugins/http-body';
11
15
  export { createLongTaskPlugin } from './plugins/long-task';
12
16
  export { createPageViewPlugin } from './plugins/page-view';
17
+ export { createResourcePlugin } from './plugins/resource';
13
18
  export { createRouteTimingPlugin } from './plugins/route-timing';
14
19
  export { createSessionPlugin } from './plugins/session';
15
20
  export { createWebVitalsPlugin } from './plugins/web-vitals';