From 05ad296b43e91811a59b73c571f27965d36cec01 Mon Sep 17 00:00:00 2001 From: jialin Date: Sun, 11 Jan 2026 18:40:29 +0800 Subject: [PATCH] chore: cluster system load service --- src/components/audio-player/index.less | 1 - src/hooks/use-chunk-request.ts | 4 +- src/pages/cluster-management/apis/index.ts | 12 ++- .../cluster-management/cluster-detail.tsx | 2 + .../components/detail/cluster-system-load.tsx | 16 ++++ .../hooks/use-cluster-columns.tsx | 6 +- .../services/use-cluster-system-load.ts | 73 +++++++++++++++++++ 7 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 src/pages/cluster-management/components/detail/cluster-system-load.tsx create mode 100644 src/pages/cluster-management/services/use-cluster-system-load.ts diff --git a/src/components/audio-player/index.less b/src/components/audio-player/index.less index 51fefcde..25668b32 100644 --- a/src/components/audio-player/index.less +++ b/src/components/audio-player/index.less @@ -23,7 +23,6 @@ margin-inline: 30px; height: 22px; width: 22px; - overflow: hidden; .ant-btn { height: 22px; diff --git a/src/hooks/use-chunk-request.ts b/src/hooks/use-chunk-request.ts index 57fab24a..f278b4b3 100644 --- a/src/hooks/use-chunk-request.ts +++ b/src/hooks/use-chunk-request.ts @@ -6,7 +6,7 @@ import { } from '@/atoms/watch-request'; import { WatchEventType } from '@/config'; import { request } from '@umijs/max'; -import axios from 'axios'; +import axios, { CancelTokenSource } from 'axios'; import _ from 'lodash'; import { useEffect, useRef, useState } from 'react'; @@ -36,7 +36,7 @@ export const sliceJsonStr = (text: string) => { return result; }; -export const createAxiosToken = () => { +export const createAxiosToken = (): CancelTokenSource => { const { CancelToken } = axios; const source = CancelToken.source(); return source; diff --git a/src/pages/cluster-management/apis/index.ts b/src/pages/cluster-management/apis/index.ts index 4b3b9b37..29d1fee5 100644 --- a/src/pages/cluster-management/apis/index.ts +++ b/src/pages/cluster-management/apis/index.ts @@ -136,12 +136,16 @@ export async function deleteCluster(id: number) { }); } -export async function queryClusterDetail(params: { - cluster_id: number | string; -}) { +export async function queryClusterDetail( + params: { + cluster_id: number | string; + }, + options?: any +) { return request(`${DASHBOARD_API}`, { method: 'GET', - params + params, + cancelToken: options?.token }); } diff --git a/src/pages/cluster-management/cluster-detail.tsx b/src/pages/cluster-management/cluster-detail.tsx index fa7672c3..6f17616f 100644 --- a/src/pages/cluster-management/cluster-detail.tsx +++ b/src/pages/cluster-management/cluster-detail.tsx @@ -2,6 +2,7 @@ import WorkerList from '@/pages/resources/components/workers'; import { useIntl, useNavigate, useSearchParams } from '@umijs/max'; import { PageContainerInner } from '../_components/page-box'; import PageBreadcrumb from '../_components/page-breadcrumb'; +import ClusterSystemLoad from './components/detail/cluster-system-load'; const ClusterDetailModal = () => { const navigate = useNavigate(); @@ -26,6 +27,7 @@ const ClusterDetailModal = () => { title: }} > + = ({ clusterId }) => { + const { systemLoad, fetchClusterSystemLoad } = useClusterSystemLoad(); + + useEffect(() => { + if (clusterId) { + fetchClusterSystemLoad({ cluster_id: clusterId }); + } + }, [clusterId]); + + return
Cluster System Load Component
; +}; + +export default ClusterSystemLoad; diff --git a/src/pages/cluster-management/hooks/use-cluster-columns.tsx b/src/pages/cluster-management/hooks/use-cluster-columns.tsx index 536af659..b5d1b49e 100644 --- a/src/pages/cluster-management/hooks/use-cluster-columns.tsx +++ b/src/pages/cluster-management/hooks/use-cluster-columns.tsx @@ -6,7 +6,7 @@ import StatusTag from '@/components/status-tag'; import { tableSorter } from '@/config/settings'; import { StarFilled } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; -import { Tooltip } from 'antd'; +import { Tooltip, Typography } from 'antd'; import dayjs from 'dayjs'; import { useMemo } from 'react'; import { @@ -42,7 +42,9 @@ const useClusterColumns = ( render: (text: string, record: ClusterListItem) => ( <> - {text} + onCellClick?.(record, 'name')}> + {record.name} + {record.is_default && ( { + const [systemLoad, setSystemLoad] = useState<{ + current: { + cpu: number; + ram: number; + gpu: number; + vram: number; + }; + history: Record; + }>({ + current: { + cpu: 0, + ram: 0, + gpu: 0, + vram: 0 + }, + history: {} + }); + const axiosTokenRef = useRef(null); + + const { + run: fetchClusterSystemLoad, + loading, + cancel + } = useRequest( + async (params) => { + axiosTokenRef.current?.cancel(); + axiosTokenRef.current = createAxiosToken(); + return await queryClusterDetail(params, { + token: axiosTokenRef.current.token + }); + }, + { + manual: true, + onSuccess: (response) => { + setSystemLoad({ + current: response.system_load?.current, + history: response.system_load?.history + }); + }, + onError: () => { + setSystemLoad({ + current: { + cpu: 0, + ram: 0, + gpu: 0, + vram: 0 + }, + history: {} + }); + } + } + ); + + useEffect(() => { + return () => { + cancel(); + axiosTokenRef.current?.cancel(); + }; + }, []); + + return { + systemLoad, + loading, + fetchClusterSystemLoad + }; +};