logixia 2.0.0 → 2.0.6
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/README.md +172 -2597
- package/dist/async-context-2mbUKhcl.mjs +132 -0
- package/dist/async-context-2mbUKhcl.mjs.map +1 -0
- package/dist/async-context-DUFMDYAr.js +148 -0
- package/dist/async-context-DUFMDYAr.js.map +1 -0
- package/dist/{azure-monitor.transport-CrvfHd9C.js → azure-monitor.transport-Bu4S2I2q.js} +32 -20
- package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
- package/dist/{azure-monitor.transport-Cn_3Usvu.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +3 -6
- package/dist/azure-monitor.transport-Bvf7Xegt.d.ts.map +1 -0
- package/dist/{azure-monitor.transport-CHnjVRF-.mjs → azure-monitor.transport-C1RWAumT.mjs} +27 -15
- package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
- package/dist/{azure-monitor.transport-D7Da4RAb.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +3 -6
- package/dist/azure-monitor.transport-CbSHOnNX.d.mts.map +1 -0
- package/dist/azure.d.mts +1 -2
- package/dist/azure.d.ts +1 -2
- package/dist/azure.js +3 -6
- package/dist/azure.mjs +1 -6
- package/dist/{batch-buffer-PGvSgbmd.mjs → batch-buffer-BvXLDPlV.mjs} +21 -7
- package/dist/batch-buffer-BvXLDPlV.mjs.map +1 -0
- package/dist/{batch-buffer-BY-mRWIK.js → batch-buffer-C7Am4Mw-.js} +53 -40
- package/dist/batch-buffer-C7Am4Mw-.js.map +1 -0
- package/dist/browser.d.mts +47 -27
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +47 -27
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +464 -62
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +465 -65
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-0gEzRopq.mjs → builder-DhNhvOkt.mjs} +307 -246
- package/dist/builder-DhNhvOkt.mjs.map +1 -0
- package/dist/{builder-D44QktIo.js → builder-yFvJrz7o.js} +435 -399
- package/dist/builder-yFvJrz7o.js.map +1 -0
- package/dist/cli/index.js +216 -125
- package/dist/cloudwatch.d.mts +1 -2
- package/dist/cloudwatch.d.ts +1 -2
- package/dist/cloudwatch.js +3 -7
- package/dist/cloudwatch.mjs +1 -7
- package/dist/{cloudwatch.transport-DsEq633o.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -6
- package/dist/cloudwatch.transport-CQyT6U91.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-BO1ahxw-.js → cloudwatch.transport-Ch1Uae-0.js} +61 -36
- package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
- package/dist/{cloudwatch.transport-UlyZFWMn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -6
- package/dist/cloudwatch.transport-CjVrI6S4.d.mts.map +1 -0
- package/dist/{cloudwatch.transport-DZ6ies7g.mjs → cloudwatch.transport-DZqF2xZO.mjs} +54 -28
- package/dist/cloudwatch.transport-DZqF2xZO.mjs.map +1 -0
- package/dist/{coerce.utils-Cu6IUTgX.mjs → coerce.utils-B_rEudCn.mjs} +3 -4
- package/dist/{coerce.utils-Cu6IUTgX.mjs.map → coerce.utils-B_rEudCn.mjs.map} +1 -1
- package/dist/{coerce.utils-B-LilukN.js → coerce.utils-C1C5sIX0.js} +8 -10
- package/dist/{coerce.utils-B-LilukN.js.map → coerce.utils-C1C5sIX0.js.map} +1 -1
- package/dist/correlation.d.mts +15 -69
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +15 -69
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +69 -20
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +67 -17
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-BvOLFlJ4.js → entry-fields-BSLkzw18.js} +16 -13
- package/dist/entry-fields-BSLkzw18.js.map +1 -0
- package/dist/{entry-fields-BJkuPnIg.mjs → entry-fields-J1OBi24o.mjs} +11 -7
- package/dist/entry-fields-J1OBi24o.mjs.map +1 -0
- package/dist/gcp.d.mts +1 -2
- package/dist/gcp.d.ts +1 -2
- package/dist/gcp.js +3 -7
- package/dist/gcp.mjs +1 -7
- package/dist/{gcp.transport-B7oc97sG.d.ts → gcp.transport-BCIvdFV-.d.ts} +5 -8
- package/dist/gcp.transport-BCIvdFV-.d.ts.map +1 -0
- package/dist/{gcp.transport-GrJurKo8.d.mts → gcp.transport-D9SdLPwP.d.mts} +5 -8
- package/dist/gcp.transport-D9SdLPwP.d.mts.map +1 -0
- package/dist/{gcp.transport-DBX5TPIy.mjs → gcp.transport-DVCmnA3b.mjs} +59 -16
- package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
- package/dist/{gcp.transport-CHV8MGgz.js → gcp.transport-Dy2Lf8FI.js} +64 -22
- package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.mts +32 -0
- package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.ts +32 -0
- package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
- package/dist/{index-3mw5gaCw.d.mts → index-BSTtFcQ6.d.mts} +142 -13
- package/dist/index-BSTtFcQ6.d.mts.map +1 -0
- package/dist/{index-DhIoploR.d.ts → index-CFDGkI8n.d.ts} +142 -13
- package/dist/index-CFDGkI8n.d.ts.map +1 -0
- package/dist/index.d.mts +114 -217
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +113 -216
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +182 -279
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -256
- package/dist/index.mjs.map +1 -1
- package/dist/internal-log-Bg4V1cPg.mjs +170 -0
- package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
- package/dist/internal-log-By4Govmu.js +223 -0
- package/dist/internal-log-By4Govmu.js.map +1 -0
- package/dist/{logitron-logger-UVeN-mQm.d.ts → logitron-logger-D22Yb61K.d.mts} +121 -100
- package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
- package/dist/{logitron-logger-BFDSO8Io.d.mts → logitron-logger-D_MYYrQt.d.ts} +121 -100
- package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
- package/dist/middleware.d.mts +13 -28
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +13 -28
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +20 -81
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +17 -79
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +37 -48
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +37 -48
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +124 -135
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +69 -78
- package/dist/nest.mjs.map +1 -1
- package/dist/{transport.manager-BiuCAJd2.mjs → otel-Dt5riXuE.mjs} +275 -117
- package/dist/otel-Dt5riXuE.mjs.map +1 -0
- package/dist/{transport.manager-CXbKKdVE.js → otel-DyeH6DVR.js} +373 -178
- package/dist/otel-DyeH6DVR.js.map +1 -0
- package/dist/own-property-BWkibepN.js +40 -0
- package/dist/own-property-BWkibepN.js.map +1 -0
- package/dist/own-property-CjFw9qwZ.mjs +29 -0
- package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
- package/dist/{trace.utils-CvXgaiQT.mjs → request-trace-BgNykH9M.mjs} +40 -9
- package/dist/request-trace-BgNykH9M.mjs.map +1 -0
- package/dist/{trace.utils-DpBOLDtq.js → request-trace-ByujsUZk.js} +117 -77
- package/dist/request-trace-ByujsUZk.js.map +1 -0
- package/dist/rolldown-runtime-D3PmRqjj.mjs +4 -0
- package/dist/{safe-stringify-DJ66tW5I.mjs → safe-stringify-B5p5ktFe.mjs} +39 -15
- package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
- package/dist/{safe-stringify-DWo3aZp_.js → safe-stringify-J3sh-7YM.js} +59 -36
- package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
- package/dist/{search-C4V0OMEn.js → search-CRjhHxe9.js} +319 -92
- package/dist/search-CRjhHxe9.js.map +1 -0
- package/dist/{search-CNh9uVwR.d.ts → search-DA3ft3X5.d.mts} +5 -22
- package/dist/search-DA3ft3X5.d.mts.map +1 -0
- package/dist/{search-BFbu_oVn.mjs → search-DAXKE-P9.mjs} +289 -62
- package/dist/search-DAXKE-P9.mjs.map +1 -0
- package/dist/{search-DXANsQ2n.d.mts → search-DEl3Pe47.d.ts} +5 -22
- package/dist/search-DEl3Pe47.d.ts.map +1 -0
- package/dist/search.d.mts +2 -4
- package/dist/search.d.ts +2 -4
- package/dist/search.js +3 -4
- package/dist/search.mjs +1 -4
- package/dist/secret-config-CmK2wVkr.js +272 -0
- package/dist/secret-config-CmK2wVkr.js.map +1 -0
- package/dist/secret-config-Dhb6pqTU.mjs +210 -0
- package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
- package/dist/{slack.transport-CXjQYOes.d.ts → slack.transport-BDyENuR0.d.mts} +56 -9
- package/dist/slack.transport-BDyENuR0.d.mts.map +1 -0
- package/dist/{slack.transport-Bzw7sucI.mjs → slack.transport-BTEwsREY.mjs} +263 -31
- package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
- package/dist/{slack.transport-BZzoXDPn.d.mts → slack.transport-C6E0l4kw.d.ts} +56 -9
- package/dist/slack.transport-C6E0l4kw.d.ts.map +1 -0
- package/dist/{slack.transport-BfJRouB2.js → slack.transport-UbYvOdKx.js} +286 -42
- package/dist/slack.transport-UbYvOdKx.js.map +1 -0
- package/dist/testing.d.mts +13 -11
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +13 -11
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +41 -7
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +40 -6
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.types-CGoHpWQR.d.ts → transport.types-CzJq4IrF.d.mts} +14 -5
- package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
- package/dist/{transport.types-BMnurPcc.d.mts → transport.types-CzJq4IrF.d.ts} +14 -5
- package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
- package/dist/transports.d.mts +39 -41
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +39 -41
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +19 -22
- package/dist/transports.mjs +7 -13
- package/dist/worker-entry.js +438 -107
- package/dist/worker.d.mts +1 -2
- package/dist/worker.d.ts +1 -2
- package/dist/worker.js +3 -4
- package/dist/worker.mjs +1 -4
- package/dist/{worker.transport-JvGPog3C.d.mts → worker.transport-B9mCQSM1.d.ts} +7 -6
- package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
- package/dist/{worker.transport-CdzSZJmw.d.ts → worker.transport-Bl8lFRck.d.mts} +7 -6
- package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
- package/dist/{worker.transport-lPxO2MVL.mjs → worker.transport-BmmOKb1-.mjs} +43 -10
- package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
- package/dist/{worker.transport-BdPxu3PN.js → worker.transport-DxxbqQCG.js} +48 -15
- package/dist/worker.transport-DxxbqQCG.js.map +1 -0
- package/package.json +51 -75
- package/dist/async-context-BzJrbfQs.mjs +0 -72
- package/dist/async-context-BzJrbfQs.mjs.map +0 -1
- package/dist/async-context-DyQQYq3I.js +0 -92
- package/dist/async-context-DyQQYq3I.js.map +0 -1
- package/dist/azure-monitor.transport-CHnjVRF-.mjs.map +0 -1
- package/dist/azure-monitor.transport-Cn_3Usvu.d.ts.map +0 -1
- package/dist/azure-monitor.transport-CrvfHd9C.js.map +0 -1
- package/dist/azure-monitor.transport-D7Da4RAb.d.mts.map +0 -1
- package/dist/batch-buffer-BY-mRWIK.js.map +0 -1
- package/dist/batch-buffer-PGvSgbmd.mjs.map +0 -1
- package/dist/builder-0gEzRopq.mjs.map +0 -1
- package/dist/builder-D44QktIo.js.map +0 -1
- package/dist/chunk-DLSkYcPk.mjs +0 -7
- package/dist/chunk-nOFOJqeH.js +0 -30
- package/dist/cloudwatch.transport-BO1ahxw-.js.map +0 -1
- package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +0 -1
- package/dist/cloudwatch.transport-DsEq633o.d.ts.map +0 -1
- package/dist/cloudwatch.transport-UlyZFWMn.d.mts.map +0 -1
- package/dist/entry-fields-BJkuPnIg.mjs.map +0 -1
- package/dist/entry-fields-BvOLFlJ4.js.map +0 -1
- package/dist/gcp.transport-B7oc97sG.d.ts.map +0 -1
- package/dist/gcp.transport-CHV8MGgz.js.map +0 -1
- package/dist/gcp.transport-DBX5TPIy.mjs.map +0 -1
- package/dist/gcp.transport-GrJurKo8.d.mts.map +0 -1
- package/dist/index-3mw5gaCw.d.mts.map +0 -1
- package/dist/index-DhIoploR.d.ts.map +0 -1
- package/dist/internal-log-BUJYMZbE.js +0 -70
- package/dist/internal-log-BUJYMZbE.js.map +0 -1
- package/dist/internal-log-Cm8SOWSV.mjs +0 -52
- package/dist/internal-log-Cm8SOWSV.mjs.map +0 -1
- package/dist/logitron-logger-BFDSO8Io.d.mts.map +0 -1
- package/dist/logitron-logger-UVeN-mQm.d.ts.map +0 -1
- package/dist/safe-stringify-DJ66tW5I.mjs.map +0 -1
- package/dist/safe-stringify-DWo3aZp_.js.map +0 -1
- package/dist/search-BFbu_oVn.mjs.map +0 -1
- package/dist/search-C4V0OMEn.js.map +0 -1
- package/dist/search-CNh9uVwR.d.ts.map +0 -1
- package/dist/search-DXANsQ2n.d.mts.map +0 -1
- package/dist/slack.transport-BZzoXDPn.d.mts.map +0 -1
- package/dist/slack.transport-BfJRouB2.js.map +0 -1
- package/dist/slack.transport-Bzw7sucI.mjs.map +0 -1
- package/dist/slack.transport-CXjQYOes.d.ts.map +0 -1
- package/dist/trace.utils-CvXgaiQT.mjs.map +0 -1
- package/dist/trace.utils-DpBOLDtq.js.map +0 -1
- package/dist/transport.manager-BiuCAJd2.mjs.map +0 -1
- package/dist/transport.manager-CXbKKdVE.js.map +0 -1
- package/dist/transport.types-BMnurPcc.d.mts.map +0 -1
- package/dist/transport.types-CGoHpWQR.d.ts.map +0 -1
- package/dist/worker.transport-BdPxu3PN.js.map +0 -1
- package/dist/worker.transport-CdzSZJmw.d.ts.map +0 -1
- package/dist/worker.transport-JvGPog3C.d.mts.map +0 -1
- package/dist/worker.transport-lPxO2MVL.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import { n as
|
|
2
|
-
import {
|
|
3
|
-
import { i as
|
|
4
|
-
import "./
|
|
5
|
-
import { a as
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { n as
|
|
11
|
-
import { a as BasicSearchEngine, i as CorrelationEngine, n as PatternRecognitionEngine, o as BasicLogIndexer, r as NLPSearchEngine, t as SearchManager } from "./search-BFbu_oVn.mjs";
|
|
1
|
+
import { C as DEFAULT_LOG_LEVELS, S as DEFAULT_LOG_COLORS, _ as serializeError, a as isLogixiaException, b as usePlugin, c as _shutdownRegistrySize, d as registerForShutdown, f as resetShutdownHandlers, g as normalizeError, h as isError, i as LogixiaException, l as deregisterFromShutdown, m as redactObject, n as generateRequestId, o as LogixiaLogger, p as applyRedaction, r as generateTraceId, s as createLogger$1, t as ErrorResponseBuilder, u as flushOnExit, v as PluginRegistry, w as LogLevel, x as DEFAULT_CONFIG, y as globalPluginRegistry } from "./builder-DhNhvOkt.mjs";
|
|
2
|
+
import { t as assignOwn } from "./own-property-CjFw9qwZ.mjs";
|
|
3
|
+
import { a as TRACE_CONTEXT_KEY, c as createTraceMiddleware, d as getTraceContextKey, f as runWithTraceId, h as traceStorage, i as MAX_INCOMING_ID_LENGTH, l as extractTraceId, m as setTraceId, o as TraceContext, p as sanitizeIncomingId, r as DEFAULT_TRACE_HEADERS, s as _setActiveContextKey, u as getCurrentTraceId } from "./request-trace-BgNykH9M.mjs";
|
|
4
|
+
import { n as createExpressContextMiddleware, r as createFastifyContextHook, t as LogixiaContext } from "./async-context-2mbUKhcl.mjs";
|
|
5
|
+
import { a as DEFAULT_REDACT_QUERY_PARAMS, c as buildNameSet, l as redactUrlQuery, n as internalLog, r as internalWarn } from "./internal-log-Bg4V1cPg.mjs";
|
|
6
|
+
import { t as safeToString } from "./coerce.utils-B_rEudCn.mjs";
|
|
7
|
+
import { i as stringifyForLog, n as retrocycle, r as safeStringify, t as decycleValue } from "./safe-stringify-B5p5ktFe.mjs";
|
|
8
|
+
import { a as getActiveOtelContext, i as disableOtelBridge, o as getOtelMetaFields, s as initOtelBridge, v as stripControlChars } from "./otel-Dt5riXuE.mjs";
|
|
9
|
+
import { i as toOtelSeverity, n as DiscordTransport, r as OtlpLogTransport, t as SlackTransport } from "./slack.transport-BTEwsREY.mjs";
|
|
10
|
+
import { a as BasicSearchEngine, i as CorrelationEngine, n as PatternRecognitionEngine, o as BasicLogIndexer, r as NLPSearchEngine, t as SearchManager } from "./search-DAXKE-P9.mjs";
|
|
12
11
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
13
|
-
|
|
14
|
-
//#region src/formatters/json.formatter.ts
|
|
12
|
+
// src/formatters/json.formatter.ts
|
|
15
13
|
/**
|
|
16
14
|
* Build a JSON.stringify replacer that replaces circular references with the
|
|
17
15
|
* string '[Circular]' instead of throwing. A fresh replacer must be created per
|
|
@@ -59,25 +57,20 @@ var JsonFormatter = class {
|
|
|
59
57
|
}
|
|
60
58
|
serializePayload(payload) {
|
|
61
59
|
const serialized = {};
|
|
62
|
-
for (const [key, value] of Object.entries(payload)) {
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
} catch {
|
|
72
|
-
serialized[key] = "[Unserializable]";
|
|
73
|
-
}
|
|
60
|
+
for (const [key, value] of Object.entries(payload)) try {
|
|
61
|
+
if (value instanceof Error) assignOwn(serialized, key, serializeError(value));
|
|
62
|
+
else if (value instanceof Date) assignOwn(serialized, key, value.toISOString());
|
|
63
|
+
else if (typeof value === "function") assignOwn(serialized, key, "[Function]");
|
|
64
|
+
else if (typeof value === "symbol") assignOwn(serialized, key, value.toString());
|
|
65
|
+
else if (value === void 0) assignOwn(serialized, key, null);
|
|
66
|
+
else assignOwn(serialized, key, value);
|
|
67
|
+
} catch {
|
|
68
|
+
assignOwn(serialized, key, "[Unserializable]");
|
|
74
69
|
}
|
|
75
70
|
return serialized;
|
|
76
71
|
}
|
|
77
72
|
};
|
|
78
|
-
|
|
79
|
-
//#endregion
|
|
80
|
-
//#region src/formatters/text.formatter.ts
|
|
73
|
+
// src/formatters/text.formatter.ts
|
|
81
74
|
const stripControls = (value) => stripControlChars(safeToString(value));
|
|
82
75
|
var TextFormatter = class TextFormatter {
|
|
83
76
|
constructor(options = {}) {
|
|
@@ -139,7 +132,6 @@ var TextFormatter = class TextFormatter {
|
|
|
139
132
|
switch (this.timestampFormat) {
|
|
140
133
|
case "iso": return date.toISOString();
|
|
141
134
|
case "short": return date.toLocaleTimeString();
|
|
142
|
-
case "locale":
|
|
143
135
|
default: return date.toLocaleString();
|
|
144
136
|
}
|
|
145
137
|
}
|
|
@@ -197,9 +189,7 @@ var TextFormatter = class TextFormatter {
|
|
|
197
189
|
});
|
|
198
190
|
}
|
|
199
191
|
};
|
|
200
|
-
|
|
201
|
-
//#endregion
|
|
202
|
-
//#region src/utils/runtime-control.ts
|
|
192
|
+
// src/utils/runtime-control.ts
|
|
203
193
|
const DEFAULT_CYCLE = [
|
|
204
194
|
"error",
|
|
205
195
|
"warn",
|
|
@@ -216,13 +206,14 @@ const DEFAULT_CYCLE = [
|
|
|
216
206
|
* memorizable command (`kill -USR2 <pid>`) is enough to ratchet verbosity up
|
|
217
207
|
* while chasing a bug and back down again — no value to remember.
|
|
218
208
|
*/
|
|
219
|
-
function registerLevelSignal(logger
|
|
209
|
+
function registerLevelSignal(logger, options = {}) {
|
|
220
210
|
const signal = options.signal ?? "SIGUSR2";
|
|
221
211
|
const cycle = options.cycle && options.cycle.length > 0 ? options.cycle : [...DEFAULT_CYCLE];
|
|
222
212
|
const handler = () => {
|
|
223
|
-
const current = logger
|
|
224
|
-
const
|
|
225
|
-
|
|
213
|
+
const current = logger.getLevel();
|
|
214
|
+
const idx = cycle.indexOf(current);
|
|
215
|
+
const next = cycle[(idx + 1) % cycle.length];
|
|
216
|
+
logger.setLevel(next);
|
|
226
217
|
internalLog(`runtime level changed via ${signal}: ${current} → ${next}`);
|
|
227
218
|
};
|
|
228
219
|
process.on(signal, handler);
|
|
@@ -231,7 +222,7 @@ function registerLevelSignal(logger$1, options = {}) {
|
|
|
231
222
|
};
|
|
232
223
|
}
|
|
233
224
|
/** Maximum accepted request body size for the level control handler. */
|
|
234
|
-
const MAX_BODY_BYTES =
|
|
225
|
+
const MAX_BODY_BYTES = 16384;
|
|
235
226
|
function isJsonContentType(req) {
|
|
236
227
|
var _req$headers;
|
|
237
228
|
const raw = (_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers["content-type"];
|
|
@@ -239,7 +230,7 @@ function isJsonContentType(req) {
|
|
|
239
230
|
if (typeof value !== "string") return false;
|
|
240
231
|
return value.split(";")[0].trim().toLowerCase() === "application/json";
|
|
241
232
|
}
|
|
242
|
-
const VALID_LEVELS = new Set([
|
|
233
|
+
const VALID_LEVELS = /* @__PURE__ */ new Set([
|
|
243
234
|
"error",
|
|
244
235
|
"warn",
|
|
245
236
|
"info",
|
|
@@ -268,13 +259,13 @@ const VALID_LEVELS = new Set([
|
|
|
268
259
|
* which also keeps cross-site form posts out) and a body of at most 16 KB
|
|
269
260
|
* (otherwise 413).
|
|
270
261
|
*/
|
|
271
|
-
function createLevelControlHandler(logger
|
|
262
|
+
function createLevelControlHandler(logger, options = {}) {
|
|
272
263
|
const allowed = options.allowedLevels && options.allowedLevels.length > 0 ? new Set(options.allowedLevels.map((l) => l.toLowerCase())) : VALID_LEVELS;
|
|
273
264
|
const snapshot = () => {
|
|
274
265
|
var _logger$getNamespaceL;
|
|
275
266
|
return {
|
|
276
|
-
level: logger
|
|
277
|
-
namespaceLevels: ((_logger$getNamespaceL = logger
|
|
267
|
+
level: logger.getLevel(),
|
|
268
|
+
namespaceLevels: ((_logger$getNamespaceL = logger.getNamespaceLevels) === null || _logger$getNamespaceL === void 0 ? void 0 : _logger$getNamespaceL.call(logger)) ?? {}
|
|
278
269
|
};
|
|
279
270
|
};
|
|
280
271
|
const send = (res, status, body) => {
|
|
@@ -300,7 +291,7 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
300
291
|
});
|
|
301
292
|
return;
|
|
302
293
|
}
|
|
303
|
-
logger
|
|
294
|
+
logger.setLevel(lvl);
|
|
304
295
|
}
|
|
305
296
|
if (parsed.namespaceLevels !== void 0) {
|
|
306
297
|
if (typeof parsed.namespaceLevels !== "object" || parsed.namespaceLevels === null || Array.isArray(parsed.namespaceLevels)) {
|
|
@@ -312,9 +303,9 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
312
303
|
send(res, 400, { error: `unknown level "${String(lvl)}" for namespace "${pat}"` });
|
|
313
304
|
return;
|
|
314
305
|
}
|
|
315
|
-
if (logger
|
|
306
|
+
if (logger.setNamespaceLevels) {
|
|
316
307
|
const coerced = Object.fromEntries(Object.entries(nl).map(([pat, lvl]) => [pat, String(lvl).toLowerCase()]));
|
|
317
|
-
logger
|
|
308
|
+
logger.setNamespaceLevels(coerced);
|
|
318
309
|
} else internalWarn("level control: logger does not support setNamespaceLevels — ignored");
|
|
319
310
|
}
|
|
320
311
|
send(res, 200, snapshot());
|
|
@@ -376,9 +367,54 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
376
367
|
send(res, 405, { error: `method ${method} not allowed` });
|
|
377
368
|
};
|
|
378
369
|
}
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
370
|
+
// src/utils/typed-logger.ts
|
|
371
|
+
/**
|
|
372
|
+
* logixia — TypeScript typed log fields
|
|
373
|
+
*
|
|
374
|
+
* Solves the type-safety gap: standard `Record<string, unknown>` metadata gives
|
|
375
|
+
* zero IDE autocomplete and lets typos slip silently into production logs.
|
|
376
|
+
*
|
|
377
|
+
* Two complementary utilities:
|
|
378
|
+
*
|
|
379
|
+
* 1. `createTypedLogger<TFields>()` — wraps any IBaseLogger so that the second
|
|
380
|
+
* argument of every log method is constrained to `TFields` (a typed object).
|
|
381
|
+
* Compile-time safety, zero runtime overhead.
|
|
382
|
+
*
|
|
383
|
+
* 2. `defineLogSchema<TFields>(schema)` — declares expected fields with optional
|
|
384
|
+
* validators. In development (NODE_ENV !== 'production') every log call is
|
|
385
|
+
* validated against the schema and a warning is emitted for missing required
|
|
386
|
+
* fields or type mismatches.
|
|
387
|
+
*
|
|
388
|
+
* @example
|
|
389
|
+
* ```ts
|
|
390
|
+
* import { createTypedLogger, defineLogSchema } from 'logixia';
|
|
391
|
+
*
|
|
392
|
+
* interface OrderFields {
|
|
393
|
+
* orderId: string;
|
|
394
|
+
* userId: string;
|
|
395
|
+
* amount?: number;
|
|
396
|
+
* currency?: string;
|
|
397
|
+
* }
|
|
398
|
+
*
|
|
399
|
+
* const schema = defineLogSchema<OrderFields>({
|
|
400
|
+
* orderId: { type: 'string', required: true },
|
|
401
|
+
* userId: { type: 'string', required: true },
|
|
402
|
+
* amount: { type: 'number' },
|
|
403
|
+
* currency: { type: 'string' },
|
|
404
|
+
* });
|
|
405
|
+
*
|
|
406
|
+
* const orderLogger = createTypedLogger<OrderFields>(baseLogger, schema);
|
|
407
|
+
* await orderLogger.info('Order created', { orderId: 'ord_123', userId: 'usr_456', amount: 99.99 });
|
|
408
|
+
* // ^^^^ fully typed autocomplete ^^^^
|
|
409
|
+
* ```
|
|
410
|
+
*/
|
|
411
|
+
function isProduction() {
|
|
412
|
+
try {
|
|
413
|
+
return process.env.NODE_ENV === "production";
|
|
414
|
+
} catch {
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
382
418
|
/**
|
|
383
419
|
* Define a typed schema for a category of log entries.
|
|
384
420
|
*
|
|
@@ -389,7 +425,7 @@ function defineLogSchema(fields) {
|
|
|
389
425
|
return {
|
|
390
426
|
fields,
|
|
391
427
|
validate(payload) {
|
|
392
|
-
if (
|
|
428
|
+
if (isProduction()) return [];
|
|
393
429
|
const warnings = [];
|
|
394
430
|
for (const [key, def] of Object.entries(fields)) {
|
|
395
431
|
const value = payload[key];
|
|
@@ -416,7 +452,7 @@ function defineLogSchema(fields) {
|
|
|
416
452
|
* @param logger Any object that implements `IBaseLogger` (e.g. the result of `createLogger()`)
|
|
417
453
|
* @param schema Optional schema for dev-time validation. Created with `defineLogSchema()`.
|
|
418
454
|
*/
|
|
419
|
-
function createTypedLogger(logger
|
|
455
|
+
function createTypedLogger(logger, schema) {
|
|
420
456
|
function withValidation(level, fn, message, data) {
|
|
421
457
|
if (schema && data) {
|
|
422
458
|
const warnings = schema.validate(data);
|
|
@@ -425,25 +461,56 @@ function createTypedLogger(logger$1, schema) {
|
|
|
425
461
|
return fn(message, data);
|
|
426
462
|
}
|
|
427
463
|
return {
|
|
428
|
-
raw: logger
|
|
464
|
+
raw: logger,
|
|
429
465
|
error(messageOrError, data) {
|
|
430
466
|
if (schema && data) {
|
|
431
467
|
const warnings = schema.validate(data);
|
|
432
468
|
const display = messageOrError instanceof Error ? messageOrError.message : messageOrError;
|
|
433
469
|
for (const w of warnings) internalWarn(`[logixia/schema] ${w} — level=error message="${display}"`);
|
|
434
470
|
}
|
|
435
|
-
return logger
|
|
471
|
+
return logger.error(messageOrError, data);
|
|
436
472
|
},
|
|
437
|
-
warn: (m, d) => withValidation("warn", logger
|
|
438
|
-
info: (m, d) => withValidation("info", logger
|
|
439
|
-
debug: (m, d) => withValidation("debug", logger
|
|
440
|
-
verbose: (m, d) => withValidation("verbose", (logger
|
|
441
|
-
trace: (m, d) => withValidation("trace", (logger
|
|
473
|
+
warn: (m, d) => withValidation("warn", logger.warn.bind(logger), m, d),
|
|
474
|
+
info: (m, d) => withValidation("info", logger.info.bind(logger), m, d),
|
|
475
|
+
debug: (m, d) => withValidation("debug", logger.debug.bind(logger), m, d),
|
|
476
|
+
verbose: (m, d) => withValidation("verbose", (logger.verbose ?? logger.debug).bind(logger), m, d),
|
|
477
|
+
trace: (m, d) => withValidation("trace", (logger.trace ?? logger.debug).bind(logger), m, d)
|
|
442
478
|
};
|
|
443
479
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
480
|
+
// src/wide-events.ts
|
|
481
|
+
/**
|
|
482
|
+
* logixia — Canonical Log Lines / Wide Events.
|
|
483
|
+
*
|
|
484
|
+
* Emit ONE dense, structured event per unit of work (usually a request) instead
|
|
485
|
+
* of scattering details across many narrow log lines. Fields are accumulated as
|
|
486
|
+
* the request flows through middleware and business logic, then the whole event
|
|
487
|
+
* is emitted ONCE — in a `finally`/teardown path so it fires even on errors.
|
|
488
|
+
*
|
|
489
|
+
* This is the "canonical log line" pattern (Stripe) / "wide events" /
|
|
490
|
+
* "Observability 2.0" (Honeycomb): one pre-joined, queryable record per request,
|
|
491
|
+
* so operators never JOIN across log lines during an incident. It composes with
|
|
492
|
+
* logixia's existing trace correlation — when a trace is active, the event
|
|
493
|
+
* carries `traceId`/`spanId`, making it OTel-friendly.
|
|
494
|
+
*
|
|
495
|
+
* @example Manual scope
|
|
496
|
+
* ```ts
|
|
497
|
+
* import { withWideEvent, addEventFields } from 'logixia';
|
|
498
|
+
*
|
|
499
|
+
* await withWideEvent(logger, { route: '/checkout' }, async () => {
|
|
500
|
+
* addEventFields({ userId, planTier }); // from anywhere in the call tree
|
|
501
|
+
* addEventFields({ dbQueries: 4, cacheHit });
|
|
502
|
+
* // ...one wide event is emitted automatically when this callback settles,
|
|
503
|
+
* // even if it throws.
|
|
504
|
+
* });
|
|
505
|
+
* ```
|
|
506
|
+
*
|
|
507
|
+
* @example Express middleware (auto-emit on response finish/close)
|
|
508
|
+
* ```ts
|
|
509
|
+
* import { wideEventMiddleware } from 'logixia';
|
|
510
|
+
* app.use(wideEventMiddleware(logger));
|
|
511
|
+
* app.get('/x', (req, res) => { addEventFields({ handled: 'x' }); res.json({}); });
|
|
512
|
+
* ```
|
|
513
|
+
*/
|
|
447
514
|
const _storage = new AsyncLocalStorage();
|
|
448
515
|
/**
|
|
449
516
|
* Merge fields into the wide event for the current async scope. No-op (with no
|
|
@@ -464,7 +531,7 @@ function getEventFields() {
|
|
|
464
531
|
const state = _storage.getStore();
|
|
465
532
|
return state ? { ...state.fields } : void 0;
|
|
466
533
|
}
|
|
467
|
-
function emit(logger
|
|
534
|
+
function emit(logger, state, options, extra) {
|
|
468
535
|
if (state.emitted) return;
|
|
469
536
|
state.emitted = true;
|
|
470
537
|
const level = options.level ?? "info";
|
|
@@ -478,7 +545,7 @@ function emit(logger$1, state, options, extra) {
|
|
|
478
545
|
const traceId = getCurrentTraceId();
|
|
479
546
|
if (traceId !== void 0 && payload["traceId"] === void 0) payload["traceId"] = traceId;
|
|
480
547
|
}
|
|
481
|
-
const p = logger
|
|
548
|
+
const p = logger.logLevel(level, message, payload);
|
|
482
549
|
if (p && typeof p.catch === "function") p.catch(() => {});
|
|
483
550
|
}
|
|
484
551
|
/**
|
|
@@ -487,7 +554,7 @@ function emit(logger$1, state, options, extra) {
|
|
|
487
554
|
* when the callback settles — on success OR error (the canonical "emit in
|
|
488
555
|
* finally" guarantee). On error, `error` + `errorMessage` fields are added.
|
|
489
556
|
*/
|
|
490
|
-
async function withWideEvent(logger
|
|
557
|
+
async function withWideEvent(logger, initialFields, callback, options = {}) {
|
|
491
558
|
const state = {
|
|
492
559
|
fields: { ...initialFields },
|
|
493
560
|
startMs: Date.now(),
|
|
@@ -496,10 +563,10 @@ async function withWideEvent(logger$1, initialFields, callback, options = {}) {
|
|
|
496
563
|
return _storage.run(state, async () => {
|
|
497
564
|
try {
|
|
498
565
|
const result = await callback();
|
|
499
|
-
emit(logger
|
|
566
|
+
emit(logger, state, options);
|
|
500
567
|
return result;
|
|
501
568
|
} catch (error) {
|
|
502
|
-
emit(logger
|
|
569
|
+
emit(logger, state, options, {
|
|
503
570
|
error: true,
|
|
504
571
|
errorMessage: error instanceof Error ? error.message : String(error)
|
|
505
572
|
});
|
|
@@ -514,17 +581,19 @@ async function withWideEvent(logger$1, initialFields, callback, options = {}) {
|
|
|
514
581
|
* more via `addEventFields`. The completion event includes `statusCode` and the
|
|
515
582
|
* request duration.
|
|
516
583
|
*/
|
|
517
|
-
function wideEventMiddleware(logger
|
|
584
|
+
function wideEventMiddleware(logger, options = {}) {
|
|
585
|
+
const redactParams = buildNameSet(DEFAULT_REDACT_QUERY_PARAMS, options.redactQueryParams);
|
|
518
586
|
return function logixiaWideEventMiddleware(req, res, next) {
|
|
519
587
|
var _options$skip, _req$socket, _res$once, _res$once2;
|
|
520
588
|
if ((_options$skip = options.skip) === null || _options$skip === void 0 ? void 0 : _options$skip.call(options, req)) {
|
|
521
589
|
next();
|
|
522
590
|
return;
|
|
523
591
|
}
|
|
592
|
+
const rawUrl = req.originalUrl ?? req.url;
|
|
524
593
|
const state = {
|
|
525
594
|
fields: {
|
|
526
595
|
method: req.method,
|
|
527
|
-
url:
|
|
596
|
+
url: rawUrl === void 0 ? void 0 : redactUrlQuery(rawUrl, redactParams),
|
|
528
597
|
ip: req.ip ?? ((_req$socket = req.socket) === null || _req$socket === void 0 ? void 0 : _req$socket.remoteAddress),
|
|
529
598
|
...options.enrich ? options.enrich(req) : {}
|
|
530
599
|
},
|
|
@@ -532,192 +601,14 @@ function wideEventMiddleware(logger$1, options = {}) {
|
|
|
532
601
|
emitted: false
|
|
533
602
|
};
|
|
534
603
|
const finalize = () => {
|
|
535
|
-
emit(logger
|
|
604
|
+
emit(logger, state, options, { statusCode: res.statusCode ?? 0 });
|
|
536
605
|
};
|
|
537
606
|
(_res$once = res.once) === null || _res$once === void 0 || _res$once.call(res, "finish", finalize);
|
|
538
607
|
(_res$once2 = res.once) === null || _res$once2 === void 0 || _res$once2.call(res, "close", finalize);
|
|
539
608
|
_storage.run(state, () => next());
|
|
540
609
|
};
|
|
541
610
|
}
|
|
542
|
-
|
|
543
|
-
//#endregion
|
|
544
|
-
//#region src/transports/otlp.transport.ts
|
|
545
|
-
const HEX_32 = /^[0-9a-f]{32}$/;
|
|
546
|
-
/**
|
|
547
|
-
* OTLP JSON wants a 32-char lowercase hex trace id. Dashed UUIDs are
|
|
548
|
-
* normalised; anything else (or all zeros) returns undefined.
|
|
549
|
-
*/
|
|
550
|
-
function toOtlpTraceId(id) {
|
|
551
|
-
const hex = id.replace(/-/g, "").toLowerCase();
|
|
552
|
-
return HEX_32.test(hex) && hex !== "0".repeat(32) ? hex : void 0;
|
|
553
|
-
}
|
|
554
|
-
/**
|
|
555
|
-
* Map a logixia level name to an OTel SeverityNumber (1–24) and text.
|
|
556
|
-
* Per the OTel logs SDK spec: TRACE=1, DEBUG=5, INFO=9, WARN=13, ERROR=17,
|
|
557
|
-
* FATAL=21. Custom/unknown levels fall back to INFO (9).
|
|
558
|
-
*/
|
|
559
|
-
function toOtelSeverity(level) {
|
|
560
|
-
switch (level.toLowerCase()) {
|
|
561
|
-
case "trace": return {
|
|
562
|
-
number: 1,
|
|
563
|
-
text: "TRACE"
|
|
564
|
-
};
|
|
565
|
-
case "verbose": return {
|
|
566
|
-
number: 5,
|
|
567
|
-
text: "DEBUG"
|
|
568
|
-
};
|
|
569
|
-
case "debug": return {
|
|
570
|
-
number: 5,
|
|
571
|
-
text: "DEBUG"
|
|
572
|
-
};
|
|
573
|
-
case "info": return {
|
|
574
|
-
number: 9,
|
|
575
|
-
text: "INFO"
|
|
576
|
-
};
|
|
577
|
-
case "warn":
|
|
578
|
-
case "warning": return {
|
|
579
|
-
number: 13,
|
|
580
|
-
text: "WARN"
|
|
581
|
-
};
|
|
582
|
-
case "error": return {
|
|
583
|
-
number: 17,
|
|
584
|
-
text: "ERROR"
|
|
585
|
-
};
|
|
586
|
-
case "fatal": return {
|
|
587
|
-
number: 21,
|
|
588
|
-
text: "FATAL"
|
|
589
|
-
};
|
|
590
|
-
default: return {
|
|
591
|
-
number: 9,
|
|
592
|
-
text: "INFO"
|
|
593
|
-
};
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
/** Coerce a JS value into an OTLP AnyValue. */
|
|
597
|
-
function toAnyValue(value) {
|
|
598
|
-
if (typeof value === "string") return { stringValue: value };
|
|
599
|
-
if (typeof value === "boolean") return { boolValue: value };
|
|
600
|
-
if (typeof value === "number") return Number.isInteger(value) ? { intValue: value } : { doubleValue: value };
|
|
601
|
-
if (typeof value === "bigint") return { stringValue: value.toString() };
|
|
602
|
-
if (value === null || value === void 0) return { stringValue: "" };
|
|
603
|
-
try {
|
|
604
|
-
return { stringValue: stringifyForLog(value) };
|
|
605
|
-
} catch {
|
|
606
|
-
return { stringValue: String(value) };
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
/** Build the OTLP KeyValue attribute list from a flat record. */
|
|
610
|
-
function toAttributes(rec) {
|
|
611
|
-
return Object.entries(rec).map(([key, value]) => ({
|
|
612
|
-
key,
|
|
613
|
-
value: toAnyValue(value)
|
|
614
|
-
}));
|
|
615
|
-
}
|
|
616
|
-
var OtlpLogTransport = class {
|
|
617
|
-
constructor(config) {
|
|
618
|
-
this.name = "otlp";
|
|
619
|
-
this.flushTimer = null;
|
|
620
|
-
this.url = config.url;
|
|
621
|
-
this.headers = config.headers ?? {};
|
|
622
|
-
this.batchSize = config.batchSize ?? 100;
|
|
623
|
-
this.flushIntervalMs = config.flushIntervalMs ?? 5e3;
|
|
624
|
-
this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
625
|
-
this.level = config.level;
|
|
626
|
-
this.buffer = new BatchBuffer({
|
|
627
|
-
name: "OtlpLogTransport",
|
|
628
|
-
batchSize: this.batchSize,
|
|
629
|
-
maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,
|
|
630
|
-
send: (entries) => this.send(entries)
|
|
631
|
-
});
|
|
632
|
-
this.resourceAttrs = toAttributes({
|
|
633
|
-
"service.name": config.serviceName ?? "logixia",
|
|
634
|
-
...config.serviceVersion ? { "service.version": config.serviceVersion } : {},
|
|
635
|
-
...config.environment ? { "deployment.environment": config.environment } : {},
|
|
636
|
-
...config.resourceAttributes ?? {}
|
|
637
|
-
});
|
|
638
|
-
this.flushTimer = setInterval(() => {
|
|
639
|
-
this.flush().catch(() => {});
|
|
640
|
-
}, this.flushIntervalMs);
|
|
641
|
-
if (this.flushTimer.unref) this.flushTimer.unref();
|
|
642
|
-
}
|
|
643
|
-
write(entry) {
|
|
644
|
-
this.buffer.push(entry);
|
|
645
|
-
this.buffer.flushIfFull();
|
|
646
|
-
}
|
|
647
|
-
/** Convert one entry into an OTLP LogRecord. */
|
|
648
|
-
toLogRecord(entry) {
|
|
649
|
-
const sev = toOtelSeverity(entry.level);
|
|
650
|
-
const tsNanos = String(entry.timestamp.getTime() * 1e6);
|
|
651
|
-
const attrs = { ...entry.data ?? {} };
|
|
652
|
-
if (entry.context !== void 0) attrs["context"] = entry.context;
|
|
653
|
-
if (entry.appName !== void 0) attrs["app.name"] = entry.appName;
|
|
654
|
-
if (entry.environment !== void 0) attrs["deployment.environment"] = entry.environment;
|
|
655
|
-
const record = {
|
|
656
|
-
timeUnixNano: tsNanos,
|
|
657
|
-
observedTimeUnixNano: tsNanos,
|
|
658
|
-
severityNumber: sev.number,
|
|
659
|
-
severityText: sev.text,
|
|
660
|
-
body: { stringValue: entry.message },
|
|
661
|
-
attributes: toAttributes(attrs)
|
|
662
|
-
};
|
|
663
|
-
if (entry.traceId) {
|
|
664
|
-
const traceId = toOtlpTraceId(entry.traceId);
|
|
665
|
-
if (traceId) record["traceId"] = traceId;
|
|
666
|
-
else record["attributes"].push({
|
|
667
|
-
key: "trace_id",
|
|
668
|
-
value: { stringValue: entry.traceId }
|
|
669
|
-
});
|
|
670
|
-
}
|
|
671
|
-
return record;
|
|
672
|
-
}
|
|
673
|
-
buildPayload(entries) {
|
|
674
|
-
return stringifyForLog({ resourceLogs: [{
|
|
675
|
-
resource: { attributes: this.resourceAttrs },
|
|
676
|
-
scopeLogs: [{
|
|
677
|
-
scope: { name: "logixia" },
|
|
678
|
-
logRecords: entries.map((e) => this.toLogRecord(e))
|
|
679
|
-
}]
|
|
680
|
-
}] });
|
|
681
|
-
}
|
|
682
|
-
flush() {
|
|
683
|
-
return this.buffer.flush();
|
|
684
|
-
}
|
|
685
|
-
async send(entries) {
|
|
686
|
-
if (typeof fetch !== "function") {
|
|
687
|
-
internalWarn("OtlpLogTransport: global fetch unavailable — cannot export logs");
|
|
688
|
-
return;
|
|
689
|
-
}
|
|
690
|
-
const controller = new AbortController();
|
|
691
|
-
const timer = setTimeout(() => controller.abort(), this.requestTimeoutMs);
|
|
692
|
-
try {
|
|
693
|
-
const res = await fetch(this.url, {
|
|
694
|
-
method: "POST",
|
|
695
|
-
headers: {
|
|
696
|
-
"Content-Type": "application/json",
|
|
697
|
-
...this.headers
|
|
698
|
-
},
|
|
699
|
-
body: this.buildPayload(entries),
|
|
700
|
-
signal: controller.signal
|
|
701
|
-
});
|
|
702
|
-
if (!res.ok) throw new HttpError(res.status, "", "OTLP export");
|
|
703
|
-
} catch (err) {
|
|
704
|
-
if (controller.signal.aborted) throw new Error(`OTLP export timed out after ${this.requestTimeoutMs}ms`, { cause: err });
|
|
705
|
-
throw err;
|
|
706
|
-
} finally {
|
|
707
|
-
clearTimeout(timer);
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
async close() {
|
|
711
|
-
if (this.flushTimer) {
|
|
712
|
-
clearInterval(this.flushTimer);
|
|
713
|
-
this.flushTimer = null;
|
|
714
|
-
}
|
|
715
|
-
await this.buffer.close();
|
|
716
|
-
}
|
|
717
|
-
};
|
|
718
|
-
|
|
719
|
-
//#endregion
|
|
720
|
-
//#region src/metrics.ts
|
|
611
|
+
// src/metrics.ts
|
|
721
612
|
const DEFAULT_BUCKETS = [
|
|
722
613
|
1,
|
|
723
614
|
5,
|
|
@@ -859,9 +750,10 @@ var MetricsPlugin = class {
|
|
|
859
750
|
const helpText = config.help ?? rawName.replace(/_/g, " ");
|
|
860
751
|
lines.push(`# HELP ${metricName} ${helpText}`);
|
|
861
752
|
lines.push(`# TYPE ${metricName} ${config.type}`);
|
|
862
|
-
if (state.type === "counter")
|
|
863
|
-
|
|
864
|
-
|
|
753
|
+
if (state.type === "counter") {
|
|
754
|
+
if (state.values.size === 0) lines.push(`${metricName} 0`);
|
|
755
|
+
else for (const [labelKey, count] of state.values) lines.push(`${metricName}${renderLabels(labelKey)} ${count}`);
|
|
756
|
+
} else if (state.type === "histogram") for (const [labelKey, bucketCounts] of state.counts) {
|
|
865
757
|
const labelSuffix = renderLabels(labelKey);
|
|
866
758
|
const baseObj = labelKey === "{}" ? {} : JSON.parse(labelKey);
|
|
867
759
|
for (let i = 0; i < state.buckets.length; i++) {
|
|
@@ -879,8 +771,10 @@ var MetricsPlugin = class {
|
|
|
879
771
|
lines.push(`${metricName}_sum${labelSuffix} ${state.sums.get(labelKey) ?? 0}`);
|
|
880
772
|
lines.push(`${metricName}_count${labelSuffix} ${state.observations.get(labelKey) ?? 0}`);
|
|
881
773
|
}
|
|
882
|
-
else if (state.type === "gauge")
|
|
883
|
-
|
|
774
|
+
else if (state.type === "gauge") {
|
|
775
|
+
if (state.values.size === 0) lines.push(`${metricName} 0`);
|
|
776
|
+
else for (const [labelKey, val] of state.values) lines.push(`${metricName}${renderLabels(labelKey)} ${val}`);
|
|
777
|
+
}
|
|
884
778
|
}
|
|
885
779
|
return `${lines.join("\n")}\n`;
|
|
886
780
|
}
|
|
@@ -997,9 +891,20 @@ var MetricsPlugin = class {
|
|
|
997
891
|
function createMetricsPlugin(map, options) {
|
|
998
892
|
return new MetricsPlugin(map, options);
|
|
999
893
|
}
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
894
|
+
// src/index.ts
|
|
895
|
+
/**
|
|
896
|
+
* Logixia - Advanced TypeScript Logger
|
|
897
|
+
*
|
|
898
|
+
* A comprehensive logging library with support for:
|
|
899
|
+
* - Multiple output formats (console, file, JSON)
|
|
900
|
+
* - Trace ID tracking
|
|
901
|
+
* - Performance monitoring
|
|
902
|
+
* - NestJS integration
|
|
903
|
+
* - Customizable log levels and colors
|
|
904
|
+
* - Intelligent log search and aggregation
|
|
905
|
+
* - Natural language query processing
|
|
906
|
+
* - Pattern recognition and anomaly detection
|
|
907
|
+
*/
|
|
1003
908
|
/**
|
|
1004
909
|
* Create a new Logixia logger instance with TypeScript support for custom levels
|
|
1005
910
|
* @param config - Logger configuration
|
|
@@ -1013,7 +918,6 @@ const logger = new LogixiaLogger(DEFAULT_CONFIG);
|
|
|
1013
918
|
/**
|
|
1014
919
|
* Export default configuration for reference
|
|
1015
920
|
*/
|
|
1016
|
-
|
|
1017
|
-
//#endregion
|
|
1018
921
|
export { BasicLogIndexer, BasicSearchEngine, CorrelationEngine, DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, DiscordTransport, ErrorResponseBuilder, JsonFormatter, LogLevel, LogixiaContext, LogixiaException, LogixiaLogger, MAX_INCOMING_ID_LENGTH, MetricsPlugin, NLPSearchEngine, OVERFLOW_LABEL_VALUE, OtlpLogTransport, PatternRecognitionEngine, PluginRegistry, SearchManager, SlackTransport, TRACE_CONTEXT_KEY, TextFormatter, TraceContext, _setActiveContextKey, _shutdownRegistrySize, addEventFields, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLevelControlHandler, createLogger, createMetricsPlugin, createTraceMiddleware, createTypedLogger, decycleValue, defineLogSchema, deregisterFromShutdown, disableOtelBridge, extractTraceId, flushOnExit, generateRequestId, generateTraceId, getActiveOtelContext, getCurrentTraceId, getEventFields, getOtelMetaFields, getTraceContextKey, globalPluginRegistry, initOtelBridge, isError, isLogixiaException, logger, normalizeError, redactObject, registerForShutdown, registerLevelSignal, resetShutdownHandlers, retrocycle, runWithTraceId, safeStringify, sanitizeIncomingId, serializeError, setEventField, setTraceId, stringifyForLog, toOtelSeverity, traceStorage, usePlugin, wideEventMiddleware, withWideEvent };
|
|
922
|
+
|
|
1019
923
|
//# sourceMappingURL=index.mjs.map
|