@spinajs/log-common 2.0.481 → 2.0.484
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 +125 -4
- package/lib/cjs/BatchQueue.d.ts +127 -0
- package/lib/cjs/BatchQueue.d.ts.map +1 -0
- package/lib/cjs/BatchQueue.js +126 -0
- package/lib/cjs/BatchQueue.js.map +1 -0
- package/lib/cjs/filters/filter.d.ts +27 -0
- package/lib/cjs/filters/filter.d.ts.map +1 -0
- package/lib/cjs/filters/filter.js +20 -0
- package/lib/cjs/filters/filter.js.map +1 -0
- package/lib/cjs/filters/whenRepeated.d.ts +52 -0
- package/lib/cjs/filters/whenRepeated.d.ts.map +1 -0
- package/lib/cjs/filters/whenRepeated.js +98 -0
- package/lib/cjs/filters/whenRepeated.js.map +1 -0
- package/lib/cjs/format.d.ts +20 -0
- package/lib/cjs/format.d.ts.map +1 -0
- package/lib/cjs/format.js +75 -0
- package/lib/cjs/format.js.map +1 -0
- package/lib/cjs/index.d.ts +260 -21
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +211 -34
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/perf.d.ts +109 -0
- package/lib/cjs/perf.d.ts.map +1 -0
- package/lib/cjs/perf.js +162 -0
- package/lib/cjs/perf.js.map +1 -0
- package/lib/cjs/persistence.d.ts +19 -0
- package/lib/cjs/persistence.d.ts.map +1 -0
- package/lib/cjs/persistence.js +137 -0
- package/lib/cjs/persistence.js.map +1 -0
- package/lib/cjs/serializers.d.ts +77 -0
- package/lib/cjs/serializers.d.ts.map +1 -0
- package/lib/cjs/serializers.js +215 -0
- package/lib/cjs/serializers.js.map +1 -0
- package/lib/mjs/BatchQueue.d.ts +127 -0
- package/lib/mjs/BatchQueue.d.ts.map +1 -0
- package/lib/mjs/BatchQueue.js +122 -0
- package/lib/mjs/BatchQueue.js.map +1 -0
- package/lib/mjs/filters/filter.d.ts +27 -0
- package/lib/mjs/filters/filter.d.ts.map +1 -0
- package/lib/mjs/filters/filter.js +16 -0
- package/lib/mjs/filters/filter.js.map +1 -0
- package/lib/mjs/filters/whenRepeated.d.ts +52 -0
- package/lib/mjs/filters/whenRepeated.d.ts.map +1 -0
- package/lib/mjs/filters/whenRepeated.js +95 -0
- package/lib/mjs/filters/whenRepeated.js.map +1 -0
- package/lib/mjs/format.d.ts +20 -0
- package/lib/mjs/format.d.ts.map +1 -0
- package/lib/mjs/format.js +72 -0
- package/lib/mjs/format.js.map +1 -0
- package/lib/mjs/index.d.ts +260 -21
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +205 -11
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/perf.d.ts +109 -0
- package/lib/mjs/perf.d.ts.map +1 -0
- package/lib/mjs/perf.js +157 -0
- package/lib/mjs/perf.js.map +1 -0
- package/lib/mjs/persistence.d.ts +19 -0
- package/lib/mjs/persistence.d.ts.map +1 -0
- package/lib/mjs/persistence.js +132 -0
- package/lib/mjs/persistence.js.map +1 -0
- package/lib/mjs/serializers.d.ts +77 -0
- package/lib/mjs/serializers.d.ts.map +1 -0
- package/lib/mjs/serializers.js +208 -0
- package/lib/mjs/serializers.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +8 -9
package/lib/cjs/index.js
CHANGED
|
@@ -10,34 +10,15 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
10
10
|
if (k2 === undefined) k2 = k;
|
|
11
11
|
o[k2] = m[k];
|
|
12
12
|
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
13
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
14
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
15
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
16
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
17
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
18
|
};
|
|
24
|
-
var
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
19
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
20
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
|
+
};
|
|
41
22
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
23
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
24
|
};
|
|
@@ -45,12 +26,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
45
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
27
|
};
|
|
47
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
-
exports.Log = exports.LogTarget = exports.LogLevelStrings = exports.StrToLogLevel = exports.LogLevel = void 0;
|
|
29
|
+
exports.Log = exports.LogTarget = exports.LogLevelToSeverityNumber = exports.LogLevelStrings = exports.SILENT_LEVEL = exports.StrToLogLevel = exports.LogLevel = void 0;
|
|
30
|
+
exports.normalizeLevel = normalizeLevel;
|
|
49
31
|
exports.createLogMessageObject = createLogMessageObject;
|
|
50
32
|
exports.Logger = Logger;
|
|
33
|
+
exports.setLogContextProvider = setLogContextProvider;
|
|
51
34
|
const di_1 = require("@spinajs/di");
|
|
52
35
|
const lodash_1 = __importDefault(require("lodash"));
|
|
53
|
-
const
|
|
36
|
+
const format_js_1 = require("./format.js");
|
|
37
|
+
const serializers_js_1 = require("./serializers.js");
|
|
38
|
+
const persistence_js_1 = require("./persistence.js");
|
|
39
|
+
__exportStar(require("./serializers.js"), exports);
|
|
40
|
+
__exportStar(require("./filters/filter.js"), exports);
|
|
41
|
+
__exportStar(require("./filters/whenRepeated.js"), exports);
|
|
42
|
+
__exportStar(require("./BatchQueue.js"), exports);
|
|
43
|
+
__exportStar(require("./persistence.js"), exports);
|
|
44
|
+
__exportStar(require("./perf.js"), exports);
|
|
54
45
|
var LogLevel;
|
|
55
46
|
(function (LogLevel) {
|
|
56
47
|
LogLevel[LogLevel["Security"] = 999] = "Security";
|
|
@@ -72,6 +63,29 @@ exports.StrToLogLevel = {
|
|
|
72
63
|
fatal: LogLevel.Fatal,
|
|
73
64
|
security: LogLevel.Security,
|
|
74
65
|
};
|
|
66
|
+
/**
|
|
67
|
+
* Sentinel level sitting one ABOVE {@link LogLevel.Security} ( SpinaJS's highest
|
|
68
|
+
* real level ). Used by `Log.disableAll()` as the runtime override so even a
|
|
69
|
+
* `security()` call is gated out - `isEnabled` compares numerically, so nothing
|
|
70
|
+
* ever reaches it.
|
|
71
|
+
*/
|
|
72
|
+
exports.SILENT_LEVEL = LogLevel.Security + 1;
|
|
73
|
+
/**
|
|
74
|
+
* Normalises a level given either as a {@link LogLevel} number or a level name
|
|
75
|
+
* ( "trace" | "debug" | ... ) to its numeric value. Single validation choke
|
|
76
|
+
* point: an unknown name throws a clear error. Numbers pass straight through
|
|
77
|
+
* ( so {@link SILENT_LEVEL } and other synthetic values are accepted ).
|
|
78
|
+
*/
|
|
79
|
+
function normalizeLevel(level) {
|
|
80
|
+
if (typeof level === "number") {
|
|
81
|
+
return level;
|
|
82
|
+
}
|
|
83
|
+
const resolved = exports.StrToLogLevel[level];
|
|
84
|
+
if (resolved === undefined) {
|
|
85
|
+
throw new Error(`Invalid log level: ${level}`);
|
|
86
|
+
}
|
|
87
|
+
return resolved;
|
|
88
|
+
}
|
|
75
89
|
exports.LogLevelStrings = {
|
|
76
90
|
[LogLevel.Debug]: "debug",
|
|
77
91
|
[LogLevel.Error]: "error",
|
|
@@ -82,11 +96,37 @@ exports.LogLevelStrings = {
|
|
|
82
96
|
[LogLevel.Trace]: "trace",
|
|
83
97
|
[LogLevel.Warn]: "warn",
|
|
84
98
|
};
|
|
99
|
+
/**
|
|
100
|
+
* Maps SpinaJS log levels onto the OpenTelemetry SeverityNumber scale ( 1..24 ),
|
|
101
|
+
* so structured logs can be severity-ranked/filtered by any OTel-aware backend
|
|
102
|
+
* ( Grafana, Datadog, Elastic, OTLP pipelines ). Anchored on the OTel bands:
|
|
103
|
+
* TRACE 1-4, DEBUG 5-8, INFO 9-12, WARN 13-16, ERROR 17-20, FATAL 21-24.
|
|
104
|
+
* Success sits in the INFO band ( above plain info ); Security is mapped to the
|
|
105
|
+
* top of the FATAL band as SpinaJS's highest severity.
|
|
106
|
+
*/
|
|
107
|
+
exports.LogLevelToSeverityNumber = {
|
|
108
|
+
[LogLevel.Trace]: 1,
|
|
109
|
+
[LogLevel.Debug]: 5,
|
|
110
|
+
[LogLevel.Info]: 9,
|
|
111
|
+
[LogLevel.Success]: 11,
|
|
112
|
+
[LogLevel.Warn]: 13,
|
|
113
|
+
[LogLevel.Error]: 17,
|
|
114
|
+
[LogLevel.Fatal]: 21,
|
|
115
|
+
[LogLevel.Security]: 23,
|
|
116
|
+
};
|
|
85
117
|
class LogTarget extends di_1.SyncService {
|
|
86
118
|
constructor(options) {
|
|
87
119
|
super();
|
|
88
120
|
this.HasError = false;
|
|
89
121
|
this.Error = null;
|
|
122
|
+
/**
|
|
123
|
+
* Drop-hook. Set by a wrapper ( eg. {@link FallbackGroupTarget} ) to receive
|
|
124
|
+
* entries this target GAVE UP on ( buffer overflow or a non-retryable delivery
|
|
125
|
+
* failure ), so a durable fallback can catch EXACTLY what was not delivered —
|
|
126
|
+
* no duplicates. `null` ( the default ) means nobody is listening and dropped
|
|
127
|
+
* entries are simply discarded, as before.
|
|
128
|
+
*/
|
|
129
|
+
this.OnDropped = null;
|
|
90
130
|
if (options) {
|
|
91
131
|
this.Options = lodash_1.default.merge(lodash_1.default.merge(this.Options, {
|
|
92
132
|
enabled: true,
|
|
@@ -100,21 +140,41 @@ class LogTarget extends di_1.SyncService {
|
|
|
100
140
|
};
|
|
101
141
|
}
|
|
102
142
|
}
|
|
143
|
+
/** Flush any buffered entries to the underlying sink. Default no-op; buffered targets override. */
|
|
144
|
+
forceFlush() {
|
|
145
|
+
return Promise.resolve();
|
|
146
|
+
}
|
|
103
147
|
}
|
|
104
148
|
exports.LogTarget = LogTarget;
|
|
105
149
|
function createLogMessageObject(err, message, level, logger, variables, ...args) {
|
|
106
|
-
|
|
107
|
-
|
|
150
|
+
// `log.error(err)` ( no message ) is a legal overload, and it used to render
|
|
151
|
+
// an EMPTY `${message}`. Fall back to the error's own message so a bare
|
|
152
|
+
// error-only call still says something.
|
|
153
|
+
const sMsg = err instanceof Error ? (message ?? err.message) : !err ? message : err;
|
|
154
|
+
const tMsg = args.length !== 0 ? (0, format_js_1.format)(sMsg, ...args) : sMsg;
|
|
108
155
|
const lName = logger ?? message;
|
|
156
|
+
// Ambient async-context fields ( lowest precedence, must never throw ). The
|
|
157
|
+
// computed core fields below and any explicit per-call / logger `variables`
|
|
158
|
+
// OVERRIDE these — ambient context only FILLS IN fields nobody else set.
|
|
159
|
+
let ctx = {};
|
|
160
|
+
try {
|
|
161
|
+
ctx = logContextProvider() ?? {};
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
ctx = {};
|
|
165
|
+
}
|
|
166
|
+
const theVars = {
|
|
167
|
+
...ctx,
|
|
168
|
+
error: err instanceof Error ? err : undefined,
|
|
169
|
+
level: exports.LogLevelStrings[`${level}`].toUpperCase(),
|
|
170
|
+
logger: lName,
|
|
171
|
+
message: tMsg,
|
|
172
|
+
...variables,
|
|
173
|
+
};
|
|
174
|
+
(0, serializers_js_1.applySerializers)(theVars);
|
|
109
175
|
return {
|
|
110
176
|
Level: level,
|
|
111
|
-
Variables:
|
|
112
|
-
error: err instanceof Error ? err : undefined,
|
|
113
|
-
level: exports.LogLevelStrings[`${level}`].toUpperCase(),
|
|
114
|
-
logger: lName,
|
|
115
|
-
message: tMsg,
|
|
116
|
-
...variables,
|
|
117
|
-
},
|
|
177
|
+
Variables: theVars,
|
|
118
178
|
};
|
|
119
179
|
}
|
|
120
180
|
class Log extends di_1.SyncService {
|
|
@@ -122,9 +182,87 @@ class Log extends di_1.SyncService {
|
|
|
122
182
|
super(...arguments);
|
|
123
183
|
this.Timers = new Map();
|
|
124
184
|
this.Variables = {};
|
|
185
|
+
/**
|
|
186
|
+
* Lowest level any of this logger's targets accepts ( the MIN across its
|
|
187
|
+
* matched rules ). Set by FrameworkLogger.resolve(); default Trace = allow
|
|
188
|
+
* all. A call below this level would be dropped by every target anyway, so the
|
|
189
|
+
* per-method guard can safely short-circuit on it.
|
|
190
|
+
*/
|
|
191
|
+
this.MinLevel = LogLevel.Trace;
|
|
192
|
+
/**
|
|
193
|
+
* Runtime level override ( loglevel-style ). `null` means "no override, use
|
|
194
|
+
* MinLevel". Set via setLevel/enableAll/disableAll, cleared via resetLevel.
|
|
195
|
+
*/
|
|
196
|
+
this.LevelOverride = null;
|
|
197
|
+
}
|
|
198
|
+
/** Effective minimum level: the runtime override if set, otherwise MinLevel. */
|
|
199
|
+
getLevel() {
|
|
200
|
+
return this.LevelOverride ?? this.MinLevel;
|
|
201
|
+
}
|
|
202
|
+
/** True when a call at `level` should be emitted given the effective level. */
|
|
203
|
+
isEnabled(level) {
|
|
204
|
+
return level >= this.getLevel();
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Set a runtime level override. Accepts a {@link LogLevel} or a level name.
|
|
208
|
+
* When `persist` ( default true ) the choice is stored so it survives a
|
|
209
|
+
* browser reload ( no-op on Node ).
|
|
210
|
+
*/
|
|
211
|
+
setLevel(level, persist = true) {
|
|
212
|
+
this.LevelOverride = normalizeLevel(level);
|
|
213
|
+
if (persist) {
|
|
214
|
+
(0, persistence_js_1.persistLevel)(this.Name, this.LevelOverride);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Set the override ONLY if nothing is currently applied ( loglevel semantics:
|
|
219
|
+
* a default must never clobber a user's explicit / persisted choice ). Never
|
|
220
|
+
* persists.
|
|
221
|
+
*/
|
|
222
|
+
setDefaultLevel(level) {
|
|
223
|
+
if (this.LevelOverride === null) {
|
|
224
|
+
this.LevelOverride = normalizeLevel(level);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/** Drop the runtime override ( back to MinLevel ) and clear any persisted value. */
|
|
228
|
+
resetLevel() {
|
|
229
|
+
this.LevelOverride = null;
|
|
230
|
+
(0, persistence_js_1.clearPersistedLevel)(this.Name);
|
|
231
|
+
}
|
|
232
|
+
/** Enable every level ( Trace and up ). */
|
|
233
|
+
enableAll(persist = true) {
|
|
234
|
+
this.setLevel(LogLevel.Trace, persist);
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Disable every level - even {@link LogLevel.Security} - by raising the
|
|
238
|
+
* override to {@link SILENT_LEVEL} ( one above Security ).
|
|
239
|
+
*/
|
|
240
|
+
disableAll(persist = true) {
|
|
241
|
+
this.setLevel(exports.SILENT_LEVEL, persist);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Force-drain THIS logger's targets' buffers ( eg. File / Loki / OTLP batch
|
|
245
|
+
* queues ) so buffered entries are written out. Does NOT close / dispose the
|
|
246
|
+
* target - handle & timer teardown remains the DI container's job. Calling
|
|
247
|
+
* `forceFlush()` on a non-buffered target is a harmless no-op. Guarded so a
|
|
248
|
+
* logger that failed to resolve ( no `Targets` ) is a safe no-op.
|
|
249
|
+
*/
|
|
250
|
+
flush() {
|
|
251
|
+
if (!this.Targets || this.Targets.length === 0) {
|
|
252
|
+
return Promise.resolve();
|
|
253
|
+
}
|
|
254
|
+
return Promise.allSettled(this.Targets.map((t) => t.instance.forceFlush())).then(() => undefined);
|
|
255
|
+
}
|
|
256
|
+
/** Flush every registered logger ( best-effort; never rejects ). */
|
|
257
|
+
static flushAll() {
|
|
258
|
+
return Promise.allSettled([...Log.Loggers.values()].map((l) => l.flush())).then(() => undefined);
|
|
125
259
|
}
|
|
126
260
|
static clearLoggers() {
|
|
127
|
-
|
|
261
|
+
// Flush buffered entries out BEFORE tearing loggers down so File / Loki /
|
|
262
|
+
// OTLP data is not lost when teardown does not go through DI container
|
|
263
|
+
// disposal of the target singletons.
|
|
264
|
+
return Log.flushAll()
|
|
265
|
+
.then(() => Promise.all([...Log.Loggers.values()].map((l) => l.dispose())))
|
|
128
266
|
.then(() => {
|
|
129
267
|
Log.Loggers.clear();
|
|
130
268
|
})
|
|
@@ -161,6 +299,28 @@ class Log extends di_1.SyncService {
|
|
|
161
299
|
this,
|
|
162
300
|
]);
|
|
163
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* Attach a sink to THIS logger AT RUNTIME ( bunyan `addStream` style ),
|
|
304
|
+
* without going through config. Returns the resolved target instance, or
|
|
305
|
+
* `undefined` when nothing was attached ( eg. `def.enabled === false` ).
|
|
306
|
+
*
|
|
307
|
+
* Default is a safe no-op ( returns `undefined` ) so `Log`-typed references
|
|
308
|
+
* and bootstrap proxies compile; {@link FrameworkLogger } overrides it with
|
|
309
|
+
* the real target-descriptor build + gate recompute.
|
|
310
|
+
*/
|
|
311
|
+
addTarget(_def, _opts) {
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Detach a runtime sink by its target `name`, flushing its buffered entries
|
|
316
|
+
* first ( it is NOT disposed - the instance may be DI-owned / shared ).
|
|
317
|
+
* No-op when no target with that name is attached.
|
|
318
|
+
*
|
|
319
|
+
* Default resolves immediately; {@link FrameworkLogger } overrides it.
|
|
320
|
+
*/
|
|
321
|
+
removeTarget(_name) {
|
|
322
|
+
return Promise.resolve();
|
|
323
|
+
}
|
|
164
324
|
}
|
|
165
325
|
exports.Log = Log;
|
|
166
326
|
Log.Loggers = new Map();
|
|
@@ -200,4 +360,21 @@ function Logger(name, variables) {
|
|
|
200
360
|
});
|
|
201
361
|
};
|
|
202
362
|
}
|
|
363
|
+
/**
|
|
364
|
+
* Ambient log-context provider seam. A Node-side consumer ( @spinajs/log's
|
|
365
|
+
* LogContext ) registers a function returning the current async-context store;
|
|
366
|
+
* `createLogMessageObject` merges its result at LOWEST precedence so every log
|
|
367
|
+
* entry inherits ambient fields ( eg. requestId ) without threading them by hand.
|
|
368
|
+
*
|
|
369
|
+
* Kept here ( not in @spinajs/log ) so the seam is browser-safe: log-common must
|
|
370
|
+
* stay free of `node:async_hooks`. The default provider returns an empty object;
|
|
371
|
+
* the browser build wires a synchronous fallback instead.
|
|
372
|
+
*/
|
|
373
|
+
let logContextProvider = () => ({});
|
|
374
|
+
/**
|
|
375
|
+
* Registers the ambient log-context provider. See {@link logContextProvider}.
|
|
376
|
+
*/
|
|
377
|
+
function setLogContextProvider(fn) {
|
|
378
|
+
logContextProvider = fn;
|
|
379
|
+
}
|
|
203
380
|
//# sourceMappingURL=index.js.map
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { SyncService } from "@spinajs/di";
|
|
2
|
+
/** Kind of a single measurement. */
|
|
3
|
+
export type PerfKind = "span" | "counter" | "value";
|
|
4
|
+
/** One unit of instrumentation, emitted to every registered {@link PerfSink}. */
|
|
5
|
+
export interface IPerfMetric {
|
|
6
|
+
name: string;
|
|
7
|
+
kind: PerfKind;
|
|
8
|
+
/** span duration in ms ( monotonic ). */
|
|
9
|
+
durationMs?: number;
|
|
10
|
+
/** counter delta / recorded value. */
|
|
11
|
+
value?: number;
|
|
12
|
+
/** LOW-cardinality dimensions ( safe as prom labels ). */
|
|
13
|
+
labels?: Record<string, string | number | boolean>;
|
|
14
|
+
/** rich payload for logs only ( sql text, bindings, rows ). Never a prom label. */
|
|
15
|
+
fields?: Record<string, unknown>;
|
|
16
|
+
/** epoch ms when the measurement started. */
|
|
17
|
+
startedAt?: number;
|
|
18
|
+
/** correlation id from the active request scope, when any. */
|
|
19
|
+
requestId?: string;
|
|
20
|
+
/** set when the measured block threw. */
|
|
21
|
+
error?: unknown;
|
|
22
|
+
}
|
|
23
|
+
/** Per-name aggregate inside a {@link IPerfRollup}. */
|
|
24
|
+
export interface IPerfRollupEntry {
|
|
25
|
+
count: number;
|
|
26
|
+
totalMs: number;
|
|
27
|
+
maxMs: number;
|
|
28
|
+
}
|
|
29
|
+
/** One per-request summary, handed to {@link PerfSink.onScopeEnd}. */
|
|
30
|
+
export interface IPerfRollup {
|
|
31
|
+
requestId?: string;
|
|
32
|
+
labels?: Record<string, string | number | boolean>;
|
|
33
|
+
totalMs: number;
|
|
34
|
+
byName: Record<string, IPerfRollupEntry>;
|
|
35
|
+
}
|
|
36
|
+
/** The mutable accumulator kept on the async request store. */
|
|
37
|
+
export interface IPerfScope {
|
|
38
|
+
requestId?: string;
|
|
39
|
+
byName: Record<string, IPerfRollupEntry>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A receiver of perf measurements. Register a concrete subclass with
|
|
43
|
+
* `@Injectable(PerfSink)` and it is discovered via `Array.ofType(PerfSink)`.
|
|
44
|
+
* `SyncService` ( same base as LogTarget ) so resolution stays synchronous.
|
|
45
|
+
*/
|
|
46
|
+
export declare abstract class PerfSink extends SyncService {
|
|
47
|
+
/** Receive one measurement. MUST NOT throw ( the facade guards it ). */
|
|
48
|
+
abstract collect(metric: IPerfMetric): void;
|
|
49
|
+
/** Optional: receive the per-request rollup at scope end. */
|
|
50
|
+
onScopeEnd?(rollup: IPerfRollup): void;
|
|
51
|
+
}
|
|
52
|
+
/** Options accepted by {@link Perf.measure} / {@link Perf.start}. */
|
|
53
|
+
export interface IMeasureOpts {
|
|
54
|
+
labels?: Record<string, string | number | boolean>;
|
|
55
|
+
fields?: Record<string, unknown>;
|
|
56
|
+
}
|
|
57
|
+
/** Handle returned by {@link Perf.start}. */
|
|
58
|
+
export interface IPerfSpan {
|
|
59
|
+
end(fields?: Record<string, unknown>): void;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Seam for the per-request scope. The node `@spinajs/log` package wires this to
|
|
63
|
+
* its AsyncLocalStorage-backed LogContext; the default returns `null` so the
|
|
64
|
+
* facade works ( sans rollups ) with no host — eg. on the browser.
|
|
65
|
+
*/
|
|
66
|
+
export interface IPerfScopeBackend {
|
|
67
|
+
get(): IPerfScope | null;
|
|
68
|
+
}
|
|
69
|
+
/** Install the per-request scope backend. See {@link IPerfScopeBackend}. */
|
|
70
|
+
export declare function setPerfScopeBackend(backend: IPerfScopeBackend): void;
|
|
71
|
+
declare class PerfImpl {
|
|
72
|
+
/** Global kill-switch; when false measure/start/count/value are pass-throughs. */
|
|
73
|
+
Enabled: boolean;
|
|
74
|
+
private sinks;
|
|
75
|
+
/** Drop the memoized sink list so the next emit re-resolves ( tests / late registration ). */
|
|
76
|
+
refreshSinks(): void;
|
|
77
|
+
private resolveSinks;
|
|
78
|
+
private emit;
|
|
79
|
+
private accumulate;
|
|
80
|
+
private record;
|
|
81
|
+
/**
|
|
82
|
+
* Time `fn` ( sync or async ), emit a span, and return `fn`'s result. On a
|
|
83
|
+
* thrown error the span is still emitted ( with `error` set ) and the error is
|
|
84
|
+
* rethrown.
|
|
85
|
+
*/
|
|
86
|
+
measure<T>(name: string, fn: () => Promise<T> | T, opts?: IMeasureOpts): Promise<T> | T;
|
|
87
|
+
/** Open a manual span; call `end()` where timing stops ( start/end may be far apart ). */
|
|
88
|
+
start(name: string, opts?: IMeasureOpts): IPerfSpan;
|
|
89
|
+
/** Increment a per-request counter ( eg. query count ) and emit a counter metric. */
|
|
90
|
+
count(name: string, delta?: number, labels?: Record<string, string | number | boolean>): void;
|
|
91
|
+
/** Record an absolute value ( gauge-like ) and emit a value metric. */
|
|
92
|
+
value(name: string, n: number, labels?: Record<string, string | number | boolean>): void;
|
|
93
|
+
/**
|
|
94
|
+
* Emit the per-request rollup for `scope` to every sink's `onScopeEnd`. The
|
|
95
|
+
* caller ( http ) passes the scope it read off `req.storage`; `extra` carries
|
|
96
|
+
* request labels and total wall time. No-op when `scope` is null.
|
|
97
|
+
*/
|
|
98
|
+
flushScope(scope: IPerfScope | null | undefined, extra?: {
|
|
99
|
+
labels?: Record<string, string | number | boolean>;
|
|
100
|
+
totalMs?: number;
|
|
101
|
+
}): void;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Shared perf-instrumentation facade. Emits measurements to every registered
|
|
105
|
+
* {@link PerfSink}. See the plan / design doc for usage.
|
|
106
|
+
*/
|
|
107
|
+
export declare const Perf: PerfImpl;
|
|
108
|
+
export {};
|
|
109
|
+
//# sourceMappingURL=perf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/perf.js
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Perf = exports.PerfSink = void 0;
|
|
4
|
+
exports.setPerfScopeBackend = setPerfScopeBackend;
|
|
5
|
+
const di_1 = require("@spinajs/di");
|
|
6
|
+
/**
|
|
7
|
+
* A receiver of perf measurements. Register a concrete subclass with
|
|
8
|
+
* `@Injectable(PerfSink)` and it is discovered via `Array.ofType(PerfSink)`.
|
|
9
|
+
* `SyncService` ( same base as LogTarget ) so resolution stays synchronous.
|
|
10
|
+
*/
|
|
11
|
+
class PerfSink extends di_1.SyncService {
|
|
12
|
+
}
|
|
13
|
+
exports.PerfSink = PerfSink;
|
|
14
|
+
const NOOP_BACKEND = { get: () => null };
|
|
15
|
+
let perfScopeBackend = NOOP_BACKEND;
|
|
16
|
+
/** Install the per-request scope backend. See {@link IPerfScopeBackend}. */
|
|
17
|
+
function setPerfScopeBackend(backend) {
|
|
18
|
+
perfScopeBackend = backend ?? NOOP_BACKEND;
|
|
19
|
+
}
|
|
20
|
+
class PerfImpl {
|
|
21
|
+
constructor() {
|
|
22
|
+
/** Global kill-switch; when false measure/start/count/value are pass-throughs. */
|
|
23
|
+
this.Enabled = true;
|
|
24
|
+
this.sinks = null;
|
|
25
|
+
}
|
|
26
|
+
/** Drop the memoized sink list so the next emit re-resolves ( tests / late registration ). */
|
|
27
|
+
refreshSinks() {
|
|
28
|
+
this.sinks = null;
|
|
29
|
+
}
|
|
30
|
+
resolveSinks() {
|
|
31
|
+
if (this.sinks === null) {
|
|
32
|
+
// PerfSink extends SyncService => resolve returns synchronously.
|
|
33
|
+
this.sinks = di_1.DI.resolve(Array.ofType(PerfSink)) ?? [];
|
|
34
|
+
}
|
|
35
|
+
return this.sinks;
|
|
36
|
+
}
|
|
37
|
+
emit(metric) {
|
|
38
|
+
for (const s of this.resolveSinks()) {
|
|
39
|
+
try {
|
|
40
|
+
s.collect(metric);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
/* a sink must never break the measured code or sibling sinks */
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
accumulate(name, durationMs, scope) {
|
|
48
|
+
if (!scope)
|
|
49
|
+
return;
|
|
50
|
+
const e = scope.byName[name] ?? (scope.byName[name] = { count: 0, totalMs: 0, maxMs: 0 });
|
|
51
|
+
e.count += 1;
|
|
52
|
+
e.totalMs += durationMs;
|
|
53
|
+
if (durationMs > e.maxMs)
|
|
54
|
+
e.maxMs = durationMs;
|
|
55
|
+
}
|
|
56
|
+
record(name, startedAt, durationMs, opts, error) {
|
|
57
|
+
const scope = perfScopeBackend.get();
|
|
58
|
+
this.accumulate(name, durationMs, scope);
|
|
59
|
+
this.emit({
|
|
60
|
+
name,
|
|
61
|
+
kind: "span",
|
|
62
|
+
durationMs,
|
|
63
|
+
labels: opts?.labels,
|
|
64
|
+
fields: error !== undefined ? { ...(opts?.fields ?? {}), error } : opts?.fields,
|
|
65
|
+
startedAt,
|
|
66
|
+
requestId: scope?.requestId,
|
|
67
|
+
error,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Time `fn` ( sync or async ), emit a span, and return `fn`'s result. On a
|
|
72
|
+
* thrown error the span is still emitted ( with `error` set ) and the error is
|
|
73
|
+
* rethrown.
|
|
74
|
+
*/
|
|
75
|
+
measure(name, fn, opts) {
|
|
76
|
+
if (!this.Enabled)
|
|
77
|
+
return fn();
|
|
78
|
+
const startedAt = Date.now();
|
|
79
|
+
const t0 = performance.now();
|
|
80
|
+
let out;
|
|
81
|
+
try {
|
|
82
|
+
out = fn();
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
this.record(name, startedAt, performance.now() - t0, opts, err);
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
if (out !== null && typeof out?.then === "function") {
|
|
89
|
+
return out.then((v) => {
|
|
90
|
+
this.record(name, startedAt, performance.now() - t0, opts, undefined);
|
|
91
|
+
return v;
|
|
92
|
+
}, (err) => {
|
|
93
|
+
this.record(name, startedAt, performance.now() - t0, opts, err);
|
|
94
|
+
throw err;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
this.record(name, startedAt, performance.now() - t0, opts, undefined);
|
|
98
|
+
return out;
|
|
99
|
+
}
|
|
100
|
+
/** Open a manual span; call `end()` where timing stops ( start/end may be far apart ). */
|
|
101
|
+
start(name, opts) {
|
|
102
|
+
const startedAt = Date.now();
|
|
103
|
+
const t0 = performance.now();
|
|
104
|
+
let ended = false;
|
|
105
|
+
return {
|
|
106
|
+
end: (fields) => {
|
|
107
|
+
if (ended)
|
|
108
|
+
return;
|
|
109
|
+
ended = true;
|
|
110
|
+
const merged = fields ? { labels: opts?.labels, fields: { ...(opts?.fields ?? {}), ...fields } } : opts ?? {};
|
|
111
|
+
this.record(name, startedAt, performance.now() - t0, merged, undefined);
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Increment a per-request counter ( eg. query count ) and emit a counter metric. */
|
|
116
|
+
count(name, delta = 1, labels) {
|
|
117
|
+
if (!this.Enabled)
|
|
118
|
+
return;
|
|
119
|
+
const scope = perfScopeBackend.get();
|
|
120
|
+
if (scope) {
|
|
121
|
+
const e = scope.byName[name] ?? (scope.byName[name] = { count: 0, totalMs: 0, maxMs: 0 });
|
|
122
|
+
e.count += delta;
|
|
123
|
+
}
|
|
124
|
+
this.emit({ name, kind: "counter", value: delta, labels, requestId: scope?.requestId });
|
|
125
|
+
}
|
|
126
|
+
/** Record an absolute value ( gauge-like ) and emit a value metric. */
|
|
127
|
+
value(name, n, labels) {
|
|
128
|
+
if (!this.Enabled)
|
|
129
|
+
return;
|
|
130
|
+
const scope = perfScopeBackend.get();
|
|
131
|
+
this.emit({ name, kind: "value", value: n, labels, requestId: scope?.requestId });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Emit the per-request rollup for `scope` to every sink's `onScopeEnd`. The
|
|
135
|
+
* caller ( http ) passes the scope it read off `req.storage`; `extra` carries
|
|
136
|
+
* request labels and total wall time. No-op when `scope` is null.
|
|
137
|
+
*/
|
|
138
|
+
flushScope(scope, extra) {
|
|
139
|
+
if (!scope)
|
|
140
|
+
return;
|
|
141
|
+
const rollup = {
|
|
142
|
+
requestId: scope.requestId,
|
|
143
|
+
labels: extra?.labels,
|
|
144
|
+
totalMs: extra?.totalMs ?? 0,
|
|
145
|
+
byName: scope.byName,
|
|
146
|
+
};
|
|
147
|
+
for (const sink of this.resolveSinks()) {
|
|
148
|
+
try {
|
|
149
|
+
sink.onScopeEnd?.(rollup);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
/* isolate */
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Shared perf-instrumentation facade. Emits measurements to every registered
|
|
159
|
+
* {@link PerfSink}. See the plan / design doc for usage.
|
|
160
|
+
*/
|
|
161
|
+
exports.Perf = new PerfImpl();
|
|
162
|
+
//# sourceMappingURL=perf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/perf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LogLevel } from "./index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Persist `level` for `loggerName`. Browser only - writes `String(level)` to
|
|
4
|
+
* localStorage under `spinajs:log:level:<loggerName>`, falling back to a cookie
|
|
5
|
+
* when storage throws. No-op on Node.
|
|
6
|
+
*/
|
|
7
|
+
export declare function persistLevel(loggerName: string, level: LogLevel): void;
|
|
8
|
+
/**
|
|
9
|
+
* Read back the persisted level for `loggerName` ( localStorage then cookie ).
|
|
10
|
+
* Returns a finite {@link LogLevel} number, or `undefined` when nothing valid is
|
|
11
|
+
* stored. Always `undefined` on Node.
|
|
12
|
+
*/
|
|
13
|
+
export declare function readPersistedLevel(loggerName: string): LogLevel | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Remove any persisted level for `loggerName` ( localStorage + cookie ). No-op
|
|
16
|
+
* on Node.
|
|
17
|
+
*/
|
|
18
|
+
export declare function clearPersistedLevel(loggerName: string): void;
|
|
19
|
+
//# sourceMappingURL=persistence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmE3C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAmBtE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA0B3E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAgB5D"}
|