From 4ff5b3e05af9bec3d543af27b4fa7673702ba58c Mon Sep 17 00:00:00 2001 From: jialin Date: Fri, 6 Feb 2026 11:38:09 +0800 Subject: [PATCH] chore: grafana entry --- config/proxy.ts | 3 ++- src/atoms/system.ts | 6 ++++-- src/pages/cluster-management/clusters.tsx | 3 +-- src/pages/llmodels/components/table-list.tsx | 3 +-- src/pages/resources/components/workers.tsx | 3 +-- .../resources/hooks/use-grafana-link.tsx | 20 ++++++++++++++++--- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/config/proxy.ts b/config/proxy.ts index 1a171724..279a76f3 100644 --- a/config/proxy.ts +++ b/config/proxy.ts @@ -6,7 +6,8 @@ const proxyTableList = [ 'v1-openai', 'version', 'proxy', - 'update' + 'update', + 'grafana' ]; // @ts-ingore diff --git a/src/atoms/system.ts b/src/atoms/system.ts index 7e0c19ef..b7718cb5 100644 --- a/src/atoms/system.ts +++ b/src/atoms/system.ts @@ -1,11 +1,13 @@ import { atom } from 'jotai'; export interface SystemConfig { + grafana_url: string; disable_builtin_observability: boolean; debug: boolean; - grafana_url: string; - server_external_url: string | null; + grafana_model_dashboard_uid: string; + grafana_worker_dashboard_uid: string; system_default_container_registry: string | null; + server_external_url: string | null; showMonitoring?: boolean; } diff --git a/src/pages/cluster-management/clusters.tsx b/src/pages/cluster-management/clusters.tsx index ca5448a0..b95eff54 100644 --- a/src/pages/cluster-management/clusters.tsx +++ b/src/pages/cluster-management/clusters.tsx @@ -74,8 +74,7 @@ const Clusters: React.FC = () => { }); const navigate = useNavigate(); const { goToGrafana, ActionButton } = useGranfanaLink({ - type: 'cluster', - dataList: dataSource.dataList || [] + type: 'cluster' }); const { watchDataList: allWorkerPoolList } = useWatchList(WORKER_POOLS_API); const [expandAtom] = useAtom(expandKeysAtom); diff --git a/src/pages/llmodels/components/table-list.tsx b/src/pages/llmodels/components/table-list.tsx index c1edf919..2602e56f 100644 --- a/src/pages/llmodels/components/table-list.tsx +++ b/src/pages/llmodels/components/table-list.tsx @@ -170,8 +170,7 @@ const Models: React.FC = ({ const { watchDataList: targetList } = useWatchList(MODEL_ROUTE_TARGETS); const { goToGrafana, ActionButton } = useGranfanaLink({ - type: 'model', - dataList: dataSource || [] + type: 'model' }); const [openLogModal, setOpenLogModal] = useState(false); diff --git a/src/pages/resources/components/workers.tsx b/src/pages/resources/components/workers.tsx index bc62ac73..04e0d8f3 100644 --- a/src/pages/resources/components/workers.tsx +++ b/src/pages/resources/components/workers.tsx @@ -67,8 +67,7 @@ const Workers: React.FC<{ } }); const { goToGrafana, ActionButton } = useGranfanaLink({ - type: 'worker', - dataList: dataSource.dataList || [] + type: 'worker' }); const { MaintenanceModal, handleStopMaintenance, setOpenStatus } = useWorkerMaintenance({ fetchData: handleSearch }); diff --git a/src/pages/resources/hooks/use-grafana-link.tsx b/src/pages/resources/hooks/use-grafana-link.tsx index 5883fa33..477fdc4f 100644 --- a/src/pages/resources/hooks/use-grafana-link.tsx +++ b/src/pages/resources/hooks/use-grafana-link.tsx @@ -7,11 +7,12 @@ import { useAtomValue } from 'jotai'; const useGranfanaLink = (options: { type: 'model' | 'worker' | 'instance' | 'cluster'; - dataList?: any[]; }) => { const intl = useIntl(); const systemConfig = useAtomValue(systemConfigAtom); + const grafanaUrl = systemConfig.grafana_url || 'grafana'; + // for worker/model/instance/cluster item entry const goToModelGrafana = (row: { id: number }) => { window.open( `/${GPUSTACK_API_BASE_URL}/models/${row.id}/dashboard`, @@ -52,9 +53,22 @@ const useGranfanaLink = (options: { } }; + // all endpoints of grafana + const modelEntry = () => { + const modelURL = systemConfig.grafana_model_dashboard_uid; + window.open(`${grafanaUrl}/d/${modelURL}/gpustack-model`, '_blank'); + }; + + const workerEntry = () => { + const workerURL = systemConfig.grafana_worker_dashboard_uid; + window.open(`${grafanaUrl}/d/${workerURL}/gpustack-worker`, '_blank'); + }; + const handleClick = () => { - if (options.dataList && options.dataList.length > 0) { - goToGrafana(options.dataList?.[0]); + if (options.type === 'model') { + modelEntry(); + } else if (options.type === 'worker' || options.type === 'cluster') { + workerEntry(); } };