hazo_logs 1.1.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +198 -4
- package/config/hazo_logs_config.ini.sample +2 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/alert-triggers.d.ts +54 -0
- package/dist/lib/alert-triggers.d.ts.map +1 -0
- package/dist/lib/alert-triggers.js +96 -0
- package/dist/lib/alert-triggers.js.map +1 -0
- package/dist/lib/config_loader.d.ts.map +1 -1
- package/dist/lib/config_loader.js +1 -7
- package/dist/lib/config_loader.js.map +1 -1
- package/dist/lib/console-logger.d.ts +17 -1
- package/dist/lib/console-logger.d.ts.map +1 -1
- package/dist/lib/console-logger.js +47 -4
- package/dist/lib/console-logger.js.map +1 -1
- package/dist/lib/context/log-context.d.ts.map +1 -1
- package/dist/lib/context/log-context.js +4 -0
- package/dist/lib/context/log-context.js.map +1 -1
- package/dist/lib/eslint_plugin/index.d.ts +109 -0
- package/dist/lib/eslint_plugin/index.d.ts.map +1 -0
- package/dist/lib/eslint_plugin/index.js +168 -0
- package/dist/lib/eslint_plugin/index.js.map +1 -0
- package/dist/lib/global-error-handlers.d.ts +23 -0
- package/dist/lib/global-error-handlers.d.ts.map +1 -0
- package/dist/lib/global-error-handlers.js +46 -0
- package/dist/lib/global-error-handlers.js.map +1 -0
- package/dist/lib/hazo_logger.d.ts +9 -0
- package/dist/lib/hazo_logger.d.ts.map +1 -1
- package/dist/lib/hazo_logger.js +32 -0
- package/dist/lib/hazo_logger.js.map +1 -1
- package/dist/lib/level_resolver.d.ts +26 -0
- package/dist/lib/level_resolver.d.ts.map +1 -0
- package/dist/lib/level_resolver.js +65 -0
- package/dist/lib/level_resolver.js.map +1 -0
- package/dist/lib/log-reader.d.ts.map +1 -1
- package/dist/lib/log-reader.js +6 -4
- package/dist/lib/log-reader.js.map +1 -1
- package/dist/lib/package_logger.d.ts +47 -3
- package/dist/lib/package_logger.d.ts.map +1 -1
- package/dist/lib/package_logger.js +196 -10
- package/dist/lib/package_logger.js.map +1 -1
- package/dist/lib/ring_buffer.d.ts +51 -0
- package/dist/lib/ring_buffer.d.ts.map +1 -0
- package/dist/lib/ring_buffer.js +107 -0
- package/dist/lib/ring_buffer.js.map +1 -0
- package/dist/lib/types.d.ts +57 -24
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/universal-logger.d.ts.map +1 -1
- package/dist/lib/universal-logger.js +18 -0
- package/dist/lib/universal-logger.js.map +1 -1
- package/dist/lib/utils/caller_info.d.ts +25 -1
- package/dist/lib/utils/caller_info.d.ts.map +1 -1
- package/dist/lib/utils/caller_info.js +62 -1
- package/dist/lib/utils/caller_info.js.map +1 -1
- package/dist/lib/with-error-handler.d.ts +19 -0
- package/dist/lib/with-error-handler.d.ts.map +1 -0
- package/dist/lib/with-error-handler.js +77 -0
- package/dist/lib/with-error-handler.js.map +1 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +7 -0
- package/dist/server.js.map +1 -1
- package/dist/ui/components/ErrorBoundary.d.ts +44 -0
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/ui/components/ErrorBoundary.js +57 -0
- package/dist/ui/components/ErrorBoundary.js.map +1 -0
- package/dist/ui/components/LogLevelBadge.d.ts.map +1 -1
- package/dist/ui/components/LogLevelBadge.js +1 -0
- package/dist/ui/components/LogLevelBadge.js.map +1 -1
- package/dist/ui/hooks/useErrorReporter.d.ts +16 -0
- package/dist/ui/hooks/useErrorReporter.d.ts.map +1 -0
- package/dist/ui/hooks/useErrorReporter.js +56 -0
- package/dist/ui/hooks/useErrorReporter.js.map +1 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -1
- package/package.json +19 -7
package/dist/lib/log-reader.js
CHANGED
|
@@ -7,10 +7,12 @@ import path from 'path';
|
|
|
7
7
|
import readline from 'readline';
|
|
8
8
|
import { loadConfig } from './config_loader.js';
|
|
9
9
|
const LEVEL_ORDER = {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
fatal: 0,
|
|
11
|
+
error: 1,
|
|
12
|
+
warn: 2,
|
|
13
|
+
info: 3,
|
|
14
|
+
debug: 4,
|
|
15
|
+
trace: 5,
|
|
14
16
|
};
|
|
15
17
|
/**
|
|
16
18
|
* Read logs from file with filtering, sorting, and pagination
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log-reader.js","sourceRoot":"","sources":["../../src/lib/log-reader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"log-reader.js","sourceRoot":"","sources":["../../src/lib/log-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* Creates loggers that tag all entries with a package name
|
|
4
4
|
*/
|
|
5
5
|
import { HazoLogger } from './hazo_logger.js';
|
|
6
|
-
import type { Logger, LogData, PackageLoggerOptions } from './types.js';
|
|
6
|
+
import type { Logger, LogData, PackageLoggerOptions, RingBufferEntry } from './types.js';
|
|
7
7
|
/**
|
|
8
|
-
* Logger implementation for a specific package
|
|
9
|
-
* Tags all log entries with the package name and captures caller info
|
|
8
|
+
* Logger implementation for a specific package.
|
|
9
|
+
* Tags all log entries with the package name and captures caller info.
|
|
10
10
|
*/
|
|
11
11
|
export declare class PackageLogger implements Logger {
|
|
12
12
|
private coreLogger;
|
|
@@ -17,11 +17,55 @@ export declare class PackageLogger implements Logger {
|
|
|
17
17
|
* Get the core logger, waiting if necessary
|
|
18
18
|
*/
|
|
19
19
|
private getCoreLogger;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a correlation ID. Prefers hazo_core's ALS-based correlationId
|
|
22
|
+
* (from globalThis.__hazo_core_context_store__) when available, falls back
|
|
23
|
+
* to hazo_logs' own context (reference ?? sessionId).
|
|
24
|
+
*/
|
|
25
|
+
private getCorrelationId;
|
|
20
26
|
private log;
|
|
27
|
+
fatal(message: string, data?: LogData): void;
|
|
21
28
|
error(message: string, data?: LogData): void;
|
|
22
29
|
warn(message: string, data?: LogData): void;
|
|
23
30
|
info(message: string, data?: LogData): void;
|
|
24
31
|
debug(message: string, data?: LogData): void;
|
|
32
|
+
trace(message: string, data?: LogData): void;
|
|
33
|
+
/**
|
|
34
|
+
* Emit only on state change. Tracks last state per `name` across the process lifetime.
|
|
35
|
+
*
|
|
36
|
+
* - First call: INFO "name: started (status=ok)"
|
|
37
|
+
* - Same status: silent
|
|
38
|
+
* - Status change: INFO (or WARN if new status matches failure pattern)
|
|
39
|
+
* "name: prev → curr (after N prev)"
|
|
40
|
+
*/
|
|
41
|
+
heartbeat(name: string, fields: {
|
|
42
|
+
status: string;
|
|
43
|
+
[key: string]: unknown;
|
|
44
|
+
}, opts?: {
|
|
45
|
+
trigger?: (prev: Record<string, unknown>, curr: Record<string, unknown>) => boolean;
|
|
46
|
+
}): void;
|
|
47
|
+
/**
|
|
48
|
+
* Emit with probability `opts.sample` (default: 0.1 = 10%).
|
|
49
|
+
* Appends "(sampled ~1/N)" to the message when emitted.
|
|
50
|
+
*/
|
|
51
|
+
sampled(level: 'trace' | 'debug' | 'info' | 'warn', msg: string, fields?: Record<string, unknown>, opts?: {
|
|
52
|
+
sample: number;
|
|
53
|
+
}): void;
|
|
54
|
+
/**
|
|
55
|
+
* Within a time window, collapse identical-keyed messages.
|
|
56
|
+
* First occurrence: emitted immediately as "msg (1× so far)"
|
|
57
|
+
* Subsequent in same window: counter incremented, silent
|
|
58
|
+
* At window end: if count > 1, emit "msg (×N over Xs)"; if count === 1, emit normally.
|
|
59
|
+
*/
|
|
60
|
+
dedupe(level: 'trace' | 'debug' | 'info' | 'warn', msg: string, fields?: Record<string, unknown>, opts?: {
|
|
61
|
+
window: string;
|
|
62
|
+
key?: string;
|
|
63
|
+
}): void;
|
|
64
|
+
/**
|
|
65
|
+
* Access the ring buffer for a given correlation ID.
|
|
66
|
+
* Returns the last n entries (default: all buffered entries).
|
|
67
|
+
*/
|
|
68
|
+
getRingBuffer(correlationId: string, n?: number): RingBufferEntry[];
|
|
25
69
|
}
|
|
26
70
|
/**
|
|
27
71
|
* Factory function to create a package-specific logger
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package_logger.d.ts","sourceRoot":"","sources":["../../src/lib/package_logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAY,oBAAoB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"package_logger.d.ts","sourceRoot":"","sources":["../../src/lib/package_logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAY,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAmDnG;;;GAGG;AACH,qBAAa,aAAc,YAAW,MAAM;IAC1C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,iBAAiB,CAAoC;IAC7D,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,oBAAoB,EAAE,UAAU,CAAC,EAAE,UAAU;IAalE;;OAEG;YACW,aAAa;IAQ3B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,GAAG;IAsEX,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI;IAM5C;;;;;;;OAOG;IACH,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAClD,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;KACrF,GACA,IAAI;IAkCP;;;OAGG;IACH,OAAO,CACL,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GACxB,IAAI;IAaP;;;;;OAKG;IACH,MAAM,CACJ,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,EAC1C,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GACtC,IAAI;IAgDP;;;OAGG;IACH,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;CAGpE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD"}
|
|
@@ -5,9 +5,33 @@
|
|
|
5
5
|
import { HazoLogger } from './hazo_logger.js';
|
|
6
6
|
import { getCallerInfo } from './utils/caller_info.js';
|
|
7
7
|
import { getLogContext } from './context/log-context.js';
|
|
8
|
+
import { ringBufferRegistry, getRingBuffer } from './ring_buffer.js';
|
|
9
|
+
const heartbeatStates = new Map();
|
|
10
|
+
const sampledCounters = new Map();
|
|
11
|
+
const dedupeStates = new Map();
|
|
12
|
+
// ─── Duration parser ─────────────────────────────────────────────────────────
|
|
8
13
|
/**
|
|
9
|
-
*
|
|
10
|
-
|
|
14
|
+
* Parse a duration string (e.g. '1m', '30s', '5m') to milliseconds.
|
|
15
|
+
*/
|
|
16
|
+
function parseDuration(window) {
|
|
17
|
+
const match = window.match(/^(\d+(?:\.\d+)?)(ms|s|m|h)$/);
|
|
18
|
+
if (!match)
|
|
19
|
+
return 60_000; // default 1 minute
|
|
20
|
+
const value = parseFloat(match[1]);
|
|
21
|
+
switch (match[2]) {
|
|
22
|
+
case 'ms': return value;
|
|
23
|
+
case 's': return value * 1_000;
|
|
24
|
+
case 'm': return value * 60_000;
|
|
25
|
+
case 'h': return value * 3_600_000;
|
|
26
|
+
default: return 60_000;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// ─── Failure status pattern ───────────────────────────────────────────────────
|
|
30
|
+
const FAILURE_STATUS_RE = /(fail|error|down|degraded)/i;
|
|
31
|
+
// ─── PackageLogger ────────────────────────────────────────────────────────────
|
|
32
|
+
/**
|
|
33
|
+
* Logger implementation for a specific package.
|
|
34
|
+
* Tags all log entries with the package name and captures caller info.
|
|
11
35
|
*/
|
|
12
36
|
export class PackageLogger {
|
|
13
37
|
coreLogger = null;
|
|
@@ -37,9 +61,41 @@ export class PackageLogger {
|
|
|
37
61
|
}
|
|
38
62
|
throw new Error('[hazo_logs] Core logger not initialized');
|
|
39
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolve a correlation ID. Prefers hazo_core's ALS-based correlationId
|
|
66
|
+
* (from globalThis.__hazo_core_context_store__) when available, falls back
|
|
67
|
+
* to hazo_logs' own context (reference ?? sessionId).
|
|
68
|
+
*/
|
|
69
|
+
getCorrelationId() {
|
|
70
|
+
// Prefer hazo_core's ALS correlationId when the context store is wired in
|
|
71
|
+
try {
|
|
72
|
+
const hazoCtx = globalThis['__hazo_core_context_store__'];
|
|
73
|
+
const coreId = hazoCtx?.getStore?.()?.correlationId;
|
|
74
|
+
if (coreId)
|
|
75
|
+
return coreId;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Context store not available — fall through
|
|
79
|
+
}
|
|
80
|
+
const ctx = getLogContext();
|
|
81
|
+
if (!ctx)
|
|
82
|
+
return null;
|
|
83
|
+
return ctx.reference ?? ctx.sessionId ?? null;
|
|
84
|
+
}
|
|
40
85
|
log(level, message, data) {
|
|
41
86
|
const { filename, line } = getCallerInfo();
|
|
42
87
|
const context = getLogContext();
|
|
88
|
+
const correlationId = this.getCorrelationId();
|
|
89
|
+
// Push TRACE and DEBUG entries into the ring buffer if we have a correlationId
|
|
90
|
+
if ((level === 'trace' || level === 'debug') && correlationId) {
|
|
91
|
+
const entry = {
|
|
92
|
+
level,
|
|
93
|
+
msg: message,
|
|
94
|
+
fields: data,
|
|
95
|
+
ts: new Date().toISOString(),
|
|
96
|
+
};
|
|
97
|
+
ringBufferRegistry.getOrCreate(correlationId).push(entry);
|
|
98
|
+
}
|
|
43
99
|
const logEntry = {
|
|
44
100
|
timestamp: new Date().toISOString(),
|
|
45
101
|
level,
|
|
@@ -47,28 +103,52 @@ export class PackageLogger {
|
|
|
47
103
|
message,
|
|
48
104
|
filename,
|
|
49
105
|
line,
|
|
50
|
-
executionId: '',
|
|
106
|
+
executionId: '',
|
|
107
|
+
...(correlationId ? { correlationId } : {}),
|
|
51
108
|
...(context?.sessionId ? { sessionId: context.sessionId } : {}),
|
|
52
109
|
...(context?.reference ? { reference: context.reference } : {}),
|
|
53
110
|
...(context?.depth ? { depth: context.depth } : {}),
|
|
111
|
+
...(context?.userId ? { userId: context.userId } : {}),
|
|
112
|
+
...(context?.scope ? { scope: context.scope } : {}),
|
|
54
113
|
...(data ? { data } : {}),
|
|
55
114
|
};
|
|
115
|
+
const emitEntry = (coreLogger) => {
|
|
116
|
+
logEntry.executionId = coreLogger.getExecutionId();
|
|
117
|
+
coreLogger.log(logEntry);
|
|
118
|
+
// On ERROR: dump the ring buffer for this correlation ID
|
|
119
|
+
if (level === 'error' && correlationId) {
|
|
120
|
+
const buffered = getRingBuffer(correlationId);
|
|
121
|
+
for (const entry of buffered) {
|
|
122
|
+
coreLogger.log({
|
|
123
|
+
timestamp: entry.ts,
|
|
124
|
+
level: entry.level,
|
|
125
|
+
package: this.packageName,
|
|
126
|
+
message: ` ↓ context: ${entry.msg}`,
|
|
127
|
+
filename,
|
|
128
|
+
line,
|
|
129
|
+
executionId: coreLogger.getExecutionId(),
|
|
130
|
+
...(context?.sessionId ? { sessionId: context.sessionId } : {}),
|
|
131
|
+
...(context?.reference ? { reference: context.reference } : {}),
|
|
132
|
+
...(entry.fields ? { data: entry.fields } : {}),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
};
|
|
56
137
|
if (this.coreLogger) {
|
|
57
|
-
|
|
58
|
-
logEntry.executionId = this.coreLogger.getExecutionId();
|
|
59
|
-
this.coreLogger.log(logEntry);
|
|
138
|
+
emitEntry(this.coreLogger);
|
|
60
139
|
}
|
|
61
140
|
else {
|
|
62
|
-
// Core logger is still initializing, queue the log
|
|
63
141
|
this.getCoreLogger().then((logger) => {
|
|
64
|
-
|
|
65
|
-
logger.log(logEntry);
|
|
142
|
+
emitEntry(logger);
|
|
66
143
|
}).catch(() => {
|
|
67
|
-
// Fallback to console if core logger fails to initialize
|
|
68
144
|
console.error(`[${this.packageName}] ${message}`, data);
|
|
69
145
|
});
|
|
70
146
|
}
|
|
71
147
|
}
|
|
148
|
+
// ─── Level methods ──────────────────────────────────────────────────────────
|
|
149
|
+
fatal(message, data) {
|
|
150
|
+
this.log('fatal', message, data);
|
|
151
|
+
}
|
|
72
152
|
error(message, data) {
|
|
73
153
|
this.log('error', message, data);
|
|
74
154
|
}
|
|
@@ -81,6 +161,112 @@ export class PackageLogger {
|
|
|
81
161
|
debug(message, data) {
|
|
82
162
|
this.log('debug', message, data);
|
|
83
163
|
}
|
|
164
|
+
trace(message, data) {
|
|
165
|
+
this.log('trace', message, data);
|
|
166
|
+
}
|
|
167
|
+
// ─── Smart helpers ──────────────────────────────────────────────────────────
|
|
168
|
+
/**
|
|
169
|
+
* Emit only on state change. Tracks last state per `name` across the process lifetime.
|
|
170
|
+
*
|
|
171
|
+
* - First call: INFO "name: started (status=ok)"
|
|
172
|
+
* - Same status: silent
|
|
173
|
+
* - Status change: INFO (or WARN if new status matches failure pattern)
|
|
174
|
+
* "name: prev → curr (after N prev)"
|
|
175
|
+
*/
|
|
176
|
+
heartbeat(name, fields, opts) {
|
|
177
|
+
const prev = heartbeatStates.get(name);
|
|
178
|
+
if (!prev) {
|
|
179
|
+
// First call ever
|
|
180
|
+
heartbeatStates.set(name, { fields: { ...fields }, count: 1 });
|
|
181
|
+
this.log('info', `${name}: started (status=${fields.status})`, fields);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Determine if a state change occurred
|
|
185
|
+
const changed = opts?.trigger
|
|
186
|
+
? opts.trigger(prev.fields, fields)
|
|
187
|
+
: prev.fields['status'] !== fields['status'];
|
|
188
|
+
if (!changed) {
|
|
189
|
+
// Same state — silent, just increment counter
|
|
190
|
+
heartbeatStates.set(name, { fields: prev.fields, count: prev.count + 1 });
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// State change
|
|
194
|
+
const prevStatus = prev.fields['status'];
|
|
195
|
+
const currStatus = fields['status'];
|
|
196
|
+
const count = prev.count;
|
|
197
|
+
heartbeatStates.set(name, { fields: { ...fields }, count: 1 });
|
|
198
|
+
const level = FAILURE_STATUS_RE.test(currStatus) ? 'warn' : 'info';
|
|
199
|
+
const msg = `${name}: ${prevStatus} → ${currStatus} (after ${count} ${prevStatus})`;
|
|
200
|
+
this.log(level, msg, { prev: prev.fields, curr: fields });
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Emit with probability `opts.sample` (default: 0.1 = 10%).
|
|
204
|
+
* Appends "(sampled ~1/N)" to the message when emitted.
|
|
205
|
+
*/
|
|
206
|
+
sampled(level, msg, fields, opts) {
|
|
207
|
+
const sample = opts?.sample ?? 0.1;
|
|
208
|
+
// Track call count for informational purposes
|
|
209
|
+
const count = (sampledCounters.get(msg) ?? 0) + 1;
|
|
210
|
+
sampledCounters.set(msg, count);
|
|
211
|
+
if (Math.random() < sample) {
|
|
212
|
+
const sampleLabel = `(sampled ~1/${Math.round(1 / sample)})`;
|
|
213
|
+
this.log(level, `${msg} ${sampleLabel}`, fields);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Within a time window, collapse identical-keyed messages.
|
|
218
|
+
* First occurrence: emitted immediately as "msg (1× so far)"
|
|
219
|
+
* Subsequent in same window: counter incremented, silent
|
|
220
|
+
* At window end: if count > 1, emit "msg (×N over Xs)"; if count === 1, emit normally.
|
|
221
|
+
*/
|
|
222
|
+
dedupe(level, msg, fields, opts) {
|
|
223
|
+
const windowStr = opts?.window ?? '1m';
|
|
224
|
+
const key = opts?.key ?? msg;
|
|
225
|
+
const windowMs = parseDuration(windowStr);
|
|
226
|
+
const existing = dedupeStates.get(key);
|
|
227
|
+
const now = Date.now();
|
|
228
|
+
if (!existing || now >= existing.windowEnd) {
|
|
229
|
+
// New window — clear any old timer, emit immediately as "(1× so far)"
|
|
230
|
+
if (existing?.timer) {
|
|
231
|
+
clearTimeout(existing.timer);
|
|
232
|
+
}
|
|
233
|
+
const windowEnd = now + windowMs;
|
|
234
|
+
const state = {
|
|
235
|
+
count: 1,
|
|
236
|
+
firstTs: now,
|
|
237
|
+
windowEnd,
|
|
238
|
+
timer: null,
|
|
239
|
+
prevFields: fields,
|
|
240
|
+
};
|
|
241
|
+
// Schedule flush at window end
|
|
242
|
+
state.timer = setTimeout(() => {
|
|
243
|
+
const s = dedupeStates.get(key);
|
|
244
|
+
if (!s)
|
|
245
|
+
return;
|
|
246
|
+
if (s.count > 1) {
|
|
247
|
+
const durationSec = Math.round((Date.now() - s.firstTs) / 1000);
|
|
248
|
+
this.log(level, `${msg} (×${s.count} over ${durationSec}s)`, s.prevFields);
|
|
249
|
+
}
|
|
250
|
+
// If count === 1, already emitted on first occurrence — no flush needed
|
|
251
|
+
dedupeStates.delete(key);
|
|
252
|
+
}, windowMs);
|
|
253
|
+
dedupeStates.set(key, state);
|
|
254
|
+
this.log(level, `${msg} (1× so far)`, fields);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// Same window — silent, increment counter and update prevFields
|
|
258
|
+
existing.count++;
|
|
259
|
+
existing.prevFields = fields;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// ─── Ring buffer access ─────────────────────────────────────────────────────
|
|
263
|
+
/**
|
|
264
|
+
* Access the ring buffer for a given correlation ID.
|
|
265
|
+
* Returns the last n entries (default: all buffered entries).
|
|
266
|
+
*/
|
|
267
|
+
getRingBuffer(correlationId, n) {
|
|
268
|
+
return getRingBuffer(correlationId, n);
|
|
269
|
+
}
|
|
84
270
|
}
|
|
85
271
|
/**
|
|
86
272
|
* Factory function to create a package-specific logger
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package_logger.js","sourceRoot":"","sources":["../../src/lib/package_logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"package_logger.js","sourceRoot":"","sources":["../../src/lib/package_logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RingBuffer — per-correlation-ID in-memory circular buffer for TRACE/DEBUG entries.
|
|
3
|
+
*
|
|
4
|
+
* Design constraints (from design spec §2.4):
|
|
5
|
+
* - 200 entries per buffer
|
|
6
|
+
* - Max 100 active correlation IDs (LRU eviction)
|
|
7
|
+
* - Memory ceiling: ~100 × 200 × 500B = 10 MB
|
|
8
|
+
*
|
|
9
|
+
* When an ERROR is emitted, the buffer for the current correlation ID is dumped
|
|
10
|
+
* alongside the error so the full request lead-up is visible in a single log group.
|
|
11
|
+
*/
|
|
12
|
+
import type { LogLevel } from './types.js';
|
|
13
|
+
export interface RingBufferEntry {
|
|
14
|
+
level: LogLevel;
|
|
15
|
+
msg: string;
|
|
16
|
+
fields?: Record<string, unknown>;
|
|
17
|
+
ts: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class RingBuffer {
|
|
20
|
+
private readonly capacity;
|
|
21
|
+
private readonly buf;
|
|
22
|
+
private head;
|
|
23
|
+
private count;
|
|
24
|
+
constructor(capacity?: number);
|
|
25
|
+
push(entry: RingBufferEntry): void;
|
|
26
|
+
/**
|
|
27
|
+
* Returns the last `n` entries (default: all).
|
|
28
|
+
* Returned in chronological order (oldest first).
|
|
29
|
+
*/
|
|
30
|
+
dump(n?: number): RingBufferEntry[];
|
|
31
|
+
clear(): void;
|
|
32
|
+
get size(): number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Global per-correlationId ring buffer registry.
|
|
36
|
+
* LRU: max 100 active correlation IDs.
|
|
37
|
+
*/
|
|
38
|
+
export declare class RingBufferRegistry {
|
|
39
|
+
private readonly buffers;
|
|
40
|
+
private readonly MAX_BUFFERS;
|
|
41
|
+
getOrCreate(correlationId: string): RingBuffer;
|
|
42
|
+
get(correlationId: string): RingBuffer | undefined;
|
|
43
|
+
evictLRU(): void;
|
|
44
|
+
}
|
|
45
|
+
export declare const ringBufferRegistry: RingBufferRegistry;
|
|
46
|
+
/**
|
|
47
|
+
* Public API used by hazo_ui/test-harness and hazo_core.
|
|
48
|
+
* Returns the last `n` entries for the given correlationId (empty array if none).
|
|
49
|
+
*/
|
|
50
|
+
export declare function getRingBuffer(correlationId: string, n?: number): RingBufferEntry[];
|
|
51
|
+
//# sourceMappingURL=ring_buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring_buffer.d.ts","sourceRoot":"","sources":["../../src/lib/ring_buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,QAAQ,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAID,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqC;IACzD,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,KAAK,CAAK;gBAEW,QAAQ,SAAM;IAI3C,IAAI,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAMlC;;;OAGG;IACH,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE;IAenC,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAID;;;GAGG;AACH,qBAAa,kBAAkB;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IAEnC,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU;IAkB9C,GAAG,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAUlD,QAAQ,IAAI,IAAI;CAOjB;AAID,eAAO,MAAM,kBAAkB,oBAA2B,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,aAAa,EAAE,MAAM,EACrB,CAAC,CAAC,EAAE,MAAM,GACT,eAAe,EAAE,CAInB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RingBuffer — per-correlation-ID in-memory circular buffer for TRACE/DEBUG entries.
|
|
3
|
+
*
|
|
4
|
+
* Design constraints (from design spec §2.4):
|
|
5
|
+
* - 200 entries per buffer
|
|
6
|
+
* - Max 100 active correlation IDs (LRU eviction)
|
|
7
|
+
* - Memory ceiling: ~100 × 200 × 500B = 10 MB
|
|
8
|
+
*
|
|
9
|
+
* When an ERROR is emitted, the buffer for the current correlation ID is dumped
|
|
10
|
+
* alongside the error so the full request lead-up is visible in a single log group.
|
|
11
|
+
*/
|
|
12
|
+
// ─── RingBuffer ──────────────────────────────────────────────────────────────
|
|
13
|
+
export class RingBuffer {
|
|
14
|
+
capacity;
|
|
15
|
+
buf;
|
|
16
|
+
head = 0; // next write index
|
|
17
|
+
count = 0; // total written (capped at capacity)
|
|
18
|
+
constructor(capacity = 200) {
|
|
19
|
+
this.capacity = capacity;
|
|
20
|
+
this.buf = new Array(capacity);
|
|
21
|
+
}
|
|
22
|
+
push(entry) {
|
|
23
|
+
this.buf[this.head] = entry;
|
|
24
|
+
this.head = (this.head + 1) % this.capacity;
|
|
25
|
+
if (this.count < this.capacity)
|
|
26
|
+
this.count++;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the last `n` entries (default: all).
|
|
30
|
+
* Returned in chronological order (oldest first).
|
|
31
|
+
*/
|
|
32
|
+
dump(n) {
|
|
33
|
+
const take = Math.min(n ?? this.count, this.count);
|
|
34
|
+
const result = [];
|
|
35
|
+
// Walk backwards from head to collect `take` entries, then reverse.
|
|
36
|
+
let idx = (this.head - 1 + this.capacity) % this.capacity;
|
|
37
|
+
for (let i = 0; i < take; i++) {
|
|
38
|
+
const entry = this.buf[idx];
|
|
39
|
+
if (entry !== undefined)
|
|
40
|
+
result.push(entry);
|
|
41
|
+
idx = (idx - 1 + this.capacity) % this.capacity;
|
|
42
|
+
}
|
|
43
|
+
return result.reverse();
|
|
44
|
+
}
|
|
45
|
+
clear() {
|
|
46
|
+
this.buf.fill(undefined);
|
|
47
|
+
this.head = 0;
|
|
48
|
+
this.count = 0;
|
|
49
|
+
}
|
|
50
|
+
get size() {
|
|
51
|
+
return this.count;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ─── RingBufferRegistry ──────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Global per-correlationId ring buffer registry.
|
|
57
|
+
* LRU: max 100 active correlation IDs.
|
|
58
|
+
*/
|
|
59
|
+
export class RingBufferRegistry {
|
|
60
|
+
// Map preserves insertion order; we move-to-end on access (LRU).
|
|
61
|
+
buffers = new Map();
|
|
62
|
+
MAX_BUFFERS = 100;
|
|
63
|
+
getOrCreate(correlationId) {
|
|
64
|
+
const existing = this.buffers.get(correlationId);
|
|
65
|
+
if (existing) {
|
|
66
|
+
// Move to end (most-recently-used)
|
|
67
|
+
this.buffers.delete(correlationId);
|
|
68
|
+
this.buffers.set(correlationId, existing);
|
|
69
|
+
return existing;
|
|
70
|
+
}
|
|
71
|
+
if (this.buffers.size >= this.MAX_BUFFERS) {
|
|
72
|
+
this.evictLRU();
|
|
73
|
+
}
|
|
74
|
+
const buf = new RingBuffer();
|
|
75
|
+
this.buffers.set(correlationId, buf);
|
|
76
|
+
return buf;
|
|
77
|
+
}
|
|
78
|
+
get(correlationId) {
|
|
79
|
+
const buf = this.buffers.get(correlationId);
|
|
80
|
+
if (buf) {
|
|
81
|
+
// Move to end on read access
|
|
82
|
+
this.buffers.delete(correlationId);
|
|
83
|
+
this.buffers.set(correlationId, buf);
|
|
84
|
+
}
|
|
85
|
+
return buf;
|
|
86
|
+
}
|
|
87
|
+
evictLRU() {
|
|
88
|
+
// The first key in the Map is the least-recently-used
|
|
89
|
+
const firstKey = this.buffers.keys().next().value;
|
|
90
|
+
if (firstKey !== undefined) {
|
|
91
|
+
this.buffers.delete(firstKey);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// ─── Singleton ───────────────────────────────────────────────────────────────
|
|
96
|
+
export const ringBufferRegistry = new RingBufferRegistry();
|
|
97
|
+
/**
|
|
98
|
+
* Public API used by hazo_ui/test-harness and hazo_core.
|
|
99
|
+
* Returns the last `n` entries for the given correlationId (empty array if none).
|
|
100
|
+
*/
|
|
101
|
+
export function getRingBuffer(correlationId, n) {
|
|
102
|
+
const buf = ringBufferRegistry.get(correlationId);
|
|
103
|
+
if (!buf)
|
|
104
|
+
return [];
|
|
105
|
+
return buf.dump(n);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=ring_buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring_buffer.js","sourceRoot":"","sources":["../../src/lib/ring_buffer.ts"],"names":[],"mappings":"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"}
|