@superblocksteam/sdk 2.0.130-next.2 → 2.0.130-next.4

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 (47) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/cli-replacement/dependency-install-classifier.d.mts.map +1 -1
  3. package/dist/cli-replacement/dependency-install-classifier.mjs +11 -0
  4. package/dist/cli-replacement/dependency-install-classifier.mjs.map +1 -1
  5. package/dist/cli-replacement/dependency-install-classifier.test.mjs +26 -0
  6. package/dist/cli-replacement/dependency-install-classifier.test.mjs.map +1 -1
  7. package/dist/cli-replacement/dev.d.mts.map +1 -1
  8. package/dist/cli-replacement/dev.mjs +63 -4
  9. package/dist/cli-replacement/dev.mjs.map +1 -1
  10. package/dist/cli-replacement/disk-space.d.mts +86 -0
  11. package/dist/cli-replacement/disk-space.d.mts.map +1 -0
  12. package/dist/cli-replacement/disk-space.mjs +133 -0
  13. package/dist/cli-replacement/disk-space.mjs.map +1 -0
  14. package/dist/cli-replacement/disk-space.test.d.mts +2 -0
  15. package/dist/cli-replacement/disk-space.test.d.mts.map +1 -0
  16. package/dist/cli-replacement/disk-space.test.mjs +186 -0
  17. package/dist/cli-replacement/disk-space.test.mjs.map +1 -0
  18. package/dist/dev-utils/dev-server-metrics.d.mts +11 -0
  19. package/dist/dev-utils/dev-server-metrics.d.mts.map +1 -1
  20. package/dist/dev-utils/dev-server-metrics.mjs +18 -0
  21. package/dist/dev-utils/dev-server-metrics.mjs.map +1 -1
  22. package/dist/telemetry/memory-metrics.d.ts +7 -0
  23. package/dist/telemetry/memory-metrics.d.ts.map +1 -1
  24. package/dist/telemetry/memory-metrics.js +221 -44
  25. package/dist/telemetry/memory-metrics.js.map +1 -1
  26. package/dist/telemetry/memory-metrics.test.d.ts +2 -0
  27. package/dist/telemetry/memory-metrics.test.d.ts.map +1 -0
  28. package/dist/telemetry/memory-metrics.test.js +256 -0
  29. package/dist/telemetry/memory-metrics.test.js.map +1 -0
  30. package/dist/vite-plugin-sdk-api-entry-point.d.mts +14 -1
  31. package/dist/vite-plugin-sdk-api-entry-point.d.mts.map +1 -1
  32. package/dist/vite-plugin-sdk-api-entry-point.mjs +68 -7
  33. package/dist/vite-plugin-sdk-api-entry-point.mjs.map +1 -1
  34. package/dist/vite-plugin-sdk-api-entry-point.test.mjs +53 -1
  35. package/dist/vite-plugin-sdk-api-entry-point.test.mjs.map +1 -1
  36. package/package.json +6 -6
  37. package/src/cli-replacement/dependency-install-classifier.mts +14 -0
  38. package/src/cli-replacement/dependency-install-classifier.test.mts +39 -0
  39. package/src/cli-replacement/dev.mts +81 -10
  40. package/src/cli-replacement/disk-space.mts +216 -0
  41. package/src/cli-replacement/disk-space.test.mts +246 -0
  42. package/src/dev-utils/dev-server-metrics.mts +20 -0
  43. package/src/telemetry/memory-metrics.test.ts +363 -0
  44. package/src/telemetry/memory-metrics.ts +329 -60
  45. package/src/vite-plugin-sdk-api-entry-point.mts +79 -9
  46. package/src/vite-plugin-sdk-api-entry-point.test.mts +134 -1
  47. package/tsconfig.tsbuildinfo +1 -1
@@ -1,54 +1,231 @@
1
- import { PerformanceObserver, } from "node:perf_hooks";
1
+ import { readFileSync } from "node:fs";
2
+ import { constants, monitorEventLoopDelay, performance, PerformanceObserver, } from "node:perf_hooks";
3
+ import { getHeapStatistics } from "node:v8";
2
4
  import { getMeter } from "./index.js";
3
5
  let cleanupFn;
