@spinajs/log 2.0.482 → 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/lib/cjs/perf/LogMetricSink.d.ts +27 -0
- package/lib/cjs/perf/LogMetricSink.d.ts.map +1 -1
- package/lib/cjs/perf/LogMetricSink.js +36 -2
- package/lib/cjs/perf/LogMetricSink.js.map +1 -1
- package/lib/mjs/perf/LogMetricSink.d.ts +27 -0
- package/lib/mjs/perf/LogMetricSink.d.ts.map +1 -1
- package/lib/mjs/perf/LogMetricSink.js +36 -2
- package/lib/mjs/perf/LogMetricSink.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +9 -8
|
@@ -13,7 +13,34 @@ export declare class LogMetricSink extends PerfSink {
|
|
|
13
13
|
protected OverLevel: "warn" | "error" | "info" | "debug" | "trace";
|
|
14
14
|
protected UnderLevel: "warn" | "error" | "info" | "debug" | "trace";
|
|
15
15
|
protected LogCounters: boolean;
|
|
16
|
+
protected SqlMaxLength: number;
|
|
17
|
+
/**
|
|
18
|
+
* Emit a log entry for spans that came in UNDER their threshold.
|
|
19
|
+
*
|
|
20
|
+
* - `false` ( default ) never; a bare `orm.query: 15.2ms` says nothing actionable
|
|
21
|
+
* and a single request produces hundreds of them,
|
|
22
|
+
* - `true` for every metric,
|
|
23
|
+
* - a list of metric names to trace just those, eg. `['orm.query']` for a full db
|
|
24
|
+
* query trace without dragging in `email.send` and `template.*`, which share
|
|
25
|
+
* this same logger.
|
|
26
|
+
*
|
|
27
|
+
* Over-threshold and failed spans are always logged regardless of this setting,
|
|
28
|
+
* and the measurements themselves are never affected - they still reach every
|
|
29
|
+
* other sink and the per-request rollup. This only controls per-span log lines.
|
|
30
|
+
*/
|
|
31
|
+
protected LogUnderThreshold: boolean | string[];
|
|
32
|
+
private logsUnderThreshold;
|
|
16
33
|
private thresholdFor;
|
|
34
|
+
/**
|
|
35
|
+
* Renders the statement into the message. The `sql` field is already attached to
|
|
36
|
+
* the entry, but most console layouts print only `${message}`, so
|
|
37
|
+
* "Slow orm.query: 251.1ms" on its own gives no way to tell WHICH query it was.
|
|
38
|
+
*
|
|
39
|
+
* Bindings are deliberately left out of the message - they routinely hold
|
|
40
|
+
* passwords, tokens and personal data. They stay in the structured fields, where a
|
|
41
|
+
* target can opt into them.
|
|
42
|
+
*/
|
|
43
|
+
private sqlSuffix;
|
|
17
44
|
collect(metric: IPerfMetric): void;
|
|
18
45
|
onScopeEnd(rollup: IPerfRollup): void;
|
|
19
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogMetricSink.d.ts","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtF;;;;;;GAMG;AACH,qBAEa,aAAc,SAAQ,QAAQ;IAEzC,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAG5B,SAAS,CAAC,UAAU,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9C,SAAS,CAAC,SAAS,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGpE,SAAS,CAAC,UAAU,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGrE,SAAS,CAAC,WAAW,EAAG,OAAO,CAAC;IAEhC,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"LogMetricSink.d.ts","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtF;;;;;;GAMG;AACH,qBAEa,aAAc,SAAQ,QAAQ;IAEzC,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAG5B,SAAS,CAAC,UAAU,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9C,SAAS,CAAC,SAAS,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGpE,SAAS,CAAC,UAAU,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGrE,SAAS,CAAC,WAAW,EAAG,OAAO,CAAC;IAGhC,SAAS,CAAC,YAAY,EAAG,MAAM,CAAC;IAEhC;;;;;;;;;;;;;OAaG;IAEH,SAAS,CAAC,iBAAiB,EAAG,OAAO,GAAG,MAAM,EAAE,CAAC;IAEjD,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAKpB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAcV,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA+BlC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAc5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;CAmBf"}
|
|
@@ -21,10 +21,33 @@ const log_common_1 = require("@spinajs/log-common");
|
|
|
21
21
|
* trace routing is off ). Rollups log one `info` line.
|
|
22
22
|
*/
|
|
23
23
|
let LogMetricSink = class LogMetricSink extends log_common_1.PerfSink {
|
|
24
|
+
logsUnderThreshold(name) {
|
|
25
|
+
const setting = this.LogUnderThreshold ?? false;
|
|
26
|
+
return Array.isArray(setting) ? setting.includes(name) : setting === true;
|
|
27
|
+
}
|
|
24
28
|
thresholdFor(name) {
|
|
25
29
|
const t = this.Thresholds ?? {};
|
|
26
30
|
return t[name] ?? t.default ?? 0;
|
|
27
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Renders the statement into the message. The `sql` field is already attached to
|
|
34
|
+
* the entry, but most console layouts print only `${message}`, so
|
|
35
|
+
* "Slow orm.query: 251.1ms" on its own gives no way to tell WHICH query it was.
|
|
36
|
+
*
|
|
37
|
+
* Bindings are deliberately left out of the message - they routinely hold
|
|
38
|
+
* passwords, tokens and personal data. They stay in the structured fields, where a
|
|
39
|
+
* target can opt into them.
|
|
40
|
+
*/
|
|
41
|
+
sqlSuffix(fields) {
|
|
42
|
+
const sql = fields.sql;
|
|
43
|
+
if (typeof sql !== "string" || sql.trim().length === 0) {
|
|
44
|
+
return "";
|
|
45
|
+
}
|
|
46
|
+
const flattened = sql.replace(/\s+/g, " ").trim();
|
|
47
|
+
const max = this.SqlMaxLength ?? 2000;
|
|
48
|
+
const clipped = flattened.length > max ? `${flattened.slice(0, max)}...` : flattened;
|
|
49
|
+
return ` - ${clipped}`;
|
|
50
|
+
}
|
|
28
51
|
collect(metric) {
|
|
29
52
|
if (!this.Enabled)
|
|
30
53
|
return;
|
|
@@ -34,13 +57,16 @@ let LogMetricSink = class LogMetricSink extends log_common_1.PerfSink {
|
|
|
34
57
|
// facade ), so the log's error serializer runs when this object is logged.
|
|
35
58
|
const fields = { durationMs: dur, ...(metric.labels ?? {}), ...(metric.fields ?? {}) };
|
|
36
59
|
if (metric.error !== undefined) {
|
|
37
|
-
this.emitAt("error", `${metric.name} failed after ${dur.toFixed(1)}ms`, fields);
|
|
60
|
+
this.emitAt("error", `${metric.name} failed after ${dur.toFixed(1)}ms${this.sqlSuffix(fields)}`, fields);
|
|
38
61
|
return;
|
|
39
62
|
}
|
|
40
63
|
const threshold = this.thresholdFor(metric.name);
|
|
41
64
|
const slow = threshold > 0 && dur >= threshold;
|
|
65
|
+
if (!slow && !this.logsUnderThreshold(metric.name)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
42
68
|
const level = slow ? this.OverLevel : this.UnderLevel;
|
|
43
|
-
this.emitAt(level, `${slow ? "Slow " : ""}${metric.name}: ${dur.toFixed(1)}ms`, fields);
|
|
69
|
+
this.emitAt(level, `${slow ? "Slow " : ""}${metric.name}: ${dur.toFixed(1)}ms${this.sqlSuffix(fields)}`, fields);
|
|
44
70
|
return;
|
|
45
71
|
}
|
|
46
72
|
if (this.LogCounters && (metric.kind === "counter" || metric.kind === "value")) {
|
|
@@ -113,6 +139,14 @@ __decorate([
|
|
|
113
139
|
(0, configuration_1.Config)("logger.perf.logCounters", { defaultValue: false }),
|
|
114
140
|
__metadata("design:type", Boolean)
|
|
115
141
|
], LogMetricSink.prototype, "LogCounters", void 0);
|
|
142
|
+
__decorate([
|
|
143
|
+
(0, configuration_1.Config)("logger.perf.sqlMaxLength", { defaultValue: 2000 }),
|
|
144
|
+
__metadata("design:type", Number)
|
|
145
|
+
], LogMetricSink.prototype, "SqlMaxLength", void 0);
|
|
146
|
+
__decorate([
|
|
147
|
+
(0, configuration_1.Config)("logger.perf.logUnderThreshold", { defaultValue: false }),
|
|
148
|
+
__metadata("design:type", Object)
|
|
149
|
+
], LogMetricSink.prototype, "LogUnderThreshold", void 0);
|
|
116
150
|
exports.LogMetricSink = LogMetricSink = __decorate([
|
|
117
151
|
(0, di_1.Singleton)(),
|
|
118
152
|
(0, di_1.Injectable)(log_common_1.PerfSink)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogMetricSink.js","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAoD;AACpD,0DAAgD;AAChD,oDAAsF;AAEtF;;;;;;GAMG;AAGI,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,qBAAQ;
|
|
1
|
+
{"version":3,"file":"LogMetricSink.js","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,34 @@ export declare class LogMetricSink extends PerfSink {
|
|
|
13
13
|
protected OverLevel: "warn" | "error" | "info" | "debug" | "trace";
|
|
14
14
|
protected UnderLevel: "warn" | "error" | "info" | "debug" | "trace";
|
|
15
15
|
protected LogCounters: boolean;
|
|
16
|
+
protected SqlMaxLength: number;
|
|
17
|
+
/**
|
|
18
|
+
* Emit a log entry for spans that came in UNDER their threshold.
|
|
19
|
+
*
|
|
20
|
+
* - `false` ( default ) never; a bare `orm.query: 15.2ms` says nothing actionable
|
|
21
|
+
* and a single request produces hundreds of them,
|
|
22
|
+
* - `true` for every metric,
|
|
23
|
+
* - a list of metric names to trace just those, eg. `['orm.query']` for a full db
|
|
24
|
+
* query trace without dragging in `email.send` and `template.*`, which share
|
|
25
|
+
* this same logger.
|
|
26
|
+
*
|
|
27
|
+
* Over-threshold and failed spans are always logged regardless of this setting,
|
|
28
|
+
* and the measurements themselves are never affected - they still reach every
|
|
29
|
+
* other sink and the per-request rollup. This only controls per-span log lines.
|
|
30
|
+
*/
|
|
31
|
+
protected LogUnderThreshold: boolean | string[];
|
|
32
|
+
private logsUnderThreshold;
|
|
16
33
|
private thresholdFor;
|
|
34
|
+
/**
|
|
35
|
+
* Renders the statement into the message. The `sql` field is already attached to
|
|
36
|
+
* the entry, but most console layouts print only `${message}`, so
|
|
37
|
+
* "Slow orm.query: 251.1ms" on its own gives no way to tell WHICH query it was.
|
|
38
|
+
*
|
|
39
|
+
* Bindings are deliberately left out of the message - they routinely hold
|
|
40
|
+
* passwords, tokens and personal data. They stay in the structured fields, where a
|
|
41
|
+
* target can opt into them.
|
|
42
|
+
*/
|
|
43
|
+
private sqlSuffix;
|
|
17
44
|
collect(metric: IPerfMetric): void;
|
|
18
45
|
onScopeEnd(rollup: IPerfRollup): void;
|
|
19
46
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogMetricSink.d.ts","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtF;;;;;;GAMG;AACH,qBAEa,aAAc,SAAQ,QAAQ;IAEzC,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAG5B,SAAS,CAAC,UAAU,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9C,SAAS,CAAC,SAAS,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGpE,SAAS,CAAC,UAAU,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGrE,SAAS,CAAC,WAAW,EAAG,OAAO,CAAC;IAEhC,OAAO,CAAC,YAAY;
|
|
1
|
+
{"version":3,"file":"LogMetricSink.d.ts","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEtF;;;;;;GAMG;AACH,qBAEa,aAAc,SAAQ,QAAQ;IAEzC,SAAS,CAAC,GAAG,EAAG,GAAG,CAAC;IAGpB,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC;IAG5B,SAAS,CAAC,UAAU,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG9C,SAAS,CAAC,SAAS,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGpE,SAAS,CAAC,UAAU,EAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAGrE,SAAS,CAAC,WAAW,EAAG,OAAO,CAAC;IAGhC,SAAS,CAAC,YAAY,EAAG,MAAM,CAAC;IAEhC;;;;;;;;;;;;;OAaG;IAEH,SAAS,CAAC,iBAAiB,EAAG,OAAO,GAAG,MAAM,EAAE,CAAC;IAEjD,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,YAAY;IAKpB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAcV,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA+BlC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAc5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;CAmBf"}
|
|
@@ -18,10 +18,33 @@ import { Logger, Log, PerfSink } from "@spinajs/log-common";
|
|
|
18
18
|
* trace routing is off ). Rollups log one `info` line.
|
|
19
19
|
*/
|
|
20
20
|
let LogMetricSink = class LogMetricSink extends PerfSink {
|
|
21
|
+
logsUnderThreshold(name) {
|
|
22
|
+
const setting = this.LogUnderThreshold ?? false;
|
|
23
|
+
return Array.isArray(setting) ? setting.includes(name) : setting === true;
|
|
24
|
+
}
|
|
21
25
|
thresholdFor(name) {
|
|
22
26
|
const t = this.Thresholds ?? {};
|
|
23
27
|
return t[name] ?? t.default ?? 0;
|
|
24
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Renders the statement into the message. The `sql` field is already attached to
|
|
31
|
+
* the entry, but most console layouts print only `${message}`, so
|
|
32
|
+
* "Slow orm.query: 251.1ms" on its own gives no way to tell WHICH query it was.
|
|
33
|
+
*
|
|
34
|
+
* Bindings are deliberately left out of the message - they routinely hold
|
|
35
|
+
* passwords, tokens and personal data. They stay in the structured fields, where a
|
|
36
|
+
* target can opt into them.
|
|
37
|
+
*/
|
|
38
|
+
sqlSuffix(fields) {
|
|
39
|
+
const sql = fields.sql;
|
|
40
|
+
if (typeof sql !== "string" || sql.trim().length === 0) {
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
const flattened = sql.replace(/\s+/g, " ").trim();
|
|
44
|
+
const max = this.SqlMaxLength ?? 2000;
|
|
45
|
+
const clipped = flattened.length > max ? `${flattened.slice(0, max)}...` : flattened;
|
|
46
|
+
return ` - ${clipped}`;
|
|
47
|
+
}
|
|
25
48
|
collect(metric) {
|
|
26
49
|
if (!this.Enabled)
|
|
27
50
|
return;
|
|
@@ -31,13 +54,16 @@ let LogMetricSink = class LogMetricSink extends PerfSink {
|
|
|
31
54
|
// facade ), so the log's error serializer runs when this object is logged.
|
|
32
55
|
const fields = { durationMs: dur, ...(metric.labels ?? {}), ...(metric.fields ?? {}) };
|
|
33
56
|
if (metric.error !== undefined) {
|
|
34
|
-
this.emitAt("error", `${metric.name} failed after ${dur.toFixed(1)}ms`, fields);
|
|
57
|
+
this.emitAt("error", `${metric.name} failed after ${dur.toFixed(1)}ms${this.sqlSuffix(fields)}`, fields);
|
|
35
58
|
return;
|
|
36
59
|
}
|
|
37
60
|
const threshold = this.thresholdFor(metric.name);
|
|
38
61
|
const slow = threshold > 0 && dur >= threshold;
|
|
62
|
+
if (!slow && !this.logsUnderThreshold(metric.name)) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
39
65
|
const level = slow ? this.OverLevel : this.UnderLevel;
|
|
40
|
-
this.emitAt(level, `${slow ? "Slow " : ""}${metric.name}: ${dur.toFixed(1)}ms`, fields);
|
|
66
|
+
this.emitAt(level, `${slow ? "Slow " : ""}${metric.name}: ${dur.toFixed(1)}ms${this.sqlSuffix(fields)}`, fields);
|
|
41
67
|
return;
|
|
42
68
|
}
|
|
43
69
|
if (this.LogCounters && (metric.kind === "counter" || metric.kind === "value")) {
|
|
@@ -109,6 +135,14 @@ __decorate([
|
|
|
109
135
|
Config("logger.perf.logCounters", { defaultValue: false }),
|
|
110
136
|
__metadata("design:type", Boolean)
|
|
111
137
|
], LogMetricSink.prototype, "LogCounters", void 0);
|
|
138
|
+
__decorate([
|
|
139
|
+
Config("logger.perf.sqlMaxLength", { defaultValue: 2000 }),
|
|
140
|
+
__metadata("design:type", Number)
|
|
141
|
+
], LogMetricSink.prototype, "SqlMaxLength", void 0);
|
|
142
|
+
__decorate([
|
|
143
|
+
Config("logger.perf.logUnderThreshold", { defaultValue: false }),
|
|
144
|
+
__metadata("design:type", Object)
|
|
145
|
+
], LogMetricSink.prototype, "LogUnderThreshold", void 0);
|
|
112
146
|
LogMetricSink = __decorate([
|
|
113
147
|
Singleton(),
|
|
114
148
|
Injectable(PerfSink)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogMetricSink.js","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAA4B,MAAM,qBAAqB,CAAC;AAEtF;;;;;;GAMG;AAGI,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,QAAQ;
|
|
1
|
+
{"version":3,"file":"LogMetricSink.js","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"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"}
|