logixia 1.13.0 → 2.0.0
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 +81 -16
- package/dist/{async-context-CwBNMm2E.mjs → async-context-BzJrbfQs.mjs} +8 -4
- package/dist/async-context-BzJrbfQs.mjs.map +1 -0
- package/dist/{async-context-CSHWoHMB.js → async-context-DyQQYq3I.js} +8 -4
- package/dist/async-context-DyQQYq3I.js.map +1 -0
- package/dist/{azure-monitor.transport-CG7ClkYj.d.ts → azure-monitor.transport-Cn_3Usvu.d.ts} +2 -2
- package/dist/{azure-monitor.transport-CG7ClkYj.d.ts.map → azure-monitor.transport-Cn_3Usvu.d.ts.map} +1 -1
- package/dist/{azure-monitor.transport-Cm74kXZS.d.mts → azure-monitor.transport-D7Da4RAb.d.mts} +2 -2
- package/dist/{azure-monitor.transport-Cm74kXZS.d.mts.map → azure-monitor.transport-D7Da4RAb.d.mts.map} +1 -1
- package/dist/azure.d.mts +2 -2
- package/dist/azure.d.ts +2 -2
- package/dist/browser.d.mts +9 -0
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +9 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +43 -12
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +43 -12
- package/dist/browser.mjs.map +1 -1
- package/dist/{logitron-logger.module-Bs3XYZgF.mjs → builder-0gEzRopq.mjs} +383 -1021
- package/dist/builder-0gEzRopq.mjs.map +1 -0
- package/dist/{logitron-logger.module-BsDZR5BH.js → builder-D44QktIo.js} +411 -1155
- package/dist/builder-D44QktIo.js.map +1 -0
- package/dist/cli/index.js +130 -65
- package/dist/cloudwatch.d.mts +2 -2
- package/dist/cloudwatch.d.ts +2 -2
- package/dist/cloudwatch.js +2 -1
- package/dist/cloudwatch.mjs +2 -1
- package/dist/{cloudwatch.transport-pNBNWJLt.js → cloudwatch.transport-BO1ahxw-.js} +26 -19
- package/dist/cloudwatch.transport-BO1ahxw-.js.map +1 -0
- package/dist/{cloudwatch.transport-yBwm4OeO.mjs → cloudwatch.transport-DZ6ies7g.mjs} +26 -19
- package/dist/cloudwatch.transport-DZ6ies7g.mjs.map +1 -0
- package/dist/{cloudwatch.transport-CGHY4buE.d.mts → cloudwatch.transport-DsEq633o.d.ts} +9 -2
- package/dist/cloudwatch.transport-DsEq633o.d.ts.map +1 -0
- package/dist/{cloudwatch.transport-DK_8cKd3.d.ts → cloudwatch.transport-UlyZFWMn.d.mts} +9 -2
- package/dist/cloudwatch.transport-UlyZFWMn.d.mts.map +1 -0
- package/dist/{coerce.utils-BN980Y9V.js → coerce.utils-B-LilukN.js} +1 -1
- package/dist/{coerce.utils-BN980Y9V.js.map → coerce.utils-B-LilukN.js.map} +1 -1
- package/dist/{coerce.utils-Dxv4_ikC.mjs → coerce.utils-Cu6IUTgX.mjs} +1 -1
- package/dist/{coerce.utils-Dxv4_ikC.mjs.map → coerce.utils-Cu6IUTgX.mjs.map} +1 -1
- package/dist/correlation.d.mts +24 -6
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +24 -6
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +41 -16
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +41 -16
- package/dist/correlation.mjs.map +1 -1
- package/dist/entry-fields-BJkuPnIg.mjs +30 -0
- package/dist/entry-fields-BJkuPnIg.mjs.map +1 -0
- package/dist/entry-fields-BvOLFlJ4.js +36 -0
- package/dist/entry-fields-BvOLFlJ4.js.map +1 -0
- package/dist/gcp.d.mts +2 -2
- package/dist/gcp.d.ts +2 -2
- package/dist/gcp.js +2 -1
- package/dist/gcp.mjs +2 -1
- package/dist/{gcp.transport-BOhkVKlI.d.ts → gcp.transport-B7oc97sG.d.ts} +2 -2
- package/dist/gcp.transport-B7oc97sG.d.ts.map +1 -0
- package/dist/{gcp.transport-SHdtc1n0.js → gcp.transport-CHV8MGgz.js} +5 -5
- package/dist/gcp.transport-CHV8MGgz.js.map +1 -0
- package/dist/{gcp.transport-BJuNRFe_.mjs → gcp.transport-DBX5TPIy.mjs} +5 -5
- package/dist/gcp.transport-DBX5TPIy.mjs.map +1 -0
- package/dist/{gcp.transport-Bi6CUqZR.d.mts → gcp.transport-GrJurKo8.d.mts} +2 -2
- package/dist/gcp.transport-GrJurKo8.d.mts.map +1 -0
- package/dist/{index-BPKwwERo.d.mts → index-3mw5gaCw.d.mts} +2 -2
- package/dist/{index-BPKwwERo.d.mts.map → index-3mw5gaCw.d.mts.map} +1 -1
- package/dist/{index-C1X-TE5I.d.ts → index-DhIoploR.d.ts} +2 -2
- package/dist/{index-C1X-TE5I.d.ts.map → index-DhIoploR.d.ts.map} +1 -1
- package/dist/index.d.mts +99 -137
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +99 -137
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +146 -510
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +99 -431
- package/dist/index.mjs.map +1 -1
- package/dist/logitron-logger-BFDSO8Io.d.mts +257 -0
- package/dist/logitron-logger-BFDSO8Io.d.mts.map +1 -0
- package/dist/logitron-logger-UVeN-mQm.d.ts +257 -0
- package/dist/logitron-logger-UVeN-mQm.d.ts.map +1 -0
- package/dist/middleware.d.mts +11 -4
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +11 -4
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +148 -24
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +148 -24
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +481 -6
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +481 -6
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +884 -13
- package/dist/nest.js.map +1 -0
- package/dist/nest.mjs +863 -6
- package/dist/nest.mjs.map +1 -0
- package/dist/{search-CFQRISUv.mjs → search-BFbu_oVn.mjs} +35 -12
- package/dist/search-BFbu_oVn.mjs.map +1 -0
- package/dist/{search-njTI2hdo.js → search-C4V0OMEn.js} +35 -12
- package/dist/search-C4V0OMEn.js.map +1 -0
- package/dist/{search-DujhR94O.d.ts → search-CNh9uVwR.d.ts} +2 -3
- package/dist/search-CNh9uVwR.d.ts.map +1 -0
- package/dist/{search-CQOo-Iq6.d.mts → search-DXANsQ2n.d.mts} +2 -3
- package/dist/search-DXANsQ2n.d.mts.map +1 -0
- package/dist/search.d.mts +3 -3
- package/dist/search.d.ts +3 -3
- package/dist/search.js +2 -2
- package/dist/search.mjs +2 -2
- package/dist/slack.transport-BZzoXDPn.d.mts +112 -0
- package/dist/slack.transport-BZzoXDPn.d.mts.map +1 -0
- package/dist/slack.transport-BfJRouB2.js +654 -0
- package/dist/slack.transport-BfJRouB2.js.map +1 -0
- package/dist/slack.transport-Bzw7sucI.mjs +643 -0
- package/dist/slack.transport-Bzw7sucI.mjs.map +1 -0
- package/dist/slack.transport-CXjQYOes.d.ts +112 -0
- package/dist/slack.transport-CXjQYOes.d.ts.map +1 -0
- package/dist/testing.d.mts +2 -2
- package/dist/testing.d.ts +2 -2
- package/dist/trace.utils-CvXgaiQT.mjs +278 -0
- package/dist/trace.utils-CvXgaiQT.mjs.map +1 -0
- package/dist/trace.utils-DpBOLDtq.js +358 -0
- package/dist/trace.utils-DpBOLDtq.js.map +1 -0
- package/dist/{transport.manager-D6KL3t9V.mjs → transport.manager-BiuCAJd2.mjs} +526 -160
- package/dist/transport.manager-BiuCAJd2.mjs.map +1 -0
- package/dist/{transport.manager-BivyUTtU.js → transport.manager-CXbKKdVE.js} +537 -159
- package/dist/transport.manager-CXbKKdVE.js.map +1 -0
- package/dist/{transport.types-B5vcyv2k.d.mts → transport.types-BMnurPcc.d.mts} +23 -3
- package/dist/transport.types-BMnurPcc.d.mts.map +1 -0
- package/dist/{transport.types-BuY84TwO.d.ts → transport.types-CGoHpWQR.d.ts} +23 -3
- package/dist/transport.types-CGoHpWQR.d.ts.map +1 -0
- package/dist/transports.d.mts +50 -20
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +50 -20
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +9 -5
- package/dist/transports.mjs +8 -6
- package/dist/worker-entry.js +307 -55
- package/dist/worker.d.mts +2 -2
- package/dist/worker.d.ts +2 -2
- package/dist/worker.js +1 -1
- package/dist/worker.mjs +1 -1
- package/dist/{worker.transport-CfH6z37Z.js → worker.transport-BdPxu3PN.js} +1 -1
- package/dist/{worker.transport-CfH6z37Z.js.map → worker.transport-BdPxu3PN.js.map} +1 -1
- package/dist/{worker.transport-mKXgNK0L.d.ts → worker.transport-CdzSZJmw.d.ts} +2 -2
- package/dist/{worker.transport-mKXgNK0L.d.ts.map → worker.transport-CdzSZJmw.d.ts.map} +1 -1
- package/dist/{worker.transport-BP8Q28Z2.d.mts → worker.transport-JvGPog3C.d.mts} +2 -2
- package/dist/{worker.transport-BP8Q28Z2.d.mts.map → worker.transport-JvGPog3C.d.mts.map} +1 -1
- package/dist/{worker.transport-BhMyvqQ2.mjs → worker.transport-lPxO2MVL.mjs} +1 -1
- package/dist/{worker.transport-BhMyvqQ2.mjs.map → worker.transport-lPxO2MVL.mjs.map} +1 -1
- package/package.json +27 -14
- package/dist/.tsbuildinfo +0 -1
- package/dist/async-context-CSHWoHMB.js.map +0 -1
- package/dist/async-context-CwBNMm2E.mjs.map +0 -1
- package/dist/cloudwatch.transport-CGHY4buE.d.mts.map +0 -1
- package/dist/cloudwatch.transport-DK_8cKd3.d.ts.map +0 -1
- package/dist/cloudwatch.transport-pNBNWJLt.js.map +0 -1
- package/dist/cloudwatch.transport-yBwm4OeO.mjs.map +0 -1
- package/dist/gcp.transport-BJuNRFe_.mjs.map +0 -1
- package/dist/gcp.transport-BOhkVKlI.d.ts.map +0 -1
- package/dist/gcp.transport-Bi6CUqZR.d.mts.map +0 -1
- package/dist/gcp.transport-SHdtc1n0.js.map +0 -1
- package/dist/logitron-logger.module-BdG1Jnpk.d.mts +0 -618
- package/dist/logitron-logger.module-BdG1Jnpk.d.mts.map +0 -1
- package/dist/logitron-logger.module-Bs3XYZgF.mjs.map +0 -1
- package/dist/logitron-logger.module-BsDZR5BH.js.map +0 -1
- package/dist/logitron-logger.module-CbXy2gfW.d.ts +0 -618
- package/dist/logitron-logger.module-CbXy2gfW.d.ts.map +0 -1
- package/dist/search-CFQRISUv.mjs.map +0 -1
- package/dist/search-CQOo-Iq6.d.mts.map +0 -1
- package/dist/search-DujhR94O.d.ts.map +0 -1
- package/dist/search-njTI2hdo.js.map +0 -1
- package/dist/transport.manager-BivyUTtU.js.map +0 -1
- package/dist/transport.manager-D6KL3t9V.mjs.map +0 -1
- package/dist/transport.types-B5vcyv2k.d.mts.map +0 -1
- package/dist/transport.types-BuY84TwO.d.ts.map +0 -1
- package/scripts/postinstall.js +0 -61
package/dist/index.js
CHANGED
|
@@ -2,370 +2,17 @@ const require_chunk = require('./chunk-nOFOJqeH.js');
|
|
|
2
2
|
const require_internal_log = require('./internal-log-BUJYMZbE.js');
|
|
3
3
|
const require_safe_stringify = require('./safe-stringify-DWo3aZp_.js');
|
|
4
4
|
const require_batch_buffer = require('./batch-buffer-BY-mRWIK.js');
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
require('./
|
|
9
|
-
const
|
|
5
|
+
require('./entry-fields-BvOLFlJ4.js');
|
|
6
|
+
const require_trace_utils = require('./trace.utils-DpBOLDtq.js');
|
|
7
|
+
const require_async_context = require('./async-context-DyQQYq3I.js');
|
|
8
|
+
const require_builder = require('./builder-D44QktIo.js');
|
|
9
|
+
const require_coerce_utils = require('./coerce.utils-B-LilukN.js');
|
|
10
|
+
const require_transport_manager = require('./transport.manager-CXbKKdVE.js');
|
|
11
|
+
const require_slack_transport = require('./slack.transport-BfJRouB2.js');
|
|
12
|
+
const require_search = require('./search-C4V0OMEn.js');
|
|
10
13
|
let node_async_hooks = require("node:async_hooks");
|
|
11
14
|
node_async_hooks = require_chunk.__toESM(node_async_hooks);
|
|
12
|
-
let __nestjs_common = require("@nestjs/common");
|
|
13
|
-
__nestjs_common = require_chunk.__toESM(__nestjs_common);
|
|
14
15
|
|
|
15
|
-
//#region src/exceptions/exception.ts
|
|
16
|
-
var LogixiaException = class extends Error {
|
|
17
|
-
constructor(options) {
|
|
18
|
-
super(options.message, { cause: options.cause });
|
|
19
|
-
this.name = "LogixiaException";
|
|
20
|
-
this.errorCode = options.code;
|
|
21
|
-
this.errorType = options.type;
|
|
22
|
-
this.httpStatus = options.httpStatus;
|
|
23
|
-
this.param = options.param;
|
|
24
|
-
this.details = options.details;
|
|
25
|
-
this.docUrl = options.docUrl;
|
|
26
|
-
this.metadata = options.metadata;
|
|
27
|
-
Object.setPrototypeOf(this, new.target.prototype);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Returns `true` when `value` is a `LogixiaException` instance.
|
|
32
|
-
*
|
|
33
|
-
* Useful in exception filters or middleware that need to distinguish a
|
|
34
|
-
* `LogixiaException` from a plain `Error` or a framework `HttpException`.
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```ts
|
|
38
|
-
* if (isLogixiaException(err)) {
|
|
39
|
-
* console.log(err.errorCode, err.httpStatus);
|
|
40
|
-
* }
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
function isLogixiaException(value) {
|
|
44
|
-
return value instanceof LogixiaException;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
//#endregion
|
|
48
|
-
//#region src/exceptions/builder.ts
|
|
49
|
-
/**
|
|
50
|
-
* Generates a trace ID via the shared {@link TraceContext} generator.
|
|
51
|
-
*
|
|
52
|
-
* Delegates to `TraceContext.instance.generate()` so any custom generator
|
|
53
|
-
* configured on `TraceIdConfig.generator` is respected — avoids the silent
|
|
54
|
-
* "builder has its own UUID source" divergence this module had previously.
|
|
55
|
-
*
|
|
56
|
-
* @example `'550e8400-e29b-41d4-a716-446655440000'`
|
|
57
|
-
*/
|
|
58
|
-
function generateTraceId() {
|
|
59
|
-
return require_logitron_logger_module.TraceContext.instance.generate();
|
|
60
|
-
}
|
|
61
|
-
/** @deprecated Use `generateTraceId` instead. */
|
|
62
|
-
const generateRequestId = generateTraceId;
|
|
63
|
-
/**
|
|
64
|
-
* Maps an HTTP status code to a human-friendly error type string.
|
|
65
|
-
* Used as a fallback when the exception is a generic `HttpException`.
|
|
66
|
-
*/
|
|
67
|
-
function httpStatusToType(status) {
|
|
68
|
-
if (status === 400) return "api_error";
|
|
69
|
-
if (status === 401) return "authentication_error";
|
|
70
|
-
if (status === 402) return "payment_error";
|
|
71
|
-
if (status === 403) return "authorization_error";
|
|
72
|
-
if (status === 404) return "not_found_error";
|
|
73
|
-
if (status === 408) return "timeout_error";
|
|
74
|
-
if (status === 409) return "conflict_error";
|
|
75
|
-
if (status === 422) return "validation_error";
|
|
76
|
-
if (status === 429) return "rate_limit_error";
|
|
77
|
-
if (status >= 500) return "server_error";
|
|
78
|
-
if (status >= 400) return "api_error";
|
|
79
|
-
return "server_error";
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Duck-type check for NestJS `HttpException`.
|
|
83
|
-
* Avoids a hard import on `@nestjs/common` so the builder is usable outside NestJS.
|
|
84
|
-
*/
|
|
85
|
-
function isHttpException(value) {
|
|
86
|
-
return typeof value === "object" && value !== null && typeof value["getStatus"] === "function" && typeof value["getResponse"] === "function";
|
|
87
|
-
}
|
|
88
|
-
/**
|
|
89
|
-
* Builds the optional `debug` block from an error.
|
|
90
|
-
* Returns `undefined` when there is nothing useful to include.
|
|
91
|
-
*/
|
|
92
|
-
function buildDebug(error, service, durationMs) {
|
|
93
|
-
const stack = error instanceof Error ? error.stack : void 0;
|
|
94
|
-
const causeRaw = error instanceof Error ? error.cause : void 0;
|
|
95
|
-
let cause;
|
|
96
|
-
if (causeRaw instanceof Error) cause = causeRaw.message;
|
|
97
|
-
else if (causeRaw !== void 0 && causeRaw !== null) cause = String(causeRaw);
|
|
98
|
-
if (!stack && !cause && !service && durationMs === void 0) return void 0;
|
|
99
|
-
return {
|
|
100
|
-
...stack !== void 0 ? { stack } : {},
|
|
101
|
-
...cause !== void 0 ? { cause } : {},
|
|
102
|
-
...service !== void 0 ? { service } : {},
|
|
103
|
-
...durationMs !== void 0 ? { duration_ms: durationMs } : {}
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
var ErrorResponseBuilder = class {
|
|
107
|
-
/**
|
|
108
|
-
* Build a `LogixiaErrorResponse` from any thrown value.
|
|
109
|
-
*
|
|
110
|
-
* @param params - See `BuildParams`.
|
|
111
|
-
* @returns The unified error response and the HTTP status code to send.
|
|
112
|
-
*
|
|
113
|
-
* @remarks
|
|
114
|
-
* `traceId` does not need to be supplied by the caller in most cases — the
|
|
115
|
-
* builder reads `TraceContext.instance.getCurrentTraceId()` internally and
|
|
116
|
-
* falls back to the explicit `traceId` argument only when AsyncLocalStorage
|
|
117
|
-
* is empty. If neither source yields a value, `meta.trace_id` is omitted.
|
|
118
|
-
*
|
|
119
|
-
* @example In a NestJS exception filter
|
|
120
|
-
* ```ts
|
|
121
|
-
* const { response, httpStatus } = ErrorResponseBuilder.build<AppCode, AppType>({
|
|
122
|
-
* exception,
|
|
123
|
-
* // Omit traceId — it will be picked up from ALS automatically.
|
|
124
|
-
* path: request.url,
|
|
125
|
-
* service: process.env.SERVICE_NAME,
|
|
126
|
-
* startTime: request.startTime,
|
|
127
|
-
* });
|
|
128
|
-
*
|
|
129
|
-
* if (process.env.NODE_ENV === 'production') delete response.debug;
|
|
130
|
-
* // Echo the resolved traceId back on whatever header your TraceIdConfig says —
|
|
131
|
-
* // do NOT hardcode 'X-Trace-Id', use `resolveResponseHeader(config)` instead.
|
|
132
|
-
* if (response.meta.trace_id) {
|
|
133
|
-
* response.setHeader(resolveResponseHeader(config) ?? 'X-Trace-Id', response.meta.trace_id);
|
|
134
|
-
* }
|
|
135
|
-
* response.status(httpStatus).json(response);
|
|
136
|
-
* ```
|
|
137
|
-
*/
|
|
138
|
-
static build(params) {
|
|
139
|
-
const { exception, path, service, startTime, traceId: rawTraceId } = params;
|
|
140
|
-
const traceId = require_logitron_logger_module.TraceContext.instance.getCurrentTraceId() ?? rawTraceId;
|
|
141
|
-
const timestamp = (/* @__PURE__ */ new Date()).toISOString();
|
|
142
|
-
const durationMs = startTime !== void 0 ? Date.now() - startTime : void 0;
|
|
143
|
-
if (isLogixiaException(exception)) {
|
|
144
|
-
const debug$1 = buildDebug(exception, service, durationMs);
|
|
145
|
-
const errorBlock = {
|
|
146
|
-
type: exception.errorType,
|
|
147
|
-
code: exception.errorCode,
|
|
148
|
-
message: exception.message
|
|
149
|
-
};
|
|
150
|
-
if (exception.param !== void 0) errorBlock.param = exception.param;
|
|
151
|
-
if (exception.details !== void 0 && exception.details.length > 0) errorBlock.details = exception.details;
|
|
152
|
-
if (exception.docUrl !== void 0) errorBlock.doc_url = exception.docUrl;
|
|
153
|
-
return {
|
|
154
|
-
response: {
|
|
155
|
-
success: false,
|
|
156
|
-
error: errorBlock,
|
|
157
|
-
meta: {
|
|
158
|
-
...traceId !== void 0 ? { trace_id: traceId } : {},
|
|
159
|
-
timestamp,
|
|
160
|
-
path,
|
|
161
|
-
status: exception.httpStatus
|
|
162
|
-
},
|
|
163
|
-
...debug$1 !== void 0 ? { debug: debug$1 } : {}
|
|
164
|
-
},
|
|
165
|
-
httpStatus: exception.httpStatus
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
if (isHttpException(exception)) {
|
|
169
|
-
const status = exception.getStatus();
|
|
170
|
-
const exResponse = exception.getResponse();
|
|
171
|
-
let message;
|
|
172
|
-
if (typeof exResponse === "string") message = exResponse;
|
|
173
|
-
else if (typeof exResponse === "object" && exResponse !== null && "message" in exResponse) {
|
|
174
|
-
const raw = exResponse.message;
|
|
175
|
-
message = Array.isArray(raw) ? raw.join(", ") : String(raw);
|
|
176
|
-
} else message = exception.message;
|
|
177
|
-
const type = httpStatusToType(status);
|
|
178
|
-
const code = `HTTP_${status}`;
|
|
179
|
-
const debug$1 = buildDebug(exception, service, durationMs);
|
|
180
|
-
return {
|
|
181
|
-
response: {
|
|
182
|
-
success: false,
|
|
183
|
-
error: {
|
|
184
|
-
type,
|
|
185
|
-
code,
|
|
186
|
-
message
|
|
187
|
-
},
|
|
188
|
-
meta: {
|
|
189
|
-
...traceId !== void 0 ? { trace_id: traceId } : {},
|
|
190
|
-
timestamp,
|
|
191
|
-
path,
|
|
192
|
-
status
|
|
193
|
-
},
|
|
194
|
-
...debug$1 !== void 0 ? { debug: debug$1 } : {}
|
|
195
|
-
},
|
|
196
|
-
httpStatus: status
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
const debug = buildDebug(exception instanceof Error ? exception : new Error(String(exception)), service, durationMs);
|
|
200
|
-
return {
|
|
201
|
-
response: {
|
|
202
|
-
success: false,
|
|
203
|
-
error: {
|
|
204
|
-
type: "server_error",
|
|
205
|
-
code: "INTERNAL_SERVER_ERROR",
|
|
206
|
-
message: "An unexpected error occurred."
|
|
207
|
-
},
|
|
208
|
-
meta: {
|
|
209
|
-
...traceId !== void 0 ? { trace_id: traceId } : {},
|
|
210
|
-
timestamp,
|
|
211
|
-
path,
|
|
212
|
-
status: 500
|
|
213
|
-
},
|
|
214
|
-
...debug !== void 0 ? { debug } : {}
|
|
215
|
-
},
|
|
216
|
-
httpStatus: 500
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
//#endregion
|
|
222
|
-
//#region src/core/nestjs-extras.ts
|
|
223
|
-
var _ref;
|
|
224
|
-
/**
|
|
225
|
-
* Inject the Logixia logger registered in the current NestJS DI container.
|
|
226
|
-
*
|
|
227
|
-
* Equivalent to `@Inject(LOGIXIA_LOGGER_TOKEN)` but without needing to import
|
|
228
|
-
* the internal token constant yourself.
|
|
229
|
-
*
|
|
230
|
-
* @example
|
|
231
|
-
* ```ts
|
|
232
|
-
* constructor(@InjectLogger() private readonly logger: LogixiaLoggerService) {}
|
|
233
|
-
* ```
|
|
234
|
-
*/
|
|
235
|
-
const InjectLogger = () => (0, __nestjs_common.Inject)(`${require_logitron_logger_module.LOGIXIA_LOGGER_PREFIX}SERVICE`);
|
|
236
|
-
/**
|
|
237
|
-
* Method decorator that auto-logs entry, exit, duration, and errors.
|
|
238
|
-
*
|
|
239
|
-
* Preserves the original method's sync/async contract: a synchronous method
|
|
240
|
-
* stays synchronous (returns its value directly, with logs emitted
|
|
241
|
-
* fire-and-forget), and an async method is awaited so exit/error logs reflect
|
|
242
|
-
* the resolved result. Attaches to the logger found on the class instance via a
|
|
243
|
-
* `logger` property (the conventional NestJS name).
|
|
244
|
-
*
|
|
245
|
-
* @example
|
|
246
|
-
* ```ts
|
|
247
|
-
* @LogMethod({ level: 'info', logArgs: true })
|
|
248
|
-
* async processPayment(orderId: string): Promise<void> { … }
|
|
249
|
-
* ```
|
|
250
|
-
*/
|
|
251
|
-
function LogMethod(options = {}) {
|
|
252
|
-
const { level = "debug", logArgs = true, logResult = false, logErrors = true } = options;
|
|
253
|
-
return function(target, propertyKey, descriptor) {
|
|
254
|
-
var _constructor;
|
|
255
|
-
const originalMethod = descriptor.value;
|
|
256
|
-
if (typeof originalMethod !== "function") return descriptor;
|
|
257
|
-
const methodName = String(propertyKey);
|
|
258
|
-
const className = ((_constructor = target.constructor) === null || _constructor === void 0 ? void 0 : _constructor.name) ?? "Unknown";
|
|
259
|
-
const label = options.label ?? `${className}.${methodName}`;
|
|
260
|
-
let _warnedNoLogger = false;
|
|
261
|
-
const reportLogFailure = (phase, err) => {
|
|
262
|
-
require_internal_log.internalError(`@LogMethod(${label}) ${phase} log failed: ${String(err)}`);
|
|
263
|
-
};
|
|
264
|
-
const emit$1 = (logger$1, phase, message, data) => {
|
|
265
|
-
const logFnRaw = logger$1[level];
|
|
266
|
-
const p = (typeof logFnRaw === "function" ? logFnRaw : logger$1.debug).bind(logger$1)(message, data);
|
|
267
|
-
if (p && typeof p.catch === "function") p.catch((e) => reportLogFailure(phase, e));
|
|
268
|
-
};
|
|
269
|
-
const emitError = (logger$1, error, start) => {
|
|
270
|
-
const err = error instanceof Error ? error : new Error(String(error));
|
|
271
|
-
const errLog = logger$1.error(err, {
|
|
272
|
-
method: label,
|
|
273
|
-
durationMs: Date.now() - start
|
|
274
|
-
});
|
|
275
|
-
if (errLog && typeof errLog.catch === "function") errLog.catch((e) => reportLogFailure("error", e));
|
|
276
|
-
};
|
|
277
|
-
descriptor.value = function(...args) {
|
|
278
|
-
const logger$1 = this.logger ?? require_logitron_logger_module.LogixiaLoggerModule._globalLogger ?? void 0;
|
|
279
|
-
if (!logger$1 && !_warnedNoLogger) {
|
|
280
|
-
_warnedNoLogger = true;
|
|
281
|
-
require_internal_log.internalWarn(`@LogMethod on ${label}: no logger available. Either inject LogixiaLoggerService as this.logger or ensure LogixiaLoggerModule is initialised.`);
|
|
282
|
-
}
|
|
283
|
-
const start = Date.now();
|
|
284
|
-
const entry = { method: label };
|
|
285
|
-
if (logArgs && args.length > 0) entry["args"] = args;
|
|
286
|
-
if (logger$1) emit$1(logger$1, "entry", `→ ${label}`, entry);
|
|
287
|
-
const buildExit = (result$1) => {
|
|
288
|
-
const exit = {
|
|
289
|
-
method: label,
|
|
290
|
-
durationMs: Date.now() - start
|
|
291
|
-
};
|
|
292
|
-
if (logResult) exit["result"] = result$1;
|
|
293
|
-
return exit;
|
|
294
|
-
};
|
|
295
|
-
let result;
|
|
296
|
-
try {
|
|
297
|
-
result = originalMethod.apply(this, args);
|
|
298
|
-
} catch (error) {
|
|
299
|
-
if (logger$1 && logErrors) emitError(logger$1, error, start);
|
|
300
|
-
throw error;
|
|
301
|
-
}
|
|
302
|
-
if (result && typeof result.then === "function") return result.then((resolved) => {
|
|
303
|
-
if (logger$1) emit$1(logger$1, "exit", `← ${label}`, buildExit(resolved));
|
|
304
|
-
return resolved;
|
|
305
|
-
}, (error) => {
|
|
306
|
-
if (logger$1 && logErrors) emitError(logger$1, error, start);
|
|
307
|
-
throw error;
|
|
308
|
-
});
|
|
309
|
-
if (logger$1) emit$1(logger$1, "exit", `← ${label}`, buildExit(result));
|
|
310
|
-
return result;
|
|
311
|
-
};
|
|
312
|
-
return descriptor;
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
let LogixiaExceptionFilter = class LogixiaExceptionFilter$1 {
|
|
316
|
-
constructor(logger$1, loggerConfig) {
|
|
317
|
-
this._logger = logger$1 ?? require_logitron_logger_module.LogixiaLoggerModule._globalLogger ?? void 0;
|
|
318
|
-
this._traceConfig = typeof (loggerConfig === null || loggerConfig === void 0 ? void 0 : loggerConfig.traceId) === "object" ? loggerConfig.traceId : void 0;
|
|
319
|
-
}
|
|
320
|
-
catch(exception, host) {
|
|
321
|
-
var _request$headers;
|
|
322
|
-
const ctx = host.switchToHttp();
|
|
323
|
-
const request = ctx.getRequest();
|
|
324
|
-
const response = ctx.getResponse();
|
|
325
|
-
const traceId = require_logitron_logger_module.TraceContext.instance.getCurrentTraceId() ?? ((_request$headers = request.headers) === null || _request$headers === void 0 ? void 0 : _request$headers["x-trace-id"]) ?? request.id ?? void 0;
|
|
326
|
-
const { response: errorResponse, httpStatus } = ErrorResponseBuilder.build({
|
|
327
|
-
exception,
|
|
328
|
-
traceId,
|
|
329
|
-
path: request.url ?? "/",
|
|
330
|
-
startTime: request.startTime
|
|
331
|
-
});
|
|
332
|
-
if (this._logger) {
|
|
333
|
-
const requestMeta = {
|
|
334
|
-
method: request.method ?? "",
|
|
335
|
-
url: request.url ?? "",
|
|
336
|
-
status: httpStatus,
|
|
337
|
-
...errorResponse.meta.trace_id !== void 0 ? { trace_id: errorResponse.meta.trace_id } : {}
|
|
338
|
-
};
|
|
339
|
-
const onLogFailure = (err) => {
|
|
340
|
-
require_internal_log.internalError(`ExceptionFilter failed to write log entry: ${String(err)}`);
|
|
341
|
-
};
|
|
342
|
-
let logPromise;
|
|
343
|
-
if (httpStatus >= 500) {
|
|
344
|
-
const err = exception instanceof Error ? exception : new Error(String(exception));
|
|
345
|
-
logPromise = this._logger.error(err, requestMeta);
|
|
346
|
-
} else if (isLogixiaException(exception)) logPromise = this._logger.warn(`[${errorResponse.error.code}] ${errorResponse.error.message}`, requestMeta);
|
|
347
|
-
else logPromise = this._logger.warn(`[${httpStatus}] ${errorResponse.error.message}`, requestMeta);
|
|
348
|
-
if (logPromise && typeof logPromise.catch === "function") logPromise.catch(onLogFailure);
|
|
349
|
-
}
|
|
350
|
-
if (process.env["NODE_ENV"] === "production") delete errorResponse.debug;
|
|
351
|
-
if (errorResponse.meta.trace_id) {
|
|
352
|
-
const traceHeader = require_logitron_logger_module.resolveResponseHeader(this._traceConfig);
|
|
353
|
-
if (traceHeader) response.setHeader(traceHeader, errorResponse.meta.trace_id);
|
|
354
|
-
}
|
|
355
|
-
if (httpStatus === 429) response.setHeader("Retry-After", "60");
|
|
356
|
-
response.status(httpStatus).json(errorResponse);
|
|
357
|
-
}
|
|
358
|
-
};
|
|
359
|
-
LogixiaExceptionFilter = require_logitron_logger_module.__decorate([
|
|
360
|
-
(0, __nestjs_common.Catch)(),
|
|
361
|
-
require_logitron_logger_module.__decorateParam(0, (0, __nestjs_common.Optional)()),
|
|
362
|
-
require_logitron_logger_module.__decorateParam(0, (0, __nestjs_common.Inject)(`${require_logitron_logger_module.LOGIXIA_LOGGER_PREFIX}SERVICE`)),
|
|
363
|
-
require_logitron_logger_module.__decorateParam(1, (0, __nestjs_common.Optional)()),
|
|
364
|
-
require_logitron_logger_module.__decorateParam(1, (0, __nestjs_common.Inject)(require_logitron_logger_module.LOGIXIA_LOGGER_CONFIG)),
|
|
365
|
-
require_logitron_logger_module.__decorateMetadata("design:paramtypes", [Object, typeof (_ref = typeof Partial !== "undefined" && Partial) === "function" ? _ref : Object])
|
|
366
|
-
], LogixiaExceptionFilter);
|
|
367
|
-
|
|
368
|
-
//#endregion
|
|
369
16
|
//#region src/formatters/json.formatter.ts
|
|
370
17
|
/**
|
|
371
18
|
* Build a JSON.stringify replacer that replaces circular references with the
|
|
@@ -403,7 +50,7 @@ var JsonFormatter = class {
|
|
|
403
50
|
if (this.includeContext && entry.context) formatted.context = entry.context;
|
|
404
51
|
formatted.message = entry.message;
|
|
405
52
|
if (entry.payload && Object.keys(entry.payload).length > 0) formatted.payload = this.serializePayload(entry.payload);
|
|
406
|
-
if (entry.error) formatted.error =
|
|
53
|
+
if (entry.error) formatted.error = require_builder.serializeError(entry.error);
|
|
407
54
|
formatted.meta = {
|
|
408
55
|
pid: process.pid,
|
|
409
56
|
hostname: process.env.HOSTNAME || "unknown",
|
|
@@ -417,7 +64,7 @@ var JsonFormatter = class {
|
|
|
417
64
|
for (const [key, value] of Object.entries(payload)) {
|
|
418
65
|
if (key === "__proto__" || key === "constructor" || key === "prototype") continue;
|
|
419
66
|
try {
|
|
420
|
-
if (value instanceof Error) serialized[key] =
|
|
67
|
+
if (value instanceof Error) serialized[key] = require_builder.serializeError(value);
|
|
421
68
|
else if (value instanceof Date) serialized[key] = value.toISOString();
|
|
422
69
|
else if (typeof value === "function") serialized[key] = "[Function]";
|
|
423
70
|
else if (typeof value === "symbol") serialized[key] = value.toString();
|
|
@@ -433,8 +80,7 @@ var JsonFormatter = class {
|
|
|
433
80
|
|
|
434
81
|
//#endregion
|
|
435
82
|
//#region src/formatters/text.formatter.ts
|
|
436
|
-
const
|
|
437
|
-
const stripControls = (value) => require_coerce_utils.safeToString(value).replace(CONTROL_CHARS_RE, "");
|
|
83
|
+
const stripControls = (value) => require_transport_manager.stripControlChars(require_coerce_utils.safeToString(value));
|
|
438
84
|
var TextFormatter = class TextFormatter {
|
|
439
85
|
constructor(options = {}) {
|
|
440
86
|
this.colorize = options.colorize ?? true;
|
|
@@ -482,7 +128,7 @@ var TextFormatter = class TextFormatter {
|
|
|
482
128
|
parts.push(`[${context}]`);
|
|
483
129
|
}
|
|
484
130
|
const safeMessage = stripControls(entry.message);
|
|
485
|
-
const message = this.colorize && entry.level ===
|
|
131
|
+
const message = this.colorize && entry.level === require_builder.LogLevel.ERROR ? `${this.colors.error}${safeMessage}${this.colors.reset}` : safeMessage;
|
|
486
132
|
parts.push(message);
|
|
487
133
|
if (entry.payload && Object.keys(entry.payload).length > 0) {
|
|
488
134
|
const payload = this.formatPayload(entry.payload);
|
|
@@ -586,6 +232,15 @@ function registerLevelSignal(logger$1, options = {}) {
|
|
|
586
232
|
process.removeListener(signal, handler);
|
|
587
233
|
};
|
|
588
234
|
}
|
|
235
|
+
/** Maximum accepted request body size for the level control handler. */
|
|
236
|
+
const MAX_BODY_BYTES = 16 * 1024;
|
|
237
|
+
function isJsonContentType(req) {
|
|
238
|
+
var _req$headers;
|
|
239
|
+
const raw = (_req$headers = req.headers) === null || _req$headers === void 0 ? void 0 : _req$headers["content-type"];
|
|
240
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
241
|
+
if (typeof value !== "string") return false;
|
|
242
|
+
return value.split(";")[0].trim().toLowerCase() === "application/json";
|
|
243
|
+
}
|
|
589
244
|
const VALID_LEVELS = new Set([
|
|
590
245
|
"error",
|
|
591
246
|
"warn",
|
|
@@ -604,7 +259,16 @@ const VALID_LEVELS = new Set([
|
|
|
604
259
|
*
|
|
605
260
|
* Custom levels are accepted too: any level the logger already knows passes
|
|
606
261
|
* through. Unknown levels are rejected with 400 so a typo can't silently mute
|
|
607
|
-
* logging.
|
|
262
|
+
* logging.
|
|
263
|
+
*
|
|
264
|
+
* **SECURITY: this handler has NO authentication or authorization.** Anyone who
|
|
265
|
+
* can reach it can silence logging or turn on verbose output. Always mount it
|
|
266
|
+
* behind your own auth (and on an internal-only route/port), never on a public
|
|
267
|
+
* listener.
|
|
268
|
+
*
|
|
269
|
+
* Mutating requests must send `Content-Type: application/json` (otherwise 415,
|
|
270
|
+
* which also keeps cross-site form posts out) and a body of at most 16 KB
|
|
271
|
+
* (otherwise 413).
|
|
608
272
|
*/
|
|
609
273
|
function createLevelControlHandler(logger$1, options = {}) {
|
|
610
274
|
const allowed = options.allowedLevels && options.allowedLevels.length > 0 ? new Set(options.allowedLevels.map((l) => l.toLowerCase())) : VALID_LEVELS;
|
|
@@ -651,8 +315,7 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
651
315
|
return;
|
|
652
316
|
}
|
|
653
317
|
if (logger$1.setNamespaceLevels) {
|
|
654
|
-
const coerced =
|
|
655
|
-
for (const [pat, lvl] of Object.entries(nl)) coerced[pat] = String(lvl).toLowerCase();
|
|
318
|
+
const coerced = Object.fromEntries(Object.entries(nl).map(([pat, lvl]) => [pat, String(lvl).toLowerCase()]));
|
|
656
319
|
logger$1.setNamespaceLevels(coerced);
|
|
657
320
|
} else require_internal_log.internalWarn("level control: logger does not support setNamespaceLevels — ignored");
|
|
658
321
|
}
|
|
@@ -665,17 +328,48 @@ function createLevelControlHandler(logger$1, options = {}) {
|
|
|
665
328
|
return;
|
|
666
329
|
}
|
|
667
330
|
if (method === "POST" || method === "PUT" || method === "PATCH") {
|
|
331
|
+
var _req$headers2;
|
|
332
|
+
if (!isJsonContentType(req)) {
|
|
333
|
+
send(res, 415, { error: "Content-Type must be application/json" });
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
const declared = Number((_req$headers2 = req.headers) === null || _req$headers2 === void 0 ? void 0 : _req$headers2["content-length"]);
|
|
337
|
+
if (Number.isFinite(declared) && declared > MAX_BODY_BYTES) {
|
|
338
|
+
send(res, 413, { error: "request body too large" });
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
668
341
|
const maybeBody = req.body;
|
|
669
|
-
if (maybeBody !== void 0
|
|
670
|
-
|
|
342
|
+
if (maybeBody !== void 0) {
|
|
343
|
+
let text;
|
|
344
|
+
if (typeof maybeBody === "string") text = maybeBody;
|
|
345
|
+
else if (Buffer.isBuffer(maybeBody)) text = maybeBody.toString("utf8");
|
|
346
|
+
else text = JSON.stringify(maybeBody);
|
|
347
|
+
if (Buffer.byteLength(text) > MAX_BODY_BYTES) {
|
|
348
|
+
send(res, 413, { error: "request body too large" });
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
applyBody(res, text);
|
|
671
352
|
return;
|
|
672
353
|
}
|
|
673
354
|
if (typeof req.on === "function") {
|
|
674
355
|
let raw = "";
|
|
356
|
+
let size = 0;
|
|
357
|
+
let rejected = false;
|
|
675
358
|
req.on("data", (chunk) => {
|
|
676
|
-
|
|
359
|
+
if (rejected) return;
|
|
360
|
+
const piece = Buffer.isBuffer(chunk) ? chunk.toString("utf8") : String(chunk ?? "");
|
|
361
|
+
size += Buffer.byteLength(piece);
|
|
362
|
+
if (size > MAX_BODY_BYTES) {
|
|
363
|
+
rejected = true;
|
|
364
|
+
raw = "";
|
|
365
|
+
send(res, 413, { error: "request body too large" });
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
raw += piece;
|
|
369
|
+
});
|
|
370
|
+
req.on("end", () => {
|
|
371
|
+
if (!rejected) applyBody(res, raw);
|
|
677
372
|
});
|
|
678
|
-
req.on("end", () => applyBody(res, raw));
|
|
679
373
|
return;
|
|
680
374
|
}
|
|
681
375
|
applyBody(res, "");
|
|
@@ -783,7 +477,7 @@ function emit(logger$1, state, options, extra) {
|
|
|
783
477
|
if (extra) Object.assign(payload, extra);
|
|
784
478
|
payload[durationField] = Date.now() - state.startMs;
|
|
785
479
|
if (includeTrace) {
|
|
786
|
-
const traceId =
|
|
480
|
+
const traceId = require_trace_utils.getCurrentTraceId();
|
|
787
481
|
if (traceId !== void 0 && payload["traceId"] === void 0) payload["traceId"] = traceId;
|
|
788
482
|
}
|
|
789
483
|
const p = logger$1.logLevel(level, message, payload);
|
|
@@ -1040,6 +734,10 @@ const DEFAULT_BUCKETS = [
|
|
|
1040
734
|
5e3,
|
|
1041
735
|
1e4
|
|
1042
736
|
];
|
|
737
|
+
const MAX_LABEL_VALUE_LENGTH = 256;
|
|
738
|
+
const DEFAULT_MAX_LABEL_SETS = 1e3;
|
|
739
|
+
/** Label value used for the series that absorbs label sets beyond the cardinality cap. */
|
|
740
|
+
const OVERFLOW_LABEL_VALUE = "__overflow__";
|
|
1043
741
|
function buildLabelKey(config, entry) {
|
|
1044
742
|
const labelNames = config.labels ?? [];
|
|
1045
743
|
if (labelNames.length === 0) return "{}";
|
|
@@ -1047,10 +745,16 @@ function buildLabelKey(config, entry) {
|
|
|
1047
745
|
const payload = entry.payload ?? {};
|
|
1048
746
|
for (const name of labelNames) {
|
|
1049
747
|
const raw = name === "level" ? entry.level : payload[name];
|
|
1050
|
-
pairs[sanitizePromName(name)] = raw !== void 0 && raw !== null ? String(raw) : "";
|
|
748
|
+
pairs[sanitizePromName(name)] = raw !== void 0 && raw !== null ? String(raw).slice(0, MAX_LABEL_VALUE_LENGTH) : "";
|
|
1051
749
|
}
|
|
1052
750
|
return JSON.stringify(pairs);
|
|
1053
751
|
}
|
|
752
|
+
/** Label key of the shared overflow series for a metric (all label values `__overflow__`). */
|
|
753
|
+
function buildOverflowKey(config) {
|
|
754
|
+
const names = config.labels ?? [];
|
|
755
|
+
if (names.length === 0) return "{}";
|
|
756
|
+
return JSON.stringify(Object.fromEntries(names.map((n) => [sanitizePromName(n), OVERFLOW_LABEL_VALUE])));
|
|
757
|
+
}
|
|
1054
758
|
function renderLabels(labelKey) {
|
|
1055
759
|
if (labelKey === "{}") return "";
|
|
1056
760
|
const obj = JSON.parse(labelKey);
|
|
@@ -1087,10 +791,13 @@ function sanitizePromName(name) {
|
|
|
1087
791
|
* ```
|
|
1088
792
|
*/
|
|
1089
793
|
var MetricsPlugin = class {
|
|
1090
|
-
constructor(map) {
|
|
794
|
+
constructor(map, options = {}) {
|
|
1091
795
|
this.name = "logixia-metrics";
|
|
1092
796
|
this.metricState = /* @__PURE__ */ new Map();
|
|
797
|
+
this.overflowKeys = /* @__PURE__ */ new Map();
|
|
1093
798
|
this.map = map;
|
|
799
|
+
const max = options.maxLabelSets;
|
|
800
|
+
this.maxLabelSets = typeof max === "number" && Number.isFinite(max) && max >= 1 ? Math.floor(max) : DEFAULT_MAX_LABEL_SETS;
|
|
1094
801
|
this.initAllState();
|
|
1095
802
|
}
|
|
1096
803
|
onInit() {}
|
|
@@ -1099,16 +806,19 @@ var MetricsPlugin = class {
|
|
|
1099
806
|
for (const [rawName, config] of Object.entries(this.map)) {
|
|
1100
807
|
const state = this.metricState.get(rawName);
|
|
1101
808
|
if (!state) continue;
|
|
1102
|
-
const
|
|
809
|
+
const rawLabelKey = buildLabelKey(config, entry);
|
|
810
|
+
const overflowKey = this.overflowKeys.get(rawName) ?? "{}";
|
|
1103
811
|
if (config.type === "counter" && state.type === "counter") {
|
|
1104
812
|
if (config.levelFilter && entry.level !== config.levelFilter) continue;
|
|
1105
813
|
if (config.field !== void 0 && payload[config.field] !== config.value) continue;
|
|
814
|
+
const labelKey = this.capLabelKey(state.values, rawLabelKey, overflowKey);
|
|
1106
815
|
state.values.set(labelKey, (state.values.get(labelKey) ?? 0) + 1);
|
|
1107
816
|
} else if (config.type === "histogram" && state.type === "histogram") {
|
|
1108
817
|
const raw = payload[config.field];
|
|
1109
818
|
if (raw === void 0 || raw === null) continue;
|
|
1110
819
|
const val = Number(raw);
|
|
1111
820
|
if (Number.isNaN(val)) continue;
|
|
821
|
+
const labelKey = this.capLabelKey(state.counts, rawLabelKey, overflowKey);
|
|
1112
822
|
if (!state.counts.has(labelKey)) {
|
|
1113
823
|
state.counts.set(labelKey, Array.from({ length: state.buckets.length + 1 }).fill(0));
|
|
1114
824
|
state.sums.set(labelKey, 0);
|
|
@@ -1124,7 +834,7 @@ var MetricsPlugin = class {
|
|
|
1124
834
|
if (raw === void 0 || raw === null) continue;
|
|
1125
835
|
const val = Number(raw);
|
|
1126
836
|
if (Number.isNaN(val)) continue;
|
|
1127
|
-
state.values.set(
|
|
837
|
+
state.values.set(this.capLabelKey(state.values, rawLabelKey, overflowKey), val);
|
|
1128
838
|
}
|
|
1129
839
|
}
|
|
1130
840
|
return entry;
|
|
@@ -1225,10 +935,19 @@ var MetricsPlugin = class {
|
|
|
1225
935
|
res.end(body);
|
|
1226
936
|
};
|
|
1227
937
|
}
|
|
938
|
+
/**
|
|
939
|
+
* Return `labelKey` when it is already tracked or there is room for it;
|
|
940
|
+
* otherwise the shared overflow series key.
|
|
941
|
+
*/
|
|
942
|
+
capLabelKey(series, labelKey, overflowKey) {
|
|
943
|
+
if (series.has(labelKey) || series.size < this.maxLabelSets) return labelKey;
|
|
944
|
+
return overflowKey;
|
|
945
|
+
}
|
|
1228
946
|
initAllState() {
|
|
1229
947
|
for (const [rawName, config] of Object.entries(this.map)) this.initSingleState(rawName, config);
|
|
1230
948
|
}
|
|
1231
949
|
initSingleState(rawName, config) {
|
|
950
|
+
this.overflowKeys.set(rawName, buildOverflowKey(config));
|
|
1232
951
|
if (config.type === "counter") this.metricState.set(rawName, {
|
|
1233
952
|
type: "counter",
|
|
1234
953
|
values: /* @__PURE__ */ new Map()
|
|
@@ -1274,77 +993,25 @@ var MetricsPlugin = class {
|
|
|
1274
993
|
* logger.use(metrics);
|
|
1275
994
|
* app.get('/metrics', metrics.expressHandler());
|
|
1276
995
|
* ```
|
|
996
|
+
*
|
|
997
|
+
* Pass `{ maxLabelSets }` to change the per-metric label cardinality cap (default 1000).
|
|
1277
998
|
*/
|
|
1278
|
-
function createMetricsPlugin(map) {
|
|
1279
|
-
return new MetricsPlugin(map);
|
|
999
|
+
function createMetricsPlugin(map, options) {
|
|
1000
|
+
return new MetricsPlugin(map, options);
|
|
1280
1001
|
}
|
|
1281
1002
|
|
|
1282
1003
|
//#endregion
|
|
1283
1004
|
//#region src/index.ts
|
|
1284
1005
|
/**
|
|
1285
|
-
* Default configuration for Logixia logger
|
|
1286
|
-
*/
|
|
1287
|
-
const DEFAULT_CONFIG = {
|
|
1288
|
-
appName: "App",
|
|
1289
|
-
environment: "development",
|
|
1290
|
-
traceId: true,
|
|
1291
|
-
format: {
|
|
1292
|
-
timestamp: true,
|
|
1293
|
-
colorize: true,
|
|
1294
|
-
json: false
|
|
1295
|
-
},
|
|
1296
|
-
silent: false,
|
|
1297
|
-
levelOptions: {
|
|
1298
|
-
level: require_logitron_logger_module.LogLevel.INFO,
|
|
1299
|
-
levels: {
|
|
1300
|
-
[require_logitron_logger_module.LogLevel.ERROR]: 0,
|
|
1301
|
-
[require_logitron_logger_module.LogLevel.WARN]: 1,
|
|
1302
|
-
[require_logitron_logger_module.LogLevel.INFO]: 2,
|
|
1303
|
-
[require_logitron_logger_module.LogLevel.DEBUG]: 3,
|
|
1304
|
-
[require_logitron_logger_module.LogLevel.TRACE]: 4,
|
|
1305
|
-
[require_logitron_logger_module.LogLevel.VERBOSE]: 5
|
|
1306
|
-
},
|
|
1307
|
-
colors: {
|
|
1308
|
-
[require_logitron_logger_module.LogLevel.ERROR]: "red",
|
|
1309
|
-
[require_logitron_logger_module.LogLevel.WARN]: "yellow",
|
|
1310
|
-
[require_logitron_logger_module.LogLevel.INFO]: "blue",
|
|
1311
|
-
[require_logitron_logger_module.LogLevel.DEBUG]: "green",
|
|
1312
|
-
[require_logitron_logger_module.LogLevel.TRACE]: "gray",
|
|
1313
|
-
[require_logitron_logger_module.LogLevel.VERBOSE]: "cyan"
|
|
1314
|
-
}
|
|
1315
|
-
},
|
|
1316
|
-
fields: {
|
|
1317
|
-
timestamp: true,
|
|
1318
|
-
level: true,
|
|
1319
|
-
appName: true,
|
|
1320
|
-
traceId: true,
|
|
1321
|
-
message: true,
|
|
1322
|
-
payload: true,
|
|
1323
|
-
timeTaken: true
|
|
1324
|
-
},
|
|
1325
|
-
outputs: ["console"]
|
|
1326
|
-
};
|
|
1327
|
-
/**
|
|
1328
1006
|
* Create a new Logixia logger instance with TypeScript support for custom levels
|
|
1329
1007
|
* @param config - Logger configuration
|
|
1330
1008
|
* @returns Typed logger instance
|
|
1331
1009
|
*/
|
|
1332
|
-
const createLogger =
|
|
1333
|
-
/**
|
|
1334
|
-
* Create a new Logixia logger service for NestJS
|
|
1335
|
-
* @param config - Logger configuration
|
|
1336
|
-
* @returns LogixiaLoggerService instance
|
|
1337
|
-
*/
|
|
1338
|
-
function createLoggerService(config) {
|
|
1339
|
-
return new require_logitron_logger_module.LogixiaLoggerService({
|
|
1340
|
-
...DEFAULT_CONFIG,
|
|
1341
|
-
...config
|
|
1342
|
-
});
|
|
1343
|
-
}
|
|
1010
|
+
const createLogger = require_builder.createLogger;
|
|
1344
1011
|
/**
|
|
1345
1012
|
* Default logger instance
|
|
1346
1013
|
*/
|
|
1347
|
-
const logger = new
|
|
1014
|
+
const logger = new require_builder.LogixiaLogger(require_builder.DEFAULT_CONFIG);
|
|
1348
1015
|
/**
|
|
1349
1016
|
* Export default configuration for reference
|
|
1350
1017
|
*/
|
|
@@ -1353,105 +1020,74 @@ const logger = new require_logitron_logger_module.LogixiaLogger(DEFAULT_CONFIG);
|
|
|
1353
1020
|
exports.BasicLogIndexer = require_search.BasicLogIndexer;
|
|
1354
1021
|
exports.BasicSearchEngine = require_search.BasicSearchEngine;
|
|
1355
1022
|
exports.CorrelationEngine = require_search.CorrelationEngine;
|
|
1356
|
-
exports.DEFAULT_CONFIG = DEFAULT_CONFIG;
|
|
1357
|
-
exports.DEFAULT_LOG_COLORS =
|
|
1358
|
-
exports.DEFAULT_LOG_LEVELS =
|
|
1359
|
-
exports.DEFAULT_TRACE_HEADERS =
|
|
1360
|
-
exports.
|
|
1361
|
-
exports.
|
|
1023
|
+
exports.DEFAULT_CONFIG = require_builder.DEFAULT_CONFIG;
|
|
1024
|
+
exports.DEFAULT_LOG_COLORS = require_builder.DEFAULT_LOG_COLORS;
|
|
1025
|
+
exports.DEFAULT_LOG_LEVELS = require_builder.DEFAULT_LOG_LEVELS;
|
|
1026
|
+
exports.DEFAULT_TRACE_HEADERS = require_trace_utils.DEFAULT_TRACE_HEADERS;
|
|
1027
|
+
exports.DiscordTransport = require_slack_transport.DiscordTransport;
|
|
1028
|
+
exports.ErrorResponseBuilder = require_builder.ErrorResponseBuilder;
|
|
1362
1029
|
exports.JsonFormatter = JsonFormatter;
|
|
1363
|
-
|
|
1364
|
-
enumerable: true,
|
|
1365
|
-
get: function () {
|
|
1366
|
-
return require_logitron_logger_module.KafkaTraceInterceptor;
|
|
1367
|
-
}
|
|
1368
|
-
});
|
|
1369
|
-
exports.LOGIXIA_LOGGER_CONFIG = require_logitron_logger_module.LOGIXIA_LOGGER_CONFIG;
|
|
1370
|
-
exports.LOGIXIA_LOGGER_PREFIX = require_logitron_logger_module.LOGIXIA_LOGGER_PREFIX;
|
|
1371
|
-
exports.LOGIXIA_TRACE_CONFIG = require_logitron_logger_module.LOGIXIA_TRACE_CONFIG;
|
|
1372
|
-
exports.LogLevel = require_logitron_logger_module.LogLevel;
|
|
1373
|
-
exports.LogMethod = LogMethod;
|
|
1030
|
+
exports.LogLevel = require_builder.LogLevel;
|
|
1374
1031
|
exports.LogixiaContext = require_async_context.LogixiaContext;
|
|
1375
|
-
exports.LogixiaException = LogixiaException;
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
get: function () {
|
|
1379
|
-
return LogixiaExceptionFilter;
|
|
1380
|
-
}
|
|
1381
|
-
});
|
|
1382
|
-
exports.LogixiaLogger = require_logitron_logger_module.LogixiaLogger;
|
|
1383
|
-
Object.defineProperty(exports, 'LogixiaLoggerModule', {
|
|
1384
|
-
enumerable: true,
|
|
1385
|
-
get: function () {
|
|
1386
|
-
return require_logitron_logger_module.LogixiaLoggerModule;
|
|
1387
|
-
}
|
|
1388
|
-
});
|
|
1389
|
-
Object.defineProperty(exports, 'LogixiaLoggerService', {
|
|
1390
|
-
enumerable: true,
|
|
1391
|
-
get: function () {
|
|
1392
|
-
return require_logitron_logger_module.LogixiaLoggerService;
|
|
1393
|
-
}
|
|
1394
|
-
});
|
|
1032
|
+
exports.LogixiaException = require_builder.LogixiaException;
|
|
1033
|
+
exports.LogixiaLogger = require_builder.LogixiaLogger;
|
|
1034
|
+
exports.MAX_INCOMING_ID_LENGTH = require_trace_utils.MAX_INCOMING_ID_LENGTH;
|
|
1395
1035
|
exports.MetricsPlugin = MetricsPlugin;
|
|
1396
1036
|
exports.NLPSearchEngine = require_search.NLPSearchEngine;
|
|
1037
|
+
exports.OVERFLOW_LABEL_VALUE = OVERFLOW_LABEL_VALUE;
|
|
1397
1038
|
exports.OtlpLogTransport = OtlpLogTransport;
|
|
1398
1039
|
exports.PatternRecognitionEngine = require_search.PatternRecognitionEngine;
|
|
1399
|
-
exports.PluginRegistry =
|
|
1040
|
+
exports.PluginRegistry = require_builder.PluginRegistry;
|
|
1400
1041
|
exports.SearchManager = require_search.SearchManager;
|
|
1401
|
-
exports.
|
|
1042
|
+
exports.SlackTransport = require_slack_transport.SlackTransport;
|
|
1043
|
+
exports.TRACE_CONTEXT_KEY = require_trace_utils.TRACE_CONTEXT_KEY;
|
|
1402
1044
|
exports.TextFormatter = TextFormatter;
|
|
1403
|
-
exports.TraceContext =
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
get: function () {
|
|
1407
|
-
return require_logitron_logger_module.WebSocketTraceInterceptor;
|
|
1408
|
-
}
|
|
1409
|
-
});
|
|
1410
|
-
exports._setActiveContextKey = require_logitron_logger_module._setActiveContextKey;
|
|
1411
|
-
exports._shutdownRegistrySize = require_logitron_logger_module._shutdownRegistrySize;
|
|
1045
|
+
exports.TraceContext = require_trace_utils.TraceContext;
|
|
1046
|
+
exports._setActiveContextKey = require_trace_utils._setActiveContextKey;
|
|
1047
|
+
exports._shutdownRegistrySize = require_builder._shutdownRegistrySize;
|
|
1412
1048
|
exports.addEventFields = addEventFields;
|
|
1413
|
-
exports.applyRedaction =
|
|
1049
|
+
exports.applyRedaction = require_builder.applyRedaction;
|
|
1414
1050
|
exports.createExpressContextMiddleware = require_async_context.createExpressContextMiddleware;
|
|
1415
1051
|
exports.createFastifyContextHook = require_async_context.createFastifyContextHook;
|
|
1416
1052
|
exports.createLevelControlHandler = createLevelControlHandler;
|
|
1417
1053
|
exports.createLogger = createLogger;
|
|
1418
|
-
exports.createLoggerService = createLoggerService;
|
|
1419
1054
|
exports.createMetricsPlugin = createMetricsPlugin;
|
|
1420
|
-
exports.createTraceMiddleware =
|
|
1055
|
+
exports.createTraceMiddleware = require_trace_utils.createTraceMiddleware;
|
|
1421
1056
|
exports.createTypedLogger = createTypedLogger;
|
|
1422
1057
|
exports.decycleValue = require_safe_stringify.decycleValue;
|
|
1423
1058
|
exports.defineLogSchema = defineLogSchema;
|
|
1424
|
-
exports.deregisterFromShutdown =
|
|
1425
|
-
exports.disableOtelBridge =
|
|
1426
|
-
exports.extractTraceId =
|
|
1427
|
-
exports.flushOnExit =
|
|
1428
|
-
exports.generateRequestId = generateRequestId;
|
|
1429
|
-
exports.generateTraceId = generateTraceId;
|
|
1430
|
-
exports.getActiveOtelContext =
|
|
1431
|
-
exports.getCurrentTraceId =
|
|
1059
|
+
exports.deregisterFromShutdown = require_builder.deregisterFromShutdown;
|
|
1060
|
+
exports.disableOtelBridge = require_builder.disableOtelBridge;
|
|
1061
|
+
exports.extractTraceId = require_trace_utils.extractTraceId;
|
|
1062
|
+
exports.flushOnExit = require_builder.flushOnExit;
|
|
1063
|
+
exports.generateRequestId = require_builder.generateRequestId;
|
|
1064
|
+
exports.generateTraceId = require_builder.generateTraceId;
|
|
1065
|
+
exports.getActiveOtelContext = require_builder.getActiveOtelContext;
|
|
1066
|
+
exports.getCurrentTraceId = require_trace_utils.getCurrentTraceId;
|
|
1432
1067
|
exports.getEventFields = getEventFields;
|
|
1433
|
-
exports.getOtelMetaFields =
|
|
1434
|
-
exports.getTraceContextKey =
|
|
1435
|
-
exports.globalPluginRegistry =
|
|
1436
|
-
exports.initOtelBridge =
|
|
1437
|
-
exports.isError =
|
|
1438
|
-
exports.isLogixiaException = isLogixiaException;
|
|
1068
|
+
exports.getOtelMetaFields = require_builder.getOtelMetaFields;
|
|
1069
|
+
exports.getTraceContextKey = require_trace_utils.getTraceContextKey;
|
|
1070
|
+
exports.globalPluginRegistry = require_builder.globalPluginRegistry;
|
|
1071
|
+
exports.initOtelBridge = require_builder.initOtelBridge;
|
|
1072
|
+
exports.isError = require_builder.isError;
|
|
1073
|
+
exports.isLogixiaException = require_builder.isLogixiaException;
|
|
1439
1074
|
exports.logger = logger;
|
|
1440
|
-
exports.normalizeError =
|
|
1441
|
-
exports.redactObject =
|
|
1442
|
-
exports.registerForShutdown =
|
|
1075
|
+
exports.normalizeError = require_builder.normalizeError;
|
|
1076
|
+
exports.redactObject = require_builder.redactObject;
|
|
1077
|
+
exports.registerForShutdown = require_builder.registerForShutdown;
|
|
1443
1078
|
exports.registerLevelSignal = registerLevelSignal;
|
|
1444
|
-
exports.resetShutdownHandlers =
|
|
1079
|
+
exports.resetShutdownHandlers = require_builder.resetShutdownHandlers;
|
|
1445
1080
|
exports.retrocycle = require_safe_stringify.retrocycle;
|
|
1446
|
-
exports.runWithTraceId =
|
|
1081
|
+
exports.runWithTraceId = require_trace_utils.runWithTraceId;
|
|
1447
1082
|
exports.safeStringify = require_safe_stringify.safeStringify;
|
|
1448
|
-
exports.
|
|
1083
|
+
exports.sanitizeIncomingId = require_trace_utils.sanitizeIncomingId;
|
|
1084
|
+
exports.serializeError = require_builder.serializeError;
|
|
1449
1085
|
exports.setEventField = setEventField;
|
|
1450
|
-
exports.setTraceId =
|
|
1086
|
+
exports.setTraceId = require_trace_utils.setTraceId;
|
|
1451
1087
|
exports.stringifyForLog = require_safe_stringify.stringifyForLog;
|
|
1452
1088
|
exports.toOtelSeverity = toOtelSeverity;
|
|
1453
|
-
exports.traceStorage =
|
|
1454
|
-
exports.usePlugin =
|
|
1089
|
+
exports.traceStorage = require_trace_utils.traceStorage;
|
|
1090
|
+
exports.usePlugin = require_builder.usePlugin;
|
|
1455
1091
|
exports.wideEventMiddleware = wideEventMiddleware;
|
|
1456
1092
|
exports.withWideEvent = withWideEvent;
|
|
1457
1093
|
//# sourceMappingURL=index.js.map
|