6
+ const NS_PER_MS = 1_000_000;
7
+ const US_PER_SECOND = 1_000_000;
8
+ function finiteNonNegative(value) {
9
+ return Number.isFinite(value) && value > 0 ? value : 0;
10
+ }
11
+ function nsToMs(value) {
12
+ return finiteNonNegative(value) / NS_PER_MS;
13
+ }
14
+ function ratio(numerator, denominator) {
15
+ if (!Number.isFinite(numerator) || !Number.isFinite(denominator)) {
16
+ return 0;
17
+ }
18
+ if (denominator <= 0) {
19
+ return 0;
20
+ }
21
+ return Math.max(0, numerator / denominator);
22
+ }
23
+ function readCgroupNumber(filePath) {
24
+ try {
25
+ const value = readFileSync(filePath, "utf-8").trim();
26
+ if (!value || value === "max") {
27
+ return { exists: true };
28
+ }
29
+ const parsed = Number(value);
30
+ if (Number.isFinite(parsed) &&
31
+ parsed >= 0 &&
32
+ parsed < Number.MAX_SAFE_INTEGER) {
33
+ return { exists: true, value: parsed };
34
+ }
35
+ return { exists: true };
36
+ }
37
+ catch {
38
+ return { exists: false };
39
+ }
40
+ }
41
+ export function readCgroupMemory(root = "/sys/fs/cgroup") {
42
+ const v2Current = readCgroupNumber(`${root}/memory.current`);
43
+ const v2Limit = readCgroupNumber(`${root}/memory.max`);
44
+ const usesCgroupV2 = v2Current.exists || v2Limit.exists;
45
+ const currentBytes = usesCgroupV2
46
+ ? v2Current.value
47
+ : readCgroupNumber(`${root}/memory/memory.usage_in_bytes`).value;
48
+ const limitBytes = usesCgroupV2
49
+ ? v2Limit.value
50
+ : readCgroupNumber(`${root}/memory/memory.limit_in_bytes`).value;
51
+ if (currentBytes === undefined ||
52
+ limitBytes === undefined ||
53
+ limitBytes <= 0) {
54
+ return undefined;
55
+ }
56
+ return {
57
+ currentBytes,
58
+ limitBytes,
59
+ usageRatio: ratio(currentBytes, limitBytes),
60
+ };
61
+ }
62
+ function gcKind(kind) {
63
+ switch (kind) {
64
+ case constants.NODE_PERFORMANCE_GC_MINOR:
65
+ return "minor";
66
+ case constants.NODE_PERFORMANCE_GC_MAJOR:
67
+ return "major";
68
+ case constants.NODE_PERFORMANCE_GC_INCREMENTAL:
69
+ return "incremental";
70
+ case constants.NODE_PERFORMANCE_GC_WEAKCB:
71
+ return "weakcb";
72
+ default:
73
+ return "unknown";
74
+ }
75
+ }
4
76
  export function startMemoryMetrics() {
5
77
  if (cleanupFn) {
6
78
  return;
7
79
  }
8
80
  const meter = getMeter();
9
- const heapUsedGauge = meter.createObservableGauge("nodejs.memory.heap_used_bytes", { description: "V8 heap memory used (bytes)", unit: "By" });
10
- const heapTotalGauge = meter.createObservableGauge("nodejs.memory.heap_total_bytes", { description: "V8 heap memory allocated (bytes)", unit: "By" });
11
- const rssGauge = meter.createObservableGauge("nodejs.memory.rss_bytes", {
12
- description: "Resident Set Size - total memory allocated for the process",
13
- unit: "By",
14
- });
15
- const externalGauge = meter.createObservableGauge("nodejs.memory.external_bytes", {
16
- description: "Memory used by C++ objects bound to JavaScript objects",
17
- unit: "By",
18
- });
19
- const arrayBuffersGauge = meter.createObservableGauge("nodejs.memory.array_buffers_bytes", {
20
- description: "Memory allocated for ArrayBuffers and SharedArrayBuffers (also included in external)",
21
- unit: "By",
22
- });
23
- const gcCountCounter = meter.createCounter("nodejs.gc.count", {
24
- description: "Number of garbage collection events",
25
- unit: "{event}",
26
- });
27
- const gauges = [
28
- heapUsedGauge,
29
- heapTotalGauge,
30
- rssGauge,
31
- externalGauge,
32
- arrayBuffersGauge,
33
- ];
34
- // Single memoryUsage() call per export interval for all 5 gauges (idiomatic OTEL batch pattern).
35
- const batchCb = (result) => {
36
- const mem = process.memoryUsage();
37
- result.observe(heapUsedGauge, mem.heapUsed);
38
- result.observe(heapTotalGauge, mem.heapTotal);
39
- result.observe(rssGauge, mem.rss);
40
- result.observe(externalGauge, mem.external);
41
- result.observe(arrayBuffersGauge, mem.arrayBuffers);
42
- };
43
- meter.addBatchObservableCallback(batchCb, gauges);
44
- const gcObserver = new PerformanceObserver((list) => {
45
- gcCountCounter.add(list.getEntries().length);
46
- });
47
- gcObserver.observe({ entryTypes: ["gc"], buffered: false });
48
- cleanupFn = () => {
49
- gcObserver.disconnect();
50
- meter.removeBatchObservableCallback(batchCb, gauges);
51
- };
81
+ const eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });
82
+ let previousEventLoopUtilization = performance.eventLoopUtilization();
83
+ let removeBatchCallback;
84
+ let disconnectGcObserver;
85
+ try {
86
+ const heapUsedGauge = meter.createObservableGauge("nodejs.memory.heap_used_bytes", { description: "V8 heap memory used (bytes)", unit: "By" });
87
+ const heapTotalGauge = meter.createObservableGauge("nodejs.memory.heap_total_bytes", { description: "V8 heap memory allocated (bytes)", unit: "By" });
88
+ const rssGauge = meter.createObservableGauge("nodejs.memory.rss_bytes", {
89
+ description: "Resident Set Size - total memory allocated for the process",
90
+ unit: "By",
91
+ });
92
+ const externalGauge = meter.createObservableGauge("nodejs.memory.external_bytes", {
93
+ description: "Memory used by C++ objects bound to JavaScript objects",
94
+ unit: "By",
95
+ });
96
+ const arrayBuffersGauge = meter.createObservableGauge("nodejs.memory.array_buffers_bytes", {
97
+ description: "Memory allocated for ArrayBuffers and SharedArrayBuffers (also included in external)",
98
+ unit: "By",
99
+ });
100
+ const heapLimitGauge = meter.createObservableGauge("nodejs.memory.heap_limit_bytes", { description: "Configured V8 heap size limit (bytes)", unit: "By" });
101
+ const heapUsedRatioGauge = meter.createObservableGauge("nodejs.memory.heap_used_ratio", { description: "V8 heap used divided by V8 heap size limit", unit: "1" });
102
+ const cgroupCurrentGauge = meter.createObservableGauge("nodejs.memory.cgroup_current_bytes", { description: "Current cgroup memory usage when available", unit: "By" });
103
+ const cgroupLimitGauge = meter.createObservableGauge("nodejs.memory.cgroup_limit_bytes", { description: "Cgroup memory limit when available", unit: "By" });
104
+ const cgroupUsageRatioGauge = meter.createObservableGauge("nodejs.memory.cgroup_usage_ratio", {
105
+ description: "Cgroup memory usage divided by cgroup memory limit",
106
+ unit: "1",
107
+ });
108
+ const eventLoopDelayMeanGauge = meter.createObservableGauge("nodejs.event_loop.delay.mean_ms", {
109
+ description: "Mean event-loop delay for the last collection window",
110
+ unit: "ms",
111
+ });
112
+ const eventLoopDelayMaxGauge = meter.createObservableGauge("nodejs.event_loop.delay.max_ms", {
113
+ description: "Max event-loop delay for the last collection window",
114
+ unit: "ms",
115
+ });
116
+ const eventLoopDelayP50Gauge = meter.createObservableGauge("nodejs.event_loop.delay.p50_ms", {
117
+ description: "p50 event-loop delay for the last collection window",
118
+ unit: "ms",
119
+ });
120
+ const eventLoopDelayP90Gauge = meter.createObservableGauge("nodejs.event_loop.delay.p90_ms", {
121
+ description: "p90 event-loop delay for the last collection window",
122
+ unit: "ms",
123
+ });
124
+ const eventLoopDelayP99Gauge = meter.createObservableGauge("nodejs.event_loop.delay.p99_ms", {
125
+ description: "p99 event-loop delay for the last collection window",
126
+ unit: "ms",
127
+ });
128
+ const eventLoopUtilizationGauge = meter.createObservableGauge("nodejs.event_loop.utilization", {
129
+ description: "Event-loop utilization delta for the last collection window",
130
+ unit: "1",
131
+ });
132
+ const processCpuUserCounter = meter.createObservableCounter("nodejs.process.cpu.user_seconds", { description: "Process user CPU time since start", unit: "s" });
133
+ const processCpuSystemCounter = meter.createObservableCounter("nodejs.process.cpu.system_seconds", { description: "Process system CPU time since start", unit: "s" });
134
+ const gcCountCounter = meter.createCounter("nodejs.gc.count", {
135
+ description: "Number of garbage collection events",
136
+ unit: "{event}",
137
+ });
138
+ const gcDurationHistogram = meter.createHistogram("nodejs.gc.duration_ms", {
139
+ description: "Garbage collection duration by collection kind",
140
+ unit: "ms",
141
+ advice: {
142
+ explicitBucketBoundaries: [0.5, 1, 2, 5, 10, 25, 50, 100, 250, 500],
143
+ },
144
+ });
145
+ const observableInstruments = [
146
+ heapUsedGauge,
147
+ heapTotalGauge,
148
+ rssGauge,
149
+ externalGauge,
150
+ arrayBuffersGauge,
151
+ heapLimitGauge,
152
+ heapUsedRatioGauge,
153
+ cgroupCurrentGauge,
154
+ cgroupLimitGauge,
155
+ cgroupUsageRatioGauge,
156
+ eventLoopDelayMeanGauge,
157
+ eventLoopDelayMaxGauge,
158
+ eventLoopDelayP50Gauge,
159
+ eventLoopDelayP90Gauge,
160
+ eventLoopDelayP99Gauge,
161
+ eventLoopUtilizationGauge,
162
+ processCpuUserCounter,
163
+ processCpuSystemCounter,
164
+ ];
165
+ // Single callback per export interval keeps runtime stats temporally aligned.
166
+ const batchCb = (result) => {
167
+ try {
168
+ const mem = process.memoryUsage();
169
+ const heap = getHeapStatistics();
170
+ const cgroup = readCgroupMemory();
171
+ const elu = performance.eventLoopUtilization(previousEventLoopUtilization);
172
+ previousEventLoopUtilization = performance.eventLoopUtilization();
173
+ const cpu = process.cpuUsage();
174
+ result.observe(heapUsedGauge, mem.heapUsed);
175
+ result.observe(heapTotalGauge, mem.heapTotal);
176
+ result.observe(rssGauge, mem.rss);
177
+ result.observe(externalGauge, mem.external);
178
+ result.observe(arrayBuffersGauge, mem.arrayBuffers);
179
+ result.observe(heapLimitGauge, heap.heap_size_limit);
180
+ result.observe(heapUsedRatioGauge, ratio(mem.heapUsed, heap.heap_size_limit));
181
+ // Omit cgroup gauges when no finite cgroup limit is available; absence means host/unlimited memory, not telemetry setup failure.
182
+ if (cgroup) {
183
+ result.observe(cgroupCurrentGauge, cgroup.currentBytes);
184
+ result.observe(cgroupLimitGauge, cgroup.limitBytes);
185
+ result.observe(cgroupUsageRatioGauge, cgroup.usageRatio);
186
+ }
187
+ result.observe(eventLoopDelayMeanGauge, nsToMs(eventLoopDelay.mean));
188
+ result.observe(eventLoopDelayMaxGauge, nsToMs(eventLoopDelay.max));
189
+ result.observe(eventLoopDelayP50Gauge, nsToMs(eventLoopDelay.percentile(50)));
190
+ result.observe(eventLoopDelayP90Gauge, nsToMs(eventLoopDelay.percentile(90)));
191
+ result.observe(eventLoopDelayP99Gauge, nsToMs(eventLoopDelay.percentile(99)));
192
+ result.observe(eventLoopUtilizationGauge, finiteNonNegative(elu.utilization));
193
+ result.observe(processCpuUserCounter, cpu.user / US_PER_SECOND);
194
+ result.observe(processCpuSystemCounter, cpu.system / US_PER_SECOND);
195
+ }
196
+ finally {
197
+ eventLoopDelay.reset();
198
+ }
199
+ };
200
+ meter.addBatchObservableCallback(batchCb, observableInstruments);
201
+ removeBatchCallback = () => {
202
+ meter.removeBatchObservableCallback(batchCb, observableInstruments);
203
+ };
204
+ const gcObserver = new PerformanceObserver((list) => {
205
+ for (const entry of list.getEntries()) {
206
+ const kind = gcKind(entry.detail?.kind ?? entry.kind);
207
+ const attrs = { kind };
208
+ gcCountCounter.add(1, attrs);
209
+ gcDurationHistogram.record(finiteNonNegative(entry.duration), attrs);
210
+ }
211
+ });
212
+ disconnectGcObserver = () => {
213
+ gcObserver.disconnect();
214
+ };
215
+ gcObserver.observe({ entryTypes: ["gc"], buffered: false });
216
+ eventLoopDelay.enable();
217
+ cleanupFn = () => {
218
+ eventLoopDelay.disable();
219
+ disconnectGcObserver?.();
220
+ removeBatchCallback?.();
221
+ };
222
+ }
223
+ catch (error) {
224
+ eventLoopDelay.disable();
225
+ disconnectGcObserver?.();
226
+ removeBatchCallback?.();
227
+ throw error;
228
+ }
52
229
  }
