Files
Minikura/apps/web/lib/k8s-metrics.ts

73 lines
2.2 KiB
TypeScript

export interface ResourceMetrics {
cpuUsage?: string;
cpuUsagePercent?: number;
memoryUsage?: string;
memoryUsagePercent?: number;
}
/** Convert CPU nanoseconds (e.g. "123456789n") to millicores (e.g. "123m") */
export function parseCpuUsage(cpuNano: string): string | undefined {
const usageNano = Number.parseInt(cpuNano.replace("n", ""), 10);
if (Number.isNaN(usageNano)) return undefined;
const usageMilli = Math.round(usageNano / 1_000_000);
return `${usageMilli}m`;
}
export function calculateCpuPercent(cpuNano: string, capacityNano: string): number | undefined {
const usageNano = Number.parseInt(cpuNano.replace("n", ""), 10);
const capNano = Number.parseInt(capacityNano.replace("n", ""), 10);
if (Number.isNaN(usageNano) || Number.isNaN(capNano) || capNano === 0) {
return undefined;
}
return Math.round((usageNano / capNano) * 100);
}
/** Convert memory kibibytes (e.g. "1024Ki") to mebibytes (e.g. "1Mi") */
export function parseMemoryUsage(memoryKi: string): string | undefined {
const usageKi = Number.parseInt(memoryKi.replace("Ki", ""), 10);
if (Number.isNaN(usageKi)) return undefined;
const usageMi = Math.round(usageKi / 1024);
return `${usageMi}Mi`;
}
export function calculateMemoryPercent(memoryKi: string, capacityKi: string): number | undefined {
const usageKi = Number.parseInt(memoryKi.replace("Ki", ""), 10);
const capKi = Number.parseInt(capacityKi.replace("Ki", ""), 10);
if (Number.isNaN(usageKi) || Number.isNaN(capKi) || capKi === 0) {
return undefined;
}
return Math.round((usageKi / capKi) * 100);
}
/** Parse raw K8s metrics into a standardized format with optional percentages */
export function parseK8sMetrics(
cpuUsage?: string,
memoryUsage?: string,
cpuCapacity?: string,
memoryCapacity?: string
): ResourceMetrics {
const result: ResourceMetrics = {};
if (cpuUsage) {
result.cpuUsage = parseCpuUsage(cpuUsage);
if (cpuCapacity) {
result.cpuUsagePercent = calculateCpuPercent(cpuUsage, cpuCapacity);
}
}
if (memoryUsage) {
result.memoryUsage = parseMemoryUsage(memoryUsage);
if (memoryCapacity) {
result.memoryUsagePercent = calculateMemoryPercent(memoryUsage, memoryCapacity);
}
}
return result;
}