@spinajs/telemetry 2.0.482
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 +482 -0
- package/lib/cjs/InMemoryPerfSink.d.ts +51 -0
- package/lib/cjs/InMemoryPerfSink.d.ts.map +1 -0
- package/lib/cjs/InMemoryPerfSink.js +100 -0
- package/lib/cjs/InMemoryPerfSink.js.map +1 -0
- package/lib/cjs/PromMetricSink.d.ts +26 -0
- package/lib/cjs/PromMetricSink.d.ts.map +1 -0
- package/lib/cjs/PromMetricSink.js +68 -0
- package/lib/cjs/PromMetricSink.js.map +1 -0
- package/lib/cjs/bootstrap.d.ts +13 -0
- package/lib/cjs/bootstrap.d.ts.map +1 -0
- package/lib/cjs/bootstrap.js +57 -0
- package/lib/cjs/bootstrap.js.map +1 -0
- package/lib/cjs/config/telemetry.d.ts +63 -0
- package/lib/cjs/config/telemetry.d.ts.map +1 -0
- package/lib/cjs/config/telemetry.js +78 -0
- package/lib/cjs/config/telemetry.js.map +1 -0
- package/lib/cjs/controllers/Metrics.d.ts +26 -0
- package/lib/cjs/controllers/Metrics.d.ts.map +1 -0
- package/lib/cjs/controllers/Metrics.js +63 -0
- package/lib/cjs/controllers/Metrics.js.map +1 -0
- package/lib/cjs/controllers/Telemetry.d.ts +92 -0
- package/lib/cjs/controllers/Telemetry.d.ts.map +1 -0
- package/lib/cjs/controllers/Telemetry.js +226 -0
- package/lib/cjs/controllers/Telemetry.js.map +1 -0
- package/lib/cjs/dto/index.d.ts +21 -0
- package/lib/cjs/dto/index.d.ts.map +1 -0
- package/lib/cjs/dto/index.js +64 -0
- package/lib/cjs/dto/index.js.map +1 -0
- package/lib/cjs/endpoints.d.ts +32 -0
- package/lib/cjs/endpoints.d.ts.map +1 -0
- package/lib/cjs/endpoints.js +38 -0
- package/lib/cjs/endpoints.js.map +1 -0
- package/lib/cjs/health.d.ts +55 -0
- package/lib/cjs/health.d.ts.map +1 -0
- package/lib/cjs/health.js +111 -0
- package/lib/cjs/health.js.map +1 -0
- package/lib/cjs/index.d.ts +16 -0
- package/lib/cjs/index.d.ts.map +1 -0
- package/lib/cjs/index.js +32 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/metrics.d.ts +16 -0
- package/lib/cjs/metrics.d.ts.map +1 -0
- package/lib/cjs/metrics.js +32 -0
- package/lib/cjs/metrics.js.map +1 -0
- package/lib/cjs/middleware.d.ts +81 -0
- package/lib/cjs/middleware.d.ts.map +1 -0
- package/lib/cjs/middleware.js +210 -0
- package/lib/cjs/middleware.js.map +1 -0
- package/lib/cjs/package.json +1 -0
- package/lib/cjs/policies/PublicPolicy.d.ts +16 -0
- package/lib/cjs/policies/PublicPolicy.d.ts.map +1 -0
- package/lib/cjs/policies/PublicPolicy.js +34 -0
- package/lib/cjs/policies/PublicPolicy.js.map +1 -0
- package/lib/cjs/policies/TelemetryTokenPolicy.d.ts +19 -0
- package/lib/cjs/policies/TelemetryTokenPolicy.d.ts.map +1 -0
- package/lib/cjs/policies/TelemetryTokenPolicy.js +65 -0
- package/lib/cjs/policies/TelemetryTokenPolicy.js.map +1 -0
- package/lib/cjs/requestStats.d.ts +81 -0
- package/lib/cjs/requestStats.d.ts.map +1 -0
- package/lib/cjs/requestStats.js +134 -0
- package/lib/cjs/requestStats.js.map +1 -0
- package/lib/cjs/responses.d.ts +23 -0
- package/lib/cjs/responses.d.ts.map +1 -0
- package/lib/cjs/responses.js +35 -0
- package/lib/cjs/responses.js.map +1 -0
- package/lib/cjs/routeStats.d.ts +43 -0
- package/lib/cjs/routeStats.d.ts.map +1 -0
- package/lib/cjs/routeStats.js +59 -0
- package/lib/cjs/routeStats.js.map +1 -0
- package/lib/cjs/schemas/HealthResponse.schema.d.ts +30 -0
- package/lib/cjs/schemas/HealthResponse.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/HealthResponse.schema.js +15 -0
- package/lib/cjs/schemas/HealthResponse.schema.js.map +1 -0
- package/lib/cjs/schemas/PerfResponse.schema.d.ts +56 -0
- package/lib/cjs/schemas/PerfResponse.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/PerfResponse.schema.js +36 -0
- package/lib/cjs/schemas/PerfResponse.schema.js.map +1 -0
- package/lib/cjs/schemas/ReadyResponse.schema.d.ts +36 -0
- package/lib/cjs/schemas/ReadyResponse.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/ReadyResponse.schema.js +23 -0
- package/lib/cjs/schemas/ReadyResponse.schema.js.map +1 -0
- package/lib/cjs/schemas/RequestStatsSnapshot.schema.d.ts +79 -0
- package/lib/cjs/schemas/RequestStatsSnapshot.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/RequestStatsSnapshot.schema.js +30 -0
- package/lib/cjs/schemas/RequestStatsSnapshot.schema.js.map +1 -0
- package/lib/cjs/schemas/RoutesResponse.schema.d.ts +100 -0
- package/lib/cjs/schemas/RoutesResponse.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/RoutesResponse.schema.js +25 -0
- package/lib/cjs/schemas/RoutesResponse.schema.js.map +1 -0
- package/lib/cjs/schemas/StatsResponse.schema.d.ts +158 -0
- package/lib/cjs/schemas/StatsResponse.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/StatsResponse.schema.js +19 -0
- package/lib/cjs/schemas/StatsResponse.schema.js.map +1 -0
- package/lib/cjs/schemas/TimelineResponse.schema.d.ts +109 -0
- package/lib/cjs/schemas/TimelineResponse.schema.d.ts.map +1 -0
- package/lib/cjs/schemas/TimelineResponse.schema.js +28 -0
- package/lib/cjs/schemas/TimelineResponse.schema.js.map +1 -0
- package/lib/cjs/store.d.ts +58 -0
- package/lib/cjs/store.d.ts.map +1 -0
- package/lib/cjs/store.js +108 -0
- package/lib/cjs/store.js.map +1 -0
- package/lib/cjs/timeline.d.ts +48 -0
- package/lib/cjs/timeline.d.ts.map +1 -0
- package/lib/cjs/timeline.js +70 -0
- package/lib/cjs/timeline.js.map +1 -0
- package/lib/mjs/InMemoryPerfSink.d.ts +51 -0
- package/lib/mjs/InMemoryPerfSink.d.ts.map +1 -0
- package/lib/mjs/InMemoryPerfSink.js +97 -0
- package/lib/mjs/InMemoryPerfSink.js.map +1 -0
- package/lib/mjs/PromMetricSink.d.ts +26 -0
- package/lib/mjs/PromMetricSink.d.ts.map +1 -0
- package/lib/mjs/PromMetricSink.js +65 -0
- package/lib/mjs/PromMetricSink.js.map +1 -0
- package/lib/mjs/bootstrap.d.ts +13 -0
- package/lib/mjs/bootstrap.d.ts.map +1 -0
- package/lib/mjs/bootstrap.js +54 -0
- package/lib/mjs/bootstrap.js.map +1 -0
- package/lib/mjs/config/telemetry.d.ts +63 -0
- package/lib/mjs/config/telemetry.d.ts.map +1 -0
- package/lib/mjs/config/telemetry.js +76 -0
- package/lib/mjs/config/telemetry.js.map +1 -0
- package/lib/mjs/controllers/Metrics.d.ts +26 -0
- package/lib/mjs/controllers/Metrics.d.ts.map +1 -0
- package/lib/mjs/controllers/Metrics.js +60 -0
- package/lib/mjs/controllers/Metrics.js.map +1 -0
- package/lib/mjs/controllers/Telemetry.d.ts +92 -0
- package/lib/mjs/controllers/Telemetry.d.ts.map +1 -0
- package/lib/mjs/controllers/Telemetry.js +223 -0
- package/lib/mjs/controllers/Telemetry.js.map +1 -0
- package/lib/mjs/dto/index.d.ts +21 -0
- package/lib/mjs/dto/index.d.ts.map +1 -0
- package/lib/mjs/dto/index.js +58 -0
- package/lib/mjs/dto/index.js.map +1 -0
- package/lib/mjs/endpoints.d.ts +32 -0
- package/lib/mjs/endpoints.d.ts.map +1 -0
- package/lib/mjs/endpoints.js +34 -0
- package/lib/mjs/endpoints.js.map +1 -0
- package/lib/mjs/health.d.ts +55 -0
- package/lib/mjs/health.d.ts.map +1 -0
- package/lib/mjs/health.js +107 -0
- package/lib/mjs/health.js.map +1 -0
- package/lib/mjs/index.d.ts +16 -0
- package/lib/mjs/index.d.ts.map +1 -0
- package/lib/mjs/index.js +16 -0
- package/lib/mjs/index.js.map +1 -0
- package/lib/mjs/metrics.d.ts +16 -0
- package/lib/mjs/metrics.d.ts.map +1 -0
- package/lib/mjs/metrics.js +16 -0
- package/lib/mjs/metrics.js.map +1 -0
- package/lib/mjs/middleware.d.ts +81 -0
- package/lib/mjs/middleware.d.ts.map +1 -0
- package/lib/mjs/middleware.js +207 -0
- package/lib/mjs/middleware.js.map +1 -0
- package/lib/mjs/package.json +1 -0
- package/lib/mjs/policies/PublicPolicy.d.ts +16 -0
- package/lib/mjs/policies/PublicPolicy.d.ts.map +1 -0
- package/lib/mjs/policies/PublicPolicy.js +31 -0
- package/lib/mjs/policies/PublicPolicy.js.map +1 -0
- package/lib/mjs/policies/TelemetryTokenPolicy.d.ts +19 -0
- package/lib/mjs/policies/TelemetryTokenPolicy.d.ts.map +1 -0
- package/lib/mjs/policies/TelemetryTokenPolicy.js +62 -0
- package/lib/mjs/policies/TelemetryTokenPolicy.js.map +1 -0
- package/lib/mjs/requestStats.d.ts +81 -0
- package/lib/mjs/requestStats.d.ts.map +1 -0
- package/lib/mjs/requestStats.js +130 -0
- package/lib/mjs/requestStats.js.map +1 -0
- package/lib/mjs/responses.d.ts +23 -0
- package/lib/mjs/responses.d.ts.map +1 -0
- package/lib/mjs/responses.js +30 -0
- package/lib/mjs/responses.js.map +1 -0
- package/lib/mjs/routeStats.d.ts +43 -0
- package/lib/mjs/routeStats.d.ts.map +1 -0
- package/lib/mjs/routeStats.js +55 -0
- package/lib/mjs/routeStats.js.map +1 -0
- package/lib/mjs/schemas/HealthResponse.schema.d.ts +30 -0
- package/lib/mjs/schemas/HealthResponse.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/HealthResponse.schema.js +13 -0
- package/lib/mjs/schemas/HealthResponse.schema.js.map +1 -0
- package/lib/mjs/schemas/PerfResponse.schema.d.ts +56 -0
- package/lib/mjs/schemas/PerfResponse.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/PerfResponse.schema.js +34 -0
- package/lib/mjs/schemas/PerfResponse.schema.js.map +1 -0
- package/lib/mjs/schemas/ReadyResponse.schema.d.ts +36 -0
- package/lib/mjs/schemas/ReadyResponse.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/ReadyResponse.schema.js +21 -0
- package/lib/mjs/schemas/ReadyResponse.schema.js.map +1 -0
- package/lib/mjs/schemas/RequestStatsSnapshot.schema.d.ts +79 -0
- package/lib/mjs/schemas/RequestStatsSnapshot.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/RequestStatsSnapshot.schema.js +28 -0
- package/lib/mjs/schemas/RequestStatsSnapshot.schema.js.map +1 -0
- package/lib/mjs/schemas/RoutesResponse.schema.d.ts +100 -0
- package/lib/mjs/schemas/RoutesResponse.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/RoutesResponse.schema.js +20 -0
- package/lib/mjs/schemas/RoutesResponse.schema.js.map +1 -0
- package/lib/mjs/schemas/StatsResponse.schema.d.ts +158 -0
- package/lib/mjs/schemas/StatsResponse.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/StatsResponse.schema.js +14 -0
- package/lib/mjs/schemas/StatsResponse.schema.js.map +1 -0
- package/lib/mjs/schemas/TimelineResponse.schema.d.ts +109 -0
- package/lib/mjs/schemas/TimelineResponse.schema.d.ts.map +1 -0
- package/lib/mjs/schemas/TimelineResponse.schema.js +23 -0
- package/lib/mjs/schemas/TimelineResponse.schema.js.map +1 -0
- package/lib/mjs/store.d.ts +58 -0
- package/lib/mjs/store.d.ts.map +1 -0
- package/lib/mjs/store.js +105 -0
- package/lib/mjs/store.js.map +1 -0
- package/lib/mjs/timeline.d.ts +48 -0
- package/lib/mjs/timeline.d.ts.map +1 -0
- package/lib/mjs/timeline.js +66 -0
- package/lib/mjs/timeline.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -0
- package/lib/tsconfig.mjs.tsbuildinfo +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PromMetricSink = exports.PERF_DURATION_BUCKETS_MS = void 0;
|
|
10
|
+
const di_1 = require("@spinajs/di");
|
|
11
|
+
const log_1 = require("@spinajs/log");
|
|
12
|
+
const metrics_js_1 = require("./metrics.js");
|
|
13
|
+
/** Duration histogram buckets ( ms ), mirroring the http telemetry middleware. */
|
|
14
|
+
exports.PERF_DURATION_BUCKETS_MS = [1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000];
|
|
15
|
+
/**
|
|
16
|
+
* {@link PerfSink} that forwards perf measurements to the shared prom-client
|
|
17
|
+
* {@link Metrics} registry — the prom side of the dual-sink. Span durations go
|
|
18
|
+
* to `perf_span_duration_ms{name}`; counter/value events increment
|
|
19
|
+
* `perf_events_total{name}`; per-request scope totals go to their own
|
|
20
|
+
* `perf_scope_total_ms{name}` histogram so they don't conflate with the
|
|
21
|
+
* per-span distribution. Labels are restricted to `name` ( plus the metric's
|
|
22
|
+
* own low-cardinality labels are folded into the name label space via a single
|
|
23
|
+
* `name` label to stay bounded ).
|
|
24
|
+
*/
|
|
25
|
+
let PromMetricSink = class PromMetricSink extends log_1.PerfSink {
|
|
26
|
+
constructor() {
|
|
27
|
+
super(...arguments);
|
|
28
|
+
this.defined = false;
|
|
29
|
+
}
|
|
30
|
+
ensure() {
|
|
31
|
+
if (this.defined)
|
|
32
|
+
return;
|
|
33
|
+
this.metrics = di_1.DI.get(metrics_js_1.Metrics) ?? di_1.DI.resolve(metrics_js_1.Metrics);
|
|
34
|
+
const map = this.metrics.defineMetrics("perf", [
|
|
35
|
+
{ name: "span_duration_ms", help: "Perf span duration in ms", type: "histogram", labelNames: ["name"], buckets: exports.PERF_DURATION_BUCKETS_MS },
|
|
36
|
+
{ name: "events_total", help: "Perf counter/value events", type: "counter", labelNames: ["name"] },
|
|
37
|
+
{ name: "scope_total_ms", help: "Perf per-request scope total duration in ms", type: "histogram", labelNames: ["name"], buckets: exports.PERF_DURATION_BUCKETS_MS },
|
|
38
|
+
]);
|
|
39
|
+
this.duration = map["span_duration_ms"];
|
|
40
|
+
this.events = map["events_total"];
|
|
41
|
+
this.scopeTotal = map["scope_total_ms"];
|
|
42
|
+
this.defined = true;
|
|
43
|
+
}
|
|
44
|
+
collect(metric) {
|
|
45
|
+
this.ensure();
|
|
46
|
+
if (metric.kind === "span") {
|
|
47
|
+
this.duration.observe({ name: metric.name }, metric.durationMs ?? 0);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
this.events.inc({ name: metric.name }, metric.value ?? 1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
onScopeEnd(rollup) {
|
|
54
|
+
this.ensure();
|
|
55
|
+
for (const [name, e] of Object.entries(rollup.byName)) {
|
|
56
|
+
// per-request totals: record the aggregate duration once per request, into
|
|
57
|
+
// its own histogram so it doesn't conflate with the per-span distribution.
|
|
58
|
+
if (e.totalMs > 0)
|
|
59
|
+
this.scopeTotal.observe({ name }, e.totalMs);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
exports.PromMetricSink = PromMetricSink;
|
|
64
|
+
exports.PromMetricSink = PromMetricSink = __decorate([
|
|
65
|
+
(0, di_1.Singleton)(),
|
|
66
|
+
(0, di_1.Injectable)(log_1.PerfSink)
|
|
67
|
+
], PromMetricSink);
|
|
68
|
+
//# sourceMappingURL=PromMetricSink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PromMetricSink.js","sourceRoot":"","sources":["../../src/PromMetricSink.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oCAAwD;AACxD,sCAAkE;AAElE,6CAAkD;AAElD,kFAAkF;AACrE,QAAA,wBAAwB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAEnG;;;;;;;;;GASG;AAGI,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,cAAQ;IAArC;;QAKG,YAAO,GAAG,KAAK,CAAC;IAiC1B,CAAC;IA/BS,MAAM;QACZ,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,OAAE,CAAC,GAAG,CAAC,oBAAO,CAAC,IAAI,OAAE,CAAC,OAAO,CAAC,oBAAO,CAAC,CAAC;QACtD,MAAM,GAAG,GAAc,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE;YACxD,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gCAAwB,EAAE;YAC1I,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE;YAClG,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,6CAA6C,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,gCAAwB,EAAE;SAC5J,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,kBAAkB,CAAsB,CAAC;QAC7D,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,cAAc,CAAoB,CAAC;QACrD,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,gBAAgB,CAAsB,CAAC;QAC7D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAEM,OAAO,CAAC,MAAmB;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,MAAmB;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACtD,2EAA2E;YAC3E,2EAA2E;YAC3E,IAAI,CAAC,CAAC,OAAO,GAAG,CAAC;gBAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF,CAAA;AAtCY,wCAAc;yBAAd,cAAc;IAF1B,IAAA,cAAS,GAAE;IACX,IAAA,eAAU,EAAC,cAAQ,CAAC;GACR,cAAc,CAsC1B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Bootstrapper } from '@spinajs/di';
|
|
2
|
+
/**
|
|
3
|
+
* Wires the telemetry collection layer at startup:
|
|
4
|
+
*
|
|
5
|
+
* - registers prom-client's default process metrics against the PRIVATE
|
|
6
|
+
* registry ( never the global default one ), when configured,
|
|
7
|
+
* - builds the perf sinks and refreshes the Perf facade's sink list, so the
|
|
8
|
+
* perf bridge is live in apps that use telemetry WITHOUT @spinajs/http.
|
|
9
|
+
*/
|
|
10
|
+
export declare class TelemetryBootstrapper extends Bootstrapper {
|
|
11
|
+
bootstrap(): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAM,MAAM,aAAa,CAAC;AAM3D;;;;;;;GAOG;AACH,qBACa,qBAAsB,SAAQ,YAAY;IAC9C,SAAS,IAAI,IAAI;CAiCzB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TelemetryBootstrapper = void 0;
|
|
10
|
+
const di_1 = require("@spinajs/di");
|
|
11
|
+
const configuration_1 = require("@spinajs/configuration");
|
|
12
|
+
const log_1 = require("@spinajs/log");
|
|
13
|
+
const metrics_js_1 = require("./metrics.js");
|
|
14
|
+
/**
|
|
15
|
+
* Wires the telemetry collection layer at startup:
|
|
16
|
+
*
|
|
17
|
+
* - registers prom-client's default process metrics against the PRIVATE
|
|
18
|
+
* registry ( never the global default one ), when configured,
|
|
19
|
+
* - builds the perf sinks and refreshes the Perf facade's sink list, so the
|
|
20
|
+
* perf bridge is live in apps that use telemetry WITHOUT @spinajs/http.
|
|
21
|
+
*/
|
|
22
|
+
let TelemetryBootstrapper = class TelemetryBootstrapper extends di_1.Bootstrapper {
|
|
23
|
+
bootstrap() {
|
|
24
|
+
const cfg = di_1.DI.get(configuration_1.Configuration);
|
|
25
|
+
const metrics = di_1.DI.get(metrics_js_1.Metrics) ?? di_1.DI.resolve(metrics_js_1.Metrics);
|
|
26
|
+
if (cfg?.get('telemetry.collectDefaultMetrics', true)) {
|
|
27
|
+
metrics.collectDefault();
|
|
28
|
+
}
|
|
29
|
+
// Build the sinks through the ARRAY, never with a direct
|
|
30
|
+
// `DI.resolve( PromMetricSink )`. A direct resolve caches the instance under
|
|
31
|
+
// its own type name only; the later `Array.ofType( PerfSink )` — which is
|
|
32
|
+
// what the Perf facade uses — then hits that cache entry on its fast path,
|
|
33
|
+
// returns it WITHOUT adding it to the `PerfSink` list, and the facade stays
|
|
34
|
+
// blind to that sink. Resolving the array first creates them together.
|
|
35
|
+
const sinks = di_1.DI.resolve(Array.ofType(log_1.PerfSink));
|
|
36
|
+
// The array cache does not double as a per-type cache, so publish each
|
|
37
|
+
// instance under its own type name too. Without this a later
|
|
38
|
+
// `@Autoinject( InMemoryPerfSink )` ( the telemetry controller does exactly
|
|
39
|
+
// that ) would build a SECOND, permanently empty sink.
|
|
40
|
+
//
|
|
41
|
+
// `override` MUST be true: without it `asValue` APPENDS to an existing cache
|
|
42
|
+
// entry instead of replacing it, while the resolve fast path keeps handing
|
|
43
|
+
// out the entry it already had. So anything that resolved a sink directly
|
|
44
|
+
// BEFORE this bootstrapper ran — an earlier-ordered consumer bootstrapper,
|
|
45
|
+
// or an app still calling `DI.resolve( PromMetricSink )` — would pin
|
|
46
|
+
// `@Autoinject` to that earlier, permanently empty instance.
|
|
47
|
+
for (const sink of sinks) {
|
|
48
|
+
di_1.DI.register(sink).asValue(sink.constructor.name, true);
|
|
49
|
+
}
|
|
50
|
+
log_1.Perf.refreshSinks();
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.TelemetryBootstrapper = TelemetryBootstrapper;
|
|
54
|
+
exports.TelemetryBootstrapper = TelemetryBootstrapper = __decorate([
|
|
55
|
+
(0, di_1.Injectable)(di_1.Bootstrapper)
|
|
56
|
+
], TelemetryBootstrapper);
|
|
57
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/bootstrap.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oCAA2D;AAC3D,0DAAuD;AACvD,sCAA8C;AAE9C,6CAAuC;AAEvC;;;;;;;GAOG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,iBAAY;IAC9C,SAAS;QACd,MAAM,GAAG,GAAG,OAAE,CAAC,GAAG,CAAC,6BAAa,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,OAAE,CAAC,GAAG,CAAC,oBAAO,CAAC,IAAI,OAAE,CAAC,OAAO,CAAC,oBAAO,CAAC,CAAC;QAEvD,IAAI,GAAG,EAAE,GAAG,CAAU,iCAAiC,EAAE,IAAI,CAAC,EAAE,CAAC;YAC/D,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,CAAC;QAED,yDAAyD;QACzD,6EAA6E;QAC7E,0EAA0E;QAC1E,2EAA2E;QAC3E,4EAA4E;QAC5E,uEAAuE;QACvE,MAAM,KAAK,GAAG,OAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,cAAQ,CAAC,CAAC,CAAC;QAEjD,uEAAuE;QACvE,6DAA6D;QAC7D,4EAA4E;QAC5E,uDAAuD;QACvD,EAAE;QACF,6EAA6E;QAC7E,2EAA2E;QAC3E,0EAA0E;QAC1E,2EAA2E;QAC3E,qEAAqE;QACrE,6DAA6D;QAC7D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;QAED,UAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;AAlCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,eAAU,EAAC,iBAAY,CAAC;GACZ,qBAAqB,CAkCjC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
declare const config: {
|
|
2
|
+
system: {
|
|
3
|
+
dirs: {
|
|
4
|
+
controllers: string[];
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
telemetry: {
|
|
8
|
+
auth: {
|
|
9
|
+
token: string;
|
|
10
|
+
/**
|
|
11
|
+
* Policy class name per endpoint. Each route resolves its policy by
|
|
12
|
+
* reading the config key below, so access can be tightened or loosened
|
|
13
|
+
* per endpoint without touching code.
|
|
14
|
+
*/
|
|
15
|
+
policies: {
|
|
16
|
+
metrics: string;
|
|
17
|
+
stats: string;
|
|
18
|
+
timeline: string;
|
|
19
|
+
routes: string;
|
|
20
|
+
perf: string;
|
|
21
|
+
health: string;
|
|
22
|
+
ready: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Register prom-client's process / heap / cpu / event-loop metrics against
|
|
27
|
+
* the private registry at bootstrap.
|
|
28
|
+
*/
|
|
29
|
+
collectDefaultMetrics: boolean;
|
|
30
|
+
/** Metric name prefix for the http telemetry metrics. */
|
|
31
|
+
prefix: string;
|
|
32
|
+
/** Duration histogram buckets in ms. */
|
|
33
|
+
buckets: number[];
|
|
34
|
+
/** Apdex satisfied threshold in ms; tolerated is 4x this. */
|
|
35
|
+
apdexThresholdMs: number;
|
|
36
|
+
timeline: {
|
|
37
|
+
/** Number of buckets retained in the ring. */
|
|
38
|
+
length: number;
|
|
39
|
+
/** Bucket width in ms. */
|
|
40
|
+
bucketMs: number;
|
|
41
|
+
};
|
|
42
|
+
routes: {
|
|
43
|
+
enabled: boolean;
|
|
44
|
+
/** Cap on distinct method+route keys held in memory. */
|
|
45
|
+
maxEntries: number;
|
|
46
|
+
};
|
|
47
|
+
perf: {
|
|
48
|
+
enabled: boolean;
|
|
49
|
+
/** Cap on distinct perf measurement names held in memory. */
|
|
50
|
+
maxNames: number;
|
|
51
|
+
};
|
|
52
|
+
health: {
|
|
53
|
+
/** Per-check timeout in ms. A timed-out check counts as down. */
|
|
54
|
+
timeoutMs: number;
|
|
55
|
+
/** When true a degraded overall status returns 503 rather than 200. */
|
|
56
|
+
failOnDegraded: boolean;
|
|
57
|
+
/** Reported by /telemetry/health. Omitted from the response when unset. */
|
|
58
|
+
version: string | undefined;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
export default config;
|
|
63
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/config/telemetry.ts"],"names":[],"mappings":"AAcA,QAAA,MAAM,MAAM;;;;;;;;;YAYN;;;;eAIG;;;;;;;;;;;QAcL;;;WAGG;;QAGH,yDAAyD;;QAGzD,wCAAwC;;QAGxC,6DAA6D;;;YAI3D,8CAA8C;;YAE9C,0BAA0B;;;;;YAM1B,wDAAwD;;;;;YAMxD,6DAA6D;;;;YAK7D,iEAAiE;;YAEjE,uEAAuE;;YAEvE,2EAA2E;qBACrD,MAAM,GAAG,SAAS;;;CAG7C,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const path_1 = require("path");
|
|
4
|
+
function dir(path) {
|
|
5
|
+
const inCommonJs = typeof module !== 'undefined';
|
|
6
|
+
return (0, path_1.resolve)((0, path_1.normalize)((0, path_1.join)(process.env.WORKSPACE_ROOT_PATH ?? process.cwd(), 'node_modules', '@spinajs', 'telemetry', 'lib', inCommonJs ? 'cjs' : 'mjs', path)));
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Duration histogram bucket boundaries ( ms ) for http request timing. Kept in
|
|
10
|
+
* sync with DURATION_BUCKETS_MS in middleware.ts, which is the compile-time
|
|
11
|
+
* default when no configuration is present.
|
|
12
|
+
*/
|
|
13
|
+
const DURATION_BUCKETS_MS = [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000];
|
|
14
|
+
const config = {
|
|
15
|
+
system: {
|
|
16
|
+
dirs: {
|
|
17
|
+
controllers: [dir('controllers')],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
telemetry: {
|
|
21
|
+
auth: {
|
|
22
|
+
// set this in your project
|
|
23
|
+
token: '',
|
|
24
|
+
/**
|
|
25
|
+
* Policy class name per endpoint. Each route resolves its policy by
|
|
26
|
+
* reading the config key below, so access can be tightened or loosened
|
|
27
|
+
* per endpoint without touching code.
|
|
28
|
+
*/
|
|
29
|
+
policies: {
|
|
30
|
+
metrics: 'TelemetryTokenPolicy',
|
|
31
|
+
stats: 'TelemetryTokenPolicy',
|
|
32
|
+
timeline: 'TelemetryTokenPolicy',
|
|
33
|
+
routes: 'TelemetryTokenPolicy',
|
|
34
|
+
perf: 'TelemetryTokenPolicy',
|
|
35
|
+
// probe endpoints must be reachable without credentials
|
|
36
|
+
health: 'PublicPolicy',
|
|
37
|
+
ready: 'PublicPolicy',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
/**
|
|
41
|
+
* Register prom-client's process / heap / cpu / event-loop metrics against
|
|
42
|
+
* the private registry at bootstrap.
|
|
43
|
+
*/
|
|
44
|
+
collectDefaultMetrics: true,
|
|
45
|
+
/** Metric name prefix for the http telemetry metrics. */
|
|
46
|
+
prefix: 'http',
|
|
47
|
+
/** Duration histogram buckets in ms. */
|
|
48
|
+
buckets: DURATION_BUCKETS_MS,
|
|
49
|
+
/** Apdex satisfied threshold in ms; tolerated is 4x this. */
|
|
50
|
+
apdexThresholdMs: 25,
|
|
51
|
+
timeline: {
|
|
52
|
+
/** Number of buckets retained in the ring. */
|
|
53
|
+
length: 60,
|
|
54
|
+
/** Bucket width in ms. */
|
|
55
|
+
bucketMs: 60_000,
|
|
56
|
+
},
|
|
57
|
+
routes: {
|
|
58
|
+
enabled: true,
|
|
59
|
+
/** Cap on distinct method+route keys held in memory. */
|
|
60
|
+
maxEntries: 500,
|
|
61
|
+
},
|
|
62
|
+
perf: {
|
|
63
|
+
enabled: true,
|
|
64
|
+
/** Cap on distinct perf measurement names held in memory. */
|
|
65
|
+
maxNames: 200,
|
|
66
|
+
},
|
|
67
|
+
health: {
|
|
68
|
+
/** Per-check timeout in ms. A timed-out check counts as down. */
|
|
69
|
+
timeoutMs: 2000,
|
|
70
|
+
/** When true a degraded overall status returns 503 rather than 200. */
|
|
71
|
+
failOnDegraded: false,
|
|
72
|
+
/** Reported by /telemetry/health. Omitted from the response when unset. */
|
|
73
|
+
version: undefined,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
exports.default = config;
|
|
78
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../../src/config/telemetry.ts"],"names":[],"mappings":";;AAAA,+BAAgD;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;IACjD,OAAO,IAAA,cAAO,EAAC,IAAA,gBAAS,EAAC,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtK,CAAC;AAED;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;AAEpF,MAAM,MAAM,GAAG;IACb,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,WAAW,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;SAClC;KACF;IAED,SAAS,EAAE;QACT,IAAI,EAAE;YACJ,2BAA2B;YAC3B,KAAK,EAAE,EAAE;YAET;;;;eAIG;YACH,QAAQ,EAAE;gBACR,OAAO,EAAE,sBAAsB;gBAC/B,KAAK,EAAE,sBAAsB;gBAC7B,QAAQ,EAAE,sBAAsB;gBAChC,MAAM,EAAE,sBAAsB;gBAC9B,IAAI,EAAE,sBAAsB;gBAE5B,wDAAwD;gBACxD,MAAM,EAAE,cAAc;gBACtB,KAAK,EAAE,cAAc;aACtB;SACF;QAED;;;WAGG;QACH,qBAAqB,EAAE,IAAI;QAE3B,yDAAyD;QACzD,MAAM,EAAE,MAAM;QAEd,wCAAwC;QACxC,OAAO,EAAE,mBAAmB;QAE5B,6DAA6D;QAC7D,gBAAgB,EAAE,EAAE;QAEpB,QAAQ,EAAE;YACR,8CAA8C;YAC9C,MAAM,EAAE,EAAE;YACV,0BAA0B;YAC1B,QAAQ,EAAE,MAAM;SACjB;QAED,MAAM,EAAE;YACN,OAAO,EAAE,IAAI;YACb,wDAAwD;YACxD,UAAU,EAAE,GAAG;SAChB;QAED,IAAI,EAAE;YACJ,OAAO,EAAE,IAAI;YACb,6DAA6D;YAC7D,QAAQ,EAAE,GAAG;SACd;QAED,MAAM,EAAE;YACN,iEAAiE;YACjE,SAAS,EAAE,IAAI;YACf,uEAAuE;YACvE,cAAc,EAAE,KAAK;YACrB,2EAA2E;YAC3E,OAAO,EAAE,SAA+B;SACzC;KACF;CACF,CAAC;AAEF,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BaseController } from '@spinajs/http';
|
|
2
|
+
import { Metrics } from './../metrics.js';
|
|
3
|
+
import { PrometheusResponse } from './../responses.js';
|
|
4
|
+
import './../policies/TelemetryTokenPolicy.js';
|
|
5
|
+
import './../policies/PublicPolicy.js';
|
|
6
|
+
/**
|
|
7
|
+
* Prometheus scrape endpoint.
|
|
8
|
+
*
|
|
9
|
+
* Deliberately kept at the bare `/metrics` path rather than under the
|
|
10
|
+
* `/telemetry` prefix used by the JSON api — this is the path existing
|
|
11
|
+
* `scrape_configs` already point at.
|
|
12
|
+
*/
|
|
13
|
+
export declare class MetricsController extends BaseController {
|
|
14
|
+
protected MetricsService: Metrics;
|
|
15
|
+
/**
|
|
16
|
+
* Prometheus exposition text for every metric on the registry: the `http_*`
|
|
17
|
+
* request metrics, the `perf_*` bridge metrics, any application metrics
|
|
18
|
+
* declared through `Metrics.defineMetrics`, and — when
|
|
19
|
+
* `telemetry.collectDefaultMetrics` is on — the `process_*` / `nodejs_*` set.
|
|
20
|
+
*
|
|
21
|
+
* @response 200 {string} Prometheus exposition text ( text/plain )
|
|
22
|
+
* @response 403 Access token missing or invalid
|
|
23
|
+
*/
|
|
24
|
+
getMetrics(): Promise<PrometheusResponse>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Metrics.d.ts","sourceRoot":"","sources":["../../../src/controllers/Metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,cAAc,EAAe,MAAM,eAAe,CAAC;AAGtE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAUvD,OAAO,uCAAuC,CAAC;AAC/C,OAAO,+BAA+B,CAAC;AAEvC;;;;;;GAMG;AACH,qBACa,iBAAkB,SAAQ,cAAc;IAEnD,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC;IAElC;;;;;;;;OAQG;IAGU,UAAU;CAGxB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.MetricsController = void 0;
|
|
13
|
+
const http_1 = require("@spinajs/http");
|
|
14
|
+
const di_1 = require("@spinajs/di");
|
|
15
|
+
const metrics_js_1 = require("./../metrics.js");
|
|
16
|
+
const responses_js_1 = require("./../responses.js");
|
|
17
|
+
// Importing the policy modules runs their @Injectable decorators, which is what
|
|
18
|
+
// puts the classes in the DI container under the names the routes below name as
|
|
19
|
+
// STRINGS ( via `telemetry.auth.policies.*` ). Nothing else forces them to load:
|
|
20
|
+
// this controller is mounted by the config-declared directory scan, and that
|
|
21
|
+
// configuration is auto-discovered from node_modules — so an app never has to
|
|
22
|
+
// import the package barrel. And http FAILS OPEN on an unresolvable policy name
|
|
23
|
+
// ( it logs `No policy named ...`, drops it, and a route left with no policies
|
|
24
|
+
// calls next() ), which would serve /metrics unauthenticated.
|
|
25
|
+
require("./../policies/TelemetryTokenPolicy.js");
|
|
26
|
+
require("./../policies/PublicPolicy.js");
|
|
27
|
+
/**
|
|
28
|
+
* Prometheus scrape endpoint.
|
|
29
|
+
*
|
|
30
|
+
* Deliberately kept at the bare `/metrics` path rather than under the
|
|
31
|
+
* `/telemetry` prefix used by the JSON api — this is the path existing
|
|
32
|
+
* `scrape_configs` already point at.
|
|
33
|
+
*/
|
|
34
|
+
let MetricsController = class MetricsController extends http_1.BaseController {
|
|
35
|
+
/**
|
|
36
|
+
* Prometheus exposition text for every metric on the registry: the `http_*`
|
|
37
|
+
* request metrics, the `perf_*` bridge metrics, any application metrics
|
|
38
|
+
* declared through `Metrics.defineMetrics`, and — when
|
|
39
|
+
* `telemetry.collectDefaultMetrics` is on — the `process_*` / `nodejs_*` set.
|
|
40
|
+
*
|
|
41
|
+
* @response 200 {string} Prometheus exposition text ( text/plain )
|
|
42
|
+
* @response 403 Access token missing or invalid
|
|
43
|
+
*/
|
|
44
|
+
async getMetrics() {
|
|
45
|
+
return new responses_js_1.PrometheusResponse(this.MetricsService);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.MetricsController = MetricsController;
|
|
49
|
+
__decorate([
|
|
50
|
+
(0, di_1.Autoinject)(metrics_js_1.Metrics),
|
|
51
|
+
__metadata("design:type", metrics_js_1.Metrics)
|
|
52
|
+
], MetricsController.prototype, "MetricsService", void 0);
|
|
53
|
+
__decorate([
|
|
54
|
+
(0, http_1.Get)('/'),
|
|
55
|
+
(0, http_1.Policy)('telemetry.auth.policies.metrics'),
|
|
56
|
+
__metadata("design:type", Function),
|
|
57
|
+
__metadata("design:paramtypes", []),
|
|
58
|
+
__metadata("design:returntype", Promise)
|
|
59
|
+
], MetricsController.prototype, "getMetrics", null);
|
|
60
|
+
exports.MetricsController = MetricsController = __decorate([
|
|
61
|
+
(0, http_1.BasePath)('metrics')
|
|
62
|
+
], MetricsController);
|
|
63
|
+
//# sourceMappingURL=Metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Metrics.js","sourceRoot":"","sources":["../../../src/controllers/Metrics.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wCAAsE;AACtE,oCAAyC;AAEzC,gDAA0C;AAC1C,oDAAuD;AAEvD,gFAAgF;AAChF,gFAAgF;AAChF,iFAAiF;AACjF,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,+EAA+E;AAC/E,8DAA8D;AAC9D,iDAA+C;AAC/C,yCAAuC;AAEvC;;;;;;GAMG;AAEI,IAAM,iBAAiB,GAAvB,MAAM,iBAAkB,SAAQ,qBAAc;IAInD;;;;;;;;OAQG;IAGU,AAAN,KAAK,CAAC,UAAU;QACrB,OAAO,IAAI,iCAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AAlBY,8CAAiB;AAElB;IADT,IAAA,eAAU,EAAC,oBAAO,CAAC;8BACM,oBAAO;yDAAC;AAarB;IAFZ,IAAA,UAAG,EAAC,GAAG,CAAC;IACR,IAAA,aAAM,EAAC,iCAAiC,CAAC;;;;mDAGzC;4BAjBU,iBAAiB;IAD7B,IAAA,eAAQ,EAAC,SAAS,CAAC;GACP,iBAAiB,CAkB7B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { BaseController, Ok } from '@spinajs/http';
|
|
2
|
+
import { TelemetryStore } from './../store.js';
|
|
3
|
+
import { InMemoryPerfSink } from './../InMemoryPerfSink.js';
|
|
4
|
+
import { HealthCheckRunner } from './../health.js';
|
|
5
|
+
import { ServiceUnavailable } from './../responses.js';
|
|
6
|
+
import './../dto/index.js';
|
|
7
|
+
import './../policies/TelemetryTokenPolicy.js';
|
|
8
|
+
import './../policies/PublicPolicy.js';
|
|
9
|
+
/**
|
|
10
|
+
* JSON telemetry API. Machine-facing — consumed by dashboards, uptime monitors
|
|
11
|
+
* and orchestrator probes.
|
|
12
|
+
*
|
|
13
|
+
* The prometheus scrape endpoint deliberately lives on its own controller at
|
|
14
|
+
* the bare `/metrics` path, not under this prefix.
|
|
15
|
+
*/
|
|
16
|
+
export declare class TelemetryController extends BaseController {
|
|
17
|
+
protected Store: TelemetryStore;
|
|
18
|
+
protected PerfSink: InMemoryPerfSink;
|
|
19
|
+
protected Health: HealthCheckRunner;
|
|
20
|
+
protected Version: string;
|
|
21
|
+
/**
|
|
22
|
+
* Lifetime request statistics plus the rolling timeline.
|
|
23
|
+
*
|
|
24
|
+
* @returns {StatsResponse} Lifetime stats and the per-bucket timeline
|
|
25
|
+
* @response 403 Access token missing or invalid
|
|
26
|
+
*/
|
|
27
|
+
getStats(): Promise<Ok<{
|
|
28
|
+
all: import("../requestStats.js").IRequestStatsSnapshot;
|
|
29
|
+
timeline: import("../timeline.js").ITimelineSnapshot;
|
|
30
|
+
}>>;
|
|
31
|
+
/**
|
|
32
|
+
* The rolling timeline alone, with each bucket annotated with the wall-clock
|
|
33
|
+
* window it covers so consumers do not have to reverse the bucket key.
|
|
34
|
+
*
|
|
35
|
+
* @param buckets - how many of the most recent buckets to return; all of them when omitted
|
|
36
|
+
* @returns {TimelineResponse} The annotated timeline
|
|
37
|
+
* @response 400 `buckets` was not a positive integer
|
|
38
|
+
* @response 403 Access token missing or invalid
|
|
39
|
+
*/
|
|
40
|
+
getTimeline(buckets?: string): Promise<Ok<{
|
|
41
|
+
bucketMs: number;
|
|
42
|
+
length: number;
|
|
43
|
+
buckets: {
|
|
44
|
+
key: number;
|
|
45
|
+
from: number;
|
|
46
|
+
to: number;
|
|
47
|
+
stats: import("../requestStats.js").IRequestStatsSnapshot;
|
|
48
|
+
}[];
|
|
49
|
+
}>>;
|
|
50
|
+
/**
|
|
51
|
+
* Per method+route request breakdown.
|
|
52
|
+
*
|
|
53
|
+
* No percentiles — query them from prometheus against the `route`-labelled
|
|
54
|
+
* `http_request_duration_ms` histogram, which carries the same label values.
|
|
55
|
+
*
|
|
56
|
+
* @returns {RoutesResponse} Per-route request statistics
|
|
57
|
+
* @response 403 Access token missing or invalid
|
|
58
|
+
*/
|
|
59
|
+
getRoutes(): Promise<Ok<import("../routeStats.js").IRouteStatsSnapshot>>;
|
|
60
|
+
/**
|
|
61
|
+
* Aggregated performance measurements collected through the `Perf` facade —
|
|
62
|
+
* every `Perf.measure`, `@Measure`, `Perf.count` and `Perf.value` in the
|
|
63
|
+
* process, including the ORM's `orm.query` spans.
|
|
64
|
+
*
|
|
65
|
+
* @returns {PerfResponse} Aggregated spans and events
|
|
66
|
+
* @response 403 Access token missing or invalid
|
|
67
|
+
*/
|
|
68
|
+
getPerf(): Promise<Ok<import("./../InMemoryPerfSink.js").IPerfSnapshot>>;
|
|
69
|
+
/**
|
|
70
|
+
* Liveness. Runs no checks, so it can never be made slow or flaky by a
|
|
71
|
+
* dependency — if this answers, the process is alive.
|
|
72
|
+
*
|
|
73
|
+
* @returns {HealthResponse} Process liveness information
|
|
74
|
+
*/
|
|
75
|
+
getHealth(): Promise<Ok<{
|
|
76
|
+
version?: string | undefined;
|
|
77
|
+
status: string;
|
|
78
|
+
startedAt: number;
|
|
79
|
+
uptimeMs: number;
|
|
80
|
+
pid: number;
|
|
81
|
+
node: string;
|
|
82
|
+
}>>;
|
|
83
|
+
/**
|
|
84
|
+
* Readiness. Runs every registered `HealthCheck`, each raced against
|
|
85
|
+
* `telemetry.health.timeoutMs`.
|
|
86
|
+
*
|
|
87
|
+
* @returns {ReadyResponse} Overall readiness and the per-check results
|
|
88
|
+
* @response 503 At least one check is down ( or degraded, when `telemetry.health.failOnDegraded` is set )
|
|
89
|
+
*/
|
|
90
|
+
getReady(): Promise<ServiceUnavailable<import("./../health.js").IReadyReport> | Ok<import("./../health.js").IReadyReport>>;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=Telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Telemetry.d.ts","sourceRoot":"","sources":["../../../src/controllers/Telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,cAAc,EAAsB,EAAE,EAAE,MAAM,eAAe,CAAC;AAKjF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAIvD,OAAO,mBAAmB,CAAC;AAW3B,OAAO,uCAAuC,CAAC;AAC/C,OAAO,+BAA+B,CAAC;AAEvC;;;;;;GAMG;AACH,qBACa,mBAAoB,SAAQ,cAAc;IAErD,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC;IAGhC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IAGrC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAGpC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAE1B;;;;;OAKG;IAGU,QAAQ;;;;IAarB;;;;;;;;OAQG;IAGU,WAAW,CAAU,OAAO,CAAC,EAAE,MAAM;;;;;;;;;;IA0ClD;;;;;;;;OAQG;IAGU,SAAS;IAItB;;;;;;;OAOG;IAGU,OAAO;IAIpB;;;;;OAKG;IAGU,SAAS;;;;;;;;IAetB;;;;;;OAMG;IAGU,QAAQ;CAStB"}
|