53
230
  export function stopMemoryMetrics() {
54
231
  if (cleanupFn) {
@@ -1 +1 @@
1
- {"version":3,"file":"memory-metrics.js","sourceRoot":"","sources":["../../src/telemetry/memory-metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,IAAI,SAAmC,CAAC;AAExC,MAAM,UAAU,kBAAkB;IAChC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,aAAa,GAAG,KAAK,CAAC,qBAAqB,CAC/C,+BAA+B,EAC/B,EAAE,WAAW,EAAE,6BAA6B,EAAE,IAAI,EAAE,IAAI,EAAE,CAC3D,CAAC;IACF,MAAM,cAAc,GAAG,KAAK,CAAC,qBAAqB,CAChD,gCAAgC,EAChC,EAAE,WAAW,EAAE,kCAAkC,EAAE,IAAI,EAAE,IAAI,EAAE,CAChE,CAAC;IACF,MAAM,QAAQ,GAAG,KAAK,CAAC,qBAAqB,CAAC,yBAAyB,EAAE;QACtE,WAAW,EAAE,4DAA4D;QACzE,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,KAAK,CAAC,qBAAqB,CAC/C,8BAA8B,EAC9B;QACE,WAAW,EAAE,wDAAwD;QACrE,IAAI,EAAE,IAAI;KACX,CACF,CAAC;IACF,MAAM,iBAAiB,GAAG,KAAK,CAAC,qBAAqB,CACnD,mCAAmC,EACnC;QACE,WAAW,EACT,sFAAsF;QACxF,IAAI,EAAE,IAAI;KACX,CACF,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,iBAAiB,EAAE;QAC5D,WAAW,EAAE,qCAAqC;QAClD,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG;QACb,aAAa;QACb,cAAc;QACd,QAAQ;QACR,aAAa;QACb,iBAAiB;KAClB,CAAC;IAEF,iGAAiG;IACjG,MAAM,OAAO,GAAG,CAAC,MAA6B,EAAE,EAAE;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC,CAAC;IAEF,KAAK,CAAC,0BAA0B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,IAAI,mBAAmB,CACxC,CAAC,IAAkC,EAAE,EAAE;QACrC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC,CACF,CAAC;IACF,UAAU,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5D,SAAS,GAAG,GAAG,EAAE;QACf,UAAU,CAAC,UAAU,EAAE,CAAC;QACxB,KAAK,CAAC,6BAA6B,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,EAAE,CAAC;QACZ,SAAS,GAAG,SAAS,CAAC;IACxB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"memory-metrics.js","sourceRoot":"","sources":["../../src/telemetry/memory-metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-metrics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-metrics.test.d.ts","sourceRoot":"","sources":["../../src/telemetry/memory-metrics.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,256 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import path from "node:path";
4
+ import { beforeEach, describe, expect, it, vi } from "vitest";
5
+ const h = vi.hoisted(() => {
6
+ const gauges = [];
7
+ const observableCounters = [];
8
+ const counters = [];
9
+ const histograms = [];
10
+ return {
11
+ gauges,
12
+ observableCounters,
13
+ counters,
14
+ histograms,
15
+ throwOnGaugeName: undefined,
16
+ delayMonitor: {
17
+ enable: vi.fn(),
18
+ disable: vi.fn(),
19
+ reset: vi.fn(),
20
+ mean: 2_000_000,
21
+ max: 80_000_000,
22
+ percentile: vi.fn((p) => p * 1_000_000),
23
+ },
24
+ gcCallback: undefined,
25
+ elu: vi.fn(),
26
+ addBatchObservableCallback: vi.fn((callback, callbackInstruments) => {
27
+ for (const instrument of callbackInstruments) {
28
+ const captured = [...gauges, ...observableCounters].find((g) => g.name === instrument.name);
29
+ if (captured)
30
+ captured.callback = callback;
31
+ }
32
+ }),
33
+ removeBatchObservableCallback: vi.fn(),
34
+ };
35
+ });
36
+ vi.mock("node:perf_hooks", async () => {
37
+ const actual = await vi.importActual("node:perf_hooks");
38
+ return {
39
+ ...actual,
40
+ PerformanceObserver: class {
41
+ constructor(callback) {
42
+ h.gcCallback = callback;
43
+ }
44
+ observe = vi.fn();
45
+ disconnect = vi.fn();
46
+ },
47
+ monitorEventLoopDelay: vi.fn(() => h.delayMonitor),
48
+ performance: {
49
+ ...actual.performance,
50
+ eventLoopUtilization: h.elu,
51
+ },
52
+ };
53
+ });
54
+ vi.mock("./index.js", () => ({
55
+ getMeter: () => ({
56
+ createObservableGauge: (name) => {
57
+ if (h.throwOnGaugeName === name) {
58
+ throw new Error(`createObservableGauge failed for ${name}`);
59
+ }
60
+ const gauge = { name };
61
+ h.gauges.push(gauge);
62
+ return gauge;
63
+ },
64
+ createObservableCounter: (name) => {
65
+ const counter = { name };
66
+ h.observableCounters.push(counter);
67
+ return counter;
68
+ },
69
+ createCounter: (name) => {
70
+ const counter = { name, adds: [] };
71
+ h.counters.push(counter);
72
+ return {
73
+ add: (value, attrs) => counter.adds.push({ value, attrs }),
74
+ };
75
+ },
76
+ createHistogram: (name, options) => {
77
+ const histogram = { name, options, records: [] };
78
+ h.histograms.push(histogram);
79
+ return {
80
+ record: (value, attrs) => histogram.records.push({ value, attrs }),
81
+ };
82
+ },
83
+ addBatchObservableCallback: h.addBatchObservableCallback,
84
+ removeBatchObservableCallback: h.removeBatchObservableCallback,
85
+ }),
86
+ }));
87
+ function observeAll() {
88
+ const observations = [];
89
+ const callback = h.gauges.find((g) => g.callback)?.callback;
90
+ if (!callback)
91
+ throw new Error("missing observable callback");
92
+ callback({
93
+ observe: (gauge, value, attrs) => observations.push({ name: gauge.name, value, attrs }),
94
+ });
95
+ return observations;
96
+ }
97
+ describe("memory metrics", () => {
98
+ beforeEach(async () => {
99
+ vi.resetModules();
100
+ h.gauges.length = 0;
101
+ h.observableCounters.length = 0;
102
+ h.counters.length = 0;
103
+ h.histograms.length = 0;
104
+ h.throwOnGaugeName = undefined;
105
+ h.delayMonitor.enable.mockClear();
106
+ h.delayMonitor.disable.mockClear();
107
+ h.delayMonitor.reset.mockClear();
108
+ h.delayMonitor.percentile.mockClear();
109
+ h.gcCallback = undefined;
110
+ h.elu.mockReset();
111
+ h.elu
112
+ .mockReturnValueOnce({ idle: 0, active: 0, utilization: 0 })
113
+ .mockReturnValueOnce({ idle: 25, active: 75, utilization: 0.75 })
114
+ .mockReturnValue({ idle: 100, active: 200, utilization: 0.67 });
115
+ h.addBatchObservableCallback.mockClear();
116
+ h.removeBatchObservableCallback.mockClear();
117
+ });
118
+ it("observes event-loop, V8 heap, and memory-pressure gauges", async () => {
119
+ const { startMemoryMetrics, stopMemoryMetrics } = await import("./memory-metrics.js");
120
+ startMemoryMetrics();
121
+ const observations = observeAll();
122
+ stopMemoryMetrics();
123
+ expect(h.delayMonitor.enable).toHaveBeenCalledOnce();
124
+ expect(observations.map((o) => o.name)).toEqual(expect.arrayContaining([
125
+ "nodejs.event_loop.delay.max_ms",
126
+ "nodejs.event_loop.delay.p99_ms",
127
+ "nodejs.event_loop.utilization",
128
+ "nodejs.memory.heap_limit_bytes",
129
+ "nodejs.memory.heap_used_ratio",
130
+ ]));
131
+ expect(h.observableCounters.map((counter) => counter.name)).toEqual([
132
+ "nodejs.process.cpu.user_seconds",
133
+ "nodejs.process.cpu.system_seconds",
134
+ ]);
135
+ expect(observations.find((o) => o.name === "nodejs.event_loop.delay.max_ms")
136
+ ?.value).toBe(80);
137
+ expect(observations.find((o) => o.name === "nodejs.event_loop.utilization")
138
+ ?.value).toBe(0.75);
139
+ expect(h.delayMonitor.reset).toHaveBeenCalledOnce();
140
+ expect(h.delayMonitor.disable).toHaveBeenCalledOnce();
141
+ });
142
+ it("cleans up the event-loop delay monitor when setup fails", async () => {
143
+ const { startMemoryMetrics, stopMemoryMetrics } = await import("./memory-metrics.js");
144
+ h.throwOnGaugeName = "nodejs.memory.rss_bytes";
145
+ expect(() => startMemoryMetrics()).toThrow("createObservableGauge failed for nodejs.memory.rss_bytes");
146
+ expect(h.delayMonitor.disable).toHaveBeenCalledOnce();
147
+ h.throwOnGaugeName = undefined;
148
+ startMemoryMetrics();
149
+ stopMemoryMetrics();
150
+ expect(h.delayMonitor.enable).toHaveBeenCalledOnce();
151
+ expect(h.delayMonitor.disable).toHaveBeenCalledTimes(2);
152
+ });
153
+ it("resets event-loop delay even when observation fails", async () => {
154
+ const { startMemoryMetrics, stopMemoryMetrics } = await import("./memory-metrics.js");
155
+ startMemoryMetrics();
156
+ const callback = h.gauges.find((g) => g.callback)?.callback;
157
+ if (!callback)
158
+ throw new Error("missing observable callback");
159
+ expect(() => callback({
160
+ observe: (instrument) => {
161
+ if (instrument.name === "nodejs.memory.rss_bytes") {
162
+ throw new Error("observe failed");
163
+ }
164
+ },
165
+ })).toThrow("observe failed");
166
+ stopMemoryMetrics();
167
+ expect(h.delayMonitor.reset).toHaveBeenCalledOnce();
168
+ });
169
+ it("does not register metrics twice until stopped", async () => {
170
+ const { startMemoryMetrics, stopMemoryMetrics } = await import("./memory-metrics.js");
171
+ startMemoryMetrics();
172
+ startMemoryMetrics();
173
+ stopMemoryMetrics();
174
+ startMemoryMetrics();
175
+ stopMemoryMetrics();
176
+ expect(h.delayMonitor.enable).toHaveBeenCalledTimes(2);
177
+ expect(h.addBatchObservableCallback).toHaveBeenCalledTimes(2);
178
+ expect(h.removeBatchObservableCallback).toHaveBeenCalledTimes(2);
179
+ });
180
+ it("records GC count and duration with bounded kind labels", async () => {
181
+ const { startMemoryMetrics, stopMemoryMetrics } = await import("./memory-metrics.js");
182
+ startMemoryMetrics();
183
+ h.gcCallback?.({
184
+ getEntries: () => [
185
+ { detail: { kind: 1 }, duration: 12 },
186
+ { detail: { kind: 4 }, duration: 34 },
187
+ { kind: 999, duration: 56 },
188
+ ],
189
+ });
190
+ stopMemoryMetrics();
191
+ const gcCounter = h.counters.find((c) => c.name === "nodejs.gc.count");
192
+ const gcDuration = h.histograms.find((histogram) => histogram.name === "nodejs.gc.duration_ms");
193
+ expect(gcCounter?.adds.map((a) => a.attrs)).toEqual([
194
+ { kind: "minor" },
195
+ { kind: "major" },
196
+ { kind: "unknown" },
197
+ ]);
198
+ expect(gcDuration?.records).toEqual([
199
+ { value: 12, attrs: { kind: "minor" } },
200
+ { value: 34, attrs: { kind: "major" } },
201
+ { value: 56, attrs: { kind: "unknown" } },
202
+ ]);
203
+ expect(gcDuration?.options).toEqual({
204
+ description: "Garbage collection duration by collection kind",
205
+ unit: "ms",
206
+ advice: {
207
+ explicitBucketBoundaries: [0.5, 1, 2, 5, 10, 25, 50, 100, 250, 500],
208
+ },
209
+ });
210
+ });
211
+ });
212
+ describe("readCgroupMemory", () => {
213
+ beforeEach(() => {
214
+ vi.resetModules();
215
+ });
216
+ it("reads cgroup v2 memory usage and ratio", async () => {
217
+ const root = mkdtempSync(path.join(tmpdir(), "sb-cgroup-"));
218
+ writeFileSync(path.join(root, "memory.current"), "50\n");
219
+ writeFileSync(path.join(root, "memory.max"), "200\n");
220
+ const { readCgroupMemory } = await import("./memory-metrics.js");
221
+ expect(readCgroupMemory(root)).toEqual({
222
+ currentBytes: 50,
223
+ limitBytes: 200,
224
+ usageRatio: 0.25,
225
+ });
226
+ });
227
+ it("returns undefined when cgroup files are absent or unlimited", async () => {
228
+ const root = mkdtempSync(path.join(tmpdir(), "sb-cgroup-"));
229
+ const { readCgroupMemory } = await import("./memory-metrics.js");
230
+ expect(readCgroupMemory(root)).toBeUndefined();
231
+ writeFileSync(path.join(root, "memory.current"), "50\n");
232
+ writeFileSync(path.join(root, "memory.max"), "max\n");
233
+ expect(readCgroupMemory(root)).toBeUndefined();
234
+ });
235
+ it("does not combine v2 usage with v1 limits", async () => {
236
+ const root = mkdtempSync(path.join(tmpdir(), "sb-cgroup-"));
237
+ const memoryRoot = path.join(root, "memory");
238
+ mkdirSync(memoryRoot);
239
+ writeFileSync(path.join(root, "memory.current"), "50\n");
240
+ writeFileSync(path.join(root, "memory.max"), "max\n");
241
+ writeFileSync(path.join(memoryRoot, "memory.usage_in_bytes"), "60\n");
242
+ writeFileSync(path.join(memoryRoot, "memory.limit_in_bytes"), "200\n");
243
+ const { readCgroupMemory } = await import("./memory-metrics.js");
244
+ expect(readCgroupMemory(root)).toBeUndefined();
245
+ });
246
+ it("treats cgroup v1 sentinel limits as unlimited", async () => {
247
+ const root = mkdtempSync(path.join(tmpdir(), "sb-cgroup-"));
248
+ const memoryRoot = path.join(root, "memory");
249
+ mkdirSync(memoryRoot);
250
+ writeFileSync(path.join(memoryRoot, "memory.usage_in_bytes"), "50\n");
251
+ writeFileSync(path.join(memoryRoot, "memory.limit_in_bytes"), "9223372036854771712\n");
252
+ const { readCgroupMemory } = await import("./memory-metrics.js");
253
+ expect(readCgroupMemory(root)).toBeUndefined();
254
+ });
255
+ });
256
+ //# sourceMappingURL=memory-metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-metrics.test.js","sourceRoot":"","sources":["../../src/telemetry/memory-metrics.test.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,23 @@
1
1
  import type { Plugin } from "vite";
2
+ /**
3
+ * Resolve the app-root-relative entry point path for a Vite module id.
4
+ *
5
+ * Fullstack apps keep `server/apis/` at the app root while `vite.config.ts`
6
+ * often sets `root: "./client"`. Dev server and build already pass the true
7
+ * app root into the plugin; failures are intermittent and depend on how Vite
8
+ * resolves module ids for files outside the client subtree (for example
9
+ * `../server/apis/...` relatives or `/@fs/...` absolute ids). Plain absolute
10
+ * paths under `<appRoot>/server/apis/` already matched before this helper.
11
+ */
12
+ export declare function resolveSdkApiEntryPointRelativePath(appRootDir: string, moduleId: string): string | null;
2
13
  /**
3
14
  * Vite plugin that prepends `__setEntryPoint(relativePath)` to SDK API files
4
15
  * so that `api()` can stamp the authoritative source file
5
16
  * path onto the compiled API object.
6
17
  *
18
+ * @param appRootDir - App root (parent of `client/` and `server/`).
19
+ *
7
20
  * Runs in both dev and build. The user's source code is never modified on disk.
8
21
  */
9
- export declare function sdkApiEntryPointPlugin(root: string): Plugin;
22
+ export declare function sdkApiEntryPointPlugin(appRootDir: string): Plugin;
10
23
  //# sourceMappingURL=vite-plugin-sdk-api-entry-point.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vite-plugin-sdk-api-entry-point.d.mts","sourceRoot":"","sources":["../src/vite-plugin-sdk-api-entry-point.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAwBnC;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2C3D"}
1
+ {"version":3,"file":"vite-plugin-sdk-api-entry-point.d.mts","sourceRoot":"","sources":["../src/vite-plugin-sdk-api-entry-point.mts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAuDnC;;;;;;;;;GASG;AACH,wBAAgB,mCAAmC,CACjD,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,IAAI,CA4Bf;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqCjE"}