@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.
Files changed (214) hide show
  1. package/README.md +482 -0
  2. package/lib/cjs/InMemoryPerfSink.d.ts +51 -0
  3. package/lib/cjs/InMemoryPerfSink.d.ts.map +1 -0
  4. package/lib/cjs/InMemoryPerfSink.js +100 -0
  5. package/lib/cjs/InMemoryPerfSink.js.map +1 -0
  6. package/lib/cjs/PromMetricSink.d.ts +26 -0
  7. package/lib/cjs/PromMetricSink.d.ts.map +1 -0
  8. package/lib/cjs/PromMetricSink.js +68 -0
  9. package/lib/cjs/PromMetricSink.js.map +1 -0
  10. package/lib/cjs/bootstrap.d.ts +13 -0
  11. package/lib/cjs/bootstrap.d.ts.map +1 -0
  12. package/lib/cjs/bootstrap.js +57 -0
  13. package/lib/cjs/bootstrap.js.map +1 -0
  14. package/lib/cjs/config/telemetry.d.ts +63 -0
  15. package/lib/cjs/config/telemetry.d.ts.map +1 -0
  16. package/lib/cjs/config/telemetry.js +78 -0
  17. package/lib/cjs/config/telemetry.js.map +1 -0
  18. package/lib/cjs/controllers/Metrics.d.ts +26 -0
  19. package/lib/cjs/controllers/Metrics.d.ts.map +1 -0
  20. package/lib/cjs/controllers/Metrics.js +63 -0
  21. package/lib/cjs/controllers/Metrics.js.map +1 -0
  22. package/lib/cjs/controllers/Telemetry.d.ts +92 -0
  23. package/lib/cjs/controllers/Telemetry.d.ts.map +1 -0
  24. package/lib/cjs/controllers/Telemetry.js +226 -0
  25. package/lib/cjs/controllers/Telemetry.js.map +1 -0
  26. package/lib/cjs/dto/index.d.ts +21 -0
  27. package/lib/cjs/dto/index.d.ts.map +1 -0
  28. package/lib/cjs/dto/index.js +64 -0
  29. package/lib/cjs/dto/index.js.map +1 -0
  30. package/lib/cjs/endpoints.d.ts +32 -0
  31. package/lib/cjs/endpoints.d.ts.map +1 -0
  32. package/lib/cjs/endpoints.js +38 -0
  33. package/lib/cjs/endpoints.js.map +1 -0
  34. package/lib/cjs/health.d.ts +55 -0
  35. package/lib/cjs/health.d.ts.map +1 -0
  36. package/lib/cjs/health.js +111 -0
  37. package/lib/cjs/health.js.map +1 -0
  38. package/lib/cjs/index.d.ts +16 -0
  39. package/lib/cjs/index.d.ts.map +1 -0
  40. package/lib/cjs/index.js +32 -0
  41. package/lib/cjs/index.js.map +1 -0
  42. package/lib/cjs/metrics.d.ts +16 -0
  43. package/lib/cjs/metrics.d.ts.map +1 -0
  44. package/lib/cjs/metrics.js +32 -0
  45. package/lib/cjs/metrics.js.map +1 -0
  46. package/lib/cjs/middleware.d.ts +81 -0
  47. package/lib/cjs/middleware.d.ts.map +1 -0
  48. package/lib/cjs/middleware.js +210 -0
  49. package/lib/cjs/middleware.js.map +1 -0
  50. package/lib/cjs/package.json +1 -0
  51. package/lib/cjs/policies/PublicPolicy.d.ts +16 -0
  52. package/lib/cjs/policies/PublicPolicy.d.ts.map +1 -0
  53. package/lib/cjs/policies/PublicPolicy.js +34 -0
  54. package/lib/cjs/policies/PublicPolicy.js.map +1 -0
  55. package/lib/cjs/policies/TelemetryTokenPolicy.d.ts +19 -0
  56. package/lib/cjs/policies/TelemetryTokenPolicy.d.ts.map +1 -0
  57. package/lib/cjs/policies/TelemetryTokenPolicy.js +65 -0
  58. package/lib/cjs/policies/TelemetryTokenPolicy.js.map +1 -0
  59. package/lib/cjs/requestStats.d.ts +81 -0
  60. package/lib/cjs/requestStats.d.ts.map +1 -0
  61. package/lib/cjs/requestStats.js +134 -0
  62. package/lib/cjs/requestStats.js.map +1 -0
  63. package/lib/cjs/responses.d.ts +23 -0
  64. package/lib/cjs/responses.d.ts.map +1 -0
  65. package/lib/cjs/responses.js +35 -0
  66. package/lib/cjs/responses.js.map +1 -0
  67. package/lib/cjs/routeStats.d.ts +43 -0
  68. package/lib/cjs/routeStats.d.ts.map +1 -0
  69. package/lib/cjs/routeStats.js +59 -0
  70. package/lib/cjs/routeStats.js.map +1 -0
  71. package/lib/cjs/schemas/HealthResponse.schema.d.ts +30 -0
  72. package/lib/cjs/schemas/HealthResponse.schema.d.ts.map +1 -0
  73. package/lib/cjs/schemas/HealthResponse.schema.js +15 -0
  74. package/lib/cjs/schemas/HealthResponse.schema.js.map +1 -0
  75. package/lib/cjs/schemas/PerfResponse.schema.d.ts +56 -0
  76. package/lib/cjs/schemas/PerfResponse.schema.d.ts.map +1 -0
  77. package/lib/cjs/schemas/PerfResponse.schema.js +36 -0
  78. package/lib/cjs/schemas/PerfResponse.schema.js.map +1 -0
  79. package/lib/cjs/schemas/ReadyResponse.schema.d.ts +36 -0
  80. package/lib/cjs/schemas/ReadyResponse.schema.d.ts.map +1 -0
  81. package/lib/cjs/schemas/ReadyResponse.schema.js +23 -0
  82. package/lib/cjs/schemas/ReadyResponse.schema.js.map +1 -0
  83. package/lib/cjs/schemas/RequestStatsSnapshot.schema.d.ts +79 -0
  84. package/lib/cjs/schemas/RequestStatsSnapshot.schema.d.ts.map +1 -0
  85. package/lib/cjs/schemas/RequestStatsSnapshot.schema.js +30 -0
  86. package/lib/cjs/schemas/RequestStatsSnapshot.schema.js.map +1 -0
  87. package/lib/cjs/schemas/RoutesResponse.schema.d.ts +100 -0
  88. package/lib/cjs/schemas/RoutesResponse.schema.d.ts.map +1 -0
  89. package/lib/cjs/schemas/RoutesResponse.schema.js +25 -0
  90. package/lib/cjs/schemas/RoutesResponse.schema.js.map +1 -0
  91. package/lib/cjs/schemas/StatsResponse.schema.d.ts +158 -0
  92. package/lib/cjs/schemas/StatsResponse.schema.d.ts.map +1 -0
  93. package/lib/cjs/schemas/StatsResponse.schema.js +19 -0
  94. package/lib/cjs/schemas/StatsResponse.schema.js.map +1 -0
  95. package/lib/cjs/schemas/TimelineResponse.schema.d.ts +109 -0
  96. package/lib/cjs/schemas/TimelineResponse.schema.d.ts.map +1 -0
  97. package/lib/cjs/schemas/TimelineResponse.schema.js +28 -0
  98. package/lib/cjs/schemas/TimelineResponse.schema.js.map +1 -0
  99. package/lib/cjs/store.d.ts +58 -0
  100. package/lib/cjs/store.d.ts.map +1 -0
  101. package/lib/cjs/store.js +108 -0
  102. package/lib/cjs/store.js.map +1 -0
  103. package/lib/cjs/timeline.d.ts +48 -0
  104. package/lib/cjs/timeline.d.ts.map +1 -0
  105. package/lib/cjs/timeline.js +70 -0
  106. package/lib/cjs/timeline.js.map +1 -0
  107. package/lib/mjs/InMemoryPerfSink.d.ts +51 -0
  108. package/lib/mjs/InMemoryPerfSink.d.ts.map +1 -0
  109. package/lib/mjs/InMemoryPerfSink.js +97 -0
  110. package/lib/mjs/InMemoryPerfSink.js.map +1 -0
  111. package/lib/mjs/PromMetricSink.d.ts +26 -0
  112. package/lib/mjs/PromMetricSink.d.ts.map +1 -0
  113. package/lib/mjs/PromMetricSink.js +65 -0
  114. package/lib/mjs/PromMetricSink.js.map +1 -0
  115. package/lib/mjs/bootstrap.d.ts +13 -0
  116. package/lib/mjs/bootstrap.d.ts.map +1 -0
  117. package/lib/mjs/bootstrap.js +54 -0
  118. package/lib/mjs/bootstrap.js.map +1 -0
  119. package/lib/mjs/config/telemetry.d.ts +63 -0
  120. package/lib/mjs/config/telemetry.d.ts.map +1 -0
  121. package/lib/mjs/config/telemetry.js +76 -0
  122. package/lib/mjs/config/telemetry.js.map +1 -0
  123. package/lib/mjs/controllers/Metrics.d.ts +26 -0
  124. package/lib/mjs/controllers/Metrics.d.ts.map +1 -0
  125. package/lib/mjs/controllers/Metrics.js +60 -0
  126. package/lib/mjs/controllers/Metrics.js.map +1 -0
  127. package/lib/mjs/controllers/Telemetry.d.ts +92 -0
  128. package/lib/mjs/controllers/Telemetry.d.ts.map +1 -0
  129. package/lib/mjs/controllers/Telemetry.js +223 -0
  130. package/lib/mjs/controllers/Telemetry.js.map +1 -0
  131. package/lib/mjs/dto/index.d.ts +21 -0
  132. package/lib/mjs/dto/index.d.ts.map +1 -0
  133. package/lib/mjs/dto/index.js +58 -0
  134. package/lib/mjs/dto/index.js.map +1 -0
  135. package/lib/mjs/endpoints.d.ts +32 -0
  136. package/lib/mjs/endpoints.d.ts.map +1 -0
  137. package/lib/mjs/endpoints.js +34 -0
  138. package/lib/mjs/endpoints.js.map +1 -0
  139. package/lib/mjs/health.d.ts +55 -0
  140. package/lib/mjs/health.d.ts.map +1 -0
  141. package/lib/mjs/health.js +107 -0
  142. package/lib/mjs/health.js.map +1 -0
  143. package/lib/mjs/index.d.ts +16 -0
  144. package/lib/mjs/index.d.ts.map +1 -0
  145. package/lib/mjs/index.js +16 -0
  146. package/lib/mjs/index.js.map +1 -0
  147. package/lib/mjs/metrics.d.ts +16 -0
  148. package/lib/mjs/metrics.d.ts.map +1 -0
  149. package/lib/mjs/metrics.js +16 -0
  150. package/lib/mjs/metrics.js.map +1 -0
  151. package/lib/mjs/middleware.d.ts +81 -0
  152. package/lib/mjs/middleware.d.ts.map +1 -0
  153. package/lib/mjs/middleware.js +207 -0
  154. package/lib/mjs/middleware.js.map +1 -0
  155. package/lib/mjs/package.json +1 -0
  156. package/lib/mjs/policies/PublicPolicy.d.ts +16 -0
  157. package/lib/mjs/policies/PublicPolicy.d.ts.map +1 -0
  158. package/lib/mjs/policies/PublicPolicy.js +31 -0
  159. package/lib/mjs/policies/PublicPolicy.js.map +1 -0
  160. package/lib/mjs/policies/TelemetryTokenPolicy.d.ts +19 -0
  161. package/lib/mjs/policies/TelemetryTokenPolicy.d.ts.map +1 -0
  162. package/lib/mjs/policies/TelemetryTokenPolicy.js +62 -0
  163. package/lib/mjs/policies/TelemetryTokenPolicy.js.map +1 -0
  164. package/lib/mjs/requestStats.d.ts +81 -0
  165. package/lib/mjs/requestStats.d.ts.map +1 -0
  166. package/lib/mjs/requestStats.js +130 -0
  167. package/lib/mjs/requestStats.js.map +1 -0
  168. package/lib/mjs/responses.d.ts +23 -0
  169. package/lib/mjs/responses.d.ts.map +1 -0
  170. package/lib/mjs/responses.js +30 -0
  171. package/lib/mjs/responses.js.map +1 -0
  172. package/lib/mjs/routeStats.d.ts +43 -0
  173. package/lib/mjs/routeStats.d.ts.map +1 -0
  174. package/lib/mjs/routeStats.js +55 -0
  175. package/lib/mjs/routeStats.js.map +1 -0
  176. package/lib/mjs/schemas/HealthResponse.schema.d.ts +30 -0
  177. package/lib/mjs/schemas/HealthResponse.schema.d.ts.map +1 -0
  178. package/lib/mjs/schemas/HealthResponse.schema.js +13 -0
  179. package/lib/mjs/schemas/HealthResponse.schema.js.map +1 -0
  180. package/lib/mjs/schemas/PerfResponse.schema.d.ts +56 -0
  181. package/lib/mjs/schemas/PerfResponse.schema.d.ts.map +1 -0
  182. package/lib/mjs/schemas/PerfResponse.schema.js +34 -0
  183. package/lib/mjs/schemas/PerfResponse.schema.js.map +1 -0
  184. package/lib/mjs/schemas/ReadyResponse.schema.d.ts +36 -0
  185. package/lib/mjs/schemas/ReadyResponse.schema.d.ts.map +1 -0
  186. package/lib/mjs/schemas/ReadyResponse.schema.js +21 -0
  187. package/lib/mjs/schemas/ReadyResponse.schema.js.map +1 -0
  188. package/lib/mjs/schemas/RequestStatsSnapshot.schema.d.ts +79 -0
  189. package/lib/mjs/schemas/RequestStatsSnapshot.schema.d.ts.map +1 -0
  190. package/lib/mjs/schemas/RequestStatsSnapshot.schema.js +28 -0
  191. package/lib/mjs/schemas/RequestStatsSnapshot.schema.js.map +1 -0
  192. package/lib/mjs/schemas/RoutesResponse.schema.d.ts +100 -0
  193. package/lib/mjs/schemas/RoutesResponse.schema.d.ts.map +1 -0
  194. package/lib/mjs/schemas/RoutesResponse.schema.js +20 -0
  195. package/lib/mjs/schemas/RoutesResponse.schema.js.map +1 -0
  196. package/lib/mjs/schemas/StatsResponse.schema.d.ts +158 -0
  197. package/lib/mjs/schemas/StatsResponse.schema.d.ts.map +1 -0
  198. package/lib/mjs/schemas/StatsResponse.schema.js +14 -0
  199. package/lib/mjs/schemas/StatsResponse.schema.js.map +1 -0
  200. package/lib/mjs/schemas/TimelineResponse.schema.d.ts +109 -0
  201. package/lib/mjs/schemas/TimelineResponse.schema.d.ts.map +1 -0
  202. package/lib/mjs/schemas/TimelineResponse.schema.js +23 -0
  203. package/lib/mjs/schemas/TimelineResponse.schema.js.map +1 -0
  204. package/lib/mjs/store.d.ts +58 -0
  205. package/lib/mjs/store.d.ts.map +1 -0
  206. package/lib/mjs/store.js +105 -0
  207. package/lib/mjs/store.js.map +1 -0
  208. package/lib/mjs/timeline.d.ts +48 -0
  209. package/lib/mjs/timeline.d.ts.map +1 -0
  210. package/lib/mjs/timeline.js +66 -0
  211. package/lib/mjs/timeline.js.map +1 -0
  212. package/lib/tsconfig.cjs.tsbuildinfo +1 -0
  213. package/lib/tsconfig.mjs.tsbuildinfo +1 -0
  214. 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"}