Skip to content

Commit 6096243

Browse files
authored
Merge pull request #72 from biersoeckli/feat/add-pod-request-cpu-and-memory-suggestions
feat: add CPU and memory usage suggestions for pod resource limits
2 parents 27a27b8 + 91654c7 commit 6096243

1 file changed

Lines changed: 56 additions & 1 deletion

File tree

src/app/project/app/[appId]/general/app-rate-limits.tsx

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,14 @@ import { useFormState } from "react-dom";
1111
import { ServerActionResult } from "@/shared/model/server-action-error-return.model";
1212
import { Input } from "@/components/ui/input";
1313
import { AppRateLimitsModel, appRateLimitsZodModel } from "@/shared/model/app-rate-limits.model";
14-
import { useEffect } from "react";
14+
import { useEffect, useState } from "react";
1515
import { toast } from "sonner";
1616
import { AppExtendedModel } from "@/shared/model/app-extended.model";
1717
import { cn } from "@/frontend/utils/utils";
18+
import { getRessourceDataApp } from "../overview/actions";
19+
import { PodsResourceInfoModel } from "@/shared/model/pods-resource-info.model";
20+
import { KubeSizeConverter } from "@/shared/utils/kubernetes-size-converter.utils";
21+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";
1822

1923

2024
export default function GeneralAppRateLimits({ app, readonly }: {
@@ -27,6 +31,23 @@ export default function GeneralAppRateLimits({ app, readonly }: {
2731
disabled: readonly
2832
});
2933

34+
const [monitoringData, setMonitoringData] = useState<PodsResourceInfoModel | undefined>(undefined);
35+
36+
useEffect(() => {
37+
getRessourceDataApp(app.projectId, app.id).then((res) => {
38+
if (res.status === 'success' && res.data) {
39+
setMonitoringData(res.data);
40+
}
41+
}).catch(() => { /* pod may not be running, silently ignore */ });
42+
}, [app.id, app.projectId]);
43+
44+
const suggestedMemoryMb = monitoringData && monitoringData.ramAbsolutBytes
45+
? Math.ceil(KubeSizeConverter.fromBytesToMegabytes(monitoringData.ramAbsolutBytes))
46+
: undefined;
47+
const suggestedCpuMillicores = monitoringData && monitoringData.cpuAbsolutCores
48+
? Math.max(1, Math.round(monitoringData.cpuAbsolutCores * 1000))
49+
: undefined;
50+
3051
const [state, formAction] = useFormState((state: ServerActionResult<any, any>, payload: AppRateLimitsModel) => saveGeneralAppRateLimits(state, payload, app.id), FormUtils.getInitialFormState<typeof appRateLimitsZodModel>());
3152
useEffect(() => {
3253
if (state.status === 'success') {
@@ -90,6 +111,23 @@ export default function GeneralAppRateLimits({ app, readonly }: {
90111
<Input type="number" {...field} value={field.value as string | number | readonly string[] | undefined} />
91112
</FormControl>
92113
<FormMessage />
114+
{!readonly && suggestedMemoryMb !== undefined && (
115+
<TooltipProvider>
116+
<Tooltip delayDuration={200}>
117+
<TooltipTrigger asChild>
118+
<span
119+
className="inline-flex cursor-pointer items-center rounded-full border border-blue-300 bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 hover:bg-blue-100 dark:border-blue-700 dark:bg-blue-950 dark:text-blue-300 dark:hover:bg-blue-900"
120+
onClick={() => form.setValue('memoryReservation', suggestedMemoryMb)}
121+
>
122+
~ {suggestedMemoryMb} MB
123+
</span>
124+
</TooltipTrigger>
125+
<TooltipContent>
126+
<p>Suggestion based on current pod resource usage</p>
127+
</TooltipContent>
128+
</Tooltip>
129+
</TooltipProvider>
130+
)}
93131
</FormItem>
94132
)}
95133
/>
@@ -118,6 +156,23 @@ export default function GeneralAppRateLimits({ app, readonly }: {
118156
<Input type="number" {...field} value={field.value as string | number | readonly string[] | undefined} />
119157
</FormControl>
120158
<FormMessage />
159+
{!readonly && suggestedCpuMillicores !== undefined && (
160+
<TooltipProvider>
161+
<Tooltip delayDuration={200}>
162+
<TooltipTrigger asChild>
163+
<span
164+
className="inline-flex cursor-pointer items-center rounded-full border border-blue-300 bg-blue-50 px-2 py-0.5 text-xs font-medium text-blue-700 hover:bg-blue-100 dark:border-blue-700 dark:bg-blue-950 dark:text-blue-300 dark:hover:bg-blue-900"
165+
onClick={() => form.setValue('cpuReservation', suggestedCpuMillicores)}
166+
>
167+
~ {suggestedCpuMillicores} m
168+
</span>
169+
</TooltipTrigger>
170+
<TooltipContent>
171+
<p>Suggestion based on current pod resource usage</p>
172+
</TooltipContent>
173+
</Tooltip>
174+
</TooltipProvider>
175+
)}
121176
</FormItem>
122177
)}
123178
/>

0 commit comments

Comments
 (0)