@spinajs/log 2.0.482 → 2.0.485

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.
@@ -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;IAKb,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA0BlC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAc5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;CAmBf"}
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;IAmBjC,YAAY,CAAC,IAAY;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,MAAmB;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAE1B,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;YACnC,yEAAyE;YACzE,2EAA2E;YAC3E,MAAM,MAAM,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAEvF,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,iBAAiB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;YACtD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACxF,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,CAAC;YAC/E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,MAAmB;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;aAC7D,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,KAAK,KAAK,IAAI,iBAAiB,EAAE,EAAE;YACtE,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;SACzB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACK,MAAM,CAAC,KAAa,EAAE,OAAe,EAAE,MAA+B;QAC5E,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO;gBACV,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChC,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC/B,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChC,MAAM;YACR;gBACE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChC,MAAM;QACV,CAAC;IACH,CAAC;CACF,CAAA;AA1FY,sCAAa;AAEd;IADT,IAAA,mBAAM,EAAC,MAAM,CAAC;8BACC,gBAAG;0CAAC;AAGV;IADT,IAAA,sBAAM,EAAC,qBAAqB,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;;8CAC1B;AAGlB;IADT,IAAA,sBAAM,EAAC,wBAAwB,EAAE,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;;iDAC7D;AAGpC;IADT,IAAA,sBAAM,EAAC,gCAAgC,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;;gDACC;AAG1D;IADT,IAAA,sBAAM,EAAC,iCAAiC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;;iDACA;AAG3D;IADT,IAAA,sBAAM,EAAC,yBAAyB,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;;kDAC3B;wBAjBrB,aAAa;IAFzB,IAAA,cAAS,GAAE;IACX,IAAA,eAAU,EAAC,qBAAQ,CAAC;GACR,aAAa,CA0FzB"}
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;IAKb,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IA0BlC,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAc5C;;;;;;OAMG;IACH,OAAO,CAAC,MAAM;CAmBf"}
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":"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"}
1
+ {"version":3,"file":"LogMetricSink.js","sourceRoot":"","sources":["../../../src/perf/LogMetricSink.ts"],"names":[],"mappings":"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"}