@embrace-io/web-sdk
Version:
146 lines (145 loc) • 6.41 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const require_utils_getIncrementedCount = require("../../utils/getIncrementedCount.cjs");
const require_constants_attributes = require("../../constants/attributes.cjs");
const require_utils_getVisibilityState = require("../../utils/getVisibilityState.cjs");
const require_utils_globalConfig = require("../../utils/globalConfig.cjs");
let _opentelemetry_api = require("@opentelemetry/api");
let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conventions");
let _opentelemetry_api_logs = require("@opentelemetry/api-logs");
//#region src/managers/EmbraceLogManager/EmbraceLogManager.ts
const EMBRACE_EXCEPTION_NUMBER_STORAGE_KEY = "embrace_exception_number";
/**
* GLOBAL_CONFIG._EmbraceFileBundleIDs is populated at runtime when each file is loaded,
* based on the contents injected by the embrace-web-cli.
*/
const getJSFileBundleIDs = () => JSON.stringify(require_utils_globalConfig.GLOBAL_CONFIG._EmbraceFileBundleIDs || {});
var EmbraceLogManager = class EmbraceLogManager {
_diag;
_perf;
_logger;
_userSessionManager;
_limitManager;
_visibilityDoc;
_storage;
constructor({ diag: diagParam, perf, userSessionManager, limitManager, loggerProvider: globalLoggerProviderOverride, visibilityDoc, storage }) {
const loggerProvider = globalLoggerProviderOverride ?? _opentelemetry_api_logs.logs;
this._diag = diagParam ?? _opentelemetry_api.diag.createComponentLogger({ namespace: "EmbraceLogManager" });
this._perf = perf;
this._logger = loggerProvider.getLogger("embrace-web-sdk-logs");
this._userSessionManager = userSessionManager;
this._limitManager = limitManager;
this._visibilityDoc = visibilityDoc;
this._storage = storage;
}
_validateAttributes(attributes) {
if (Object.prototype.toString.call(attributes) !== "[object Object]") {
this._diag.warn("attributes must be a plain object", attributes);
return {};
}
return attributes;
}
static _logSeverityToSeverityNumber(severity) {
switch (severity) {
case "info": return _opentelemetry_api_logs.SeverityNumber.INFO;
case "warning": return _opentelemetry_api_logs.SeverityNumber.WARN;
default: return _opentelemetry_api_logs.SeverityNumber.ERROR;
}
}
logException(error, { handled = true, attributes = {}, timestamp = this._perf.getNowMillis(), handler = "manual" } = {}) {
const validAttrs = this._validateAttributes(attributes);
if (!handled) this._userSessionManager.incrSessionPartCountForKey(require_constants_attributes.KEY_EMB_UNHANDLED_EXCEPTIONS_COUNT);
const type = error?.constructor?.name || typeof error;
let errMessage = "";
let errName = type;
let errStack = "";
let errCause = "";
if (error instanceof Error) {
errMessage = String(error.message || "").trim();
errName = error.name || "";
errStack = error.stack || "";
errCause = error.cause ? "present" : "";
} else if (error && typeof error === "object") try {
errMessage = JSON.stringify(error);
} catch {
errMessage = String(error).trim();
}
else errMessage = String(error).trim();
const limited = this._limitManager.limitException(errMessage, validAttrs);
if (limited === "dropped") return;
this._logger.emit({
timestamp,
severityNumber: _opentelemetry_api_logs.SeverityNumber.ERROR,
severityText: "ERROR",
body: limited.message,
attributes: {
...limited.attributes,
[require_constants_attributes.KEY_EMB_TYPE]: "sys.exception",
[require_constants_attributes.KEY_EMB_EXCEPTION_HANDLING]: EmbraceLogManager._exceptionHandlingType(handled, handler),
[require_constants_attributes.KEY_EMB_EXCEPTION_CAUSE]: errCause,
[_opentelemetry_semantic_conventions.ATTR_EXCEPTION_TYPE]: type,
["exception.name"]: errName,
[_opentelemetry_semantic_conventions.ATTR_EXCEPTION_MESSAGE]: limited.message,
[_opentelemetry_semantic_conventions.ATTR_EXCEPTION_STACKTRACE]: errStack,
[require_constants_attributes.KEY_EMB_JS_FILE_BUNDLE_IDS]: getJSFileBundleIDs(),
[require_constants_attributes.KEY_EMB_STATE]: require_utils_getVisibilityState.getVisibilityState(this._visibilityDoc),
[require_constants_attributes.KEY_EMB_EXCEPTION_NUMBER]: require_utils_getIncrementedCount.getIncrementedCount(this._storage, EMBRACE_EXCEPTION_NUMBER_STORAGE_KEY, this._diag)
}
});
}
message(message, severity, { attributes = {}, includeStacktrace = true, stacktrace } = {}) {
if (typeof message !== "string" || !message.trim()) {
this._diag.warn("Message must be a non-empty string");
return;
}
if (![
"info",
"warning",
"error"
].includes(severity)) {
this._diag.warn("Severity must be info, warning, or error");
return;
}
const validAttrs = this._validateAttributes(attributes);
if (severity === "error") this._userSessionManager.incrSessionPartCountForKey(require_constants_attributes.KEY_EMB_ERROR_LOG_COUNT);
let stack = "";
if (severity !== "info") {
if (typeof stacktrace === "string") stack = stacktrace;
else if (includeStacktrace) stack = (/* @__PURE__ */ new Error()).stack || "";
}
this._logMessage({
message: message.trim(),
severity,
timestamp: this._perf.getNowMillis(),
attributes: validAttrs,
stack
});
}
_logMessage({ message, severity, timestamp, attributes = {}, stack }) {
const limitedLog = this._limitManager.limitLog(message, severity, attributes);
if (limitedLog === "dropped") return;
this._logger.emit({
timestamp,
severityNumber: EmbraceLogManager._logSeverityToSeverityNumber(severity),
severityText: severity.toUpperCase(),
body: limitedLog.message,
attributes: {
...limitedLog.attributes,
[require_constants_attributes.KEY_EMB_TYPE]: "sys.log",
...stack ? {
[require_constants_attributes.KEY_EMB_JS_EXCEPTION_STACKTRACE]: stack,
[require_constants_attributes.KEY_EMB_JS_FILE_BUNDLE_IDS]: getJSFileBundleIDs()
} : {},
[require_constants_attributes.KEY_EMB_STATE]: require_utils_getVisibilityState.getVisibilityState(this._visibilityDoc)
}
});
}
static _exceptionHandlingType(handled, handler) {
if (handled) return "handled";
if (handler === "global_exception") return "unhandled_error";
if (handler === "promise_rejection") return "unhandled_rejection";
return "unhandled";
}
};
//#endregion
exports.EmbraceLogManager = EmbraceLogManager;
//# sourceMappingURL=EmbraceLogManager.cjs.map