@embrace-io/web-sdk
Version:
325 lines (324 loc) • 19.2 kB
JavaScript
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