UNPKG

@embrace-io/web-sdk

Version:
1 lines 24.4 kB
{"version":3,"file":"initSDK.cjs","names":["DiagLogLevel","diag","registry","DiagConsoleLogger","OTelPerformanceManager","updateZeroTimeMillis","validateAppID","validateAppVersion","NamespacedStorage","getWebSDKOverridableResource","getWebSDKResource","EmbraceDynamicConfigManager","EmbraceSDKFeaturesManager","nsfConfigValidation","EmbraceLimitManager","DEFAULT_LIMITS","getDefaultAttributeScrubbers","EmbraceSessionPartBatchedSpanProcessor","EmbraceTraceExporter","BatchLogRecordProcessor","EmbraceLogExporter","SignalBuffer","EmbraceW3CTraceContextPropagator","setupDefaultInstrumentations","EmbraceUserManager","EmbraceUserSessionManager","BrowserSpanProcessor","EmbraceNetworkSpanProcessor","UserSpanProcessor","PageSpanProcessor","SpanScrubProcessor","SignalCorrelationSpanProcessor","BatchSpanProcessor","WebTracerProvider","EmbraceTraceManager","StackContextManager","UserSessionLogRecordProcessor","BrowserLogRecordProcessor","EmbraceLogRecordProcessor","UserLogRecordProcessor","LogRecordScrubProcessor","PageLogRecordProcessor","SignalCorrelationLogRecordProcessor","LoggerProvider","EmbraceLogManager","EmbracePageManager"],"sources":["../../src/sdk/initSDK.ts"],"sourcesContent":["import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { logs } from '@opentelemetry/api-logs';\nimport { registerInstrumentations } from '@opentelemetry/instrumentation';\nimport { emptyResource } from '@opentelemetry/resources';\nimport type { LogRecordProcessor } from '@opentelemetry/sdk-logs';\nimport {\n BatchLogRecordProcessor,\n LoggerProvider,\n} from '@opentelemetry/sdk-logs';\nimport type { SpanProcessor } from '@opentelemetry/sdk-trace';\nimport { BatchSpanProcessor } from '@opentelemetry/sdk-trace';\nimport {\n StackContextManager,\n WebTracerProvider,\n} from '@opentelemetry/sdk-trace-web';\nimport { log } from '../api-logs/index.ts';\nimport { page } from '../api-page/index.ts';\nimport { session } from '../api-sessions/index.ts';\nimport { trace } from '../api-traces/index.ts';\nimport { user } from '../api-users/index.ts';\nimport type { AttributeScrubber } from '../common/index.ts';\nimport {\n EmbraceLogExporter,\n EmbraceTraceExporter,\n} from '../exporters/index.ts';\nimport {\n DEFAULT_LIMITS,\n EmbraceDynamicConfigManager,\n EmbraceLimitManager,\n EmbraceLogManager,\n EmbracePageManager,\n EmbraceSDKFeaturesManager,\n EmbraceTraceManager,\n EmbraceUserManager,\n EmbraceUserSessionManager,\n} from '../managers/index.ts';\nimport {\n BrowserLogRecordProcessor,\n BrowserSpanProcessor,\n EmbraceLogRecordProcessor,\n EmbraceNetworkSpanProcessor,\n EmbraceSessionPartBatchedSpanProcessor,\n LogRecordScrubProcessor,\n PageLogRecordProcessor,\n PageSpanProcessor,\n SignalBuffer,\n SignalCorrelationLogRecordProcessor,\n SignalCorrelationSpanProcessor,\n SpanScrubProcessor,\n UserLogRecordProcessor,\n UserSessionLogRecordProcessor,\n UserSpanProcessor,\n} from '../processors/index.ts';\nimport { EmbraceW3CTraceContextPropagator } from '../propagators/index.ts';\nimport {\n getWebSDKOverridableResource,\n getWebSDKResource,\n} from '../resources/index.ts';\nimport {\n NamespacedStorage,\n nsfConfigValidation,\n OTelPerformanceManager,\n updateZeroTimeMillis,\n} from '../utils/index.ts';\nimport { getDefaultAttributeScrubbers } from './defaultAttributeScrubbers.ts';\nimport { registry } from './registry.ts';\nimport { setupDefaultInstrumentations } from './setupDefaultInstrumentations.ts';\nimport type {\n DynamicSDKConfig,\n SDKControl,\n SDKInitConfig,\n SetupLogsArgs,\n SetupPageArgs,\n SetupTracesArgs,\n SetupUserArgs,\n SetupUserSessionArgs,\n} from './types.ts';\nimport { validateAppID, validateAppVersion } from './utils.ts';\n\nexport const initSDK = (\n {\n appID,\n appVersion,\n resource = emptyResource(),\n spanExporters = [],\n logExporters = [],\n spanProcessors = [],\n propagator = null,\n defaultInstrumentationConfig,\n instrumentations = [],\n contextManager = null,\n logProcessors = [],\n attributeScrubbers = [],\n enableDefaultAttributeScrubbing = true,\n additionalQueryParamsToScrub = [],\n logLevel = DiagLogLevel.ERROR,\n embraceDataURL,\n embraceConfigURL,\n diagLogger = diag.createComponentLogger({\n namespace: 'embrace-sdk',\n }),\n dynamicSDKConfigManager: providedDynamicSDKConfigManager,\n dynamicSDKConfig,\n registerGlobally = true,\n blockNetworkSpanForwarding = false,\n restrictedProtocols = new Set(['file:']),\n useDocumentTitleAsPageLabel = true,\n }: SDKInitConfig = {} as SDKInitConfig,\n): SDKControl | false => {\n try {\n if (registerGlobally) {\n const existingSDK = registry.registered();\n if (existingSDK !== null) {\n diagLogger.warn(\n 'SDK has already been successfully initialized, skipping this invocation of initSDK',\n );\n return existingSDK;\n }\n }\n\n diag.setLogger(new DiagConsoleLogger(), {\n logLevel,\n });\n\n if (typeof window === 'undefined') {\n diagLogger.warn('browser not detected, skipping initialization');\n return false;\n }\n\n const perf = new OTelPerformanceManager();\n const initSDKStart = perf.getNowMillis();\n\n window.addEventListener('pageshow', (event) =>\n updateZeroTimeMillis(perf.epochMillisFromOrigin(event.timeStamp)),\n );\n\n const validatedAppID = validateAppID(appID);\n const validatedAppVersion = validateAppVersion(appVersion);\n\n const sendingToEmbrace = validatedAppID !== undefined;\n\n if (!sendingToEmbrace && !logExporters.length && !spanExporters.length) {\n throw new Error(\n 'when appID is omitted, at least one logExporter or spanExporter must be set',\n );\n }\n\n if (restrictedProtocols.has(window.location.protocol)) {\n throw new Error(\n `not initializing due to restricted protocol: ${window.location.protocol}`,\n );\n }\n\n if (sendingToEmbrace && typeof CompressionStream === 'undefined') {\n throw new Error(\n 'CompressionStream is not supported in this browser and required for data compression.',\n );\n }\n\n const namespace = appID ?? undefined;\n const sdkLocalStorage = new NamespacedStorage({\n namespace,\n storage: window.localStorage,\n diag: diagLogger,\n });\n const sdkTabStorage = new NamespacedStorage({\n namespace,\n storage: window.sessionStorage,\n diag: diagLogger,\n });\n\n const resourceWithWebSDKAttributes = getWebSDKOverridableResource()\n .merge(resource)\n .merge(\n getWebSDKResource({\n diagLogger,\n appVersion: validatedAppVersion,\n tabStorage: sdkTabStorage,\n }),\n );\n\n const userManager = setupUser({ registerGlobally, sdkLocalStorage });\n const enduserPseudoID = userManager.getEmbraceUserId();\n if (sendingToEmbrace && !enduserPseudoID) {\n throw new Error('userID is required when using Embrace exporter');\n }\n\n const dynamicConfigManager =\n providedDynamicSDKConfigManager ??\n new EmbraceDynamicConfigManager({\n appID: validatedAppID,\n appVersion: validatedAppVersion,\n embraceConfigURL,\n defaultConfig: dynamicSDKConfig,\n deviceId: enduserPseudoID,\n storage: sdkLocalStorage,\n });\n void dynamicConfigManager.refreshRemoteConfig();\n\n const sdkFeaturesManager = new EmbraceSDKFeaturesManager({\n dynamicConfigManager,\n deviceId: enduserPseudoID,\n blockNetworkSpanForwarding,\n });\n\n if (!sdkFeaturesManager.isSDKEnabled()) {\n diagLogger.debug('SDK is disabled, skipping initialization.');\n\n return false;\n }\n\n const nsfValid = nsfConfigValidation({\n featureManager: sdkFeaturesManager,\n diag: diagLogger,\n registerGlobally,\n defaultInstrumentationConfig,\n propagator,\n });\n\n const limitManager = new EmbraceLimitManager(DEFAULT_LIMITS);\n\n const finalAttributeScrubbers: AttributeScrubber[] = [\n ...(enableDefaultAttributeScrubbing\n ? getDefaultAttributeScrubbers(additionalQueryParamsToScrub)\n : []),\n ...attributeScrubbers,\n ];\n\n const userSessionManager = setupUserSession({\n limitManager,\n perf,\n registerGlobally,\n sdkLocalStorage,\n visibilityDoc: window.document,\n dynamicConfigManager,\n });\n\n let embraceSpanProcessor:\n | EmbraceSessionPartBatchedSpanProcessor\n | undefined;\n let embraceLogProcessor: BatchLogRecordProcessor | undefined;\n if (sendingToEmbrace) {\n embraceSpanProcessor = new EmbraceSessionPartBatchedSpanProcessor({\n exporter: new EmbraceTraceExporter({\n appID: validatedAppID,\n embraceDataURL,\n userID: enduserPseudoID,\n }),\n limitManager,\n userSessionManager,\n });\n\n embraceLogProcessor = new BatchLogRecordProcessor({\n exporter: new EmbraceLogExporter({\n appID: validatedAppID,\n embraceDataURL,\n userID: enduserPseudoID,\n }),\n });\n }\n\n const pageManager = setupPage({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n userSessionManager,\n perf,\n });\n\n // The correlation buffer is only needed to back-fill soft-navigation\n // spans, so skip creating it when that instrumentation is omitted.\n const softNavigationEnabled = !defaultInstrumentationConfig?.omit?.has(\n 'soft-navigation-performance',\n );\n const signalBuffer = softNavigationEnabled ? new SignalBuffer() : undefined;\n\n const { tracerProvider, embraceTraceManager } = setupTraces({\n resource: resourceWithWebSDKAttributes,\n userManager,\n spanExporters,\n spanProcessors,\n propagator: nsfValid\n ? new EmbraceW3CTraceContextPropagator()\n : propagator,\n contextManager,\n attributeScrubbers: finalAttributeScrubbers,\n registerGlobally,\n embraceSpanProcessor,\n pageManager,\n signalBuffer,\n });\n\n userSessionManager.setTracerProvider(tracerProvider);\n // No-op if the tab is hidden/unfocused at init; the first part starts\n // on the next engagement via the manager's browser-activity listeners.\n userSessionManager.startSessionPartInternal({ reason: 'init' });\n\n const { loggerProvider, embraceLogManager } = setupLogs({\n resource: resourceWithWebSDKAttributes,\n userManager,\n logExporters,\n logProcessors,\n userSessionManager,\n limitManager,\n attributeScrubbers: finalAttributeScrubbers,\n perf,\n registerGlobally,\n embraceLogProcessor,\n sdkLocalStorage,\n pageManager,\n visibilityDoc: window.document,\n signalBuffer,\n });\n\n // NOTE: we require setupInstrumentation to run the last, after setupLogs and setupTraces. This is how OTel works wrt\n // the dependencies between instrumentations and global providers. We need the providers for tracers, and logs to be\n // setup before we enable instrumentations.\n if (!registerGlobally) {\n registerInstrumentations({\n tracerProvider,\n loggerProvider,\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n logManager: embraceLogManager,\n userSessionManager,\n pageManager,\n limitManager,\n signalBuffer,\n }),\n ...instrumentations,\n ],\n });\n } else {\n registerInstrumentations({\n instrumentations: [\n setupDefaultInstrumentations(defaultInstrumentationConfig, {\n pageManager,\n limitManager,\n signalBuffer,\n }),\n ...instrumentations,\n ],\n });\n }\n\n diagLogger.info('successfully initialized the SDK');\n\n const sdkControl: SDKControl = {\n setDynamicConfig: (config: Partial<DynamicSDKConfig>) => {\n dynamicConfigManager.setConfig(config);\n },\n flush: async () => {\n await tracerProvider.forceFlush();\n await loggerProvider.forceFlush();\n },\n log: embraceLogManager,\n trace: embraceTraceManager,\n session: userSessionManager,\n user: userManager,\n page: pageManager,\n };\n\n if (registerGlobally) {\n registry.register(sdkControl);\n }\n\n userSessionManager.recordSDKStartupDuration(\n perf.getNowMillis() - initSDKStart,\n );\n\n return sdkControl;\n } catch (e) {\n const message = e instanceof Error ? e.message : 'Unknown error.';\n diagLogger.error(`failed to initialize the SDK: ${message}`);\n return false;\n }\n};\n\nconst setupUser = ({ registerGlobally, sdkLocalStorage }: SetupUserArgs) => {\n const embraceUserManager = new EmbraceUserManager({\n storage: sdkLocalStorage,\n });\n\n if (registerGlobally) {\n user.setGlobalUserManager(embraceUserManager);\n }\n\n return embraceUserManager;\n};\n\nconst setupUserSession = ({\n limitManager,\n perf,\n registerGlobally,\n sdkLocalStorage,\n visibilityDoc,\n dynamicConfigManager,\n}: SetupUserSessionArgs) => {\n const embraceUserSessionManager = new EmbraceUserSessionManager({\n limitManager,\n perf,\n storage: sdkLocalStorage,\n visibilityDoc,\n dynamicConfigManager,\n });\n\n if (registerGlobally) {\n session.setGlobalUserSessionManager(embraceUserSessionManager);\n }\n\n return embraceUserSessionManager;\n};\n\nconst setupTraces = ({\n resource,\n userManager,\n spanExporters,\n spanProcessors = [],\n propagator = null,\n contextManager = null,\n attributeScrubbers,\n registerGlobally,\n embraceSpanProcessor,\n pageManager,\n signalBuffer,\n}: SetupTracesArgs) => {\n const finalSpanProcessors: SpanProcessor[] = [\n ...spanProcessors,\n new BrowserSpanProcessor(),\n new EmbraceNetworkSpanProcessor(),\n new UserSpanProcessor({ userManager }),\n new PageSpanProcessor({ pageManager }),\n new SpanScrubProcessor({ attributeScrubbers }),\n // Placement in this chain does not affect the stamp: every\n // processor's onEnding runs before any onEnd (the batcher exports at\n // onEnd), so the soft-navigation span still sees the full window.\n ...(signalBuffer\n ? [\n new SignalCorrelationSpanProcessor({\n buffer: signalBuffer,\n }),\n ]\n : []),\n ];\n\n spanExporters?.forEach((exporter) => {\n finalSpanProcessors.push(new BatchSpanProcessor({ exporter }));\n });\n\n if (embraceSpanProcessor) {\n finalSpanProcessors.push(embraceSpanProcessor);\n }\n\n const tracerProvider = new WebTracerProvider({\n resource,\n spanProcessors: finalSpanProcessors,\n spanLimits: {\n // Session properties are stored as attributes on the session part span,\n // add a buffer here so that there is room for our internal attributes\n attributeCountLimit: DEFAULT_LIMITS.maxAllowed.session_property * 2,\n // Breadcrumbs are stored as events on the session part span, add a\n // buffer here so that there is room for our internal events\n eventCountLimit: DEFAULT_LIMITS.maxAllowed.breadcrumb * 2,\n },\n });\n\n const embraceTraceManager = new EmbraceTraceManager({\n tracerProvider: registerGlobally ? undefined : tracerProvider,\n });\n\n if (registerGlobally) {\n trace.setGlobalTraceManager(embraceTraceManager);\n tracerProvider.register({\n // WebTracerProvider.register has different fallback behaviours depending on whether null or undefined is passed,\n // be more explicit here and always supply a StackContextManager if the config did not specify one. If a user really\n // wants to turn off context management they can pass a no-op manager explicitly:\n // https://github.com/open-telemetry/opentelemetry-js/blob/4f0b6285af24b71a9fa022755aaa3b6a63ae5033/packages/opentelemetry-sdk-trace-web/src/WebTracerProvider.ts#L39\n contextManager: contextManager || new StackContextManager(),\n propagator,\n });\n }\n\n return { tracerProvider, embraceTraceManager };\n};\n\nconst setupLogs = ({\n resource,\n userManager,\n logExporters,\n logProcessors,\n userSessionManager,\n limitManager,\n attributeScrubbers,\n perf,\n registerGlobally,\n embraceLogProcessor,\n sdkLocalStorage,\n pageManager,\n visibilityDoc,\n signalBuffer,\n}: SetupLogsArgs) => {\n const finalLogProcessors: LogRecordProcessor[] = [\n ...logProcessors,\n new UserSessionLogRecordProcessor({\n userSessionManager,\n }),\n new BrowserLogRecordProcessor(),\n new EmbraceLogRecordProcessor(),\n new UserLogRecordProcessor({ userManager }),\n new LogRecordScrubProcessor({ attributeScrubbers }),\n new PageLogRecordProcessor({ pageManager }),\n // Must run after UserSessionLogRecordProcessor, which stamps the\n // synthetic log id this processor records into the shared buffer.\n // Keeping it last to prevent any ordering issues.\n ...(signalBuffer\n ? [\n new SignalCorrelationLogRecordProcessor({\n buffer: signalBuffer,\n }),\n ]\n : []),\n ];\n\n logExporters?.forEach((exporter) => {\n finalLogProcessors.push(new BatchLogRecordProcessor({ exporter }));\n });\n\n if (embraceLogProcessor) {\n finalLogProcessors.push(embraceLogProcessor);\n }\n\n const loggerProvider = new LoggerProvider({\n resource,\n processors: finalLogProcessors,\n });\n\n const embraceLogManager = new EmbraceLogManager({\n userSessionManager,\n limitManager,\n loggerProvider: registerGlobally ? undefined : loggerProvider,\n perf,\n storage: sdkLocalStorage,\n visibilityDoc,\n });\n\n if (registerGlobally) {\n logs.setGlobalLoggerProvider(loggerProvider);\n log.setGlobalLogManager(embraceLogManager);\n }\n\n return { loggerProvider, embraceLogManager };\n};\n\nconst setupPage = ({\n useDocumentTitleAsPageLabel,\n registerGlobally,\n userSessionManager,\n perf,\n}: SetupPageArgs) => {\n const embracePageManager = new EmbracePageManager({\n useDocumentTitleAsPageLabel,\n userSessionManager,\n perf,\n });\n\n if (registerGlobally) {\n page.setGlobalPageManager(embracePageManager);\n }\n\n return embracePageManager;\n};\n"],"mappings":"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"}