logixia 1.3.0 → 1.4.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 +848 -7
- package/dist/.tsbuildinfo +1 -0
- package/dist/{index-iDTW2-eY.d.mts → index-Ium497V3.d.mts} +180 -2
- package/dist/index-Ium497V3.d.mts.map +1 -0
- package/dist/{index-CHIsdA9n.d.ts → index-t-ActikQ.d.ts} +180 -2
- package/dist/index-t-ActikQ.d.ts.map +1 -0
- package/dist/index.d.mts +458 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +458 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +436 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +416 -3
- package/dist/index.mjs.map +1 -1
- package/dist/{logitron-logger.module-C0G8JGVf.d.ts → logitron-logger.module-9vOhKWDG.d.ts} +120 -6
- package/dist/logitron-logger.module-9vOhKWDG.d.ts.map +1 -0
- package/dist/{logitron-logger.module-2AzkadqZ.mjs → logitron-logger.module-C939PIEV.mjs} +331 -10
- package/dist/logitron-logger.module-C939PIEV.mjs.map +1 -0
- package/dist/{logitron-logger.module-BqNKp0Fs.js → logitron-logger.module-CCnX7GwK.js} +383 -8
- package/dist/logitron-logger.module-CCnX7GwK.js.map +1 -0
- package/dist/{logitron-logger.module-DQKaZTJL.d.mts → logitron-logger.module-SArymP6b.d.mts} +120 -6
- package/dist/logitron-logger.module-SArymP6b.d.mts.map +1 -0
- package/dist/middleware.d.mts +1 -1
- package/dist/middleware.d.ts +1 -1
- package/dist/nest.d.mts +2 -2
- package/dist/nest.d.ts +2 -2
- package/dist/nest.js +2 -2
- package/dist/nest.mjs +2 -2
- package/dist/{promise-DaiZ2BaH.js → promise-BI-3eI4n.js} +285 -128
- package/dist/promise-BI-3eI4n.js.map +1 -0
- package/dist/{promise-C4pQPcK4.mjs → promise-BrZcjavs.mjs} +285 -128
- package/dist/promise-BrZcjavs.mjs.map +1 -0
- package/dist/testing.d.mts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +7 -1
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +7 -1
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.manager-5VVdqS3o.mjs → transport.manager-DR7TLXQT.mjs} +82 -4
- package/dist/transport.manager-DR7TLXQT.mjs.map +1 -0
- package/dist/{transport.manager-DCOm4uIQ.js → transport.manager-DVTM978M.js} +82 -4
- package/dist/transport.manager-DVTM978M.js.map +1 -0
- package/dist/transports.d.mts +61 -168
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +61 -168
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +1 -1
- package/dist/transports.mjs +1 -1
- package/package.json +72 -9
- package/dist/index-CHIsdA9n.d.ts.map +0 -1
- package/dist/index-iDTW2-eY.d.mts.map +0 -1
- package/dist/logitron-logger.module-2AzkadqZ.mjs.map +0 -1
- package/dist/logitron-logger.module-BqNKp0Fs.js.map +0 -1
- package/dist/logitron-logger.module-C0G8JGVf.d.ts.map +0 -1
- package/dist/logitron-logger.module-DQKaZTJL.d.mts.map +0 -1
- package/dist/promise-C4pQPcK4.mjs.map +0 -1
- package/dist/promise-DaiZ2BaH.js.map +0 -1
- package/dist/transport.manager-5VVdqS3o.mjs.map +0 -1
- package/dist/transport.manager-DCOm4uIQ.js.map +0 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,80 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as LogixiaOptionsFactory, c as LogixiaLoggerService, i as LogixiaLoggerModule, l as LogixiaLogger, n as LOGIXIA_LOGGER_PREFIX, o as WebSocketTraceInterceptor, r as LogixiaAsyncOptions, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG, u as createLogger$1 } from "./logitron-logger.module-
|
|
1
|
+
import { C as SamplingConfig, E as TraceIdExtractorConfig, G as RequestTiming, H as HttpRequest, S as RequestContext, T as TraceIdConfig, U as HttpResponse, V as HttpError, W as RequestMetrics, _ as LogLevelString, a as Environment, b as NamespaceLevels, c as GracefulShutdownConfig, d as ILogger, f as ILoggerDefault, g as LogLevel, h as LogFieldKey, i as DEFAULT_LOG_LEVELS, l as IBaseLogger, m as LogEntry, n as CustomLevelMethods, o as ErrorSerializationOptions, p as LogColor, r as DEFAULT_LOG_COLORS, s as ExtractLevels, t as ContextData, u as ILogFormatter, v as LoggerConfig, w as TimingEntry, x as RedactConfig, y as LoggerWithLevels } from "./index-Ium497V3.mjs";
|
|
2
|
+
import { a as LogixiaOptionsFactory, c as LogixiaLoggerService, d as LogixiaPlugin, f as PluginRegistry, i as LogixiaLoggerModule, l as LogixiaLogger, m as usePlugin, n as LOGIXIA_LOGGER_PREFIX, o as WebSocketTraceInterceptor, p as globalPluginRegistry, r as LogixiaAsyncOptions, s as KafkaTraceInterceptor, t as LOGIXIA_LOGGER_CONFIG, u as createLogger$1 } from "./logitron-logger.module-SArymP6b.mjs";
|
|
3
3
|
import "./search-DanSf_yc.mjs";
|
|
4
4
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
5
|
+
import { ArgumentsHost, ExceptionFilter } from "@nestjs/common";
|
|
6
|
+
import { IncomingMessage, ServerResponse } from "node:http";
|
|
5
7
|
|
|
8
|
+
//#region src/core/nestjs-extras.d.ts
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Inject the Logixia logger registered in the current NestJS DI container.
|
|
12
|
+
*
|
|
13
|
+
* Equivalent to `@Inject(LOGIXIA_LOGGER_TOKEN)` but without needing to import
|
|
14
|
+
* the internal token constant yourself.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* constructor(@InjectLogger() private readonly logger: LogixiaLoggerService) {}
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
declare const InjectLogger: () => ParameterDecorator;
|
|
22
|
+
interface LogMethodOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Log level to use for entry / exit messages.
|
|
25
|
+
* @default 'debug'
|
|
26
|
+
*/
|
|
27
|
+
level?: 'debug' | 'info' | 'verbose';
|
|
28
|
+
/**
|
|
29
|
+
* Whether to log the arguments passed to the method.
|
|
30
|
+
* Disable for high-throughput hot paths.
|
|
31
|
+
* @default true
|
|
32
|
+
*/
|
|
33
|
+
logArgs?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Whether to log the return value of the method.
|
|
36
|
+
* @default false
|
|
37
|
+
*/
|
|
38
|
+
logResult?: boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Whether to log error stack traces for thrown errors.
|
|
41
|
+
* @default true
|
|
42
|
+
*/
|
|
43
|
+
logErrors?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Custom label used in log messages instead of the auto-detected class.method name.
|
|
46
|
+
*/
|
|
47
|
+
label?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Method decorator that auto-logs entry, exit, duration, and errors.
|
|
51
|
+
*
|
|
52
|
+
* Works on both async and sync methods. Attaches to the logger found on the
|
|
53
|
+
* class instance via a `logger` property (the conventional NestJS name).
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* @LogMethod({ level: 'info', logArgs: true })
|
|
58
|
+
* async processPayment(orderId: string): Promise<void> { … }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
declare function LogMethod(options?: LogMethodOptions): MethodDecorator;
|
|
62
|
+
/**
|
|
63
|
+
* Global NestJS exception filter that logs every unhandled exception with full
|
|
64
|
+
* request context (method, URL, status) before delegating the response.
|
|
65
|
+
*
|
|
66
|
+
* Register in `main.ts`:
|
|
67
|
+
* ```ts
|
|
68
|
+
* const logger = app.get(LogixiaLoggerService);
|
|
69
|
+
* app.useGlobalFilters(new LogixiaExceptionFilter(logger));
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
declare class LogixiaExceptionFilter implements ExceptionFilter {
|
|
73
|
+
private readonly logger?;
|
|
74
|
+
constructor(logger?: LogixiaLoggerService | undefined);
|
|
75
|
+
catch(exception: unknown, host: ArgumentsHost): void;
|
|
76
|
+
}
|
|
77
|
+
//#endregion
|
|
6
78
|
//#region src/formatters/json.formatter.d.ts
|
|
7
79
|
declare class JsonFormatter implements ILogFormatter {
|
|
8
80
|
private includeTimestamp;
|
|
@@ -71,6 +143,118 @@ declare function isError(value: unknown): value is Error;
|
|
|
71
143
|
*/
|
|
72
144
|
declare function normalizeError(error: unknown): Error;
|
|
73
145
|
//#endregion
|
|
146
|
+
//#region src/utils/otel.d.ts
|
|
147
|
+
/**
|
|
148
|
+
* logixia — OpenTelemetry auto trace-log correlation
|
|
149
|
+
*
|
|
150
|
+
* Zero-config: if `@opentelemetry/api` is installed, logixia automatically
|
|
151
|
+
* reads the active span context and injects `traceId`, `spanId`, and
|
|
152
|
+
* `traceFlags` into every log entry. No manual wiring needed.
|
|
153
|
+
*
|
|
154
|
+
* The integration is completely optional — if `@opentelemetry/api` is absent
|
|
155
|
+
* (or the OTel SDK is not initialised), all helpers return `undefined` silently.
|
|
156
|
+
*
|
|
157
|
+
* Additionally exposes a `createOtelLogExporter()` factory that routes every
|
|
158
|
+
* logixia log entry through the active OTel LoggerProvider (OTLP export).
|
|
159
|
+
*
|
|
160
|
+
* @example Auto bridge (zero config)
|
|
161
|
+
* ```ts
|
|
162
|
+
* import { createLogger } from 'logixia';
|
|
163
|
+
* import { initOtelBridge } from 'logixia';
|
|
164
|
+
*
|
|
165
|
+
* // Call once at app startup, after your OTel SDK is initialised
|
|
166
|
+
* initOtelBridge();
|
|
167
|
+
*
|
|
168
|
+
* const logger = createLogger({ appName: 'api' });
|
|
169
|
+
* // Every logger.info / warn / error call now auto-injects traceId + spanId
|
|
170
|
+
* // from the currently active OTel span — no per-call code needed.
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* @example Manual span context injection
|
|
174
|
+
* ```ts
|
|
175
|
+
* import { getActiveOtelContext } from 'logixia';
|
|
176
|
+
*
|
|
177
|
+
* const ctx = getActiveOtelContext();
|
|
178
|
+
* await logger.info('Payment processed', { ...ctx, orderId: 'ord_123' });
|
|
179
|
+
* // → { traceId: 'abc...', spanId: 'def...', traceFlags: 1, orderId: 'ord_123' }
|
|
180
|
+
* ```
|
|
181
|
+
*/
|
|
182
|
+
interface OtelSpanContext {
|
|
183
|
+
/** W3C 32-hex-char trace ID */
|
|
184
|
+
traceId: string;
|
|
185
|
+
/** W3C 16-hex-char span ID */
|
|
186
|
+
spanId: string;
|
|
187
|
+
/** W3C trace-flags integer (1 = sampled) */
|
|
188
|
+
traceFlags: number;
|
|
189
|
+
/** Whether this context is from a valid, sampled span */
|
|
190
|
+
isSampled: boolean;
|
|
191
|
+
}
|
|
192
|
+
interface OtelBridgeOptions {
|
|
193
|
+
/**
|
|
194
|
+
* Field name written to log entries for the trace ID.
|
|
195
|
+
* @default 'traceId'
|
|
196
|
+
*/
|
|
197
|
+
traceIdField?: string;
|
|
198
|
+
/**
|
|
199
|
+
* Field name written to log entries for the span ID.
|
|
200
|
+
* @default 'spanId'
|
|
201
|
+
*/
|
|
202
|
+
spanIdField?: string;
|
|
203
|
+
/**
|
|
204
|
+
* Field name written to log entries for trace flags.
|
|
205
|
+
* @default 'traceFlags'
|
|
206
|
+
*/
|
|
207
|
+
traceFlagsField?: string;
|
|
208
|
+
/**
|
|
209
|
+
* Only inject context when the span is sampled (traceFlags bit 1 set).
|
|
210
|
+
* @default false
|
|
211
|
+
*/
|
|
212
|
+
sampledOnly?: boolean;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Read the currently active OTel span context (if any) and return its fields
|
|
216
|
+
* in a plain object suitable for spreading into a log entry.
|
|
217
|
+
*
|
|
218
|
+
* Returns `undefined` when:
|
|
219
|
+
* - `@opentelemetry/api` is not installed
|
|
220
|
+
* - No active span exists (root context)
|
|
221
|
+
* - The span context is invalid (all-zeros)
|
|
222
|
+
*/
|
|
223
|
+
declare function getActiveOtelContext(opts?: OtelBridgeOptions): OtelSpanContext | undefined;
|
|
224
|
+
/**
|
|
225
|
+
* Returns a metadata object with OTel context fields ready to merge into a log call,
|
|
226
|
+
* using the configured field names.
|
|
227
|
+
*
|
|
228
|
+
* Returns `{}` when no active span exists (safe to spread unconditionally).
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```ts
|
|
232
|
+
* await logger.info('Payment processed', {
|
|
233
|
+
* ...getOtelMetaFields(),
|
|
234
|
+
* orderId: 'ord_123',
|
|
235
|
+
* });
|
|
236
|
+
* ```
|
|
237
|
+
*/
|
|
238
|
+
declare function getOtelMetaFields(opts?: OtelBridgeOptions): Record<string, unknown>;
|
|
239
|
+
/**
|
|
240
|
+
* Initialise the global OTel bridge.
|
|
241
|
+
*
|
|
242
|
+
* Once called, logixia's internal log pipeline checks for an active OTel span
|
|
243
|
+
* on **every** log call and automatically merges the span context into the
|
|
244
|
+
* entry's metadata — no per-call wiring needed.
|
|
245
|
+
*
|
|
246
|
+
* Call once at app startup, **after** the OTel SDK has been initialised:
|
|
247
|
+
* ```ts
|
|
248
|
+
* import { initOtelBridge } from 'logixia';
|
|
249
|
+
* initOtelBridge();
|
|
250
|
+
* ```
|
|
251
|
+
*/
|
|
252
|
+
declare function initOtelBridge(opts?: OtelBridgeOptions): void;
|
|
253
|
+
/**
|
|
254
|
+
* Disable the OTel bridge (useful for tests).
|
|
255
|
+
*/
|
|
256
|
+
declare function disableOtelBridge(): void;
|
|
257
|
+
//#endregion
|
|
74
258
|
//#region src/utils/redact.utils.d.ts
|
|
75
259
|
/**
|
|
76
260
|
* Deep-clone and redact an object according to the given RedactConfig.
|
|
@@ -173,6 +357,106 @@ declare const DEFAULT_TRACE_HEADERS: string[];
|
|
|
173
357
|
*/
|
|
174
358
|
declare function createTraceMiddleware(config: TraceIdConfig): (req: unknown, res: unknown, next: () => void) => void;
|
|
175
359
|
//#endregion
|
|
360
|
+
//#region src/utils/typed-logger.d.ts
|
|
361
|
+
/**
|
|
362
|
+
* logixia — TypeScript typed log fields
|
|
363
|
+
*
|
|
364
|
+
* Solves the type-safety gap: standard `Record<string, unknown>` metadata gives
|
|
365
|
+
* zero IDE autocomplete and lets typos slip silently into production logs.
|
|
366
|
+
*
|
|
367
|
+
* Two complementary utilities:
|
|
368
|
+
*
|
|
369
|
+
* 1. `createTypedLogger<TFields>()` — wraps any IBaseLogger so that the second
|
|
370
|
+
* argument of every log method is constrained to `TFields` (a typed object).
|
|
371
|
+
* Compile-time safety, zero runtime overhead.
|
|
372
|
+
*
|
|
373
|
+
* 2. `defineLogSchema<TFields>(schema)` — declares expected fields with optional
|
|
374
|
+
* validators. In development (NODE_ENV !== 'production') every log call is
|
|
375
|
+
* validated against the schema and a warning is emitted for missing required
|
|
376
|
+
* fields or type mismatches.
|
|
377
|
+
*
|
|
378
|
+
* @example
|
|
379
|
+
* ```ts
|
|
380
|
+
* import { createTypedLogger, defineLogSchema } from 'logixia';
|
|
381
|
+
*
|
|
382
|
+
* interface OrderFields {
|
|
383
|
+
* orderId: string;
|
|
384
|
+
* userId: string;
|
|
385
|
+
* amount?: number;
|
|
386
|
+
* currency?: string;
|
|
387
|
+
* }
|
|
388
|
+
*
|
|
389
|
+
* const schema = defineLogSchema<OrderFields>({
|
|
390
|
+
* orderId: { type: 'string', required: true },
|
|
391
|
+
* userId: { type: 'string', required: true },
|
|
392
|
+
* amount: { type: 'number' },
|
|
393
|
+
* currency: { type: 'string' },
|
|
394
|
+
* });
|
|
395
|
+
*
|
|
396
|
+
* const orderLogger = createTypedLogger<OrderFields>(baseLogger, schema);
|
|
397
|
+
* await orderLogger.info('Order created', { orderId: 'ord_123', userId: 'usr_456', amount: 99.99 });
|
|
398
|
+
* // ^^^^ fully typed autocomplete ^^^^
|
|
399
|
+
* ```
|
|
400
|
+
*/
|
|
401
|
+
type LogFieldType = 'string' | 'number' | 'boolean' | 'object' | 'array';
|
|
402
|
+
interface LogFieldDef {
|
|
403
|
+
type: LogFieldType;
|
|
404
|
+
/** Emit a warning when this field is missing from the log call. Default: false */
|
|
405
|
+
required?: boolean;
|
|
406
|
+
/** Custom validator — return a string to emit it as a warning message. */
|
|
407
|
+
validate?: (value: unknown) => string | undefined;
|
|
408
|
+
}
|
|
409
|
+
type LogSchema<TFields extends Record<string, unknown>> = { [K in keyof TFields]: LogFieldDef };
|
|
410
|
+
interface CompiledSchema<TFields extends Record<string, unknown>> {
|
|
411
|
+
readonly fields: LogSchema<TFields>;
|
|
412
|
+
/**
|
|
413
|
+
* Validate a payload against the schema.
|
|
414
|
+
* Returns an array of warning strings (empty = pass).
|
|
415
|
+
* Only runs in non-production environments.
|
|
416
|
+
*/
|
|
417
|
+
validate(payload: Partial<TFields>): string[];
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Define a typed schema for a category of log entries.
|
|
421
|
+
*
|
|
422
|
+
* Call this once at module initialisation and pass it to `createTypedLogger`.
|
|
423
|
+
* In development, every log call is validated against the schema.
|
|
424
|
+
*/
|
|
425
|
+
declare function defineLogSchema<TFields extends Record<string, unknown>>(fields: LogSchema<TFields>): CompiledSchema<TFields>;
|
|
426
|
+
/** IBaseLogger-compatible subset used by TypedLogger */
|
|
427
|
+
interface LoggerLike {
|
|
428
|
+
error(message: string | Error, data?: Record<string, unknown>): Promise<void>;
|
|
429
|
+
warn(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
430
|
+
info(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
431
|
+
debug(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
432
|
+
verbose?(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
433
|
+
trace?(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* A logger whose metadata is typed to `TFields`.
|
|
437
|
+
*
|
|
438
|
+
* The `error` overload still accepts a plain `Error` object as the first arg
|
|
439
|
+
* (with optional `TFields` data) so the typed logger remains a drop-in replacement.
|
|
440
|
+
*/
|
|
441
|
+
interface TypedLogger<TFields extends Record<string, unknown>> {
|
|
442
|
+
error(error: Error, data?: Partial<TFields>): Promise<void>;
|
|
443
|
+
error(message: string, data?: Partial<TFields>): Promise<void>;
|
|
444
|
+
warn(message: string, data?: Partial<TFields>): Promise<void>;
|
|
445
|
+
info(message: string, data?: Partial<TFields>): Promise<void>;
|
|
446
|
+
debug(message: string, data?: Partial<TFields>): Promise<void>;
|
|
447
|
+
verbose(message: string, data?: Partial<TFields>): Promise<void>;
|
|
448
|
+
trace(message: string, data?: Partial<TFields>): Promise<void>;
|
|
449
|
+
/** Access the underlying untyped logger if needed. */
|
|
450
|
+
readonly raw: LoggerLike;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Wrap any logixia logger with a type-safe field interface.
|
|
454
|
+
*
|
|
455
|
+
* @param logger Any object that implements `IBaseLogger` (e.g. the result of `createLogger()`)
|
|
456
|
+
* @param schema Optional schema for dev-time validation. Created with `defineLogSchema()`.
|
|
457
|
+
*/
|
|
458
|
+
declare function createTypedLogger<TFields extends Record<string, unknown>>(logger: LoggerLike, schema?: CompiledSchema<TFields>): TypedLogger<TFields>;
|
|
459
|
+
//#endregion
|
|
176
460
|
//#region src/context/async-context.d.ts
|
|
177
461
|
interface LogContext {
|
|
178
462
|
requestId?: string;
|
|
@@ -259,6 +543,177 @@ interface SamplingStats {
|
|
|
259
543
|
windowStart: number;
|
|
260
544
|
}
|
|
261
545
|
//#endregion
|
|
546
|
+
//#region src/metrics.d.ts
|
|
547
|
+
/**
|
|
548
|
+
* Increment a counter on each matching log entry.
|
|
549
|
+
*
|
|
550
|
+
* @example Count every error entry, labelled by context:
|
|
551
|
+
* ```ts
|
|
552
|
+
* error_count: { type: 'counter', levelFilter: 'error', labels: ['context'] }
|
|
553
|
+
* ```
|
|
554
|
+
*
|
|
555
|
+
* @example Count entries where payload.event === 'checkout':
|
|
556
|
+
* ```ts
|
|
557
|
+
* checkout_events: { type: 'counter', field: 'event', value: 'checkout' }
|
|
558
|
+
* ```
|
|
559
|
+
*/
|
|
560
|
+
interface CounterConfig {
|
|
561
|
+
type: 'counter';
|
|
562
|
+
/** Only increment when `entry.level` equals this value. Omit to count all entries. */
|
|
563
|
+
levelFilter?: string;
|
|
564
|
+
/**
|
|
565
|
+
* Only increment when `entry.payload[field] === value`.
|
|
566
|
+
* If omitted, every entry (matching `levelFilter`) is counted.
|
|
567
|
+
*/
|
|
568
|
+
field?: string;
|
|
569
|
+
value?: unknown;
|
|
570
|
+
/** `entry.payload` fields used as Prometheus label dimensions. `'level'` is also valid. */
|
|
571
|
+
labels?: string[];
|
|
572
|
+
help?: string;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Observe a numeric payload field and bucket it into a Prometheus histogram.
|
|
576
|
+
*
|
|
577
|
+
* @example Duration histogram labelled by HTTP method and status code:
|
|
578
|
+
* ```ts
|
|
579
|
+
* http_request_duration: {
|
|
580
|
+
* type: 'histogram',
|
|
581
|
+
* field: 'duration',
|
|
582
|
+
* labels: ['method', 'statusCode'],
|
|
583
|
+
* buckets: [10, 25, 50, 100, 250, 500, 1000],
|
|
584
|
+
* }
|
|
585
|
+
* ```
|
|
586
|
+
*/
|
|
587
|
+
interface HistogramConfig {
|
|
588
|
+
type: 'histogram';
|
|
589
|
+
/** The `entry.payload` field containing the numeric value to observe. */
|
|
590
|
+
field: string;
|
|
591
|
+
/** `entry.payload` fields used as Prometheus label dimensions. */
|
|
592
|
+
labels?: string[];
|
|
593
|
+
help?: string;
|
|
594
|
+
/**
|
|
595
|
+
* Bucket upper bounds (inclusive). Sorted automatically.
|
|
596
|
+
* Default: [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000]
|
|
597
|
+
*/
|
|
598
|
+
buckets?: number[];
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Track the most recent numeric value of a payload field as a gauge.
|
|
602
|
+
*
|
|
603
|
+
* @example Track live connection count:
|
|
604
|
+
* ```ts
|
|
605
|
+
* active_connections: { type: 'gauge', field: 'connections' }
|
|
606
|
+
* ```
|
|
607
|
+
*/
|
|
608
|
+
interface GaugeConfig {
|
|
609
|
+
type: 'gauge';
|
|
610
|
+
/** The `entry.payload` field containing the numeric value. */
|
|
611
|
+
field: string;
|
|
612
|
+
/** `entry.payload` fields used as Prometheus label dimensions. */
|
|
613
|
+
labels?: string[];
|
|
614
|
+
help?: string;
|
|
615
|
+
}
|
|
616
|
+
type MetricConfig = CounterConfig | HistogramConfig | GaugeConfig;
|
|
617
|
+
type MetricsMap = Record<string, MetricConfig>;
|
|
618
|
+
/**
|
|
619
|
+
* A logixia plugin that extracts Prometheus-compatible metrics from log entries.
|
|
620
|
+
*
|
|
621
|
+
* Implements `LogixiaPlugin` — pass directly to `logger.use()`:
|
|
622
|
+
* ```ts
|
|
623
|
+
* const metrics = new MetricsPlugin({ ... });
|
|
624
|
+
* logger.use(metrics);
|
|
625
|
+
* ```
|
|
626
|
+
*
|
|
627
|
+
* Or use the `createMetricsPlugin()` factory (preferred):
|
|
628
|
+
* ```ts
|
|
629
|
+
* const metrics = createMetricsPlugin({ ... });
|
|
630
|
+
* logger.use(metrics);
|
|
631
|
+
* ```
|
|
632
|
+
*/
|
|
633
|
+
declare class MetricsPlugin implements LogixiaPlugin {
|
|
634
|
+
readonly name = "logixia-metrics";
|
|
635
|
+
private readonly map;
|
|
636
|
+
private readonly metricState;
|
|
637
|
+
constructor(map: MetricsMap);
|
|
638
|
+
onInit(): void;
|
|
639
|
+
onLog(entry: LogEntry): LogEntry;
|
|
640
|
+
/**
|
|
641
|
+
* Render all registered metrics in the Prometheus text exposition format
|
|
642
|
+
* (version 0.0.4).
|
|
643
|
+
*
|
|
644
|
+
* All metric names are prefixed with `logixia_`.
|
|
645
|
+
*
|
|
646
|
+
* @example
|
|
647
|
+
* ```
|
|
648
|
+
* # HELP logixia_error_count Total error log entries
|
|
649
|
+
* # TYPE logixia_error_count counter
|
|
650
|
+
* logixia_error_count{context="OrderService"} 7
|
|
651
|
+
* ```
|
|
652
|
+
*/
|
|
653
|
+
render(): string;
|
|
654
|
+
/**
|
|
655
|
+
* Reset all metric counters and observations back to zero.
|
|
656
|
+
* Useful between test runs or on a scheduled reset interval.
|
|
657
|
+
*/
|
|
658
|
+
reset(): void;
|
|
659
|
+
/**
|
|
660
|
+
* Express route handler — call `app.get('/metrics', metrics.expressHandler())`.
|
|
661
|
+
*
|
|
662
|
+
* @example
|
|
663
|
+
* ```ts
|
|
664
|
+
* import express from 'express';
|
|
665
|
+
* const app = express();
|
|
666
|
+
* app.get('/metrics', metrics.expressHandler());
|
|
667
|
+
* ```
|
|
668
|
+
*/
|
|
669
|
+
expressHandler(): (req: unknown, res: {
|
|
670
|
+
set(k: string, v: string): unknown;
|
|
671
|
+
end(body: string): void;
|
|
672
|
+
}) => void;
|
|
673
|
+
/**
|
|
674
|
+
* Raw Node.js `http` server handler.
|
|
675
|
+
* Responds to `GET /metrics` with the Prometheus text payload.
|
|
676
|
+
*
|
|
677
|
+
* @example Start a dedicated metrics server on the standard port:
|
|
678
|
+
* ```ts
|
|
679
|
+
* import http from 'node:http';
|
|
680
|
+
* const server = http.createServer(metrics.httpHandler());
|
|
681
|
+
* server.listen(9464); // Prometheus default port for custom exporters
|
|
682
|
+
* ```
|
|
683
|
+
*/
|
|
684
|
+
httpHandler(): (req: IncomingMessage, res: ServerResponse) => void;
|
|
685
|
+
private initAllState;
|
|
686
|
+
private initSingleState;
|
|
687
|
+
}
|
|
688
|
+
/**
|
|
689
|
+
* Create a `MetricsPlugin` from a metrics map and return it ready for
|
|
690
|
+
* `logger.use()`.
|
|
691
|
+
*
|
|
692
|
+
* @example
|
|
693
|
+
* ```ts
|
|
694
|
+
* import { createMetricsPlugin } from 'logixia';
|
|
695
|
+
*
|
|
696
|
+
* const metrics = createMetricsPlugin({
|
|
697
|
+
* http_request_duration: {
|
|
698
|
+
* type: 'histogram',
|
|
699
|
+
* field: 'duration',
|
|
700
|
+
* labels: ['method', 'statusCode'],
|
|
701
|
+
* help: 'HTTP request duration in milliseconds',
|
|
702
|
+
* },
|
|
703
|
+
* error_count: {
|
|
704
|
+
* type: 'counter',
|
|
705
|
+
* levelFilter: 'error',
|
|
706
|
+
* labels: ['context'],
|
|
707
|
+
* help: 'Total error log entries',
|
|
708
|
+
* },
|
|
709
|
+
* });
|
|
710
|
+
*
|
|
711
|
+
* logger.use(metrics);
|
|
712
|
+
* app.get('/metrics', metrics.expressHandler());
|
|
713
|
+
* ```
|
|
714
|
+
*/
|
|
715
|
+
declare function createMetricsPlugin(map: MetricsMap): MetricsPlugin;
|
|
716
|
+
//#endregion
|
|
262
717
|
//#region src/index.d.ts
|
|
263
718
|
/**
|
|
264
719
|
* Default configuration for Logixia logger
|
|
@@ -345,5 +800,5 @@ declare const logger: LogixiaLogger<{
|
|
|
345
800
|
outputs: string[];
|
|
346
801
|
}>;
|
|
347
802
|
//#endregion
|
|
348
|
-
export { ContextData, CustomLevelMethods, DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, Environment, ErrorSerializationOptions, ExtractLevels, FlushOnExitOptions, GracefulShutdownConfig, HttpError, HttpRequest, HttpResponse, IBaseLogger, ILogFormatter, ILogger, ILoggerDefault, JsonFormatter, KafkaTraceInterceptor, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, LogColor, type LogContext, LogEntry, LogFieldKey, LogLevel, LogLevelString, LoggerConfig, LoggerConfig as LoggerConfigInterface, LoggerWithLevels, LogixiaAsyncOptions, LogixiaContext, LogixiaLogger, LogixiaLoggerModule, LogixiaLoggerService, LogixiaOptionsFactory, NamespaceLevels, type RedactConfig, RequestContext, RequestMetrics, RequestTiming, SamplingConfig, type SamplingStats, TextFormatter, TimingEntry, TraceIdConfig, TraceIdExtractorConfig, WebSocketTraceInterceptor, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLogger, createLoggerService, createTraceMiddleware, deregisterFromShutdown, extractTraceId, flushOnExit, generateTraceId, getCurrentTraceId, isError, logger, normalizeError, redactObject, registerForShutdown, resetShutdownHandlers, runWithTraceId, serializeError, setTraceId, traceStorage };
|
|
803
|
+
export { type CompiledSchema, ContextData, type CounterConfig, CustomLevelMethods, DEFAULT_CONFIG, DEFAULT_LOG_COLORS, DEFAULT_LOG_LEVELS, DEFAULT_TRACE_HEADERS, Environment, ErrorSerializationOptions, ExtractLevels, FlushOnExitOptions, type GaugeConfig, GracefulShutdownConfig, type HistogramConfig, HttpError, HttpRequest, HttpResponse, IBaseLogger, ILogFormatter, ILogger, ILoggerDefault, InjectLogger, JsonFormatter, KafkaTraceInterceptor, LOGIXIA_LOGGER_CONFIG, LOGIXIA_LOGGER_PREFIX, LogColor, type LogContext, LogEntry, type LogFieldDef, LogFieldKey, type LogFieldType, LogLevel, LogLevelString, LogMethod, type LogMethodOptions, type LogSchema, LoggerConfig, LoggerConfig as LoggerConfigInterface, type LoggerLike, LoggerWithLevels, LogixiaAsyncOptions, LogixiaContext, LogixiaExceptionFilter, LogixiaLogger, LogixiaLoggerModule, LogixiaLoggerService, LogixiaOptionsFactory, type LogixiaPlugin, type MetricConfig, type MetricsMap, MetricsPlugin, NamespaceLevels, type OtelBridgeOptions, type OtelSpanContext, PluginRegistry, type RedactConfig, RequestContext, RequestMetrics, RequestTiming, SamplingConfig, type SamplingStats, TextFormatter, TimingEntry, TraceIdConfig, TraceIdExtractorConfig, type TypedLogger, WebSocketTraceInterceptor, applyRedaction, createExpressContextMiddleware, createFastifyContextHook, createLogger, createLoggerService, createMetricsPlugin, createTraceMiddleware, createTypedLogger, defineLogSchema, deregisterFromShutdown, disableOtelBridge, extractTraceId, flushOnExit, generateTraceId, getActiveOtelContext, getCurrentTraceId, getOtelMetaFields, globalPluginRegistry, initOtelBridge, isError, logger, normalizeError, redactObject, registerForShutdown, resetShutdownHandlers, runWithTraceId, serializeError, setTraceId, traceStorage, usePlugin };
|
|
349
804
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/formatters/json.formatter.ts","../src/formatters/text.formatter.ts","../src/utils/error.utils.ts","../src/utils/redact.utils.ts","../src/utils/shutdown.utils.ts","../src/utils/trace.utils.ts","../src/context/async-context.ts","../src/utils/sampling.utils.ts","../src/index.ts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/nestjs-extras.ts","../src/formatters/json.formatter.ts","../src/formatters/text.formatter.ts","../src/utils/error.utils.ts","../src/utils/otel.ts","../src/utils/redact.utils.ts","../src/utils/shutdown.utils.ts","../src/utils/trace.utils.ts","../src/utils/typed-logger.ts","../src/context/async-context.ts","../src/utils/sampling.utils.ts","../src/metrics.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
|