70 lines
1.8 KiB
TypeScript
70 lines
1.8 KiB
TypeScript
import type { Client } from "ssh2";
|
|
import { execCommand } from "./common-utils.js";
|
|
import { statsLogger } from "../../utils/logger.js";
|
|
|
|
export async function collectProcessesMetrics(client: Client): Promise<{
|
|
total: number | null;
|
|
running: number | null;
|
|
top: Array<{
|
|
pid: string;
|
|
user: string;
|
|
cpu: string;
|
|
mem: string;
|
|
command: string;
|
|
}>;
|
|
}> {
|
|
let totalProcesses: number | null = null;
|
|
let runningProcesses: number | null = null;
|
|
const topProcesses: Array<{
|
|
pid: string;
|
|
user: string;
|
|
cpu: string;
|
|
mem: string;
|
|
command: string;
|
|
}> = [];
|
|
|
|
try {
|
|
const psOut = await execCommand(
|
|
client,
|
|
"ps aux --sort=-%cpu | head -n 11",
|
|
);
|
|
const psLines = psOut.stdout
|
|
.split("\n")
|
|
.map((l) => l.trim())
|
|
.filter(Boolean);
|
|
if (psLines.length > 1) {
|
|
for (let i = 1; i < Math.min(psLines.length, 11); i++) {
|
|
const parts = psLines[i].split(/\s+/);
|
|
if (parts.length >= 11) {
|
|
topProcesses.push({
|
|
pid: parts[1],
|
|
user: parts[0],
|
|
cpu: parts[2],
|
|
mem: parts[3],
|
|
command: parts.slice(10).join(" ").substring(0, 50),
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
const procCount = await execCommand(client, "ps aux | wc -l");
|
|
const runningCount = await execCommand(
|
|
client,
|
|
"ps aux | grep -c ' R '",
|
|
);
|
|
totalProcesses = Number(procCount.stdout.trim()) - 1;
|
|
runningProcesses = Number(runningCount.stdout.trim());
|
|
} catch (e) {
|
|
statsLogger.debug("Failed to collect process stats", {
|
|
operation: "process_stats_failed",
|
|
error: e instanceof Error ? e.message : String(e),
|
|
});
|
|
}
|
|
|
|
return {
|
|
total: totalProcesses,
|
|
running: runningProcesses,
|
|
top: topProcesses,
|
|
};
|
|
}
|