@kubesense/kubesense-browser-logs 0.0.0-stage → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +90 -2
- package/bundle/kubesense-logs.js +1 -0
- package/cjs/boot/logsPublicApi.d.ts +231 -0
- package/cjs/boot/logsPublicApi.js +75 -0
- package/cjs/boot/logsPublicApi.js.map +1 -0
- package/cjs/boot/preStartLogs.d.ts +8 -0
- package/cjs/boot/preStartLogs.js +105 -0
- package/cjs/boot/preStartLogs.js.map +1 -0
- package/cjs/boot/startLogs.d.ts +35 -0
- package/cjs/boot/startLogs.js +54 -0
- package/cjs/boot/startLogs.js.map +1 -0
- package/cjs/domain/assembly.d.ts +5 -0
- package/cjs/domain/assembly.js +35 -0
- package/cjs/domain/assembly.js.map +1 -0
- package/cjs/domain/configuration.d.ts +306 -0
- package/cjs/domain/configuration.js +86 -0
- package/cjs/domain/configuration.js.map +1 -0
- package/cjs/domain/console/consoleCollection.d.ts +20 -0
- package/cjs/domain/console/consoleCollection.js +37 -0
- package/cjs/domain/console/consoleCollection.js.map +1 -0
- package/cjs/domain/contexts/commonContext.d.ts +2 -0
- package/cjs/domain/contexts/commonContext.js +13 -0
- package/cjs/domain/contexts/commonContext.js.map +1 -0
- package/cjs/domain/contexts/internalContext.d.ts +7 -0
- package/cjs/domain/contexts/internalContext.js +11 -0
- package/cjs/domain/contexts/internalContext.js.map +1 -0
- package/cjs/domain/contexts/rumInternalContext.d.ts +2 -0
- package/cjs/domain/contexts/rumInternalContext.js +32 -0
- package/cjs/domain/contexts/rumInternalContext.js.map +1 -0
- package/cjs/domain/contexts/sessionContext.d.ts +4 -0
- package/cjs/domain/contexts/sessionContext.js +20 -0
- package/cjs/domain/contexts/sessionContext.js.map +1 -0
- package/cjs/domain/contexts/trackingConsentContext.d.ts +3 -0
- package/cjs/domain/contexts/trackingConsentContext.js +14 -0
- package/cjs/domain/contexts/trackingConsentContext.js.map +1 -0
- package/cjs/domain/createErrorFieldFromRawError.d.ts +10 -0
- package/cjs/domain/createErrorFieldFromRawError.js +15 -0
- package/cjs/domain/createErrorFieldFromRawError.js.map +1 -0
- package/cjs/domain/hooks.d.ts +28 -0
- package/cjs/domain/hooks.js +13 -0
- package/cjs/domain/hooks.js.map +1 -0
- package/cjs/domain/lifeCycle.d.ts +24 -0
- package/cjs/domain/lifeCycle.js +6 -0
- package/cjs/domain/lifeCycle.js.map +1 -0
- package/cjs/domain/logger/isAuthorized.d.ts +17 -0
- package/cjs/domain/logger/isAuthorized.js +34 -0
- package/cjs/domain/logger/isAuthorized.js.map +1 -0
- package/cjs/domain/logger/loggerCollection.d.ts +7 -0
- package/cjs/domain/logger/loggerCollection.js +47 -0
- package/cjs/domain/logger/loggerCollection.js.map +1 -0
- package/cjs/domain/logger.d.ts +48 -0
- package/cjs/domain/logger.js +112 -0
- package/cjs/domain/logger.js.map +1 -0
- package/cjs/domain/networkError/networkErrorCollection.d.ts +9 -0
- package/cjs/domain/networkError/networkErrorCollection.js +57 -0
- package/cjs/domain/networkError/networkErrorCollection.js.map +1 -0
- package/cjs/domain/plugins.d.ts +49 -0
- package/cjs/domain/plugins.js +12 -0
- package/cjs/domain/plugins.js.map +1 -0
- package/cjs/domain/remoteSdkConfiguration.d.ts +26 -0
- package/cjs/domain/remoteSdkConfiguration.js +67 -0
- package/cjs/domain/remoteSdkConfiguration.js.map +1 -0
- package/cjs/domain/report/reportCollection.d.ts +13 -0
- package/cjs/domain/report/reportCollection.js +30 -0
- package/cjs/domain/report/reportCollection.js.map +1 -0
- package/cjs/domain/reportError.d.ts +2 -0
- package/cjs/domain/reportError.js +20 -0
- package/cjs/domain/reportError.js.map +1 -0
- package/cjs/domain/runtimeError/runtimeErrorCollection.d.ts +14 -0
- package/cjs/domain/runtimeError/runtimeErrorCollection.js +29 -0
- package/cjs/domain/runtimeError/runtimeErrorCollection.js.map +1 -0
- package/cjs/domainContext.types.d.ts +11 -0
- package/cjs/entries/main.d.ts +33 -0
- package/cjs/entries/main.js +31 -0
- package/cjs/entries/main.js.map +1 -0
- package/cjs/logsEvent.types.d.ts +192 -0
- package/cjs/rawLogsEvent.types.d.ts +59 -0
- package/cjs/transport/startLogsBatch.d.ts +4 -0
- package/cjs/transport/startLogsBatch.js +22 -0
- package/cjs/transport/startLogsBatch.js.map +1 -0
- package/cjs/transport/startLogsBridge.d.ts +2 -0
- package/cjs/transport/startLogsBridge.js +13 -0
- package/cjs/transport/startLogsBridge.js.map +1 -0
- package/esm/boot/logsPublicApi.mjs +75 -0
- package/esm/boot/logsPublicApi.mjs.map +1 -0
- package/esm/boot/preStartLogs.mjs +105 -0
- package/esm/boot/preStartLogs.mjs.map +1 -0
- package/esm/boot/startLogs.mjs +54 -0
- package/esm/boot/startLogs.mjs.map +1 -0
- package/esm/domain/assembly.mjs +35 -0
- package/esm/domain/assembly.mjs.map +1 -0
- package/esm/domain/configuration.mjs +84 -0
- package/esm/domain/configuration.mjs.map +1 -0
- package/esm/domain/console/consoleCollection.mjs +36 -0
- package/esm/domain/console/consoleCollection.mjs.map +1 -0
- package/esm/domain/contexts/commonContext.mjs +13 -0
- package/esm/domain/contexts/commonContext.mjs.map +1 -0
- package/esm/domain/contexts/internalContext.mjs +11 -0
- package/esm/domain/contexts/internalContext.mjs.map +1 -0
- package/esm/domain/contexts/rumInternalContext.mjs +32 -0
- package/esm/domain/contexts/rumInternalContext.mjs.map +1 -0
- package/esm/domain/contexts/sessionContext.mjs +20 -0
- package/esm/domain/contexts/sessionContext.mjs.map +1 -0
- package/esm/domain/contexts/trackingConsentContext.mjs +14 -0
- package/esm/domain/contexts/trackingConsentContext.mjs.map +1 -0
- package/esm/domain/createErrorFieldFromRawError.mjs +15 -0
- package/esm/domain/createErrorFieldFromRawError.mjs.map +1 -0
- package/esm/domain/hooks.mjs +13 -0
- package/esm/domain/hooks.mjs.map +1 -0
- package/esm/domain/lifeCycle.mjs +7 -0
- package/esm/domain/lifeCycle.mjs.map +1 -0
- package/esm/domain/logger/isAuthorized.mjs +32 -0
- package/esm/domain/logger/isAuthorized.mjs.map +1 -0
- package/esm/domain/logger/loggerCollection.mjs +47 -0
- package/esm/domain/logger/loggerCollection.mjs.map +1 -0
- package/esm/domain/logger.mjs +110 -0
- package/esm/domain/logger.mjs.map +1 -0
- package/esm/domain/networkError/networkErrorCollection.mjs +56 -0
- package/esm/domain/networkError/networkErrorCollection.mjs.map +1 -0
- package/esm/domain/plugins.mjs +12 -0
- package/esm/domain/plugins.mjs.map +1 -0
- package/esm/domain/remoteSdkConfiguration.mjs +65 -0
- package/esm/domain/remoteSdkConfiguration.mjs.map +1 -0
- package/esm/domain/report/reportCollection.mjs +30 -0
- package/esm/domain/report/reportCollection.mjs.map +1 -0
- package/esm/domain/reportError.mjs +20 -0
- package/esm/domain/reportError.mjs.map +1 -0
- package/esm/domain/runtimeError/runtimeErrorCollection.mjs +29 -0
- package/esm/domain/runtimeError/runtimeErrorCollection.mjs.map +1 -0
- package/esm/entries/main.mjs +27 -0
- package/esm/entries/main.mjs.map +1 -0
- package/esm/transport/startLogsBatch.mjs +22 -0
- package/esm/transport/startLogsBatch.mjs.map +1 -0
- package/esm/transport/startLogsBridge.mjs +13 -0
- package/esm/transport/startLogsBridge.mjs.map +1 -0
- package/package.json +53 -3
- package/src/boot/logsPublicApi.ts +427 -0
- package/src/boot/preStartLogs.ts +192 -0
- package/src/boot/startLogs.ts +83 -0
- package/src/domain/assembly.ts +73 -0
- package/src/domain/configuration.ts +176 -0
- package/src/domain/console/consoleCollection.ts +58 -0
- package/src/domain/contexts/commonContext.ts +15 -0
- package/src/domain/contexts/internalContext.ts +19 -0
- package/src/domain/contexts/rumInternalContext.ts +60 -0
- package/src/domain/contexts/sessionContext.ts +34 -0
- package/src/domain/contexts/trackingConsentContext.ts +18 -0
- package/src/domain/createErrorFieldFromRawError.ts +22 -0
- package/src/domain/hooks.ts +40 -0
- package/src/domain/lifeCycle.ts +25 -0
- package/src/domain/logger/isAuthorized.ts +33 -0
- package/src/domain/logger/loggerCollection.ts +69 -0
- package/src/domain/logger.ts +202 -0
- package/src/domain/networkError/networkErrorCollection.ts +104 -0
- package/src/domain/plugins.ts +72 -0
- package/src/domain/remoteSdkConfiguration.ts +105 -0
- package/src/domain/report/reportCollection.ts +47 -0
- package/src/domain/reportError.ts +20 -0
- package/src/domain/runtimeError/runtimeErrorCollection.ts +51 -0
- package/src/domainContext.types.ts +21 -0
- package/src/entries/main.ts +65 -0
- package/src/logsEvent.types.ts +198 -0
- package/src/rawLogsEvent.types.ts +74 -0
- package/src/transport/startLogsBatch.ts +29 -0
- package/src/transport/startLogsBridge.ts +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackingConsentContext.mjs","names":[],"sources":["../../../src/domain/contexts/trackingConsentContext.ts"],"sourcesContent":["import { DISCARDED, SKIPPED } from '@kubesense/kubesense-js-core/assembly'\nimport type { TrackingConsentState } from '@kubesense/kubesense-browser-core'\nimport type { Hooks } from '../hooks'\n\nexport function startTrackingConsentContext(hooks: Hooks, trackingConsentState: TrackingConsentState) {\n function isConsented() {\n const wasConsented = trackingConsentState.isGranted()\n\n if (!wasConsented) {\n return DISCARDED\n }\n\n return SKIPPED\n }\n\n hooks.assembleEventDefaults.register(isConsented)\n hooks.assembleTelemetry.register(isConsented)\n}\n"],"mappings":";;AAIA,SAAgB,4BAA4B,OAAc,sBAA4C;CACpG,SAAS,cAAc;EAGrB,IAAI,CAFiB,qBAAqB,UAE1B,GACd,OAAO;EAGT,OAAO;CACT;CAEA,MAAM,sBAAsB,SAAS,WAAW;CAChD,MAAM,kBAAkB,SAAS,WAAW;AAC9C"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
//#region src/domain/createErrorFieldFromRawError.ts
|
|
2
|
+
function createErrorFieldFromRawError(rawError, { includeMessage = false } = {}) {
|
|
3
|
+
return {
|
|
4
|
+
stack: rawError.stack,
|
|
5
|
+
kind: rawError.type,
|
|
6
|
+
message: includeMessage ? rawError.message : void 0,
|
|
7
|
+
causes: rawError.causes,
|
|
8
|
+
fingerprint: rawError.fingerprint,
|
|
9
|
+
handling: rawError.handling
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { createErrorFieldFromRawError };
|
|
14
|
+
|
|
15
|
+
//# sourceMappingURL=createErrorFieldFromRawError.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createErrorFieldFromRawError.mjs","names":[],"sources":["../../src/domain/createErrorFieldFromRawError.ts"],"sourcesContent":["import type { RawError } from '@kubesense/kubesense-browser-core'\nimport type { RawLoggerLogsEvent } from '../rawLogsEvent.types'\n\nexport function createErrorFieldFromRawError(\n rawError: RawError,\n {\n /**\n * Set this to `true` to include the error message in the error field. In most cases, the error\n * message is already included in the log message, so we don't need to include it again.\n */\n includeMessage = false,\n } = {}\n): NonNullable<RawLoggerLogsEvent['error']> {\n return {\n stack: rawError.stack,\n kind: rawError.type,\n message: includeMessage ? rawError.message : undefined,\n causes: rawError.causes,\n fingerprint: rawError.fingerprint,\n handling: rawError.handling,\n }\n}\n"],"mappings":";AAGA,SAAgB,6BACd,UACA,EAKE,iBAAiB,UACf,CAAC,GACqC;CAC1C,OAAO;EACL,OAAO,SAAS;EAChB,MAAM,SAAS;EACf,SAAS,iBAAiB,SAAS,UAAU,KAAA;EAC7C,QAAQ,SAAS;EACjB,aAAa,SAAS;EACtB,UAAU,SAAS;CACrB;AACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createHook } from "@kubesense/kubesense-js-core/assembly";
|
|
2
|
+
//#region src/domain/hooks.ts
|
|
3
|
+
function createHooks() {
|
|
4
|
+
return {
|
|
5
|
+
assembleEventDefaults: createHook(),
|
|
6
|
+
assembleTelemetry: createHook(),
|
|
7
|
+
assembleEvent: createHook()
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { createHooks };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=hooks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.mjs","names":[],"sources":["../../src/domain/hooks.ts"],"sourcesContent":["import type { RelativeTime } from '@kubesense/kubesense-js-core/time'\nimport type { TelemetryEvent } from '@kubesense/kubesense-browser-core'\nimport { createHook } from '@kubesense/kubesense-js-core/assembly'\nimport type { Hook } from '@kubesense/kubesense-js-core/assembly'\nimport type { RecursivePartial } from '@kubesense/kubesense-js-core/util'\nimport type { LogsEvent } from '../logsEvent.types'\nimport type { RawLogsEvent } from '../rawLogsEvent.types'\nimport type { LogsEventDomainContext } from '../domainContext.types'\n\nexport type DefaultLogsEventAttributes = RecursivePartial<LogsEvent>\nexport type DefaultTelemetryEventAttributes = RecursivePartial<TelemetryEvent>\n\ntype DeepReadonly<T> = {\n readonly [K in keyof T]: DeepReadonly<T[K]>\n}\n\n// Use readonly and DeepReadonly to prevent assemble hook callbacks from mutating the inputs.\n// DeepReadonly is only applied to objects rather than the entire AssembleHookParams to avoid casts for primitives.\nexport interface AssembleHookParams {\n readonly startTime: RelativeTime\n rawLogsEvent: DeepReadonly<RawLogsEvent>\n domainContext: DeepReadonly<LogsEventDomainContext>\n}\n\nexport type AssembleHook = Hook<AssembleHookParams, DefaultLogsEventAttributes>\nexport type AssembleTelemetryHook = Hook<{ startTime: RelativeTime }, DefaultTelemetryEventAttributes>\n\nexport interface Hooks {\n assembleEventDefaults: AssembleHook\n assembleTelemetry: AssembleTelemetryHook\n assembleEvent: AssembleHook\n}\n\nexport function createHooks(): Hooks {\n return {\n assembleEventDefaults: createHook(),\n assembleTelemetry: createHook(),\n assembleEvent: createHook(),\n }\n}\n"],"mappings":";;AAiCA,SAAgB,cAAqB;CACnC,OAAO;EACL,uBAAuB,WAAW;EAClC,mBAAmB,WAAW;EAC9B,eAAe,WAAW;CAC5B;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifeCycle.mjs","names":[],"sources":["../../src/domain/lifeCycle.ts"],"sourcesContent":["import { AbstractLifeCycle } from '@kubesense/kubesense-browser-core'\nimport type { Context } from '@kubesense/kubesense-browser-core'\nimport type { LogsEvent } from '../logsEvent.types'\nimport type { CommonContext, RawLogsEvent } from '../rawLogsEvent.types'\nimport type { LogsEventDomainContext } from '../domainContext.types'\n\nexport const enum LifeCycleEventType {\n RAW_LOG_COLLECTED,\n LOG_COLLECTED,\n}\n\ninterface LifeCycleEventMap {\n [LifeCycleEventType.RAW_LOG_COLLECTED]: RawLogsEventCollectedData\n [LifeCycleEventType.LOG_COLLECTED]: LogsEvent & Context\n}\n\nexport const LifeCycle = AbstractLifeCycle<LifeCycleEventMap>\nexport type LifeCycle = AbstractLifeCycle<LifeCycleEventMap>\n\nexport interface RawLogsEventCollectedData<E extends RawLogsEvent = RawLogsEvent> {\n rawLogsEvent: E\n savedCommonContext?: CommonContext\n domainContext?: LogsEventDomainContext<E['origin']>\n ktags?: string[]\n}\n"],"mappings":";;AAgBA,MAAa,YAAY"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/domain/logger/isAuthorized.ts
|
|
2
|
+
function isAuthorized(status, handlerType, logger) {
|
|
3
|
+
const loggerHandler = logger.getHandler();
|
|
4
|
+
const sanitizedHandlerType = Array.isArray(loggerHandler) ? loggerHandler : [loggerHandler];
|
|
5
|
+
return STATUS_PRIORITIES[status] >= STATUS_PRIORITIES[logger.getLevel()] && sanitizedHandlerType.includes(handlerType);
|
|
6
|
+
}
|
|
7
|
+
const StatusType = {
|
|
8
|
+
ok: "ok",
|
|
9
|
+
debug: "debug",
|
|
10
|
+
info: "info",
|
|
11
|
+
notice: "notice",
|
|
12
|
+
warn: "warn",
|
|
13
|
+
error: "error",
|
|
14
|
+
critical: "critical",
|
|
15
|
+
alert: "alert",
|
|
16
|
+
emerg: "emerg"
|
|
17
|
+
};
|
|
18
|
+
const STATUS_PRIORITIES = {
|
|
19
|
+
[StatusType.ok]: 0,
|
|
20
|
+
[StatusType.debug]: 1,
|
|
21
|
+
[StatusType.info]: 2,
|
|
22
|
+
[StatusType.notice]: 4,
|
|
23
|
+
[StatusType.warn]: 5,
|
|
24
|
+
[StatusType.error]: 6,
|
|
25
|
+
[StatusType.critical]: 7,
|
|
26
|
+
[StatusType.alert]: 8,
|
|
27
|
+
[StatusType.emerg]: 9
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { STATUS_PRIORITIES, StatusType, isAuthorized };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=isAuthorized.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isAuthorized.mjs","names":[],"sources":["../../../src/domain/logger/isAuthorized.ts"],"sourcesContent":["import type { Logger, HandlerType } from '../logger'\n\nexport function isAuthorized(status: StatusType, handlerType: HandlerType, logger: Logger) {\n const loggerHandler = logger.getHandler()\n const sanitizedHandlerType = Array.isArray(loggerHandler) ? loggerHandler : [loggerHandler]\n return STATUS_PRIORITIES[status] >= STATUS_PRIORITIES[logger.getLevel()] && sanitizedHandlerType.includes(handlerType)\n}\n\nexport const StatusType = {\n ok: 'ok',\n debug: 'debug',\n info: 'info',\n notice: 'notice',\n warn: 'warn',\n error: 'error',\n critical: 'critical',\n alert: 'alert',\n emerg: 'emerg',\n} as const\n\nexport const STATUS_PRIORITIES: { [key in StatusType]: number } = {\n [StatusType.ok]: 0,\n [StatusType.debug]: 1,\n [StatusType.info]: 2,\n [StatusType.notice]: 4,\n [StatusType.warn]: 5,\n [StatusType.error]: 6,\n [StatusType.critical]: 7,\n [StatusType.alert]: 8,\n [StatusType.emerg]: 9,\n}\n\nexport type StatusType = (typeof StatusType)[keyof typeof StatusType]\n"],"mappings":";AAEA,SAAgB,aAAa,QAAoB,aAA0B,QAAgB;CACzF,MAAM,gBAAgB,OAAO,WAAW;CACxC,MAAM,uBAAuB,MAAM,QAAQ,aAAa,IAAI,gBAAgB,CAAC,aAAa;CAC1F,OAAO,kBAAkB,WAAW,kBAAkB,OAAO,SAAS,MAAM,qBAAqB,SAAS,WAAW;AACvH;AAEA,MAAa,aAAa;CACxB,IAAI;CACJ,OAAO;CACP,MAAM;CACN,QAAQ;CACR,MAAM;CACN,OAAO;CACP,UAAU;CACV,OAAO;CACP,OAAO;AACT;AAEA,MAAa,oBAAqD;EAC/D,WAAW,KAAK;EAChB,WAAW,QAAQ;EACnB,WAAW,OAAO;EAClB,WAAW,SAAS;EACpB,WAAW,OAAO;EAClB,WAAW,QAAQ;EACnB,WAAW,WAAW;EACtB,WAAW,QAAQ;EACnB,WAAW,QAAQ;AACtB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { StatusType, isAuthorized } from "./isAuthorized.mjs";
|
|
2
|
+
import { HandlerType } from "../logger.mjs";
|
|
3
|
+
import "../lifeCycle.mjs";
|
|
4
|
+
import { ConsoleApiName, combine, globalConsole, originalConsoleMethods } from "@kubesense/kubesense-js-core/util";
|
|
5
|
+
import { ErrorSource } from "@kubesense/kubesense-browser-core";
|
|
6
|
+
import { timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
7
|
+
//#region src/domain/logger/loggerCollection.ts
|
|
8
|
+
function startLoggerCollection(lifeCycle) {
|
|
9
|
+
function handleLog(logsMessage, logger, handlingStack, savedCommonContext, savedDate) {
|
|
10
|
+
const messageContext = combine(logger.getContext(), logsMessage.context);
|
|
11
|
+
if (isAuthorized(logsMessage.status, HandlerType.console, logger)) displayInConsole(logsMessage, messageContext);
|
|
12
|
+
if (isAuthorized(logsMessage.status, HandlerType.http, logger)) {
|
|
13
|
+
const rawLogEventData = {
|
|
14
|
+
rawLogsEvent: combine({
|
|
15
|
+
date: savedDate || timeStampNow(),
|
|
16
|
+
message: logsMessage.message,
|
|
17
|
+
status: logsMessage.status,
|
|
18
|
+
origin: ErrorSource.LOGGER,
|
|
19
|
+
_kubesense: { debug_ids: logsMessage.debugIds }
|
|
20
|
+
}, messageContext),
|
|
21
|
+
savedCommonContext,
|
|
22
|
+
ktags: logger.getTags()
|
|
23
|
+
};
|
|
24
|
+
if (handlingStack) rawLogEventData.domainContext = { handlingStack };
|
|
25
|
+
lifeCycle.notify(0, rawLogEventData);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return { handleLog };
|
|
29
|
+
}
|
|
30
|
+
const loggerToConsoleApiName = {
|
|
31
|
+
[StatusType.ok]: ConsoleApiName.debug,
|
|
32
|
+
[StatusType.debug]: ConsoleApiName.debug,
|
|
33
|
+
[StatusType.info]: ConsoleApiName.info,
|
|
34
|
+
[StatusType.notice]: ConsoleApiName.info,
|
|
35
|
+
[StatusType.warn]: ConsoleApiName.warn,
|
|
36
|
+
[StatusType.error]: ConsoleApiName.error,
|
|
37
|
+
[StatusType.critical]: ConsoleApiName.error,
|
|
38
|
+
[StatusType.alert]: ConsoleApiName.error,
|
|
39
|
+
[StatusType.emerg]: ConsoleApiName.error
|
|
40
|
+
};
|
|
41
|
+
function displayInConsole({ status, message }, messageContext) {
|
|
42
|
+
originalConsoleMethods[loggerToConsoleApiName[status]].call(globalConsole, message, messageContext);
|
|
43
|
+
}
|
|
44
|
+
//#endregion
|
|
45
|
+
export { startLoggerCollection };
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=loggerCollection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loggerCollection.mjs","names":[],"sources":["../../../src/domain/logger/loggerCollection.ts"],"sourcesContent":["import { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { TimeStamp } from '@kubesense/kubesense-js-core/time'\nimport type { Context } from '@kubesense/kubesense-browser-core'\nimport { ErrorSource } from '@kubesense/kubesense-browser-core'\nimport { originalConsoleMethods, globalConsole, ConsoleApiName, combine } from '@kubesense/kubesense-js-core/util'\nimport type { CommonContext, RawLogsEvent } from '../../rawLogsEvent.types'\nimport type { LifeCycle, RawLogsEventCollectedData } from '../lifeCycle'\nimport { LifeCycleEventType } from '../lifeCycle'\nimport type { Logger, LogsMessage } from '../logger'\nimport { HandlerType } from '../logger'\nimport { isAuthorized, StatusType } from './isAuthorized'\n\nexport function startLoggerCollection(lifeCycle: LifeCycle) {\n function handleLog(\n logsMessage: LogsMessage,\n logger: Logger,\n handlingStack?: string,\n savedCommonContext?: CommonContext,\n savedDate?: TimeStamp\n ) {\n const messageContext = combine(logger.getContext(), logsMessage.context)\n\n if (isAuthorized(logsMessage.status, HandlerType.console, logger)) {\n displayInConsole(logsMessage, messageContext)\n }\n\n if (isAuthorized(logsMessage.status, HandlerType.http, logger)) {\n const rawLogEventData: RawLogsEventCollectedData<RawLogsEvent> = {\n rawLogsEvent: combine(\n {\n date: savedDate || timeStampNow(),\n message: logsMessage.message,\n status: logsMessage.status,\n origin: ErrorSource.LOGGER,\n _kubesense: { debug_ids: logsMessage.debugIds },\n },\n messageContext\n ),\n savedCommonContext,\n ktags: logger.getTags(),\n }\n\n if (handlingStack) {\n rawLogEventData.domainContext = { handlingStack }\n }\n\n lifeCycle.notify(LifeCycleEventType.RAW_LOG_COLLECTED, rawLogEventData)\n }\n }\n\n return {\n handleLog,\n }\n}\nconst loggerToConsoleApiName: { [key in StatusType]: ConsoleApiName } = {\n [StatusType.ok]: ConsoleApiName.debug,\n [StatusType.debug]: ConsoleApiName.debug,\n [StatusType.info]: ConsoleApiName.info,\n [StatusType.notice]: ConsoleApiName.info,\n [StatusType.warn]: ConsoleApiName.warn,\n [StatusType.error]: ConsoleApiName.error,\n [StatusType.critical]: ConsoleApiName.error,\n [StatusType.alert]: ConsoleApiName.error,\n [StatusType.emerg]: ConsoleApiName.error,\n}\n\nfunction displayInConsole({ status, message }: LogsMessage, messageContext: Context | undefined) {\n originalConsoleMethods[loggerToConsoleApiName[status]].call(globalConsole, message, messageContext)\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,sBAAsB,WAAsB;CAC1D,SAAS,UACP,aACA,QACA,eACA,oBACA,WACA;EACA,MAAM,iBAAiB,QAAQ,OAAO,WAAW,GAAG,YAAY,OAAO;EAEvE,IAAI,aAAa,YAAY,QAAQ,YAAY,SAAS,MAAM,GAC9D,iBAAiB,aAAa,cAAc;EAG9C,IAAI,aAAa,YAAY,QAAQ,YAAY,MAAM,MAAM,GAAG;GAC9D,MAAM,kBAA2D;IAC/D,cAAc,QACZ;KACE,MAAM,aAAa,aAAa;KAChC,SAAS,YAAY;KACrB,QAAQ,YAAY;KACpB,QAAQ,YAAY;KACpB,YAAY,EAAE,WAAW,YAAY,SAAS;IAChD,GACA,cACF;IACA;IACA,OAAO,OAAO,QAAQ;GACxB;GAEA,IAAI,eACF,gBAAgB,gBAAgB,EAAE,cAAc;GAGlD,UAAU,OAAA,GAA6C,eAAe;EACxE;CACF;CAEA,OAAO,EACL,UACF;AACF;AACA,MAAM,yBAAkE;EACrE,WAAW,KAAK,eAAe;EAC/B,WAAW,QAAQ,eAAe;EAClC,WAAW,OAAO,eAAe;EACjC,WAAW,SAAS,eAAe;EACnC,WAAW,OAAO,eAAe;EACjC,WAAW,QAAQ,eAAe;EAClC,WAAW,WAAW,eAAe;EACrC,WAAW,QAAQ,eAAe;EAClC,WAAW,QAAQ,eAAe;AACrC;AAEA,SAAS,iBAAiB,EAAE,QAAQ,WAAwB,gBAAqC;CAC/F,uBAAuB,uBAAuB,QAAQ,CAAC,KAAK,eAAe,SAAS,cAAc;AACpG"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { StatusType, isAuthorized } from "./logger/isAuthorized.mjs";
|
|
2
|
+
import { createErrorFieldFromRawError } from "./createErrorFieldFromRawError.mjs";
|
|
3
|
+
import { combine } from "@kubesense/kubesense-js-core/util";
|
|
4
|
+
import { ErrorHandling, ErrorSource, NonErrorPrefix, buildTag, computeRawError, createContextManager, createHandlingStack, sanitize, sanitizeTag } from "@kubesense/kubesense-browser-core";
|
|
5
|
+
import { callMonitored } from "@kubesense/kubesense-js-core/monitor";
|
|
6
|
+
import { clocksNow } from "@kubesense/kubesense-js-core/time";
|
|
7
|
+
//#region src/domain/logger.ts
|
|
8
|
+
const HandlerType = {
|
|
9
|
+
console: "console",
|
|
10
|
+
http: "http",
|
|
11
|
+
silent: "silent"
|
|
12
|
+
};
|
|
13
|
+
const STATUSES = Object.keys(StatusType);
|
|
14
|
+
var Logger = class {
|
|
15
|
+
constructor(handleLogStrategy, name, handlerType = HandlerType.http, level = StatusType.debug, loggerContext = {}) {
|
|
16
|
+
this.handleLogStrategy = handleLogStrategy;
|
|
17
|
+
this.handlerType = handlerType;
|
|
18
|
+
this.level = level;
|
|
19
|
+
this.contextManager = createContextManager("logger");
|
|
20
|
+
this.tags = [];
|
|
21
|
+
this.contextManager.setContext(loggerContext);
|
|
22
|
+
if (name) this.contextManager.setContextProperty("logger", { name });
|
|
23
|
+
}
|
|
24
|
+
logImplementation(message, messageContext, status = StatusType.info, error, handlingStack) {
|
|
25
|
+
callMonitored(() => {
|
|
26
|
+
const sanitizedMessageContext = sanitize(messageContext);
|
|
27
|
+
let context;
|
|
28
|
+
let debugIds;
|
|
29
|
+
if (error !== void 0 && error !== null) {
|
|
30
|
+
const rawError = computeRawError({
|
|
31
|
+
originalError: error,
|
|
32
|
+
nonErrorPrefix: NonErrorPrefix.PROVIDED,
|
|
33
|
+
source: ErrorSource.LOGGER,
|
|
34
|
+
handling: ErrorHandling.HANDLED,
|
|
35
|
+
startClocks: clocksNow()
|
|
36
|
+
});
|
|
37
|
+
debugIds = rawError.debugIds;
|
|
38
|
+
context = combine({ error: createErrorFieldFromRawError(rawError, { includeMessage: true }) }, rawError.context, sanitizedMessageContext);
|
|
39
|
+
} else context = sanitizedMessageContext;
|
|
40
|
+
this.handleLogStrategy({
|
|
41
|
+
message: sanitize(message),
|
|
42
|
+
context,
|
|
43
|
+
status,
|
|
44
|
+
...debugIds ? { debugIds } : {}
|
|
45
|
+
}, this, handlingStack);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
log(message, messageContext, status = StatusType.info, error) {
|
|
49
|
+
let handlingStack;
|
|
50
|
+
if (isAuthorized(status, HandlerType.http, this)) handlingStack = createHandlingStack("log");
|
|
51
|
+
this.logImplementation(message, messageContext, status, error, handlingStack);
|
|
52
|
+
}
|
|
53
|
+
setContext(context) {
|
|
54
|
+
this.contextManager.setContext(context);
|
|
55
|
+
}
|
|
56
|
+
getContext() {
|
|
57
|
+
return this.contextManager.getContext();
|
|
58
|
+
}
|
|
59
|
+
setContextProperty(key, value) {
|
|
60
|
+
this.contextManager.setContextProperty(key, value);
|
|
61
|
+
}
|
|
62
|
+
removeContextProperty(key) {
|
|
63
|
+
this.contextManager.removeContextProperty(key);
|
|
64
|
+
}
|
|
65
|
+
clearContext() {
|
|
66
|
+
this.contextManager.clearContext();
|
|
67
|
+
}
|
|
68
|
+
addTag(key, value) {
|
|
69
|
+
this.tags.push(buildTag(key, value));
|
|
70
|
+
}
|
|
71
|
+
removeTagsWithKey(key) {
|
|
72
|
+
const sanitizedKey = sanitizeTag(key);
|
|
73
|
+
this.tags = this.tags.filter((tag) => tag !== sanitizedKey && !tag.startsWith(`${sanitizedKey}:`));
|
|
74
|
+
}
|
|
75
|
+
getTags() {
|
|
76
|
+
return this.tags.slice();
|
|
77
|
+
}
|
|
78
|
+
setHandler(handler) {
|
|
79
|
+
this.handlerType = handler;
|
|
80
|
+
}
|
|
81
|
+
getHandler() {
|
|
82
|
+
return this.handlerType;
|
|
83
|
+
}
|
|
84
|
+
setLevel(level) {
|
|
85
|
+
this.level = level;
|
|
86
|
+
}
|
|
87
|
+
getLevel() {
|
|
88
|
+
return this.level;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
Logger.prototype.ok = createLoggerMethod(StatusType.ok);
|
|
92
|
+
Logger.prototype.debug = createLoggerMethod(StatusType.debug);
|
|
93
|
+
Logger.prototype.info = createLoggerMethod(StatusType.info);
|
|
94
|
+
Logger.prototype.notice = createLoggerMethod(StatusType.notice);
|
|
95
|
+
Logger.prototype.warn = createLoggerMethod(StatusType.warn);
|
|
96
|
+
Logger.prototype.error = createLoggerMethod(StatusType.error);
|
|
97
|
+
Logger.prototype.critical = createLoggerMethod(StatusType.critical);
|
|
98
|
+
Logger.prototype.alert = createLoggerMethod(StatusType.alert);
|
|
99
|
+
Logger.prototype.emerg = createLoggerMethod(StatusType.emerg);
|
|
100
|
+
function createLoggerMethod(status) {
|
|
101
|
+
return function(message, messageContext, error) {
|
|
102
|
+
let handlingStack;
|
|
103
|
+
if (isAuthorized(status, HandlerType.http, this)) handlingStack = createHandlingStack("log");
|
|
104
|
+
this.logImplementation(message, messageContext, status, error, handlingStack);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
//#endregion
|
|
108
|
+
export { HandlerType, Logger, STATUSES };
|
|
109
|
+
|
|
110
|
+
//# sourceMappingURL=logger.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.mjs","names":[],"sources":["../../src/domain/logger.ts"],"sourcesContent":["import type { Context, ContextManager, DebugIdEntry } from '@kubesense/kubesense-browser-core'\nimport { clocksNow } from '@kubesense/kubesense-js-core/time'\nimport { combine } from '@kubesense/kubesense-js-core/util'\nimport {\n computeRawError,\n ErrorHandling,\n createContextManager,\n ErrorSource,\n sanitize,\n NonErrorPrefix,\n createHandlingStack,\n buildTag,\n sanitizeTag,\n} from '@kubesense/kubesense-browser-core'\nimport { callMonitored } from '@kubesense/kubesense-js-core/monitor'\n\nimport { isAuthorized, StatusType } from './logger/isAuthorized'\nimport { createErrorFieldFromRawError } from './createErrorFieldFromRawError'\n\nexport interface LogsMessage {\n message: string\n status: StatusType\n context?: Context\n debugIds?: DebugIdEntry[]\n}\n\nexport const HandlerType = {\n console: 'console',\n http: 'http',\n silent: 'silent',\n} as const\n\nexport type HandlerType = (typeof HandlerType)[keyof typeof HandlerType]\nexport const STATUSES = Object.keys(StatusType) as StatusType[]\n\n// note: it is safe to merge declarations as long as the methods are actually defined on the prototype\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging, no-restricted-syntax\nexport class Logger {\n private contextManager: ContextManager\n\n // Tags are formatted as either `key:value` or `key_only`\n private tags: string[]\n\n constructor(\n private handleLogStrategy: (logsMessage: LogsMessage, logger: Logger, handlingStack?: string) => void,\n name?: string,\n private handlerType: HandlerType | HandlerType[] = HandlerType.http,\n private level: StatusType = StatusType.debug,\n loggerContext: object = {}\n ) {\n this.contextManager = createContextManager('logger')\n this.tags = []\n this.contextManager.setContext(loggerContext)\n if (name) {\n this.contextManager.setContextProperty('logger', { name })\n }\n }\n\n logImplementation(\n message: string,\n messageContext?: object,\n status: StatusType = StatusType.info,\n error?: Error,\n handlingStack?: string\n ) {\n callMonitored(() => {\n const sanitizedMessageContext = sanitize(messageContext) as Context\n let context: Context\n let debugIds: DebugIdEntry[] | undefined\n\n if (error !== undefined && error !== null) {\n const rawError = computeRawError({\n originalError: error,\n nonErrorPrefix: NonErrorPrefix.PROVIDED,\n source: ErrorSource.LOGGER,\n handling: ErrorHandling.HANDLED,\n startClocks: clocksNow(),\n })\n\n debugIds = rawError.debugIds\n context = combine(\n {\n error: createErrorFieldFromRawError(rawError, { includeMessage: true }),\n },\n rawError.context,\n sanitizedMessageContext\n )\n } else {\n context = sanitizedMessageContext\n }\n\n this.handleLogStrategy(\n {\n message: sanitize(message)!,\n context,\n status,\n ...(debugIds ? { debugIds } : {}),\n },\n this,\n handlingStack\n )\n })\n }\n\n log(message: string, messageContext?: object, status: StatusType = StatusType.info, error?: Error) {\n let handlingStack: string | undefined\n\n if (isAuthorized(status, HandlerType.http, this)) {\n handlingStack = createHandlingStack('log')\n }\n\n this.logImplementation(message, messageContext, status, error, handlingStack)\n }\n\n setContext(context: object) {\n this.contextManager.setContext(context)\n }\n\n getContext() {\n return this.contextManager.getContext()\n }\n\n setContextProperty(key: string, value: any) {\n this.contextManager.setContextProperty(key, value)\n }\n\n removeContextProperty(key: string) {\n this.contextManager.removeContextProperty(key)\n }\n\n clearContext() {\n this.contextManager.clearContext()\n }\n\n addTag(key: string, value?: string) {\n this.tags.push(buildTag(key, value))\n }\n\n removeTagsWithKey(key: string) {\n const sanitizedKey = sanitizeTag(key)\n\n this.tags = this.tags.filter((tag) => tag !== sanitizedKey && !tag.startsWith(`${sanitizedKey}:`))\n }\n\n getTags() {\n return this.tags.slice()\n }\n\n setHandler(handler: HandlerType | HandlerType[]) {\n this.handlerType = handler\n }\n\n getHandler() {\n return this.handlerType\n }\n\n setLevel(level: StatusType) {\n this.level = level\n }\n\n getLevel() {\n return this.level\n }\n}\n\n/* eslint-disable local-rules/disallow-side-effects */\nLogger.prototype.ok = createLoggerMethod(StatusType.ok)\nLogger.prototype.debug = createLoggerMethod(StatusType.debug)\nLogger.prototype.info = createLoggerMethod(StatusType.info)\nLogger.prototype.notice = createLoggerMethod(StatusType.notice)\nLogger.prototype.warn = createLoggerMethod(StatusType.warn)\nLogger.prototype.error = createLoggerMethod(StatusType.error)\nLogger.prototype.critical = createLoggerMethod(StatusType.critical)\nLogger.prototype.alert = createLoggerMethod(StatusType.alert)\nLogger.prototype.emerg = createLoggerMethod(StatusType.emerg)\n/* eslint-enable local-rules/disallow-side-effects */\n\n// note: it is safe to merge declarations as long as the methods are actually defined on the prototype\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface Logger {\n ok(message: string, messageContext?: object, error?: Error): void\n debug(message: string, messageContext?: object, error?: Error): void\n info(message: string, messageContext?: object, error?: Error): void\n notice(message: string, messageContext?: object, error?: Error): void\n warn(message: string, messageContext?: object, error?: Error): void\n error(message: string, messageContext?: object, error?: Error): void\n critical(message: string, messageContext?: object, error?: Error): void\n alert(message: string, messageContext?: object, error?: Error): void\n emerg(message: string, messageContext?: object, error?: Error): void\n}\n\nfunction createLoggerMethod(status: StatusType) {\n return function (this: Logger, message: string, messageContext?: object, error?: Error) {\n let handlingStack: string | undefined\n\n if (isAuthorized(status, HandlerType.http, this)) {\n handlingStack = createHandlingStack('log')\n }\n\n this.logImplementation(message, messageContext, status, error, handlingStack)\n }\n}\n"],"mappings":";;;;;;;AA0BA,MAAa,cAAc;CACzB,SAAS;CACT,MAAM;CACN,QAAQ;AACV;AAGA,MAAa,WAAW,OAAO,KAAK,UAAU;AAI9C,IAAa,SAAb,MAAoB;CAMlB,YACE,mBACA,MACA,cAAmD,YAAY,MAC/D,QAA4B,WAAW,OACvC,gBAAwB,CAAC,GACzB;EALQ,KAAA,oBAAA;EAEA,KAAA,cAAA;EACA,KAAA,QAAA;EAGR,KAAK,iBAAiB,qBAAqB,QAAQ;EACnD,KAAK,OAAO,CAAC;EACb,KAAK,eAAe,WAAW,aAAa;EAC5C,IAAI,MACF,KAAK,eAAe,mBAAmB,UAAU,EAAE,KAAK,CAAC;CAE7D;CAEA,kBACE,SACA,gBACA,SAAqB,WAAW,MAChC,OACA,eACA;EACA,oBAAoB;GAClB,MAAM,0BAA0B,SAAS,cAAc;GACvD,IAAI;GACJ,IAAI;GAEJ,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM;IACzC,MAAM,WAAW,gBAAgB;KAC/B,eAAe;KACf,gBAAgB,eAAe;KAC/B,QAAQ,YAAY;KACpB,UAAU,cAAc;KACxB,aAAa,UAAU;IACzB,CAAC;IAED,WAAW,SAAS;IACpB,UAAU,QACR,EACE,OAAO,6BAA6B,UAAU,EAAE,gBAAgB,KAAK,CAAC,EACxE,GACA,SAAS,SACT,uBACF;GACF,OACE,UAAU;GAGZ,KAAK,kBACH;IACE,SAAS,SAAS,OAAO;IACzB;IACA;IACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;GACjC,GACA,MACA,aACF;EACF,CAAC;CACH;CAEA,IAAI,SAAiB,gBAAyB,SAAqB,WAAW,MAAM,OAAe;EACjG,IAAI;EAEJ,IAAI,aAAa,QAAQ,YAAY,MAAM,IAAI,GAC7C,gBAAgB,oBAAoB,KAAK;EAG3C,KAAK,kBAAkB,SAAS,gBAAgB,QAAQ,OAAO,aAAa;CAC9E;CAEA,WAAW,SAAiB;EAC1B,KAAK,eAAe,WAAW,OAAO;CACxC;CAEA,aAAa;EACX,OAAO,KAAK,eAAe,WAAW;CACxC;CAEA,mBAAmB,KAAa,OAAY;EAC1C,KAAK,eAAe,mBAAmB,KAAK,KAAK;CACnD;CAEA,sBAAsB,KAAa;EACjC,KAAK,eAAe,sBAAsB,GAAG;CAC/C;CAEA,eAAe;EACb,KAAK,eAAe,aAAa;CACnC;CAEA,OAAO,KAAa,OAAgB;EAClC,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,CAAC;CACrC;CAEA,kBAAkB,KAAa;EAC7B,MAAM,eAAe,YAAY,GAAG;EAEpC,KAAK,OAAO,KAAK,KAAK,QAAQ,QAAQ,QAAQ,gBAAgB,CAAC,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;CACnG;CAEA,UAAU;EACR,OAAO,KAAK,KAAK,MAAM;CACzB;CAEA,WAAW,SAAsC;EAC/C,KAAK,cAAc;CACrB;CAEA,aAAa;EACX,OAAO,KAAK;CACd;CAEA,SAAS,OAAmB;EAC1B,KAAK,QAAQ;CACf;CAEA,WAAW;EACT,OAAO,KAAK;CACd;AACF;AAGA,OAAO,UAAU,KAAK,mBAAmB,WAAW,EAAE;AACtD,OAAO,UAAU,QAAQ,mBAAmB,WAAW,KAAK;AAC5D,OAAO,UAAU,OAAO,mBAAmB,WAAW,IAAI;AAC1D,OAAO,UAAU,SAAS,mBAAmB,WAAW,MAAM;AAC9D,OAAO,UAAU,OAAO,mBAAmB,WAAW,IAAI;AAC1D,OAAO,UAAU,QAAQ,mBAAmB,WAAW,KAAK;AAC5D,OAAO,UAAU,WAAW,mBAAmB,WAAW,QAAQ;AAClE,OAAO,UAAU,QAAQ,mBAAmB,WAAW,KAAK;AAC5D,OAAO,UAAU,QAAQ,mBAAmB,WAAW,KAAK;AAiB5D,SAAS,mBAAmB,QAAoB;CAC9C,OAAO,SAAwB,SAAiB,gBAAyB,OAAe;EACtF,IAAI;EAEJ,IAAI,aAAa,QAAQ,YAAY,MAAM,IAAI,GAC7C,gBAAgB,oBAAoB,KAAK;EAG3C,KAAK,kBAAkB,SAAS,gBAAgB,QAAQ,OAAO,aAAa;CAC9E;AACF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { StatusType } from "../logger/isAuthorized.mjs";
|
|
2
|
+
import "../lifeCycle.mjs";
|
|
3
|
+
import { BufferedDataType, ErrorSource, ONE_KIBI_BYTE, RequestType, ResponseBodyAction, buildDebugIdByUrl, computeStackTrace, getStackTraceUrls, initFetchObservable, isServerError, noop, safeTruncate, toStackTraceString } from "@kubesense/kubesense-browser-core";
|
|
4
|
+
import { isIntakeUrl } from "@kubesense/kubesense-js-core/transport";
|
|
5
|
+
//#region src/domain/networkError/networkErrorCollection.ts
|
|
6
|
+
/** arbitrary value, byte precision not needed */
|
|
7
|
+
const DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT = 32 * ONE_KIBI_BYTE;
|
|
8
|
+
function startNetworkErrorCollection(configuration, lifeCycle, bufferedDataObservable) {
|
|
9
|
+
if (!configuration.forwardErrorsToLogs) return { stop: noop };
|
|
10
|
+
initFetchObservable({ responseBodyAction: (context) => isNetworkError(context) ? ResponseBodyAction.COLLECT : ResponseBodyAction.IGNORE });
|
|
11
|
+
const subscription = bufferedDataObservable.subscribe(({ data, type }) => {
|
|
12
|
+
if (type === BufferedDataType.FETCH && data.state === "resolve") handleResponse(RequestType.FETCH, data);
|
|
13
|
+
else if (type === BufferedDataType.XHR && data.state === "complete") handleResponse(RequestType.XHR, data);
|
|
14
|
+
});
|
|
15
|
+
function isNetworkError(request) {
|
|
16
|
+
return !isIntakeUrl(request.url) && !request.isAborted && (isRejected(request) || isServerError(request.status));
|
|
17
|
+
}
|
|
18
|
+
function handleResponse(type, request) {
|
|
19
|
+
if (!isNetworkError(request)) return;
|
|
20
|
+
const stackTrace = "error" in request && request.error ? computeStackTrace(request.error) : void 0;
|
|
21
|
+
const stack = stackTrace ? toStackTraceString(stackTrace) : request.responseBody || "Failed to load";
|
|
22
|
+
const debugIds = stackTrace ? buildDebugIdByUrl(getStackTraceUrls(stackTrace)) : void 0;
|
|
23
|
+
const domainContext = { handlingStack: request.handlingStack };
|
|
24
|
+
lifeCycle.notify(0, {
|
|
25
|
+
rawLogsEvent: {
|
|
26
|
+
message: `${format(type)} error ${request.method} ${request.url}`,
|
|
27
|
+
date: request.startClocks.timeStamp,
|
|
28
|
+
error: {
|
|
29
|
+
stack: safeTruncate(stack, DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT, "..."),
|
|
30
|
+
handling: void 0
|
|
31
|
+
},
|
|
32
|
+
_kubesense: { debug_ids: debugIds },
|
|
33
|
+
http: {
|
|
34
|
+
method: request.method,
|
|
35
|
+
status_code: request.status,
|
|
36
|
+
url: request.url
|
|
37
|
+
},
|
|
38
|
+
status: StatusType.error,
|
|
39
|
+
origin: ErrorSource.NETWORK
|
|
40
|
+
},
|
|
41
|
+
domainContext
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return { stop: () => subscription.unsubscribe() };
|
|
45
|
+
}
|
|
46
|
+
function isRejected(request) {
|
|
47
|
+
return request.status === 0 && request.responseType !== "opaque";
|
|
48
|
+
}
|
|
49
|
+
function format(type) {
|
|
50
|
+
if (RequestType.XHR === type) return "XHR";
|
|
51
|
+
return "Fetch";
|
|
52
|
+
}
|
|
53
|
+
//#endregion
|
|
54
|
+
export { DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT, startNetworkErrorCollection };
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=networkErrorCollection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"networkErrorCollection.mjs","names":[],"sources":["../../../src/domain/networkError/networkErrorCollection.ts"],"sourcesContent":["import type {\n FetchResolveContext,\n XhrCompleteContext,\n Observable,\n BufferedData,\n} from '@kubesense/kubesense-browser-core'\nimport {\n BufferedDataType,\n ErrorSource,\n RequestType,\n initFetchObservable,\n computeStackTrace,\n toStackTraceString,\n noop,\n isServerError,\n ResponseBodyAction,\n safeTruncate,\n ONE_KIBI_BYTE,\n buildDebugIdByUrl,\n getStackTraceUrls,\n} from '@kubesense/kubesense-browser-core'\nimport { isIntakeUrl } from '@kubesense/kubesense-js-core/transport'\nimport type { LogsConfiguration } from '../configuration'\n\n/** arbitrary value, byte precision not needed */\nexport const DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT = 32 * ONE_KIBI_BYTE\nimport type { LifeCycle } from '../lifeCycle'\nimport type { LogsEventDomainContext } from '../../domainContext.types'\nimport { LifeCycleEventType } from '../lifeCycle'\nimport { StatusType } from '../logger/isAuthorized'\n\nexport function startNetworkErrorCollection(\n configuration: LogsConfiguration,\n lifeCycle: LifeCycle,\n bufferedDataObservable: Observable<BufferedData>\n) {\n if (!configuration.forwardErrorsToLogs) {\n return { stop: noop }\n }\n\n // Register responseBodyAction getter (no subscription needed)\n initFetchObservable({\n responseBodyAction: (context) => (isNetworkError(context) ? ResponseBodyAction.COLLECT : ResponseBodyAction.IGNORE),\n })\n\n const subscription = bufferedDataObservable.subscribe(({ data, type }) => {\n if (type === BufferedDataType.FETCH && data.state === 'resolve') {\n handleResponse(RequestType.FETCH, data)\n } else if (type === BufferedDataType.XHR && data.state === 'complete') {\n handleResponse(RequestType.XHR, data)\n }\n })\n\n function isNetworkError(request: XhrCompleteContext | FetchResolveContext) {\n return !isIntakeUrl(request.url) && !request.isAborted && (isRejected(request) || isServerError(request.status))\n }\n\n function handleResponse(type: RequestType, request: XhrCompleteContext | FetchResolveContext) {\n if (!isNetworkError(request)) {\n return\n }\n const stackTrace = 'error' in request && request.error ? computeStackTrace(request.error) : undefined\n const stack = stackTrace ? toStackTraceString(stackTrace) : request.responseBody || 'Failed to load'\n const debugIds = stackTrace ? buildDebugIdByUrl(getStackTraceUrls(stackTrace)) : undefined\n\n const domainContext: LogsEventDomainContext<typeof ErrorSource.NETWORK> = {\n handlingStack: request.handlingStack,\n }\n\n lifeCycle.notify(LifeCycleEventType.RAW_LOG_COLLECTED, {\n rawLogsEvent: {\n message: `${format(type)} error ${request.method} ${request.url}`,\n date: request.startClocks.timeStamp,\n error: {\n stack: safeTruncate(stack, DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT, '...'),\n // We don't know if the error was handled or not, so we set it to undefined\n handling: undefined,\n },\n _kubesense: { debug_ids: debugIds },\n http: {\n method: request.method as any, // Cast resource method because of case mismatch cf issue RUMF-1152\n status_code: request.status,\n url: request.url,\n },\n status: StatusType.error,\n origin: ErrorSource.NETWORK,\n },\n domainContext,\n })\n }\n\n return { stop: () => subscription.unsubscribe() }\n}\n\nfunction isRejected(request: { status: number; responseType?: string }) {\n return request.status === 0 && request.responseType !== 'opaque'\n}\n\nfunction format(type: RequestType) {\n if (RequestType.XHR === type) {\n return 'XHR'\n }\n return 'Fetch'\n}\n"],"mappings":";;;;;;AAyBA,MAAa,8CAA8C,KAAK;AAMhE,SAAgB,4BACd,eACA,WACA,wBACA;CACA,IAAI,CAAC,cAAc,qBACjB,OAAO,EAAE,MAAM,KAAK;CAItB,oBAAoB,EAClB,qBAAqB,YAAa,eAAe,OAAO,IAAI,mBAAmB,UAAU,mBAAmB,OAC9G,CAAC;CAED,MAAM,eAAe,uBAAuB,WAAW,EAAE,MAAM,WAAW;EACxE,IAAI,SAAS,iBAAiB,SAAS,KAAK,UAAU,WACpD,eAAe,YAAY,OAAO,IAAI;OACjC,IAAI,SAAS,iBAAiB,OAAO,KAAK,UAAU,YACzD,eAAe,YAAY,KAAK,IAAI;CAExC,CAAC;CAED,SAAS,eAAe,SAAmD;EACzE,OAAO,CAAC,YAAY,QAAQ,GAAG,KAAK,CAAC,QAAQ,cAAc,WAAW,OAAO,KAAK,cAAc,QAAQ,MAAM;CAChH;CAEA,SAAS,eAAe,MAAmB,SAAmD;EAC5F,IAAI,CAAC,eAAe,OAAO,GACzB;EAEF,MAAM,aAAa,WAAW,WAAW,QAAQ,QAAQ,kBAAkB,QAAQ,KAAK,IAAI,KAAA;EAC5F,MAAM,QAAQ,aAAa,mBAAmB,UAAU,IAAI,QAAQ,gBAAgB;EACpF,MAAM,WAAW,aAAa,kBAAkB,kBAAkB,UAAU,CAAC,IAAI,KAAA;EAEjF,MAAM,gBAAoE,EACxE,eAAe,QAAQ,cACzB;EAEA,UAAU,OAAA,GAA6C;GACrD,cAAc;IACZ,SAAS,GAAG,OAAO,IAAI,EAAE,SAAS,QAAQ,OAAO,GAAG,QAAQ;IAC5D,MAAM,QAAQ,YAAY;IAC1B,OAAO;KACL,OAAO,aAAa,OAAO,6CAA6C,KAAK;KAE7E,UAAU,KAAA;IACZ;IACA,YAAY,EAAE,WAAW,SAAS;IAClC,MAAM;KACJ,QAAQ,QAAQ;KAChB,aAAa,QAAQ;KACrB,KAAK,QAAQ;IACf;IACA,QAAQ,WAAW;IACnB,QAAQ,YAAY;GACtB;GACA;EACF,CAAC;CACH;CAEA,OAAO,EAAE,YAAY,aAAa,YAAY,EAAE;AAClD;AAEA,SAAS,WAAW,SAAoD;CACtE,OAAO,QAAQ,WAAW,KAAK,QAAQ,iBAAiB;AAC1D;AAEA,SAAS,OAAO,MAAmB;CACjC,IAAI,YAAY,QAAQ,MACtB,OAAO;CAET,OAAO;AACT"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/domain/plugins.ts
|
|
2
|
+
function callPluginsMethod(plugins, methodName, parameter) {
|
|
3
|
+
if (!plugins) return;
|
|
4
|
+
for (const plugin of plugins) {
|
|
5
|
+
const method = plugin[methodName];
|
|
6
|
+
if (method) method(parameter);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { callPluginsMethod };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=plugins.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.mjs","names":[],"sources":["../../src/domain/plugins.ts"],"sourcesContent":["import type { LogsPublicApi } from '../boot/logsPublicApi'\nimport type { StartLogsResult } from '../boot/startLogs'\nimport type { LogsInitConfiguration } from './configuration'\nimport type { AssembleHook } from './hooks'\n\n/**\n * onInit plugin API options.\n *\n * @experimental\n */\nexport interface OnInitOptions {\n initConfiguration: LogsInitConfiguration\n publicApi: LogsPublicApi\n /**\n * Register a callback invoked when a log event is assembled, so plugins can enrich or override\n * log fields before they are sent. Callbacks registered in `onInit` run before any log is\n * assembled, including logs buffered during the pre-start phase.\n */\n registerAssembleEventHook: AssembleHook['register']\n}\n\n/**\n * onLogsStart plugin API options.\n *\n * @experimental\n */\nexport interface OnLogsStartOptions {\n /**\n * Emit a log with the same pipeline as a logger call.\n */\n handleLog: StartLogsResult['handleLog']\n}\n\n/**\n * Plugin interface of the Logs browser SDK.\n *\n * The plugins API is unstable and experimental, and may change without\n * notice. Please use only plugins provided by KubeSense matching the version of the SDK you are\n * using.\n *\n * @experimental\n */\nexport interface LogsPlugin {\n name: string\n getConfigurationTelemetry?(): Record<string, unknown>\n onInit?(options: OnInitOptions): void\n onLogsStart?(options: OnLogsStartOptions): void\n}\n\ntype MethodNames = 'onInit' | 'onLogsStart'\ntype MethodParameter<MethodName extends MethodNames> = Parameters<NonNullable<LogsPlugin[MethodName]>>[0]\n\nexport function callPluginsMethod<MethodName extends MethodNames>(\n plugins: LogsPlugin[] | undefined,\n methodName: MethodName,\n parameter: MethodParameter<MethodName>\n): void\nexport function callPluginsMethod<MethodName extends MethodNames>(\n plugins: LogsPlugin[] | undefined,\n methodName: MethodName,\n parameter: any\n) {\n if (!plugins) {\n return\n }\n for (const plugin of plugins) {\n const method = plugin[methodName]\n if (method) {\n method(parameter)\n }\n }\n}\n"],"mappings":";AAyDA,SAAgB,kBACd,SACA,YACA,WACA;CACA,IAAI,CAAC,SACH;CAEF,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,SAAS,OAAO;EACtB,IAAI,QACF,OAAO,SAAS;CAEpB;AACF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ConsoleApiName } from "@kubesense/kubesense-js-core/util";
|
|
2
|
+
import { RawReportType, getCachedSdkConfig, objectValues, readBoolean, readSampleRate, readString, readStringList, refreshSdkConfig } from "@kubesense/kubesense-browser-core";
|
|
3
|
+
//#region src/domain/remoteSdkConfiguration.ts
|
|
4
|
+
function applyCachedLogsSdkConfiguration(initConfiguration) {
|
|
5
|
+
const remoteConfig = getCachedSdkConfig(initConfiguration.clientToken);
|
|
6
|
+
if (!remoteConfig) return {
|
|
7
|
+
initConfiguration,
|
|
8
|
+
logsEnabled: true
|
|
9
|
+
};
|
|
10
|
+
return applyLogsSdkConfiguration(initConfiguration, remoteConfig);
|
|
11
|
+
}
|
|
12
|
+
function applyLogsSdkConfiguration(initConfiguration, remoteConfig) {
|
|
13
|
+
const features = remoteConfig.features;
|
|
14
|
+
if (readBoolean(features, "logs") === false) return {
|
|
15
|
+
initConfiguration,
|
|
16
|
+
logsEnabled: false
|
|
17
|
+
};
|
|
18
|
+
const logs = remoteConfig.logs;
|
|
19
|
+
if (!logs) return {
|
|
20
|
+
initConfiguration,
|
|
21
|
+
logsEnabled: true
|
|
22
|
+
};
|
|
23
|
+
const applied = { ...initConfiguration };
|
|
24
|
+
assign(applied, "sessionSampleRate", readSampleRate(logs, "sessionSampleRate"));
|
|
25
|
+
assign(applied, "telemetrySampleRate", readSampleRate(logs, "telemetrySampleRate"));
|
|
26
|
+
assign(applied, "forwardErrorsToLogs", readBoolean(logs, "forwardErrorsToLogs"));
|
|
27
|
+
assign(applied, "trackAnonymousUser", readBoolean(logs, "trackAnonymousUser"));
|
|
28
|
+
assign(applied, "trackSessionAcrossSubdomains", readBoolean(logs, "trackSessionAcrossSubdomains"));
|
|
29
|
+
assign(applied, "allowedTrackingOrigins", readStringList(logs.allowedTrackingOrigins));
|
|
30
|
+
assign(applied, "forwardConsoleLogs", readForwardList(logs.forwardConsoleLogs, objectValues(ConsoleApiName)));
|
|
31
|
+
assign(applied, "forwardReports", readForwardList(logs.forwardReports, objectValues(RawReportType)));
|
|
32
|
+
assign(applied, "service", readString(logs, "service"));
|
|
33
|
+
assign(applied, "env", readString(logs, "env"));
|
|
34
|
+
assign(applied, "version", readString(logs, "version"));
|
|
35
|
+
return {
|
|
36
|
+
initConfiguration: applied,
|
|
37
|
+
logsEnabled: true
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `forwardConsoleLogs` and `forwardReports` accept either the literal `'all'` or a subset of the
|
|
42
|
+
* known names. Unknown names are dropped rather than passed through, so a document written against
|
|
43
|
+
* a newer SDK cannot turn the option into a value this SDK will reject wholesale.
|
|
44
|
+
*/
|
|
45
|
+
function readForwardList(value, allowedValues) {
|
|
46
|
+
if (value === "all") return "all";
|
|
47
|
+
const names = readStringList(value)?.filter((name) => allowedValues.includes(name));
|
|
48
|
+
return names?.length ? names : void 0;
|
|
49
|
+
}
|
|
50
|
+
function assign(target, key, value) {
|
|
51
|
+
if (value !== void 0) target[key] = value;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Refresh the shared cache for the next page load.
|
|
55
|
+
*
|
|
56
|
+
* When RUM and Logs both run on a page they each schedule a refresh; the requests are
|
|
57
|
+
* idempotent GETs and the last response simply wins, so no coordination is needed.
|
|
58
|
+
*/
|
|
59
|
+
function scheduleLogsSdkConfigurationRefresh(initConfiguration) {
|
|
60
|
+
return refreshSdkConfig(initConfiguration);
|
|
61
|
+
}
|
|
62
|
+
//#endregion
|
|
63
|
+
export { applyCachedLogsSdkConfiguration, applyLogsSdkConfiguration, scheduleLogsSdkConfigurationRefresh };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=remoteSdkConfiguration.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remoteSdkConfiguration.mjs","names":[],"sources":["../../src/domain/remoteSdkConfiguration.ts"],"sourcesContent":["import type { RemoteSdkConfig } from '@kubesense/kubesense-browser-core'\nimport {\n RawReportType,\n getCachedSdkConfig,\n objectValues,\n readBoolean,\n readSampleRate,\n readString,\n readStringList,\n refreshSdkConfig,\n} from '@kubesense/kubesense-browser-core'\nimport { ConsoleApiName } from '@kubesense/kubesense-js-core/util'\nimport type { LogsInitConfiguration } from './configuration'\n\n/**\n * Applies the dashboard-managed configuration document to the Logs init configuration.\n *\n * The Logs SDK reads the same cached document as RUM (they share one local-storage entry), but\n * only consumes the `features.logs` switch and the `logs` section — RUM settings never leak\n * into Logs, and vice versa.\n *\n * As in RUM, a missing or invalid field leaves the local `init()` value untouched, and\n * identity/endpoint settings are never remotable.\n */\n\nexport interface LogsRemoteSdkConfigurationResult {\n initConfiguration: LogsInitConfiguration\n /** `false` when the dashboard has switched Logs off entirely. */\n logsEnabled: boolean\n}\n\nexport function applyCachedLogsSdkConfiguration(\n initConfiguration: LogsInitConfiguration\n): LogsRemoteSdkConfigurationResult {\n const remoteConfig = getCachedSdkConfig(initConfiguration.clientToken)\n if (!remoteConfig) {\n return { initConfiguration, logsEnabled: true }\n }\n return applyLogsSdkConfiguration(initConfiguration, remoteConfig)\n}\n\nexport function applyLogsSdkConfiguration(\n initConfiguration: LogsInitConfiguration,\n remoteConfig: RemoteSdkConfig\n): LogsRemoteSdkConfigurationResult {\n const features = remoteConfig.features as { [key: string]: unknown } | undefined\n if (readBoolean(features, 'logs') === false) {\n return { initConfiguration, logsEnabled: false }\n }\n\n const logs = remoteConfig.logs\n if (!logs) {\n return { initConfiguration, logsEnabled: true }\n }\n\n const applied: LogsInitConfiguration = { ...initConfiguration }\n\n assign(applied, 'sessionSampleRate', readSampleRate(logs, 'sessionSampleRate'))\n assign(applied, 'telemetrySampleRate', readSampleRate(logs, 'telemetrySampleRate'))\n assign(applied, 'forwardErrorsToLogs', readBoolean(logs, 'forwardErrorsToLogs'))\n assign(applied, 'trackAnonymousUser', readBoolean(logs, 'trackAnonymousUser'))\n assign(applied, 'trackSessionAcrossSubdomains', readBoolean(logs, 'trackSessionAcrossSubdomains'))\n assign(applied, 'allowedTrackingOrigins', readStringList(logs.allowedTrackingOrigins))\n assign(applied, 'forwardConsoleLogs', readForwardList(logs.forwardConsoleLogs, objectValues(ConsoleApiName)))\n assign(applied, 'forwardReports', readForwardList(logs.forwardReports, objectValues(RawReportType)))\n\n assign(applied, 'service', readString(logs, 'service'))\n assign(applied, 'env', readString(logs, 'env'))\n assign(applied, 'version', readString(logs, 'version'))\n\n return { initConfiguration: applied, logsEnabled: true }\n}\n\n/**\n * `forwardConsoleLogs` and `forwardReports` accept either the literal `'all'` or a subset of the\n * known names. Unknown names are dropped rather than passed through, so a document written against\n * a newer SDK cannot turn the option into a value this SDK will reject wholesale.\n */\nfunction readForwardList<T extends string>(value: unknown, allowedValues: readonly T[]): T[] | 'all' | undefined {\n if (value === 'all') {\n return 'all'\n }\n const names = readStringList(value)?.filter((name): name is T => (allowedValues as readonly string[]).includes(name))\n return names?.length ? names : undefined\n}\n\nfunction assign<K extends keyof LogsInitConfiguration>(\n target: LogsInitConfiguration,\n key: K,\n value: LogsInitConfiguration[K] | undefined\n) {\n if (value !== undefined) {\n target[key] = value\n }\n}\n\n/**\n * Refresh the shared cache for the next page load.\n *\n * When RUM and Logs both run on a page they each schedule a refresh; the requests are\n * idempotent GETs and the last response simply wins, so no coordination is needed.\n */\nexport function scheduleLogsSdkConfigurationRefresh(initConfiguration: LogsInitConfiguration) {\n return refreshSdkConfig(initConfiguration)\n}\n"],"mappings":";;;AA+BA,SAAgB,gCACd,mBACkC;CAClC,MAAM,eAAe,mBAAmB,kBAAkB,WAAW;CACrE,IAAI,CAAC,cACH,OAAO;EAAE;EAAmB,aAAa;CAAK;CAEhD,OAAO,0BAA0B,mBAAmB,YAAY;AAClE;AAEA,SAAgB,0BACd,mBACA,cACkC;CAClC,MAAM,WAAW,aAAa;CAC9B,IAAI,YAAY,UAAU,MAAM,MAAM,OACpC,OAAO;EAAE;EAAmB,aAAa;CAAM;CAGjD,MAAM,OAAO,aAAa;CAC1B,IAAI,CAAC,MACH,OAAO;EAAE;EAAmB,aAAa;CAAK;CAGhD,MAAM,UAAiC,EAAE,GAAG,kBAAkB;CAE9D,OAAO,SAAS,qBAAqB,eAAe,MAAM,mBAAmB,CAAC;CAC9E,OAAO,SAAS,uBAAuB,eAAe,MAAM,qBAAqB,CAAC;CAClF,OAAO,SAAS,uBAAuB,YAAY,MAAM,qBAAqB,CAAC;CAC/E,OAAO,SAAS,sBAAsB,YAAY,MAAM,oBAAoB,CAAC;CAC7E,OAAO,SAAS,gCAAgC,YAAY,MAAM,8BAA8B,CAAC;CACjG,OAAO,SAAS,0BAA0B,eAAe,KAAK,sBAAsB,CAAC;CACrF,OAAO,SAAS,sBAAsB,gBAAgB,KAAK,oBAAoB,aAAa,cAAc,CAAC,CAAC;CAC5G,OAAO,SAAS,kBAAkB,gBAAgB,KAAK,gBAAgB,aAAa,aAAa,CAAC,CAAC;CAEnG,OAAO,SAAS,WAAW,WAAW,MAAM,SAAS,CAAC;CACtD,OAAO,SAAS,OAAO,WAAW,MAAM,KAAK,CAAC;CAC9C,OAAO,SAAS,WAAW,WAAW,MAAM,SAAS,CAAC;CAEtD,OAAO;EAAE,mBAAmB;EAAS,aAAa;CAAK;AACzD;;;;;;AAOA,SAAS,gBAAkC,OAAgB,eAAsD;CAC/G,IAAI,UAAU,OACZ,OAAO;CAET,MAAM,QAAQ,eAAe,KAAK,CAAC,EAAE,QAAQ,SAAqB,cAAoC,SAAS,IAAI,CAAC;CACpH,OAAO,OAAO,SAAS,QAAQ,KAAA;AACjC;AAEA,SAAS,OACP,QACA,KACA,OACA;CACA,IAAI,UAAU,KAAA,GACZ,OAAO,OAAO;AAElB;;;;;;;AAQA,SAAgB,oCAAoC,mBAA0C;CAC5F,OAAO,iBAAiB,iBAAiB;AAC3C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { StatusType } from "../logger/isAuthorized.mjs";
|
|
2
|
+
import { createErrorFieldFromRawError } from "../createErrorFieldFromRawError.mjs";
|
|
3
|
+
import "../lifeCycle.mjs";
|
|
4
|
+
import { ErrorSource, getFileFromStackTraceString, initReportObservable } from "@kubesense/kubesense-browser-core";
|
|
5
|
+
import { timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
6
|
+
//#region src/domain/report/reportCollection.ts
|
|
7
|
+
function startReportCollection(configuration, lifeCycle) {
|
|
8
|
+
const reportSubscription = initReportObservable(configuration.forwardReports).subscribe((rawError) => {
|
|
9
|
+
let message = rawError.message;
|
|
10
|
+
let error;
|
|
11
|
+
const status = rawError.originalError.type === "deprecation" ? StatusType.warn : StatusType.error;
|
|
12
|
+
if (status === StatusType.error) error = createErrorFieldFromRawError(rawError);
|
|
13
|
+
else if (rawError.stack) message += ` Found in ${getFileFromStackTraceString(rawError.stack)}`;
|
|
14
|
+
lifeCycle.notify(0, { rawLogsEvent: {
|
|
15
|
+
date: timeStampNow(),
|
|
16
|
+
message,
|
|
17
|
+
origin: ErrorSource.REPORT,
|
|
18
|
+
error,
|
|
19
|
+
_kubesense: { debug_ids: rawError.debugIds },
|
|
20
|
+
status
|
|
21
|
+
} });
|
|
22
|
+
});
|
|
23
|
+
return { stop: () => {
|
|
24
|
+
reportSubscription.unsubscribe();
|
|
25
|
+
} };
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { startReportCollection };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=reportCollection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportCollection.mjs","names":[],"sources":["../../../src/domain/report/reportCollection.ts"],"sourcesContent":["import type { ClocksState } from '@kubesense/kubesense-js-core/time'\nimport type { Context } from '@kubesense/kubesense-browser-core'\nimport { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport { ErrorSource, getFileFromStackTraceString, initReportObservable } from '@kubesense/kubesense-browser-core'\nimport type { LogsConfiguration } from '../configuration'\nimport type { LifeCycle } from '../lifeCycle'\nimport { LifeCycleEventType } from '../lifeCycle'\nimport { StatusType } from '../logger/isAuthorized'\nimport { createErrorFieldFromRawError } from '../createErrorFieldFromRawError'\n\nexport interface ProvidedError {\n startClocks: ClocksState\n error: unknown\n context?: Context\n handlingStack: string\n}\n\nexport function startReportCollection(configuration: LogsConfiguration, lifeCycle: LifeCycle) {\n const reportSubscription = initReportObservable(configuration.forwardReports).subscribe((rawError) => {\n let message = rawError.message\n let error\n const status = rawError.originalError.type === 'deprecation' ? StatusType.warn : StatusType.error\n\n if (status === StatusType.error) {\n error = createErrorFieldFromRawError(rawError)\n } else if (rawError.stack) {\n message += ` Found in ${getFileFromStackTraceString(rawError.stack)!}`\n }\n\n lifeCycle.notify(LifeCycleEventType.RAW_LOG_COLLECTED, {\n rawLogsEvent: {\n date: timeStampNow(),\n message,\n origin: ErrorSource.REPORT,\n error,\n _kubesense: { debug_ids: rawError.debugIds },\n status,\n },\n })\n })\n\n return {\n stop: () => {\n reportSubscription.unsubscribe()\n },\n }\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,sBAAsB,eAAkC,WAAsB;CAC5F,MAAM,qBAAqB,qBAAqB,cAAc,cAAc,CAAC,CAAC,WAAW,aAAa;EACpG,IAAI,UAAU,SAAS;EACvB,IAAI;EACJ,MAAM,SAAS,SAAS,cAAc,SAAS,gBAAgB,WAAW,OAAO,WAAW;EAE5F,IAAI,WAAW,WAAW,OACxB,QAAQ,6BAA6B,QAAQ;OACxC,IAAI,SAAS,OAClB,WAAW,aAAa,4BAA4B,SAAS,KAAK;EAGpE,UAAU,OAAA,GAA6C,EACrD,cAAc;GACZ,MAAM,aAAa;GACnB;GACA,QAAQ,YAAY;GACpB;GACA,YAAY,EAAE,WAAW,SAAS,SAAS;GAC3C;EACF,EACF,CAAC;CACH,CAAC;CAED,OAAO,EACL,YAAY;EACV,mBAAmB,YAAY;CACjC,EACF;AACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { StatusType } from "./logger/isAuthorized.mjs";
|
|
2
|
+
import "./lifeCycle.mjs";
|
|
3
|
+
import { ErrorSource, addTelemetryDebug } from "@kubesense/kubesense-browser-core";
|
|
4
|
+
import { timeStampNow } from "@kubesense/kubesense-js-core/time";
|
|
5
|
+
//#region src/domain/reportError.ts
|
|
6
|
+
function startReportError(lifeCycle) {
|
|
7
|
+
return (message) => {
|
|
8
|
+
lifeCycle.notify(0, { rawLogsEvent: {
|
|
9
|
+
message,
|
|
10
|
+
date: timeStampNow(),
|
|
11
|
+
origin: ErrorSource.AGENT,
|
|
12
|
+
status: StatusType.error
|
|
13
|
+
} });
|
|
14
|
+
addTelemetryDebug("Error reported to customer", { "error.message": message });
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { startReportError };
|
|
19
|
+
|
|
20
|
+
//# sourceMappingURL=reportError.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reportError.mjs","names":[],"sources":["../../src/domain/reportError.ts"],"sourcesContent":["import { ErrorSource, addTelemetryDebug } from '@kubesense/kubesense-browser-core'\nimport { timeStampNow } from '@kubesense/kubesense-js-core/time'\nimport type { LifeCycle } from './lifeCycle'\nimport { LifeCycleEventType } from './lifeCycle'\nimport { StatusType } from './logger/isAuthorized'\n\nexport function startReportError(lifeCycle: LifeCycle) {\n return (message: string) => {\n lifeCycle.notify(LifeCycleEventType.RAW_LOG_COLLECTED, {\n rawLogsEvent: {\n message,\n date: timeStampNow(),\n origin: ErrorSource.AGENT,\n status: StatusType.error,\n },\n })\n // monitor-until: forever, to keep an eye on the errors reported to customers\n addTelemetryDebug('Error reported to customer', { 'error.message': message })\n }\n}\n"],"mappings":";;;;;AAMA,SAAgB,iBAAiB,WAAsB;CACrD,QAAQ,YAAoB;EAC1B,UAAU,OAAA,GAA6C,EACrD,cAAc;GACZ;GACA,MAAM,aAAa;GACnB,QAAQ,YAAY;GACpB,QAAQ,WAAW;EACrB,EACF,CAAC;EAED,kBAAkB,8BAA8B,EAAE,iBAAiB,QAAQ,CAAC;CAC9E;AACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { StatusType } from "../logger/isAuthorized.mjs";
|
|
2
|
+
import { createErrorFieldFromRawError } from "../createErrorFieldFromRawError.mjs";
|
|
3
|
+
import "../lifeCycle.mjs";
|
|
4
|
+
import { combine } from "@kubesense/kubesense-js-core/util";
|
|
5
|
+
import { BufferedDataType, ErrorSource, noop } from "@kubesense/kubesense-browser-core";
|
|
6
|
+
//#region src/domain/runtimeError/runtimeErrorCollection.ts
|
|
7
|
+
function startRuntimeErrorCollection(configuration, lifeCycle, bufferedDataObservable) {
|
|
8
|
+
if (!configuration.forwardErrorsToLogs) return { stop: noop };
|
|
9
|
+
const rawErrorSubscription = bufferedDataObservable.subscribe((bufferedData) => {
|
|
10
|
+
if (bufferedData.type === BufferedDataType.RUNTIME_ERROR) {
|
|
11
|
+
const error = bufferedData.data;
|
|
12
|
+
lifeCycle.notify(0, { rawLogsEvent: combine({
|
|
13
|
+
message: error.message,
|
|
14
|
+
date: error.startClocks.timeStamp,
|
|
15
|
+
error: createErrorFieldFromRawError(error),
|
|
16
|
+
_kubesense: { debug_ids: error.debugIds },
|
|
17
|
+
origin: ErrorSource.SOURCE,
|
|
18
|
+
status: StatusType.error
|
|
19
|
+
}, error.context) });
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
return { stop: () => {
|
|
23
|
+
rawErrorSubscription.unsubscribe();
|
|
24
|
+
} };
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { startRuntimeErrorCollection };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=runtimeErrorCollection.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeErrorCollection.mjs","names":[],"sources":["../../../src/domain/runtimeError/runtimeErrorCollection.ts"],"sourcesContent":["import type { ClocksState } from '@kubesense/kubesense-js-core/time'\nimport { combine } from '@kubesense/kubesense-js-core/util'\nimport type { Context, Observable, BufferedData } from '@kubesense/kubesense-browser-core'\nimport { noop, ErrorSource, BufferedDataType } from '@kubesense/kubesense-browser-core'\nimport type { LogsConfiguration } from '../configuration'\nimport type { LifeCycle } from '../lifeCycle'\nimport { LifeCycleEventType } from '../lifeCycle'\nimport { StatusType } from '../logger/isAuthorized'\nimport { createErrorFieldFromRawError } from '../createErrorFieldFromRawError'\n\nexport interface ProvidedError {\n startClocks: ClocksState\n error: unknown\n context?: Context\n handlingStack: string\n}\n\nexport function startRuntimeErrorCollection(\n configuration: LogsConfiguration,\n lifeCycle: LifeCycle,\n bufferedDataObservable: Observable<BufferedData>\n) {\n if (!configuration.forwardErrorsToLogs) {\n return { stop: noop }\n }\n\n const rawErrorSubscription = bufferedDataObservable.subscribe((bufferedData) => {\n if (bufferedData.type === BufferedDataType.RUNTIME_ERROR) {\n const error = bufferedData.data\n lifeCycle.notify(LifeCycleEventType.RAW_LOG_COLLECTED, {\n rawLogsEvent: combine(\n {\n message: error.message,\n date: error.startClocks.timeStamp,\n error: createErrorFieldFromRawError(error),\n _kubesense: { debug_ids: error.debugIds },\n origin: ErrorSource.SOURCE,\n status: StatusType.error,\n },\n error.context\n ),\n })\n }\n })\n\n return {\n stop: () => {\n rawErrorSubscription.unsubscribe()\n },\n }\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,4BACd,eACA,WACA,wBACA;CACA,IAAI,CAAC,cAAc,qBACjB,OAAO,EAAE,MAAM,KAAK;CAGtB,MAAM,uBAAuB,uBAAuB,WAAW,iBAAiB;EAC9E,IAAI,aAAa,SAAS,iBAAiB,eAAe;GACxD,MAAM,QAAQ,aAAa;GAC3B,UAAU,OAAA,GAA6C,EACrD,cAAc,QACZ;IACE,SAAS,MAAM;IACf,MAAM,MAAM,YAAY;IACxB,OAAO,6BAA6B,KAAK;IACzC,YAAY,EAAE,WAAW,MAAM,SAAS;IACxC,QAAQ,YAAY;IACpB,QAAQ,WAAW;GACrB,GACA,MAAM,OACR,EACF,CAAC;EACH;CACF,CAAC;CAED,OAAO,EACL,YAAY;EACV,qBAAqB,YAAY;CACnC,EACF;AACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { StatusType } from "../domain/logger/isAuthorized.mjs";
|
|
2
|
+
import { HandlerType, Logger } from "../domain/logger.mjs";
|
|
3
|
+
import { makeLogsPublicApi } from "../boot/logsPublicApi.mjs";
|
|
4
|
+
import { globalObject } from "@kubesense/kubesense-js-core/util";
|
|
5
|
+
import { defineGlobal } from "@kubesense/kubesense-browser-core";
|
|
6
|
+
//#region src/entries/main.ts
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* KubeSense Browser Logs SDK for collecting and forwarding browser logs to KubeSense.
|
|
10
|
+
* Provides comprehensive logging capabilities with automatic error tracking and custom log collection.
|
|
11
|
+
*
|
|
12
|
+
* @packageDocumentation
|
|
13
|
+
* @see [Browser Log Collection](https://docs.kubesense.ai/logs/log_collection/javascript/)
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* The global Logs instance. Use this to call Logs methods.
|
|
17
|
+
*
|
|
18
|
+
* @category Main
|
|
19
|
+
* @see {@link KubesenseLogs}
|
|
20
|
+
* @see [Browser Log Collection](https://docs.kubesense.ai/logs/log_collection/javascript/)
|
|
21
|
+
*/
|
|
22
|
+
const kubesenseLogs = makeLogsPublicApi({ sdkName: "logs" });
|
|
23
|
+
defineGlobal(globalObject, "KUBESENSE_LOGS", kubesenseLogs);
|
|
24
|
+
//#endregion
|
|
25
|
+
export { HandlerType, Logger, StatusType, kubesenseLogs };
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=main.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.mjs","names":[],"sources":["../../src/entries/main.ts"],"sourcesContent":["/**\n *\n * KubeSense Browser Logs SDK for collecting and forwarding browser logs to KubeSense.\n * Provides comprehensive logging capabilities with automatic error tracking and custom log collection.\n *\n * @packageDocumentation\n * @see [Browser Log Collection](https://docs.kubesense.ai/logs/log_collection/javascript/)\n */\n\nimport { globalObject } from '@kubesense/kubesense-js-core/util'\nimport { defineGlobal } from '@kubesense/kubesense-browser-core'\nimport type { LogsPublicApi } from '../boot/logsPublicApi'\nimport { makeLogsPublicApi } from '../boot/logsPublicApi'\n\nexport type { InternalContext } from '../domain/contexts/internalContext'\nexport type { LogsMessage } from '../domain/logger'\nexport { Logger, HandlerType } from '../domain/logger'\nexport { StatusType } from '../domain/logger/isAuthorized'\nexport type { LoggerConfiguration, LogsPublicApi as KubesenseLogs } from '../boot/logsPublicApi'\nexport type { LogsInitConfiguration, LogsBeforeSend } from '../domain/configuration'\nexport type { LogsEvent } from '../logsEvent.types'\nexport type { LogsPlugin, OnLogsStartOptions, OnInitOptions } from '../domain/plugins'\nexport type {\n LogsEventDomainContext,\n NetworkLogsEventDomainContext,\n ConsoleLogsEventDomainContext,\n LoggerLogsEventDomainContext,\n} from '../domainContext.types'\n\n/**\n * @deprecated Use {@link KubesenseLogs} instead\n */\nexport type LogsGlobal = LogsPublicApi\n\nexport type {\n InitConfiguration,\n PublicApi,\n Context,\n ContextValue,\n ContextArray,\n User,\n Account,\n TraceContextInjection,\n SessionPersistence,\n TrackingConsent,\n MatchOption,\n RawReportType,\n ErrorSource,\n} from '@kubesense/kubesense-browser-core'\nexport type { ProxyFn, Site } from '@kubesense/kubesense-js-core/transport'\nexport type { ConsoleApiName } from '@kubesense/kubesense-js-core/util'\n\n/**\n * The global Logs instance. Use this to call Logs methods.\n *\n * @category Main\n * @see {@link KubesenseLogs}\n * @see [Browser Log Collection](https://docs.kubesense.ai/logs/log_collection/javascript/)\n */\nexport const kubesenseLogs = makeLogsPublicApi({ sdkName: 'logs' })\n\ninterface BrowserWindow {\n KUBESENSE_LOGS?: LogsPublicApi\n}\ndefineGlobal(globalObject as BrowserWindow, 'KUBESENSE_LOGS', kubesenseLogs)\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA2DA,MAAa,gBAAgB,kBAAkB,EAAE,SAAS,OAAO,CAAC;AAKlE,aAAa,cAA+B,kBAAkB,aAAa"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "../domain/lifeCycle.mjs";
|
|
2
|
+
import { createBatch } from "@kubesense/kubesense-browser-core";
|
|
3
|
+
import { createEndpointBuilder, createReplicaEndpointBuilder } from "@kubesense/kubesense-js-core/transport";
|
|
4
|
+
//#region src/transport/startLogsBatch.ts
|
|
5
|
+
function startLogsBatch(configuration, lifeCycle, reportError, sessionManager) {
|
|
6
|
+
const endpoints = [createEndpointBuilder(configuration, "logs")];
|
|
7
|
+
const replicaEndpoint = createReplicaEndpointBuilder(configuration, "logs");
|
|
8
|
+
if (replicaEndpoint) endpoints.push(replicaEndpoint);
|
|
9
|
+
const batch = createBatch({
|
|
10
|
+
endpoints,
|
|
11
|
+
reportError
|
|
12
|
+
});
|
|
13
|
+
sessionManager.expireObservable.subscribe(() => batch.forceFlush("session_expire"));
|
|
14
|
+
lifeCycle.subscribe(1, (serverLogsEvent) => {
|
|
15
|
+
batch.add(serverLogsEvent);
|
|
16
|
+
});
|
|
17
|
+
return batch;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { startLogsBatch };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=startLogsBatch.mjs.map
|