Work at monitoring of app

This commit is contained in:
stefan.meyer
2024-11-28 14:35:33 +00:00
parent f9d0d40183
commit 62d5c1c43c
4 changed files with 95 additions and 26 deletions

View File

@@ -10,6 +10,7 @@ import deploymentService from "@/server/services/deployment.service";
import monitorAppService from "@/server/services/monitor-app.service";
import podService from "@/server/services/pod.service";
import { getAuthUserSession, simpleAction } from "@/server/utils/action-wrapper.utils";
import { PodsResourceInfoModel } from "@/shared/model/pods-resource-info.model";
export const getDeploymentsAndBuildsForApp = async (appId: string) =>
@@ -33,8 +34,8 @@ export const getPodsForApp = async (appId: string) =>
return await podService.getPodsForApp(app.projectId, appId);
}) as Promise<ServerActionResult<unknown, PodsInfoModel[]>>;
export const getRessourceDataApp = async (namespace: string, deploymentName: string) =>
export const getRessourceDataApp = async (projectId: string, appId: string) =>
simpleAction(async () => {
await getAuthUserSession();
return await monitorAppService.getPodsFromDeployment(namespace, deploymentName);
}) as Promise<ServerActionResult<unknown, string>>;
return await monitorAppService.getPodsForApp(projectId, appId);
}) as Promise<ServerActionResult<unknown, PodsResourceInfoModel>>;

View File

@@ -12,6 +12,8 @@ import { DeploymentInfoModel } from "@/shared/model/deployment-info.model";
import DeploymentStatusBadge from "./deployment-status-badge";
import { BuildLogsDialog } from "./build-logs-overlay";
import ShortCommitHash from "@/components/custom/short-commit-hash";
import { PodsResourceInfoModel } from "@/shared/model/pods-resource-info.model";
import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table";
export default function MonitoringTab({
app
@@ -19,24 +21,27 @@ export default function MonitoringTab({
app: AppExtendedModel;
}) {
const [selectedPod, setSelectedPod] = useState<PodsResourceInfoModel | undefined>(undefined);
const [error, setError] = useState<string | undefined>(undefined);
const updateValues = async () => {
setError(undefined);
try {
const response = await getRessourceDataApp(app.projectId, app.id.split('-').slice(0, 3).join('-'));
const response = await getRessourceDataApp(app.projectId, app.id);
if (response.status === 'success' && response.data) {
console.log(response.data);
setSelectedPod(response.data);
} else {
console.error(response);
console.log(response.message ?? 'An unknown error occurred.');
setError(response.message ?? 'An unknown error occurred.');
}
} catch (ex) {
console.error(ex);
setError('An unknown error occurred.');
}
}
useEffect(() => {
if (app.sourceType === 'container') {
return;
}
updateValues();
const intervalId = setInterval(updateValues, 10000);
return () => clearInterval(intervalId);
@@ -51,8 +56,32 @@ export default function MonitoringTab({
<Card>
<CardHeader>
<CardTitle>App Monitoring</CardTitle>
<CardDescription>This is an overview about the resources the app is consuming.</CardDescription>
<CardDescription>This is an overview about the resources the app is consuming.
</CardDescription>
</CardHeader>
</Card>
<CardContent>
<Table>
<TableHeader>
<TableRow>
<TableHead>CPU absolut</TableHead>
<TableHead>CPU percent</TableHead>
<TableHead>memory absent</TableHead>
<TableHead>memory percent</TableHead>
<TableHead>volume percent</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell className="font-medium">{selectedPod?.cpuAbsolut}</TableCell>
<TableCell className="font-medium">{selectedPod?.cpuPercent}</TableCell>
<TableCell className="font-medium">{selectedPod?.memoryAbsolut}</TableCell>
<TableCell className="font-medium">{selectedPod?.memoryPercent}</TableCell>
<TableCell className="font-medium">{selectedPod?.volumePercent}</TableCell>
</TableRow>
</TableBody>
</Table>
</CardContent>
</Card >
</>;
}
}

View File

@@ -1,12 +1,13 @@
import { AppExtendedModel } from "@/shared/model/app-extended.model";
import k3s from "../adapter/kubernetes-api.adapter";
import * as k8s from '@kubernetes/client-node';
import { V1Deployment, V1LabelSelector, V1ReplicaSet } from "@kubernetes/client-node";
import buildService from "./build.service";
import { ListUtils } from "../../shared/utils/list.utils";
import { DeploymentInfoModel, DeplyomentStatus } from "@/shared/model/deployment-info.model";
import { BuildJobStatus } from "@/shared/model/build-job";
import { ServiceException } from "@/shared/model/service.exception.model";
import { PodsInfoModel } from "@/shared/model/pods-info.model";
import { PodsInfoModel, podsInfoZodModel } from "@/shared/model/pods-info.model";
import { KubeObjectNameUtils } from "../utils/kube-object-name.utils";
import pvcService from "./pvc.service";
import ingressService from "./ingress.service";
@@ -14,23 +15,47 @@ import namespaceService from "./namespace.service";
import { Constants } from "../../shared/utils/constants";
import svcService from "./svc.service";
import { Label } from "@radix-ui/react-dropdown-menu";
import setupPodService from "./setup-services/setup-pod.service";
import clusterService from "./node.service";
import { PodsResourceInfoModel } from "@/shared/model/pods-resource-info.model";
class MonitorAppService {
async getRessourceData() {
//console.log("gugus");
return "miau";
async getPodsForApp(projectId: string, appId: string): Promise<PodsResourceInfoModel> {
const metricsClient = new k8s.Metrics(k3s.getKubeConfig());
const podsFromApp = await setupPodService.getPodsForApp(projectId, appId);
const topPodsRes1 = await k8s.topPods(k3s.core, metricsClient, projectId);
const filteredTopPods = topPodsRes1.filter((topPod) =>
podsFromApp.some((pod) => pod.podName === topPod.Pod.metadata?.name)
);
const nodeInfo = await clusterService.getNodeInfo();
const nodesColumns = nodeInfo.map((node) => {
return {
'POD': node.name,
'CPU(cores)': node.cpuCapacity,
'MEMORY(bytes)': node.ramCapacity,
};
});
const podsColumns = filteredTopPods.map((pod) => {
return {
'POD': pod.Pod.metadata?.name,
'CPU(cores)': pod.CPU.CurrentUsage,
'MEMORY(bytes)': pod.Memory.CurrentUsage,
};
});
return {
cpuAbsolut: '5',
cpuPercent: '6',
memoryAbsolut: '7',
memoryPercent: '8',
volumePercent: '9',
}
}
async getPodsFromDeployment(namespace: string, deploymentName: string): Promise<void> {
const pods = await k3s.core.listNamespacedPod(namespace, undefined, undefined, undefined, undefined, `app=${deploymentName}`);
// console.log(namespace);
// console.log(deploymentName);
//console.log(pods.body.items);
for (const pod of pods.body.items) {
//console.log(pod.metadata?.name);
}
}
}
const monitorAppService = new MonitorAppService();

View File

@@ -0,0 +1,14 @@
import { memo } from "react";
import { z } from "zod";
export const podsResourceInfoZodModel = z.object({
cpuAbsolut: z.string(),
cpuPercent: z.string(),
memoryAbsolut: z.string(),
memoryPercent: z.string(),
volumePercent: z.string(),
});
export type PodsResourceInfoModel = z.infer<typeof podsResourceInfoZodModel>;