mirror of
https://github.com/biersoeckli/QuickStack.git
synced 2026-01-07 20:20:49 -06:00
Work at monitoring of app
This commit is contained in:
@@ -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>>;
|
||||
@@ -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 >
|
||||
|
||||
</>;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
14
src/shared/model/pods-resource-info.model.ts
Normal file
14
src/shared/model/pods-resource-info.model.ts
Normal 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>;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user