You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
homepage/src/pages/api/widgets/kubernetes.js

81 lines
2.2 KiB

import { CoreV1Api, Metrics } from "@kubernetes/client-node";
import getKubeConfig from "../../../utils/config/kubernetes";
import { parseCpu, parseMemory } from "../../../utils/kubernetes/kubernetes-utils";
import createLogger from "../../../utils/logger";
const logger = createLogger("kubernetes-widget");
export default async function handler(req, res) {
const { type } = req.query;
try {
const kc = getKubeConfig();
const coreApi = kc.makeApiClient(CoreV1Api);
const metricsApi = new Metrics(kc);
const nodes = await coreApi.listNode()
.then((response) => response.body)
.catch((error) => {
logger.error("Error getting ingresses: %d %s %s", error.statusCode, error.body, error.response);
return null;
});
if (!nodes) {
return res.status(500).send({
error: "unknown error"
});
}
const nodeCapacity = new Map();
let cpuTotal = 0;
let cpuUsage = 0;
let memTotal = 0;
let memUsage = 0;
nodes.items.forEach((node) => {
nodeCapacity.set(node.metadata.name, node.status.capacity);
cpuTotal += Number.parseInt(node.status.capacity.cpu, 10);
memTotal += parseMemory(node.status.capacity.memory);
});
const nodeMetrics = await metricsApi.getNodeMetrics();
const nodeUsage = new Map();
nodeMetrics.items.forEach((metrics) => {
nodeUsage.set(metrics.metadata.name, metrics.usage);
cpuUsage += parseCpu(metrics.usage.cpu);
memUsage += parseMemory(metrics.usage.memory);
});
if (type === "cpu") {
return res.status(200).json({
cpu: {
usage: (cpuUsage / cpuTotal) * 100,
load: cpuUsage
}
});
}
if (type === "memory") {
const SCALE_MB = 1024 * 1024;
const usedMemMb = memUsage / SCALE_MB;
const totalMemMb = memTotal / SCALE_MB;
const freeMemMb = totalMemMb - usedMemMb;
return res.status(200).json({
memory: {
usedMemMb,
freeMemMb,
totalMemMb
}
});
}
return res.status(400).json({
error: "invalid type"
});
} catch (e) {
logger.error("exception %s", e);
return res.status(500).send({
error: "unknown error"
});
}
}