UNPKG

@embrace-io/web-sdk

Version:
325 lines (324 loc) 19.2 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const require_utils_NamespacedStorage_NamespacedStorage = require("../utils/NamespacedStorage/NamespacedStorage.cjs"); const require_utils_nsfConfigValidation = require("../utils/nsfConfigValidation.cjs"); const require_utils_PerformanceManager_OTelPerformanceManager = require("../utils/PerformanceManager/OTelPerformanceManager.cjs"); const require_api_logs_logAPI = require("../api-logs/logAPI.cjs"); const require_api_page_pageAPI = require("../api-page/pageAPI.cjs"); const require_api_sessions_sessionAPI = require("../api-sessions/sessionAPI.cjs"); const require_api_traces_traceAPI = require("../api-traces/traceAPI.cjs"); const require_api_users_userAPI = require("../api-users/userAPI.cjs"); const require_exporters_EmbraceLogExporter_EmbraceLogExporter = require("../exporters/EmbraceLogExporter/EmbraceLogExporter.cjs"); const require_exporters_EmbraceTraceExporter_EmbraceTraceExporter = require("../exporters/EmbraceTraceExporter/EmbraceTraceExporter.cjs"); const require_managers_EmbraceConfigManager_EmbraceDynamicConfigManager = require("../managers/EmbraceConfigManager/EmbraceDynamicConfigManager.cjs"); const require_managers_EmbraceLimitManager_constants = require("../managers/EmbraceLimitManager/constants.cjs"); const require_managers_EmbraceLimitManager_EmbraceLimitManager = require("../managers/EmbraceLimitManager/EmbraceLimitManager.cjs"); const require_managers_EmbraceLogManager_EmbraceLogManager = require("../managers/EmbraceLogManager/EmbraceLogManager.cjs"); const require_managers_EmbracePageManager_EmbracePageManager = require("../managers/EmbracePageManager/EmbracePageManager.cjs"); const require_managers_EmbraceSDKFeaturesManager_EmbraceSDKFeaturesManager = require("../managers/EmbraceSDKFeaturesManager/EmbraceSDKFeaturesManager.cjs"); const require_managers_EmbraceTraceManager_EmbraceTraceManager = require("../managers/EmbraceTraceManager/EmbraceTraceManager.cjs"); const require_managers_EmbraceUserManager_EmbraceUserManager = require("../managers/EmbraceUserManager/EmbraceUserManager.cjs"); const require_managers_EmbraceUserSessionManager_EmbraceUserSessionManager = require("../managers/EmbraceUserSessionManager/EmbraceUserSessionManager.cjs"); const require_processors_BrowserLogRecordProcessor_BrowserLogRecordProcessor = require("../processors/BrowserLogRecordProcessor/BrowserLogRecordProcessor.cjs"); const require_processors_BrowserSpanProcessor_BrowserSpanProcessor = require("../processors/BrowserSpanProcessor/BrowserSpanProcessor.cjs"); const require_processors_EmbraceLogRecordProcessor_EmbraceLogRecordProcessor = require("../processors/EmbraceLogRecordProcessor/EmbraceLogRecordProcessor.cjs"); const require_processors_EmbraceNetworkSpanProcessor_EmbraceNetworkSpanProcessor = require("../processors/EmbraceNetworkSpanProcessor/EmbraceNetworkSpanProcessor.cjs"); const require_processors_EmbraceSessionPartBatchedSpanProcessor_EmbraceSessionPartBatchedSpanProcessor = require("../processors/EmbraceSessionPartBatchedSpanProcessor/EmbraceSessionPartBatchedSpanProcessor.cjs"); const require_processors_LogRecordScrubProcessor_LogRecordScrubProcessor = require("../processors/LogRecordScrubProcessor/LogRecordScrubProcessor.cjs"); const require_processors_PageLogRecordProcessor_PageLogRecordProcessor = require("../processors/PageLogRecordProcessor/PageLogRecordProcessor.cjs"); const require_processors_PageSpanProcessor_PageSpanProcessor = require("../processors/PageSpanProcessor/PageSpanProcessor.cjs"); const require_processors_SignalCorrelationLogRecordProcessor_SignalCorrelationLogRecordProcessor = require("../processors/SignalCorrelationLogRecordProcessor/SignalCorrelationLogRecordProcessor.cjs"); const require_processors_SignalCorrelationSpanProcessor_SignalCorrelationSpanProcessor = require("../processors/SignalCorrelationSpanProcessor/SignalCorrelationSpanProcessor.cjs"); const require_processors_SpanScrubProcessor_SpanScrubProcessor = require("../processors/SpanScrubProcessor/SpanScrubProcessor.cjs"); const require_processors_UserLogRecordProcessor_UserLogRecordProcessor = require("../processors/UserLogRecordProcessor/UserLogRecordProcessor.cjs"); const require_processors_UserSessionLogRecordProcessor_UserSessionLogRecordProcessor = require("../processors/UserSessionLogRecordProcessor/UserSessionLogRecordProcessor.cjs"); const require_processors_UserSpanProcessor_UserSpanProcessor = require("../processors/UserSpanProcessor/UserSpanProcessor.cjs"); const require_processors_utils_SignalBuffer = require("../processors/utils/SignalBuffer.cjs"); const require_propagators_EmbraceW3CTraceContextPropagator_EmbraceW3CTraceContextPropagator = require("../propagators/EmbraceW3CTraceContextPropagator/EmbraceW3CTraceContextPropagator.cjs"); const require_resources_webSdkResource = require("../resources/webSdkResource.cjs"); const require_sdk_defaultAttributeScrubbers = require("./defaultAttributeScrubbers.cjs"); const require_sdk_registry = require("./registry.cjs"); const require_sdk_setupDefaultInstrumentations = require("./setupDefaultInstrumentations.cjs"); const require_sdk_utils = require("./utils.cjs"); let _opentelemetry_api = require("@opentelemetry/api"); let _opentelemetry_api_logs = require("@opentelemetry/api-logs"); let _opentelemetry_instrumentation = require("@opentelemetry/instrumentation"); let _opentelemetry_resources = require("@opentelemetry/resources"); let _opentelemetry_sdk_logs = require("@opentelemetry/sdk-logs"); let _opentelemetry_sdk_trace = require("@opentelemetry/sdk-trace"); let _opentelemetry_sdk_trace_web = require("@opentelemetry/sdk-trace-web"); //#region src/sdk/initSDK.ts const initSDK = ({ appID, appVersion, resource = (0, _opentelemetry_resources.emptyResource)(), spanExporters = [], logExporters = [], spanProcessors = [], propagator = null, defaultInstrumentationConfig, instrumentations = [], contextManager = null, logProcessors = [], attributeScrubbers = [], enableDefaultAttributeScrubbing = true, additionalQueryParamsToScrub = [], logLevel = _opentelemetry_api.DiagLogLevel.ERROR, embraceDataURL, embraceConfigURL, diagLogger = _opentelemetry_api.diag.createComponentLogger({ namespace: "embrace-sdk" }), dynamicSDKConfigManager: providedDynamicSDKConfigManager, dynamicSDKConfig, registerGlobally = true, blockNetworkSpanForwarding = false, restrictedProtocols = /* @__PURE__ */ new Set(["file:"]), useDocumentTitleAsPageLabel = true } = {}) => { try { if (registerGlobally) { const existingSDK = require_sdk_registry.registry.registered(); if (existingSDK !== null) { diagLogger.warn("SDK has already been successfully initialized, skipping this invocation of initSDK"); return existingSDK; } } _opentelemetry_api.diag.setLogger(new _opentelemetry_api.DiagConsoleLogger(), { logLevel }); if (typeof window === "undefined") { diagLogger.warn("browser not detected, skipping initialization"); return false; } const perf = new require_utils_PerformanceManager_OTelPerformanceManager.OTelPerformanceManager(); const initSDKStart = perf.getNowMillis(); window.addEventListener("pageshow", (event) => require_utils_PerformanceManager_OTelPerformanceManager.updateZeroTimeMillis(perf.epochMillisFromOrigin(event.timeStamp))); const validatedAppID = require_sdk_utils.validateAppID(appID); const validatedAppVersion = require_sdk_utils.validateAppVersion(appVersion); const sendingToEmbrace = validatedAppID !== void 0; if (!sendingToEmbrace && !logExporters.length && !spanExporters.length) throw new Error("when appID is omitted, at least one logExporter or spanExporter must be set"); if (restrictedProtocols.has(window.location.protocol)) throw new Error(`not initializing due to restricted protocol: ${window.location.protocol}`); if (sendingToEmbrace && typeof CompressionStream === "undefined") throw new Error("CompressionStream is not supported in this browser and required for data compression."); const namespace = appID ?? void 0; const sdkLocalStorage = new require_utils_NamespacedStorage_NamespacedStorage.NamespacedStorage({ namespace, storage: window.localStorage, diag: diagLogger }); const sdkTabStorage = new require_utils_NamespacedStorage_NamespacedStorage.NamespacedStorage({ namespace, storage: window.sessionStorage, diag: diagLogger }); const resourceWithWebSDKAttributes = require_resources_webSdkResource.getWebSDKOverridableResource().merge(resource).merge(require_resources_webSdkResource.getWebSDKResource({ diagLogger, appVersion: validatedAppVersion, tabStorage: sdkTabStorage })); const userManager = setupUser({ registerGlobally, sdkLocalStorage }); const enduserPseudoID = userManager.getEmbraceUserId(); if (sendingToEmbrace && !enduserPseudoID) throw new Error("userID is required when using Embrace exporter"); const dynamicConfigManager = providedDynamicSDKConfigManager ?? new require_managers_EmbraceConfigManager_EmbraceDynamicConfigManager.EmbraceDynamicConfigManager({ appID: validatedAppID, appVersion: validatedAppVersion, embraceConfigURL, defaultConfig: dynamicSDKConfig, deviceId: enduserPseudoID, storage: sdkLocalStorage }); dynamicConfigManager.refreshRemoteConfig(); const sdkFeaturesManager = new require_managers_EmbraceSDKFeaturesManager_EmbraceSDKFeaturesManager.EmbraceSDKFeaturesManager({ dynamicConfigManager, deviceId: enduserPseudoID, blockNetworkSpanForwarding }); if (!sdkFeaturesManager.isSDKEnabled()) { diagLogger.debug("SDK is disabled, skipping initialization."); return false; } const nsfValid = require_utils_nsfConfigValidation.nsfConfigValidation({ featureManager: sdkFeaturesManager, diag: diagLogger, registerGlobally, defaultInstrumentationConfig, propagator }); const limitManager = new require_managers_EmbraceLimitManager_EmbraceLimitManager.EmbraceLimitManager(require_managers_EmbraceLimitManager_constants.DEFAULT_LIMITS); const finalAttributeScrubbers = [...enableDefaultAttributeScrubbing ? require_sdk_defaultAttributeScrubbers.getDefaultAttributeScrubbers(additionalQueryParamsToScrub) : [], ...attributeScrubbers]; const userSessionManager = setupUserSession({ limitManager, perf, registerGlobally, sdkLocalStorage, visibilityDoc: window.document, dynamicConfigManager }); let embraceSpanProcessor; let embraceLogProcessor; if (sendingToEmbrace) { embraceSpanProcessor = new require_processors_EmbraceSessionPartBatchedSpanProcessor_EmbraceSessionPartBatchedSpanProcessor.EmbraceSessionPartBatchedSpanProcessor({ exporter: new require_exporters_EmbraceTraceExporter_EmbraceTraceExporter.EmbraceTraceExporter({ appID: validatedAppID, embraceDataURL, userID: enduserPseudoID }), limitManager, userSessionManager }); embraceLogProcessor = new _opentelemetry_sdk_logs.BatchLogRecordProcessor({ exporter: new require_exporters_EmbraceLogExporter_EmbraceLogExporter.EmbraceLogExporter({ appID: validatedAppID, embraceDataURL, userID: enduserPseudoID }) }); } const pageManager = setupPage({ useDocumentTitleAsPageLabel, registerGlobally, userSessionManager, perf }); const signalBuffer = !defaultInstrumentationConfig?.omit?.has("soft-navigation-performance") ? new require_processors_utils_SignalBuffer.SignalBuffer() : void 0; const { tracerProvider, embraceTraceManager } = setupTraces({ resource: resourceWithWebSDKAttributes, userManager, spanExporters, spanProcessors, propagator: nsfValid ? new require_propagators_EmbraceW3CTraceContextPropagator_EmbraceW3CTraceContextPropagator.EmbraceW3CTraceContextPropagator() : propagator, contextManager, attributeScrubbers: finalAttributeScrubbers, registerGlobally, embraceSpanProcessor, pageManager, signalBuffer }); userSessionManager.setTracerProvider(tracerProvider); userSessionManager.startSessionPartInternal({ reason: "init" }); const { loggerProvider, embraceLogManager } = setupLogs({ resource: resourceWithWebSDKAttributes, userManager, logExporters, logProcessors, userSessionManager, limitManager, attributeScrubbers: finalAttributeScrubbers, perf, registerGlobally, embraceLogProcessor, sdkLocalStorage, pageManager, visibilityDoc: window.document, signalBuffer }); if (!registerGlobally) (0, _opentelemetry_instrumentation.registerInstrumentations)({ tracerProvider, loggerProvider, instrumentations: [require_sdk_setupDefaultInstrumentations.setupDefaultInstrumentations(defaultInstrumentationConfig, { logManager: embraceLogManager, userSessionManager, pageManager, limitManager, signalBuffer }), ...instrumentations] }); else (0, _opentelemetry_instrumentation.registerInstrumentations)({ instrumentations: [require_sdk_setupDefaultInstrumentations.setupDefaultInstrumentations(defaultInstrumentationConfig, { pageManager, limitManager, signalBuffer }), ...instrumentations] }); diagLogger.info("successfully initialized the SDK"); const sdkControl = { setDynamicConfig: (config) => { dynamicConfigManager.setConfig(config); }, flush: async () => { await tracerProvider.forceFlush(); await loggerProvider.forceFlush(); }, log: embraceLogManager, trace: embraceTraceManager, session: userSessionManager, user: userManager, page: pageManager }; if (registerGlobally) require_sdk_registry.registry.register(sdkControl); userSessionManager.recordSDKStartupDuration(perf.getNowMillis() - initSDKStart); return sdkControl; } catch (e) { const message = e instanceof Error ? e.message : "Unknown error."; diagLogger.error(`failed to initialize the SDK: ${message}`); return false; } }; const setupUser = ({ registerGlobally, sdkLocalStorage }) => { const embraceUserManager = new require_managers_EmbraceUserManager_EmbraceUserManager.EmbraceUserManager({ storage: sdkLocalStorage }); if (registerGlobally) require_api_users_userAPI.user.setGlobalUserManager(embraceUserManager); return embraceUserManager; }; const setupUserSession = ({ limitManager, perf, registerGlobally, sdkLocalStorage, visibilityDoc, dynamicConfigManager }) => { const embraceUserSessionManager = new require_managers_EmbraceUserSessionManager_EmbraceUserSessionManager.EmbraceUserSessionManager({ limitManager, perf, storage: sdkLocalStorage, visibilityDoc, dynamicConfigManager }); if (registerGlobally) require_api_sessions_sessionAPI.session.setGlobalUserSessionManager(embraceUserSessionManager); return embraceUserSessionManager; }; const setupTraces = ({ resource, userManager, spanExporters, spanProcessors = [], propagator = null, contextManager = null, attributeScrubbers, registerGlobally, embraceSpanProcessor, pageManager, signalBuffer }) => { const finalSpanProcessors = [ ...spanProcessors, new require_processors_BrowserSpanProcessor_BrowserSpanProcessor.BrowserSpanProcessor(), new require_processors_EmbraceNetworkSpanProcessor_EmbraceNetworkSpanProcessor.EmbraceNetworkSpanProcessor(), new require_processors_UserSpanProcessor_UserSpanProcessor.UserSpanProcessor({ userManager }), new require_processors_PageSpanProcessor_PageSpanProcessor.PageSpanProcessor({ pageManager }), new require_processors_SpanScrubProcessor_SpanScrubProcessor.SpanScrubProcessor({ attributeScrubbers }), ...signalBuffer ? [new require_processors_SignalCorrelationSpanProcessor_SignalCorrelationSpanProcessor.SignalCorrelationSpanProcessor({ buffer: signalBuffer })] : [] ]; spanExporters?.forEach((exporter) => { finalSpanProcessors.push(new _opentelemetry_sdk_trace.BatchSpanProcessor({ exporter })); }); if (embraceSpanProcessor) finalSpanProcessors.push(embraceSpanProcessor); const tracerProvider = new _opentelemetry_sdk_trace_web.WebTracerProvider({ resource, spanProcessors: finalSpanProcessors, spanLimits: { attributeCountLimit: require_managers_EmbraceLimitManager_constants.DEFAULT_LIMITS.maxAllowed.session_property * 2, eventCountLimit: require_managers_EmbraceLimitManager_constants.DEFAULT_LIMITS.maxAllowed.breadcrumb * 2 } }); const embraceTraceManager = new require_managers_EmbraceTraceManager_EmbraceTraceManager.EmbraceTraceManager({ tracerProvider: registerGlobally ? void 0 : tracerProvider }); if (registerGlobally) { require_api_traces_traceAPI.trace.setGlobalTraceManager(embraceTraceManager); tracerProvider.register({ contextManager: contextManager || new _opentelemetry_sdk_trace_web.StackContextManager(), propagator }); } return { tracerProvider, embraceTraceManager }; }; const setupLogs = ({ resource, userManager, logExporters, logProcessors, userSessionManager, limitManager, attributeScrubbers, perf, registerGlobally, embraceLogProcessor, sdkLocalStorage, pageManager, visibilityDoc, signalBuffer }) => { const finalLogProcessors = [ ...logProcessors, new require_processors_UserSessionLogRecordProcessor_UserSessionLogRecordProcessor.UserSessionLogRecordProcessor({ userSessionManager }), new require_processors_BrowserLogRecordProcessor_BrowserLogRecordProcessor.BrowserLogRecordProcessor(), new require_processors_EmbraceLogRecordProcessor_EmbraceLogRecordProcessor.EmbraceLogRecordProcessor(), new require_processors_UserLogRecordProcessor_UserLogRecordProcessor.UserLogRecordProcessor({ userManager }), new require_processors_LogRecordScrubProcessor_LogRecordScrubProcessor.LogRecordScrubProcessor({ attributeScrubbers }), new require_processors_PageLogRecordProcessor_PageLogRecordProcessor.PageLogRecordProcessor({ pageManager }), ...signalBuffer ? [new require_processors_SignalCorrelationLogRecordProcessor_SignalCorrelationLogRecordProcessor.SignalCorrelationLogRecordProcessor({ buffer: signalBuffer })] : [] ]; logExporters?.forEach((exporter) => { finalLogProcessors.push(new _opentelemetry_sdk_logs.BatchLogRecordProcessor({ exporter })); }); if (embraceLogProcessor) finalLogProcessors.push(embraceLogProcessor); const loggerProvider = new _opentelemetry_sdk_logs.LoggerProvider({ resource, processors: finalLogProcessors }); const embraceLogManager = new require_managers_EmbraceLogManager_EmbraceLogManager.EmbraceLogManager({ userSessionManager, limitManager, loggerProvider: registerGlobally ? void 0 : loggerProvider, perf, storage: sdkLocalStorage, visibilityDoc }); if (registerGlobally) { _opentelemetry_api_logs.logs.setGlobalLoggerProvider(loggerProvider); require_api_logs_logAPI.log.setGlobalLogManager(embraceLogManager); } return { loggerProvider, embraceLogManager }; }; const setupPage = ({ useDocumentTitleAsPageLabel, registerGlobally, userSessionManager, perf }) => { const embracePageManager = new require_managers_EmbracePageManager_EmbracePageManager.EmbracePageManager({ useDocumentTitleAsPageLabel, userSessionManager, perf }); if (registerGlobally) require_api_page_pageAPI.page.setGlobalPageManager(embracePageManager); return embracePageManager; }; //#endregion exports.initSDK = initSDK; //# sourceMappingURL=initSDK.cjs.map