@embrace-io/web-sdk
Version:
1 lines • 11.5 kB
Source Map (JSON)
{"version":3,"file":"EmbraceLogManager.cjs","names":["GLOBAL_CONFIG","logs","diag","SeverityNumber","KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT","KEY_EMB_TYPE","KEY_EMB_EXCEPTION_HANDLING","KEY_EMB_EXCEPTION_CAUSE","ATTR_EXCEPTION_TYPE","ATTR_EXCEPTION_MESSAGE","ATTR_EXCEPTION_STACKTRACE","KEY_EMB_JS_FILE_BUNDLE_IDS","KEY_EMB_STATE","getVisibilityState","KEY_EMB_EXCEPTION_NUMBER","getIncrementedCount","KEY_EMB_ERROR_LOG_COUNT","KEY_EMB_JS_EXCEPTION_STACKTRACE"],"sources":["../../../src/managers/EmbraceLogManager/EmbraceLogManager.ts"],"sourcesContent":["import type { Attributes, DiagLogger } from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\nimport type { Logger } from '@opentelemetry/api-logs';\nimport { logs, SeverityNumber } from '@opentelemetry/api-logs';\nimport {\n ATTR_EXCEPTION_MESSAGE,\n ATTR_EXCEPTION_STACKTRACE,\n ATTR_EXCEPTION_TYPE,\n} from '@opentelemetry/semantic-conventions';\nimport type { LogManager, LogSeverity } from '../../api-logs/index.ts';\nimport type {\n LogExceptionOptions,\n LogMessageOptions,\n} from '../../api-logs/manager/index.ts';\nimport type { ExceptionHandlerType } from '../../api-logs/manager/types.ts';\nimport type { VisibilityStateDocument } from '../../common/index.ts';\nimport {\n KEY_EMB_ERROR_LOG_COUNT,\n KEY_EMB_EXCEPTION_CAUSE,\n KEY_EMB_JS_FILE_BUNDLE_IDS,\n KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT,\n} from '../../constants/attributes.ts';\nimport {\n EMB_TYPES,\n KEY_EMB_EXCEPTION_HANDLING,\n KEY_EMB_EXCEPTION_NUMBER,\n KEY_EMB_JS_EXCEPTION_STACKTRACE,\n KEY_EMB_STATE,\n KEY_EMB_TYPE,\n} from '../../constants/index.ts';\nimport type {\n NamespacedStorage,\n PerformanceManager,\n} from '../../utils/index.ts';\nimport {\n GLOBAL_CONFIG,\n getIncrementedCount,\n getVisibilityState,\n} from '../../utils/index.ts';\nimport type { LimitManagerInternal } from '../EmbraceLimitManager/index.ts';\nimport type { UserSessionManagerInternal } from '../EmbraceUserSessionManager/index.ts';\nimport type { EmbraceLogManagerArgs } from './types.ts';\n\nconst EMBRACE_EXCEPTION_NUMBER_STORAGE_KEY = 'embrace_exception_number';\n/**\n * GLOBAL_CONFIG._EmbraceFileBundleIDs is populated at runtime when each file is loaded,\n * based on the contents injected by the embrace-web-cli.\n */\nconst getJSFileBundleIDs = () =>\n JSON.stringify(GLOBAL_CONFIG._EmbraceFileBundleIDs || {});\n\nexport class EmbraceLogManager implements LogManager {\n private readonly _diag: DiagLogger;\n private readonly _perf: PerformanceManager;\n private readonly _logger: Logger;\n private readonly _userSessionManager: UserSessionManagerInternal;\n private readonly _limitManager: LimitManagerInternal;\n private readonly _visibilityDoc: VisibilityStateDocument;\n private readonly _storage: NamespacedStorage;\n\n public constructor({\n diag: diagParam,\n perf,\n userSessionManager,\n limitManager,\n loggerProvider: globalLoggerProviderOverride,\n visibilityDoc,\n storage,\n }: EmbraceLogManagerArgs) {\n const loggerProvider = globalLoggerProviderOverride ?? logs;\n\n this._diag =\n diagParam ??\n diag.createComponentLogger({\n namespace: 'EmbraceLogManager',\n });\n this._perf = perf;\n this._logger = loggerProvider.getLogger('embrace-web-sdk-logs');\n this._userSessionManager = userSessionManager;\n this._limitManager = limitManager;\n this._visibilityDoc = visibilityDoc;\n this._storage = storage;\n }\n\n private _validateAttributes(attributes: unknown): Attributes {\n if (Object.prototype.toString.call(attributes) !== '[object Object]') {\n this._diag.warn('attributes must be a plain object', attributes);\n return {};\n }\n return attributes as Attributes;\n }\n\n private static _logSeverityToSeverityNumber(\n severity: LogSeverity,\n ): SeverityNumber {\n switch (severity) {\n case 'info':\n return SeverityNumber.INFO;\n case 'warning':\n return SeverityNumber.WARN;\n default:\n return SeverityNumber.ERROR;\n }\n }\n\n public logException(\n error: unknown,\n {\n handled = true,\n attributes = {},\n timestamp = this._perf.getNowMillis(),\n handler = 'manual',\n }: LogExceptionOptions = {},\n ) {\n const validAttrs = this._validateAttributes(attributes);\n\n if (!handled) {\n this._userSessionManager.incrSessionPartCountForKey(\n KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT,\n );\n }\n\n const type = error?.constructor?.name || typeof error;\n let errMessage = '';\n let errName = type;\n let errStack = '';\n let errCause = '';\n\n if (error instanceof Error) {\n errMessage = String(error.message || '').trim();\n errName = error.name || '';\n errStack = error.stack || '';\n errCause = error.cause ? 'present' : '';\n } else if (error && typeof error === 'object') {\n try {\n errMessage = JSON.stringify(error);\n } catch {\n errMessage = String(error).trim();\n }\n } else {\n errMessage = String(error).trim();\n }\n\n const limited = this._limitManager.limitException(errMessage, validAttrs);\n if (limited === 'dropped') {\n return;\n }\n\n this._logger.emit({\n timestamp,\n severityNumber: SeverityNumber.ERROR,\n severityText: 'ERROR',\n body: limited.message,\n attributes: {\n ...limited.attributes,\n [KEY_EMB_TYPE]: EMB_TYPES.SystemException,\n [KEY_EMB_EXCEPTION_HANDLING]: EmbraceLogManager._exceptionHandlingType(\n handled,\n handler,\n ),\n [KEY_EMB_EXCEPTION_CAUSE]: errCause,\n [ATTR_EXCEPTION_TYPE]: type,\n ['exception.name']: errName,\n [ATTR_EXCEPTION_MESSAGE]: limited.message,\n [ATTR_EXCEPTION_STACKTRACE]: errStack,\n [KEY_EMB_JS_FILE_BUNDLE_IDS]: getJSFileBundleIDs(),\n [KEY_EMB_STATE]: getVisibilityState(this._visibilityDoc),\n [KEY_EMB_EXCEPTION_NUMBER]: getIncrementedCount(\n this._storage,\n EMBRACE_EXCEPTION_NUMBER_STORAGE_KEY,\n this._diag,\n ),\n },\n });\n }\n\n public message(\n message: string,\n severity: LogSeverity,\n {\n attributes = {},\n includeStacktrace = true,\n stacktrace,\n }: LogMessageOptions = {},\n ) {\n if (typeof message !== 'string' || !message.trim()) {\n this._diag.warn('Message must be a non-empty string');\n return;\n }\n\n if (!['info', 'warning', 'error'].includes(severity)) {\n this._diag.warn('Severity must be info, warning, or error');\n return;\n }\n\n const validAttrs = this._validateAttributes(attributes);\n\n if (severity === 'error') {\n this._userSessionManager.incrSessionPartCountForKey(\n KEY_EMB_ERROR_LOG_COUNT,\n );\n }\n\n let stack = '';\n if (severity !== 'info') {\n if (typeof stacktrace === 'string') {\n stack = stacktrace;\n } else if (includeStacktrace) {\n stack = new Error().stack || '';\n }\n }\n\n this._logMessage({\n message: message.trim(),\n severity,\n timestamp: this._perf.getNowMillis(),\n attributes: validAttrs,\n stack,\n });\n }\n\n private _logMessage({\n message,\n severity,\n timestamp,\n attributes = {},\n stack,\n }: {\n message: string;\n severity: LogSeverity;\n timestamp: number;\n attributes?: Attributes;\n stack?: string;\n }) {\n const limitedLog = this._limitManager.limitLog(\n message,\n severity,\n attributes,\n );\n\n if (limitedLog === 'dropped') {\n return;\n }\n\n this._logger.emit({\n timestamp,\n severityNumber: EmbraceLogManager._logSeverityToSeverityNumber(severity),\n severityText: severity.toUpperCase(),\n body: limitedLog.message,\n attributes: {\n ...limitedLog.attributes,\n [KEY_EMB_TYPE]: EMB_TYPES.SystemLog,\n ...(stack\n ? {\n [KEY_EMB_JS_EXCEPTION_STACKTRACE]: stack,\n [KEY_EMB_JS_FILE_BUNDLE_IDS]: getJSFileBundleIDs(),\n }\n : {}),\n [KEY_EMB_STATE]: getVisibilityState(this._visibilityDoc),\n },\n });\n }\n\n private static _exceptionHandlingType(\n handled: boolean,\n handler: ExceptionHandlerType,\n ): string {\n if (handled) {\n return 'handled';\n }\n\n if (handler === 'global_exception') {\n return 'unhandled_error';\n }\n\n if (handler === 'promise_rejection') {\n return 'unhandled_rejection';\n }\n\n return 'unhandled';\n }\n}\n"],"mappings":"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"}