@trigger.dev/core 0.0.0-v4-prerelease-20250918151437 → 0.0.0-v4-prerelease-20251008112940
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/dist/commonjs/v3/runEngineWorker/supervisor/http.d.ts +5 -0
- package/dist/commonjs/v3/runEngineWorker/supervisor/schemas.d.ts +31 -0
- package/dist/commonjs/v3/runEngineWorker/workload/http.d.ts +4 -0
- package/dist/commonjs/v3/runEngineWorker/workload/schemas.d.ts +31 -0
- package/dist/commonjs/v3/schemas/api.d.ts +16 -8
- package/dist/commonjs/v3/schemas/api.js +8 -4
- package/dist/commonjs/v3/schemas/api.js.map +1 -1
- package/dist/commonjs/v3/schemas/openTelemetry.d.ts +183 -0
- package/dist/commonjs/v3/schemas/openTelemetry.js +20 -2
- package/dist/commonjs/v3/schemas/openTelemetry.js.map +1 -1
- package/dist/commonjs/v3/schemas/runEngine.d.ts +25 -0
- package/dist/commonjs/v3/schemas/runEngine.js +1 -0
- package/dist/commonjs/v3/schemas/runEngine.js.map +1 -1
- package/dist/commonjs/v3/semanticInternalAttributes.d.ts +3 -0
- package/dist/commonjs/v3/semanticInternalAttributes.js +3 -0
- package/dist/commonjs/v3/semanticInternalAttributes.js.map +1 -1
- package/dist/commonjs/v3/serverOnly/index.d.ts +1 -0
- package/dist/commonjs/v3/serverOnly/index.js +1 -0
- package/dist/commonjs/v3/serverOnly/index.js.map +1 -1
- package/dist/commonjs/v3/serverOnly/resourceMonitor.d.ts +190 -0
- package/dist/commonjs/v3/serverOnly/resourceMonitor.js +596 -0
- package/dist/commonjs/v3/serverOnly/resourceMonitor.js.map +1 -0
- package/dist/commonjs/v3/utils/flattenAttributes.d.ts +1 -1
- package/dist/commonjs/v3/utils/flattenAttributes.js +4 -1
- package/dist/commonjs/v3/utils/flattenAttributes.js.map +1 -1
- package/dist/commonjs/v3/workers/taskExecutor.js +1 -1
- package/dist/commonjs/v3/workers/taskExecutor.js.map +1 -1
- package/dist/commonjs/v3/workers/warmStartClient.d.ts +3 -0
- package/dist/commonjs/v3/workers/warmStartClient.js +67 -28
- package/dist/commonjs/v3/workers/warmStartClient.js.map +1 -1
- package/dist/commonjs/version.js +1 -1
- package/dist/esm/v3/runEngineWorker/supervisor/http.d.ts +5 -0
- package/dist/esm/v3/runEngineWorker/supervisor/schemas.d.ts +31 -0
- package/dist/esm/v3/runEngineWorker/workload/http.d.ts +4 -0
- package/dist/esm/v3/runEngineWorker/workload/schemas.d.ts +31 -0
- package/dist/esm/v3/schemas/api.d.ts +16 -8
- package/dist/esm/v3/schemas/api.js +5 -1
- package/dist/esm/v3/schemas/api.js.map +1 -1
- package/dist/esm/v3/schemas/openTelemetry.d.ts +183 -0
- package/dist/esm/v3/schemas/openTelemetry.js +18 -1
- package/dist/esm/v3/schemas/openTelemetry.js.map +1 -1
- package/dist/esm/v3/schemas/runEngine.d.ts +25 -0
- package/dist/esm/v3/schemas/runEngine.js +1 -0
- package/dist/esm/v3/schemas/runEngine.js.map +1 -1
- package/dist/esm/v3/semanticInternalAttributes.d.ts +3 -0
- package/dist/esm/v3/semanticInternalAttributes.js +3 -0
- package/dist/esm/v3/semanticInternalAttributes.js.map +1 -1
- package/dist/esm/v3/serverOnly/index.d.ts +1 -0
- package/dist/esm/v3/serverOnly/index.js +1 -0
- package/dist/esm/v3/serverOnly/index.js.map +1 -1
- package/dist/esm/v3/serverOnly/resourceMonitor.d.ts +190 -0
- package/dist/esm/v3/serverOnly/resourceMonitor.js +589 -0
- package/dist/esm/v3/serverOnly/resourceMonitor.js.map +1 -0
- package/dist/esm/v3/utils/flattenAttributes.d.ts +1 -1
- package/dist/esm/v3/utils/flattenAttributes.js +4 -1
- package/dist/esm/v3/utils/flattenAttributes.js.map +1 -1
- package/dist/esm/v3/workers/taskExecutor.js +1 -1
- package/dist/esm/v3/workers/taskExecutor.js.map +1 -1
- package/dist/esm/v3/workers/warmStartClient.d.ts +3 -0
- package/dist/esm/v3/workers/warmStartClient.js +67 -28
- package/dist/esm/v3/workers/warmStartClient.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
import { exec } from "node:child_process";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import { PerformanceObserver, constants } from "node:perf_hooks";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { getHeapStatistics } from "node:v8";
|
|
7
|
+
const execAsync = promisify(exec);
|
|
8
|
+
// Constants
|
|
9
|
+
const DISK_LIMIT_GB = 10;
|
|
10
|
+
const DISK_LIMIT_BYTES = DISK_LIMIT_GB * 1024 * 1024 * 1024; // 10Gi in bytes
|
|
11
|
+
export class ResourceMonitor {
|
|
12
|
+
logInterval = null;
|
|
13
|
+
dirName;
|
|
14
|
+
processName;
|
|
15
|
+
ctx;
|
|
16
|
+
verbose;
|
|
17
|
+
compactLogging;
|
|
18
|
+
gcObserver = null;
|
|
19
|
+
bufferedGcEntries = [];
|
|
20
|
+
constructor(config) {
|
|
21
|
+
this.dirName = config.dirName ?? "/tmp";
|
|
22
|
+
this.processName = config.processName;
|
|
23
|
+
this.ctx = config.ctx;
|
|
24
|
+
this.verbose = config.verbose ?? true;
|
|
25
|
+
this.compactLogging = config.compactLogging ?? false;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Start periodic resource monitoring
|
|
29
|
+
* @param intervalMs Monitoring interval in milliseconds
|
|
30
|
+
*/
|
|
31
|
+
startMonitoring(intervalMs = 10000) {
|
|
32
|
+
if (intervalMs < 1000) {
|
|
33
|
+
intervalMs = 1000;
|
|
34
|
+
console.warn("ResourceMonitor: intervalMs is less than 1000, setting to 1000");
|
|
35
|
+
}
|
|
36
|
+
if (this.logInterval) {
|
|
37
|
+
clearInterval(this.logInterval);
|
|
38
|
+
}
|
|
39
|
+
this.logInterval = setInterval(this.logResources.bind(this), intervalMs);
|
|
40
|
+
this.gcObserver = new PerformanceObserver((list) => {
|
|
41
|
+
this.bufferedGcEntries.push(...list.getEntries());
|
|
42
|
+
});
|
|
43
|
+
this.gcObserver.observe({ entryTypes: ["gc"], buffered: true });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Stop resource monitoring
|
|
47
|
+
*/
|
|
48
|
+
stopMonitoring() {
|
|
49
|
+
if (this.logInterval) {
|
|
50
|
+
clearInterval(this.logInterval);
|
|
51
|
+
this.logInterval = null;
|
|
52
|
+
}
|
|
53
|
+
if (this.gcObserver) {
|
|
54
|
+
this.gcObserver.disconnect();
|
|
55
|
+
this.gcObserver = null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async logResources() {
|
|
59
|
+
try {
|
|
60
|
+
await this.logResourceSnapshot("ResourceMonitor");
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
console.error(`Resource monitoring error: ${error instanceof Error ? error.message : String(error)}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get combined system metrics (disk and memory)
|
|
68
|
+
*/
|
|
69
|
+
async getSystemMetrics() {
|
|
70
|
+
const [disk, memory] = await Promise.all([this.getDiskMetrics(), this.getMemoryMetrics()]);
|
|
71
|
+
return { disk, memory };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get disk space information
|
|
75
|
+
*/
|
|
76
|
+
async getDiskMetrics() {
|
|
77
|
+
try {
|
|
78
|
+
// Even with permission errors, du will output a total
|
|
79
|
+
const { stdout, stderr } = await execAsync(`du -sb ${this.dirName} || true`);
|
|
80
|
+
// Get the last line of stdout which contains the total
|
|
81
|
+
const lastLine = stdout.split("\n").filter(Boolean).pop() || "";
|
|
82
|
+
const usedBytes = parseInt(lastLine.split("\t")[0] ?? "", 10);
|
|
83
|
+
const effectiveTotal = DISK_LIMIT_BYTES;
|
|
84
|
+
const effectiveUsed = Math.min(usedBytes, DISK_LIMIT_BYTES);
|
|
85
|
+
const effectiveFree = effectiveTotal - effectiveUsed;
|
|
86
|
+
const percentUsed = (effectiveUsed / effectiveTotal) * 100;
|
|
87
|
+
const metrics = {
|
|
88
|
+
total: effectiveTotal,
|
|
89
|
+
used: effectiveUsed,
|
|
90
|
+
free: effectiveFree,
|
|
91
|
+
percentUsed,
|
|
92
|
+
};
|
|
93
|
+
// If we had permission errors, add a warning
|
|
94
|
+
if (stderr.includes("Permission denied") || stderr.includes("cannot access")) {
|
|
95
|
+
metrics.warning = "Some directories were not accessible";
|
|
96
|
+
}
|
|
97
|
+
else if (stderr.includes("No such file or directory")) {
|
|
98
|
+
metrics.warning = "The directory does not exist";
|
|
99
|
+
}
|
|
100
|
+
return metrics;
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error(`Error getting disk metrics: ${error instanceof Error ? error.message : String(error)}`);
|
|
104
|
+
return {
|
|
105
|
+
free: DISK_LIMIT_BYTES,
|
|
106
|
+
total: DISK_LIMIT_BYTES,
|
|
107
|
+
used: 0,
|
|
108
|
+
percentUsed: 0,
|
|
109
|
+
warning: "Failed to measure disk usage",
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get memory metrics
|
|
115
|
+
*/
|
|
116
|
+
getMemoryMetrics() {
|
|
117
|
+
const total = os.totalmem();
|
|
118
|
+
const free = os.freemem();
|
|
119
|
+
const used = total - free;
|
|
120
|
+
const percentUsed = (used / total) * 100;
|
|
121
|
+
return { total, free, used, percentUsed };
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get process-specific metrics using /proc filesystem
|
|
125
|
+
*/
|
|
126
|
+
async getProcMetrics(pids) {
|
|
127
|
+
return Promise.all(pids.map(async (pid) => {
|
|
128
|
+
try {
|
|
129
|
+
// Read process status
|
|
130
|
+
const status = await fs.readFile(`/proc/${pid}/status`, "utf8");
|
|
131
|
+
const cmdline = await fs.readFile(`/proc/${pid}/cmdline`, "utf8");
|
|
132
|
+
const stat = await fs.readFile(`/proc/${pid}/stat`, "utf8");
|
|
133
|
+
// Parse VmRSS (resident set size) from status
|
|
134
|
+
const rss = parseInt(status.match(/VmRSS:\s+(\d+)/)?.[1] ?? "0", 10);
|
|
135
|
+
// Parse VmSize (virtual memory size) from status
|
|
136
|
+
const vsz = parseInt(status.match(/VmSize:\s+(\d+)/)?.[1] ?? "0", 10);
|
|
137
|
+
// Get process owner
|
|
138
|
+
const user = (await fs.stat(`/proc/${pid}`)).uid.toString();
|
|
139
|
+
// Parse CPU stats from /proc/[pid]/stat
|
|
140
|
+
const stats = stat.split(" ");
|
|
141
|
+
const utime = parseInt(stats[13] ?? "0", 10);
|
|
142
|
+
const stime = parseInt(stats[14] ?? "0", 10);
|
|
143
|
+
const starttime = parseInt(stats[21] ?? "0", 10);
|
|
144
|
+
// Calculate CPU percentage
|
|
145
|
+
const totalTime = utime + stime;
|
|
146
|
+
const uptime = os.uptime();
|
|
147
|
+
const hertz = 100; // Usually 100 on Linux
|
|
148
|
+
const elapsedTime = uptime - starttime / hertz;
|
|
149
|
+
const cpuUsage = 100 * (totalTime / hertz / elapsedTime);
|
|
150
|
+
// Calculate memory percentage against total system memory
|
|
151
|
+
const totalMem = os.totalmem();
|
|
152
|
+
const memoryPercent = (rss * 1024 * 100) / totalMem;
|
|
153
|
+
return {
|
|
154
|
+
user,
|
|
155
|
+
pid,
|
|
156
|
+
cpu: cpuUsage,
|
|
157
|
+
mem: memoryPercent,
|
|
158
|
+
vsz,
|
|
159
|
+
rss,
|
|
160
|
+
command: cmdline.replace(/\0/g, " ").trim(),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
})).then((results) => results.filter((r) => r !== null));
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Find PIDs for a process name using /proc filesystem
|
|
170
|
+
*/
|
|
171
|
+
async findPidsByName(processName) {
|
|
172
|
+
if (!processName) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const pids = [];
|
|
177
|
+
const procDirs = await fs.readdir("/proc");
|
|
178
|
+
for (const dir of procDirs) {
|
|
179
|
+
if (!/^\d+$/.test(dir))
|
|
180
|
+
continue;
|
|
181
|
+
const processPid = parseInt(dir, 10);
|
|
182
|
+
// Ignore processes that have a lower PID than our own PID
|
|
183
|
+
if (processPid <= process.pid) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const cmdline = await fs.readFile(`/proc/${dir}/cmdline`, "utf8");
|
|
188
|
+
if (cmdline.includes(processName)) {
|
|
189
|
+
pids.push(parseInt(dir, 10));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// Ignore errors reading individual process info
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return pids;
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return [];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Get process-specific metrics
|
|
205
|
+
*/
|
|
206
|
+
async getProcessMetrics() {
|
|
207
|
+
// Get Node.js process metrics
|
|
208
|
+
const totalMemory = os.totalmem();
|
|
209
|
+
// Convert GB to bytes (machine.memory is in GB)
|
|
210
|
+
const machineMemoryBytes = totalMemory;
|
|
211
|
+
const nodeMemoryUsage = process.memoryUsage();
|
|
212
|
+
// Node process percentage is based on machine memory if available, otherwise system memory
|
|
213
|
+
const nodeMemoryPercent = (nodeMemoryUsage.rss / machineMemoryBytes) * 100;
|
|
214
|
+
const heapStats = getHeapStatistics();
|
|
215
|
+
const nodeMetrics = {
|
|
216
|
+
memoryUsage: nodeMemoryUsage.rss,
|
|
217
|
+
memoryUsagePercent: nodeMemoryPercent,
|
|
218
|
+
heapUsed: nodeMemoryUsage.heapUsed,
|
|
219
|
+
heapSizeLimit: heapStats.heap_size_limit,
|
|
220
|
+
heapUsagePercent: (heapStats.used_heap_size / heapStats.heap_size_limit) * 100,
|
|
221
|
+
availableHeap: heapStats.total_available_size,
|
|
222
|
+
isNearHeapLimit: heapStats.used_heap_size / heapStats.heap_size_limit > 0.8,
|
|
223
|
+
};
|
|
224
|
+
let method = "ps";
|
|
225
|
+
try {
|
|
226
|
+
let processes = [];
|
|
227
|
+
// Try ps first, fall back to /proc if it fails
|
|
228
|
+
try {
|
|
229
|
+
const { stdout: psOutput } = await execAsync(`ps aux | grep ${this.processName} | grep -v grep`);
|
|
230
|
+
if (psOutput.trim()) {
|
|
231
|
+
processes = psOutput
|
|
232
|
+
.trim()
|
|
233
|
+
.split("\n")
|
|
234
|
+
.filter((line) => {
|
|
235
|
+
const parts = line.trim().split(/\s+/);
|
|
236
|
+
const pid = parseInt(parts[1] ?? "0", 10);
|
|
237
|
+
// Ignore processes that have a lower PID than our own PID
|
|
238
|
+
return pid > process.pid;
|
|
239
|
+
})
|
|
240
|
+
.map((line) => {
|
|
241
|
+
const parts = line.trim().split(/\s+/);
|
|
242
|
+
return {
|
|
243
|
+
user: parts[0] ?? "",
|
|
244
|
+
pid: parseInt(parts[1] ?? "0", 10),
|
|
245
|
+
cpu: parseFloat(parts[2] ?? "0"),
|
|
246
|
+
mem: parseFloat(parts[3] ?? "0"),
|
|
247
|
+
vsz: parseInt(parts[4] ?? "0", 10),
|
|
248
|
+
rss: parseInt(parts[5] ?? "0", 10),
|
|
249
|
+
command: parts.slice(10).join(" "),
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
// ps failed, try /proc instead
|
|
256
|
+
method = "proc";
|
|
257
|
+
const pids = await this.findPidsByName(this.processName);
|
|
258
|
+
processes = await this.getProcMetrics(pids);
|
|
259
|
+
}
|
|
260
|
+
if (processes.length === 0) {
|
|
261
|
+
return {
|
|
262
|
+
node: nodeMetrics,
|
|
263
|
+
targetProcess: this.processName
|
|
264
|
+
? {
|
|
265
|
+
method,
|
|
266
|
+
processName: this.processName,
|
|
267
|
+
count: 0,
|
|
268
|
+
processes: [],
|
|
269
|
+
averages: null,
|
|
270
|
+
totals: null,
|
|
271
|
+
}
|
|
272
|
+
: null,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
// For CPU:
|
|
276
|
+
// - ps shows CPU percentage per core (e.g., 100% = 1 core)
|
|
277
|
+
// - machine.cpu is in cores (e.g., 0.5 = half a core)
|
|
278
|
+
// - we want to show percentage of allocated CPU (e.g., 100% = using all allocated CPU)
|
|
279
|
+
const availableCpu = os.cpus().length;
|
|
280
|
+
const cpuNormalizer = availableCpu * 100; // Convert to basis points for better precision with fractional CPUs
|
|
281
|
+
// For Memory:
|
|
282
|
+
// - ps 'mem' is already a percentage of system memory
|
|
283
|
+
// - we need to convert it to a percentage of machine memory
|
|
284
|
+
// - if machine memory is 0.5GB and system has 16GB, we multiply the percentage by 32
|
|
285
|
+
const memoryScaleFactor = this.ctx.machine ? totalMemory / machineMemoryBytes : 1;
|
|
286
|
+
const totals = processes.reduce((acc, proc) => ({
|
|
287
|
+
cpu: acc.cpu + proc.cpu,
|
|
288
|
+
// Scale memory percentage to machine memory
|
|
289
|
+
// TODO: test this
|
|
290
|
+
memory: acc.memory + proc.mem * memoryScaleFactor,
|
|
291
|
+
rss: acc.rss + proc.rss,
|
|
292
|
+
vsz: acc.vsz + proc.vsz,
|
|
293
|
+
}), { cpu: 0, memory: 0, rss: 0, vsz: 0 });
|
|
294
|
+
const count = processes.length;
|
|
295
|
+
const averages = {
|
|
296
|
+
cpu: totals.cpu / (count * cpuNormalizer),
|
|
297
|
+
memory: totals.memory / count,
|
|
298
|
+
rss: totals.rss / count,
|
|
299
|
+
vsz: totals.vsz / count,
|
|
300
|
+
};
|
|
301
|
+
return {
|
|
302
|
+
node: nodeMetrics,
|
|
303
|
+
targetProcess: this.processName
|
|
304
|
+
? {
|
|
305
|
+
method,
|
|
306
|
+
processName: this.processName,
|
|
307
|
+
count,
|
|
308
|
+
processes,
|
|
309
|
+
averages,
|
|
310
|
+
totals: {
|
|
311
|
+
cpu: totals.cpu / cpuNormalizer,
|
|
312
|
+
memory: totals.memory,
|
|
313
|
+
rss: totals.rss,
|
|
314
|
+
vsz: totals.vsz,
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
: null,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
return {
|
|
322
|
+
node: nodeMetrics,
|
|
323
|
+
targetProcess: this.processName
|
|
324
|
+
? {
|
|
325
|
+
method,
|
|
326
|
+
processName: this.processName,
|
|
327
|
+
count: 0,
|
|
328
|
+
processes: [],
|
|
329
|
+
averages: null,
|
|
330
|
+
totals: null,
|
|
331
|
+
}
|
|
332
|
+
: null,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Log a snapshot of current resource usage
|
|
338
|
+
*/
|
|
339
|
+
async logResourceSnapshot(label = "Resource Snapshot") {
|
|
340
|
+
try {
|
|
341
|
+
const payload = await this.getResourceSnapshotPayload();
|
|
342
|
+
const enhancedLabel = this.compactLogging
|
|
343
|
+
? this.createCompactLabel(payload, label)
|
|
344
|
+
: this.createEnhancedLabel(payload, label);
|
|
345
|
+
if (payload.process.node.isNearHeapLimit) {
|
|
346
|
+
console.warn(`${enhancedLabel}: Node is near heap limit`);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
console.log(enhancedLabel);
|
|
350
|
+
}
|
|
351
|
+
if (this.verbose) {
|
|
352
|
+
console.dir(payload, { depth: 6 });
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
console.error(`Error logging resource snapshot: ${error instanceof Error ? error.message : String(error)}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Create an enhanced log label with key metrics for quick scanning
|
|
361
|
+
*/
|
|
362
|
+
createEnhancedLabel(payload, baseLabel) {
|
|
363
|
+
const parts = [baseLabel];
|
|
364
|
+
// System resources with text indicators
|
|
365
|
+
const diskPercent = parseFloat(payload.system.disk.percentUsed);
|
|
366
|
+
const memoryPercent = parseFloat(payload.system.memory.percentUsed);
|
|
367
|
+
const diskIndicator = this.getTextIndicator(diskPercent, 80, 90);
|
|
368
|
+
const memIndicator = this.getTextIndicator(memoryPercent, 80, 90);
|
|
369
|
+
parts.push(`Disk:${diskPercent.toFixed(1).padStart(5)}%${diskIndicator}`);
|
|
370
|
+
parts.push(`Mem:${memoryPercent.toFixed(1).padStart(5)}%${memIndicator}`);
|
|
371
|
+
// Node process metrics with text indicators
|
|
372
|
+
const nodeMemPercent = parseFloat(payload.process.node.memoryUsagePercent);
|
|
373
|
+
const heapPercent = parseFloat(payload.process.node.heapUsagePercent);
|
|
374
|
+
const nodeIndicator = this.getTextIndicator(nodeMemPercent, 70, 85);
|
|
375
|
+
const heapIndicator = this.getTextIndicator(heapPercent, 70, 85);
|
|
376
|
+
parts.push(`Node:${nodeMemPercent.toFixed(1).padStart(4)}%${nodeIndicator}`);
|
|
377
|
+
parts.push(`Heap:${heapPercent.toFixed(1).padStart(4)}%${heapIndicator}`);
|
|
378
|
+
// Target process metrics (if available)
|
|
379
|
+
if (payload.process.targetProcess && payload.process.targetProcess.count > 0) {
|
|
380
|
+
const targetCpu = payload.process.targetProcess.totals?.cpuPercent || "0";
|
|
381
|
+
const targetMem = payload.process.targetProcess.totals?.memoryPercent || "0";
|
|
382
|
+
const targetCpuNum = parseFloat(targetCpu);
|
|
383
|
+
const targetMemNum = parseFloat(targetMem);
|
|
384
|
+
const cpuIndicator = this.getTextIndicator(targetCpuNum, 80, 90);
|
|
385
|
+
const memIndicator = this.getTextIndicator(targetMemNum, 80, 90);
|
|
386
|
+
parts.push(`${payload.process.targetProcess.processName}:${targetCpu.padStart(4)}%${cpuIndicator}/${targetMem.padStart(4)}%${memIndicator}`);
|
|
387
|
+
}
|
|
388
|
+
// GC activity with performance indicators
|
|
389
|
+
if (payload.gc && payload.gc.count > 0) {
|
|
390
|
+
const avgDuration = payload.gc.avgDuration;
|
|
391
|
+
const gcIndicator = this.getTextIndicator(avgDuration, 5, 10, true);
|
|
392
|
+
parts.push(`GC:${payload.gc.count.toString().padStart(2)}(${avgDuration
|
|
393
|
+
.toFixed(1)
|
|
394
|
+
.padStart(4)}ms)${gcIndicator}`);
|
|
395
|
+
}
|
|
396
|
+
// Machine constraints
|
|
397
|
+
if (payload.constraints) {
|
|
398
|
+
parts.push(`[${payload.constraints.cpu}CPU/${payload.constraints.memoryGB}GB]`);
|
|
399
|
+
}
|
|
400
|
+
// Warning indicators (only show critical ones in the main label)
|
|
401
|
+
const criticalWarnings = [];
|
|
402
|
+
if (payload.process.node.isNearHeapLimit)
|
|
403
|
+
criticalWarnings.push("HEAP_LIMIT");
|
|
404
|
+
if (diskPercent > 90)
|
|
405
|
+
criticalWarnings.push("DISK_CRITICAL");
|
|
406
|
+
if (memoryPercent > 95)
|
|
407
|
+
criticalWarnings.push("MEM_CRITICAL");
|
|
408
|
+
if (payload.system.disk.warning)
|
|
409
|
+
criticalWarnings.push("DISK_WARN");
|
|
410
|
+
if (criticalWarnings.length > 0) {
|
|
411
|
+
parts.push(`[${criticalWarnings.join(",")}]`);
|
|
412
|
+
}
|
|
413
|
+
return parts.join(" | ");
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Get text-based indicator for percentage values
|
|
417
|
+
*/
|
|
418
|
+
getTextIndicator(value, warningThreshold, criticalThreshold, isDuration = false) {
|
|
419
|
+
if (isDuration) {
|
|
420
|
+
// For duration values, higher is worse
|
|
421
|
+
if (value >= criticalThreshold)
|
|
422
|
+
return " [CRIT]";
|
|
423
|
+
if (value >= warningThreshold)
|
|
424
|
+
return " [WARN]";
|
|
425
|
+
return " [OK]";
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
// For percentage values, higher is worse
|
|
429
|
+
if (value >= criticalThreshold)
|
|
430
|
+
return " [CRIT]";
|
|
431
|
+
if (value >= warningThreshold)
|
|
432
|
+
return " [WARN]";
|
|
433
|
+
return " [OK]";
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Create a compact version of the enhanced label for high-frequency logging
|
|
438
|
+
*/
|
|
439
|
+
createCompactLabel(payload, baseLabel) {
|
|
440
|
+
const parts = [baseLabel];
|
|
441
|
+
// Only show critical metrics in compact mode
|
|
442
|
+
const diskPercent = parseFloat(payload.system.disk.percentUsed);
|
|
443
|
+
const memoryPercent = parseFloat(payload.system.memory.percentUsed);
|
|
444
|
+
const heapPercent = parseFloat(payload.process.node.heapUsagePercent);
|
|
445
|
+
// Use single character indicators for compactness
|
|
446
|
+
const diskIndicator = diskPercent > 90 ? "!" : diskPercent > 80 ? "?" : ".";
|
|
447
|
+
const memIndicator = memoryPercent > 95 ? "!" : memoryPercent > 80 ? "?" : ".";
|
|
448
|
+
const heapIndicator = heapPercent > 85 ? "!" : heapPercent > 70 ? "?" : ".";
|
|
449
|
+
parts.push(`D:${diskPercent.toFixed(0).padStart(2)}%${diskIndicator}`);
|
|
450
|
+
parts.push(`M:${memoryPercent.toFixed(0).padStart(2)}%${memIndicator}`);
|
|
451
|
+
parts.push(`H:${heapPercent.toFixed(0).padStart(2)}%${heapIndicator}`);
|
|
452
|
+
// GC activity (only if significant)
|
|
453
|
+
if (payload.gc && payload.gc.count > 0 && payload.gc.avgDuration > 2) {
|
|
454
|
+
const gcIndicator = payload.gc.avgDuration > 10 ? "!" : payload.gc.avgDuration > 5 ? "?" : ".";
|
|
455
|
+
parts.push(`GC:${payload.gc.count}${gcIndicator}`);
|
|
456
|
+
}
|
|
457
|
+
return parts.join(" ");
|
|
458
|
+
}
|
|
459
|
+
async getResourceSnapshotPayload() {
|
|
460
|
+
const [systemMetrics, processMetrics] = await Promise.all([
|
|
461
|
+
this.getSystemMetrics(),
|
|
462
|
+
this.getProcessMetrics(),
|
|
463
|
+
]);
|
|
464
|
+
const gcSummary = summarizeGCEntries(this.bufferedGcEntries);
|
|
465
|
+
this.bufferedGcEntries = [];
|
|
466
|
+
const formatBytes = (bytes) => (bytes / (1024 * 1024)).toFixed(2);
|
|
467
|
+
const formatPercent = (value) => value.toFixed(1);
|
|
468
|
+
return {
|
|
469
|
+
system: {
|
|
470
|
+
disk: {
|
|
471
|
+
limitGiB: DISK_LIMIT_GB,
|
|
472
|
+
dirName: this.dirName,
|
|
473
|
+
usedGiB: (systemMetrics.disk.used / (1024 * 1024 * 1024)).toFixed(2),
|
|
474
|
+
freeGiB: (systemMetrics.disk.free / (1024 * 1024 * 1024)).toFixed(2),
|
|
475
|
+
percentUsed: formatPercent(systemMetrics.disk.percentUsed),
|
|
476
|
+
warning: systemMetrics.disk.warning,
|
|
477
|
+
},
|
|
478
|
+
memory: {
|
|
479
|
+
freeGB: (systemMetrics.memory.free / (1024 * 1024 * 1024)).toFixed(2),
|
|
480
|
+
percentUsed: formatPercent(systemMetrics.memory.percentUsed),
|
|
481
|
+
},
|
|
482
|
+
},
|
|
483
|
+
gc: gcSummary,
|
|
484
|
+
constraints: {
|
|
485
|
+
cpu: os.cpus().length,
|
|
486
|
+
memoryGB: Math.floor(os.totalmem() / (1024 * 1024 * 1024)),
|
|
487
|
+
note: "Using system resources (no machine constraints specified)",
|
|
488
|
+
},
|
|
489
|
+
process: {
|
|
490
|
+
node: {
|
|
491
|
+
memoryUsageMB: formatBytes(processMetrics.node.memoryUsage),
|
|
492
|
+
memoryUsagePercent: formatPercent(processMetrics.node.memoryUsagePercent),
|
|
493
|
+
heapUsedMB: formatBytes(processMetrics.node.heapUsed),
|
|
494
|
+
heapSizeLimitMB: formatBytes(processMetrics.node.heapSizeLimit),
|
|
495
|
+
heapUsagePercent: formatPercent(processMetrics.node.heapUsagePercent),
|
|
496
|
+
availableHeapMB: formatBytes(processMetrics.node.availableHeap),
|
|
497
|
+
isNearHeapLimit: processMetrics.node.isNearHeapLimit,
|
|
498
|
+
...(this.verbose
|
|
499
|
+
? {
|
|
500
|
+
heapStats: getHeapStatistics(),
|
|
501
|
+
}
|
|
502
|
+
: {}),
|
|
503
|
+
},
|
|
504
|
+
targetProcess: processMetrics.targetProcess
|
|
505
|
+
? {
|
|
506
|
+
method: processMetrics.targetProcess.method,
|
|
507
|
+
processName: processMetrics.targetProcess.processName,
|
|
508
|
+
count: processMetrics.targetProcess.count,
|
|
509
|
+
averages: processMetrics.targetProcess.averages
|
|
510
|
+
? {
|
|
511
|
+
cpuPercent: formatPercent(processMetrics.targetProcess.averages.cpu * 100),
|
|
512
|
+
memoryPercent: formatPercent(processMetrics.targetProcess.averages.memory),
|
|
513
|
+
rssMB: formatBytes(processMetrics.targetProcess.averages.rss * 1024),
|
|
514
|
+
vszMB: formatBytes(processMetrics.targetProcess.averages.vsz * 1024),
|
|
515
|
+
}
|
|
516
|
+
: null,
|
|
517
|
+
totals: processMetrics.targetProcess.totals
|
|
518
|
+
? {
|
|
519
|
+
cpuPercent: formatPercent(processMetrics.targetProcess.totals.cpu * 100),
|
|
520
|
+
memoryPercent: formatPercent(processMetrics.targetProcess.totals.memory),
|
|
521
|
+
rssMB: formatBytes(processMetrics.targetProcess.totals.rss * 1024),
|
|
522
|
+
vszMB: formatBytes(processMetrics.targetProcess.totals.vsz * 1024),
|
|
523
|
+
}
|
|
524
|
+
: null,
|
|
525
|
+
}
|
|
526
|
+
: null,
|
|
527
|
+
},
|
|
528
|
+
timestamp: new Date().toISOString(),
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
function summarizeGCEntries(entries) {
|
|
533
|
+
if (entries.length === 0) {
|
|
534
|
+
return {
|
|
535
|
+
count: 0,
|
|
536
|
+
totalDuration: 0,
|
|
537
|
+
avgDuration: 0,
|
|
538
|
+
maxDuration: 0,
|
|
539
|
+
kinds: {},
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
let totalDuration = 0;
|
|
543
|
+
let maxDuration = 0;
|
|
544
|
+
const kinds = {};
|
|
545
|
+
for (const e of entries) {
|
|
546
|
+
const duration = e.duration;
|
|
547
|
+
totalDuration += duration;
|
|
548
|
+
if (duration > maxDuration)
|
|
549
|
+
maxDuration = duration;
|
|
550
|
+
const kind = kindName(e?.detail?.kind ?? "unknown");
|
|
551
|
+
if (!kinds[kind]) {
|
|
552
|
+
kinds[kind] = { count: 0, totalDuration: 0, maxDuration: 0 };
|
|
553
|
+
}
|
|
554
|
+
kinds[kind].count += 1;
|
|
555
|
+
kinds[kind].totalDuration += duration;
|
|
556
|
+
if (duration > kinds[kind].maxDuration)
|
|
557
|
+
kinds[kind].maxDuration = duration;
|
|
558
|
+
}
|
|
559
|
+
// finalize averages
|
|
560
|
+
const avgDuration = totalDuration / entries.length;
|
|
561
|
+
const kindsWithAvg = {};
|
|
562
|
+
for (const [kind, stats] of Object.entries(kinds)) {
|
|
563
|
+
kindsWithAvg[kind] = {
|
|
564
|
+
count: stats.count,
|
|
565
|
+
totalDuration: stats.totalDuration,
|
|
566
|
+
avgDuration: stats.totalDuration / stats.count,
|
|
567
|
+
maxDuration: stats.maxDuration,
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
return {
|
|
571
|
+
count: entries.length,
|
|
572
|
+
totalDuration,
|
|
573
|
+
avgDuration,
|
|
574
|
+
maxDuration,
|
|
575
|
+
kinds: kindsWithAvg,
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
const kindName = (k) => {
|
|
579
|
+
if (typeof k === "number") {
|
|
580
|
+
return ({
|
|
581
|
+
[constants.NODE_PERFORMANCE_GC_MAJOR]: "major",
|
|
582
|
+
[constants.NODE_PERFORMANCE_GC_MINOR]: "minor",
|
|
583
|
+
[constants.NODE_PERFORMANCE_GC_INCREMENTAL]: "incremental",
|
|
584
|
+
[constants.NODE_PERFORMANCE_GC_WEAKCB]: "weak-cb",
|
|
585
|
+
}[k] ?? `kind:${k}`);
|
|
586
|
+
}
|
|
587
|
+
return k;
|
|
588
|
+
};
|
|
589
|
+
//# sourceMappingURL=resourceMonitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceMonitor.js","sourceRoot":"","sources":["../../../../src/v3/serverOnly/resourceMonitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,5 +2,5 @@ import { Attributes } from "@opentelemetry/api";
|
|
|
2
2
|
export declare const NULL_SENTINEL = "$@null((";
|
|
3
3
|
export declare const CIRCULAR_REFERENCE_SENTINEL = "$@circular((";
|
|
4
4
|
export declare function flattenAttributes(obj: unknown, prefix?: string, maxAttributeCount?: number): Attributes;
|
|
5
|
-
export declare function unflattenAttributes(obj: Attributes): Record<string, unknown> | string | number | boolean | null | undefined;
|
|
5
|
+
export declare function unflattenAttributes(obj: Attributes, filteredKeys?: string[]): Record<string, unknown> | string | number | boolean | null | undefined;
|
|
6
6
|
export declare function primitiveValueOrflattenedAttributes(obj: Record<string, unknown> | Array<unknown> | string | boolean | number | undefined, prefix: string | undefined): Attributes | string | number | boolean | undefined;
|
|
@@ -202,7 +202,7 @@ class AttributeFlattener {
|
|
|
202
202
|
function isRecord(value) {
|
|
203
203
|
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
204
204
|
}
|
|
205
|
-
export function unflattenAttributes(obj) {
|
|
205
|
+
export function unflattenAttributes(obj, filteredKeys) {
|
|
206
206
|
if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
|
|
207
207
|
return obj;
|
|
208
208
|
}
|
|
@@ -217,6 +217,9 @@ export function unflattenAttributes(obj) {
|
|
|
217
217
|
}
|
|
218
218
|
const result = {};
|
|
219
219
|
for (const [key, value] of Object.entries(obj)) {
|
|
220
|
+
if (filteredKeys?.includes(key)) {
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
220
223
|
const parts = key.split(".").reduce((acc, part) => {
|
|
221
224
|
if (part.startsWith("[") && part.endsWith("]")) {
|
|
222
225
|
// Handle array indices more precisely
|