From a2c556a40493af9be43d9cc03d2e5d57dfa1e783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=8D=9A=E6=96=87?= <1179111926@qq.com> Date: Mon, 4 Aug 2025 14:09:00 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/vgpu/views/poll/admin/index.vue | 85 +++++++++++-------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/packages/web/projects/vgpu/views/poll/admin/index.vue b/packages/web/projects/vgpu/views/poll/admin/index.vue index 7c7dc78..9a148e7 100644 --- a/packages/web/projects/vgpu/views/poll/admin/index.vue +++ b/packages/web/projects/vgpu/views/poll/admin/index.vue @@ -5,35 +5,35 @@ round>创建资源池 - - - -
- {{ poolName }} -
- 节点数量  {{ nodeNum }} - CPU数  {{ cpuCores }}核 - 显卡数量  {{ gpuNum }}张 - 可用/总内存  {{ bytesToGB(availableMemory) }}GB / {{ bytesToGB(totalMemory) }}GB - 磁盘大小  {{ bytesToGB(diskSize) }}GB +
+ + +
+ {{ poolName }} +
+ 节点数量  {{ nodeNum }} + CPU数  {{ cpuCores }}核 + 显卡数量  {{ gpuNum }}张 + 可用/总内存  {{ bytesToGB(availableMemory) }}GB / {{ bytesToGB(totalMemory) }}GB + 磁盘大小  {{ bytesToGB(diskSize) }}GB +
-
-
- 查看详情 - - -
- - - +
+ 查看详情 + + +
+ + +
@@ -110,6 +110,7 @@ const nodeList = ref([]) const nodeSelect = ref([]) const input = ref('') const btnLoading = ref(false) +const loading = ref(true) const bytesToGB = (bytes) => { return Math.round(bytes / (1024 * 1024 * 1024)); @@ -145,10 +146,12 @@ const handleOk = async () => { nodes }) } - console.log(res, 'res') - getList(); + if (res?.code === 200) { + getList(); + dialogVisible.value = false; + } + btnLoading.value = false; - dialogVisible.value = false; } const handleCheckboxChange = (ip) => { @@ -165,17 +168,27 @@ const handleDelete = async (id) => { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', - }).then(async () => { - const res = await pollApi.delete({ pool_id: id }) - if (res.code === 1) { - ElMessage.success('删除成功'); - getList(); + beforeClose: async (action, instance, done) => { + if (action === 'confirm') { + instance.confirmButtonLoading = true; + const res = await pollApi.delete({ pool_id: id }); + if (res.code === 200) { + ElMessage.success('删除成功'); + getList(); + done(); // 关闭对话框 + } + instance.confirmButtonLoading = false; // 确保无论如何都关闭loading + } else { + done(); + } } }) } const getList = async () => { + loading.value = true const res = await pollApi.getPollList() + loading.value = false list.value = res.data } From 0238216d8ee5472692ce8a2cbec8b0ef6b41d8d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=8D=9A=E6=96=87?= <1179111926@qq.com> Date: Mon, 4 Aug 2025 15:03:11 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/vgpu/views/poll/admin/index.vue | 114 ++++++++++++------ 1 file changed, 78 insertions(+), 36 deletions(-) diff --git a/packages/web/projects/vgpu/views/poll/admin/index.vue b/packages/web/projects/vgpu/views/poll/admin/index.vue index 9a148e7..6101b15 100644 --- a/packages/web/projects/vgpu/views/poll/admin/index.vue +++ b/packages/web/projects/vgpu/views/poll/admin/index.vue @@ -5,9 +5,9 @@ round>创建资源池 -
+
@@ -22,7 +22,7 @@
查看详情 - + \ No newline at end of file From 534eec0c12a6d2b65afbd19905a186b1afef7f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=8D=9A=E6=96=87?= <1179111926@qq.com> Date: Mon, 4 Aug 2025 18:45:20 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/projects/vgpu/components/TabTop.vue | 1 + .../vgpu/views/monitor/overview/index.vue | 44 +++++++++++-------- .../projects/vgpu/views/poll/admin/index.vue | 6 +-- packages/web/src/utils/index.js | 5 +++ 4 files changed, 32 insertions(+), 24 deletions(-) diff --git a/packages/web/projects/vgpu/components/TabTop.vue b/packages/web/projects/vgpu/components/TabTop.vue index d3efdd1..f12ea06 100644 --- a/packages/web/projects/vgpu/components/TabTop.vue +++ b/packages/web/projects/vgpu/components/TabTop.vue @@ -111,6 +111,7 @@ onMounted(async () => { query: v.query, }) .then((res) => { + console.log(v.query, res, 'res') currentConfig.value[i].data = res.data.map((item) => ({ name: item.metric[v.nameKey], value: item.value, diff --git a/packages/web/projects/vgpu/views/monitor/overview/index.vue b/packages/web/projects/vgpu/views/monitor/overview/index.vue index 8ee6f77..e8d81ee 100644 --- a/packages/web/projects/vgpu/views/monitor/overview/index.vue +++ b/packages/web/projects/vgpu/views/monitor/overview/index.vue @@ -95,10 +95,11 @@ import { } from './getOptions'; import Block from './Block.vue'; import './style.scss'; -import { timeParse, getDaysInRange, getRandom } from '@/utils'; +import { timeParse, getDaysInRange, getRandom, bytesToGB } from '@/utils'; import { useRouter } from 'vue-router'; import UserCard from '@/components/UserCard.vue'; import nodeApi from '~/vgpu/api/node'; +import pollApi from '~/vgpu/api/poll'; import taskApi from '~/vgpu/api/task'; import monitorApi from '~/vgpu/api/monitor'; import cardApi from '~/vgpu/api/card'; @@ -134,9 +135,9 @@ const cardGaugeConfig = useInstantVector([ { title: 'CPU 使用率', percent: 0, - query: `avg(sum (hami_container_vgpu_allocated) by (instance))`, - totalQuery: `avg(sum (hami_vgpu_count) by (instance))`, - percentQuery: `avg(sum (hami_container_vgpu_allocated) by (instance))/avg(sum (hami_vgpu_count) by (instance)) *100`, + query: `avg(count(node_cpu_seconds_total{mode="idle"}) by (instance)) * (1 - avg(rate(node_cpu_seconds_total{mode="idle"}[5m])))`, + totalQuery: `avg(count(node_cpu_seconds_total{mode="idle"}) by (instance))`, + percentQuery: ``, total: 0, used: 0, unit: '核', @@ -144,9 +145,9 @@ const cardGaugeConfig = useInstantVector([ { title: '内存 使用率', percent: 0, - query: `avg(sum (hami_container_vgpu_allocated) by (instance))`, - totalQuery: `avg(sum (hami_vgpu_count) by (instance))`, - percentQuery: `avg(sum (hami_container_vgpu_allocated) by (instance))/avg(sum (hami_vgpu_count) by (instance)) *100`, + query: `avg(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / 1024 / 1024 / 1024`, + totalQuery: `avg(node_memory_MemTotal_bytes) / 1024 / 1024 / 1024`, + percentQuery: ``, total: 0, used: 0, unit: 'GiB', @@ -154,12 +155,12 @@ const cardGaugeConfig = useInstantVector([ { title: '磁盘 使用率', percent: 0, - query: `avg(sum (hami_container_vgpu_allocated) by (instance))`, - totalQuery: `avg(sum (hami_vgpu_count) by (instance))`, - percentQuery: `avg(sum (hami_container_vgpu_allocated) by (instance))/avg(sum (hami_vgpu_count) by (instance)) *100`, + query: `avg(node_filesystem_size_bytes{fstype!~"tmpfs|overlay"} - node_filesystem_free_bytes{fstype!~"tmpfs|overlay"}) / 1024 / 1024 / 1024`, + totalQuery: `avg(node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) / 1024 / 1024 / 1024`, + percentQuery: ``, total: 0, used: 0, - unit: '块', + unit: 'GiB', }, { title: 'vGPU 分配率', @@ -244,7 +245,7 @@ const resourceOverview = ref([ title: '磁盘', count: 0, icon: 'vgpu-disk', - unit: '个', + unit: 'GIB', }, { title: '显卡', @@ -312,6 +313,8 @@ const nodeData = useFetchList(nodeApi.getNodeListReq({ filters: {} })); const cardData = useFetchList(cardApi.getCardListReq({ filters: {} })); +const pollData = useFetchList(pollApi.getPollList(), 'data'); + const cardDetail = useInstantVector([ { title: 'vGPU', @@ -377,18 +380,18 @@ const nodeUsedTop = { key: 'used', config: [ { - tab: 'GPU', - key: 'gpu', - nameKey: 'node', + tab: 'CPU', + key: 'cpu', + nameKey: 'instance', data: [], - query: 'topk(5, avg(hami_core_util_avg) by (node))', + query: 'topk(5, avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])))', }, { tab: '内存', key: 'internal', - nameKey: 'node', + nameKey: 'instance', data: [], - query: 'topk(5, avg(hami_core_util_avg) by (node))', + query: 'topk(5, ((node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes))', }, { tab: '算力', @@ -491,7 +494,10 @@ const fetchRangeData = () => { watchEffect(() => { resourceOverview.value[0].count = nodeData.value.length; - + resourceOverview.value[1].count = pollData.value.length; + resourceOverview.value[2].count = cardGaugeConfig.value[0].total; + resourceOverview.value[3].count = Math.round(cardGaugeConfig.value[1].total); + resourceOverview.value[4].count = Math.round(cardGaugeConfig.value[2].total); resourceOverview.value[5].count = cardData.value.length; resourceOverview.value[6].count = cardGaugeConfig.value[3].total; resourceOverview.value[7].count = cardGaugeConfig.value[4].total; diff --git a/packages/web/projects/vgpu/views/poll/admin/index.vue b/packages/web/projects/vgpu/views/poll/admin/index.vue index 6101b15..6b3af46 100644 --- a/packages/web/projects/vgpu/views/poll/admin/index.vue +++ b/packages/web/projects/vgpu/views/poll/admin/index.vue @@ -104,6 +104,7 @@ import { ref, onMounted, computed, watchEffect } from 'vue'; import BlockBox from '@/components/BlockBox.vue'; import { Remove } from '@element-plus/icons-vue' import { ElMessage, ElMessageBox } from 'element-plus' +import { bytesToGB } from '@/utils'; // 数据列表相关 const list = ref([]) @@ -135,11 +136,6 @@ const paginatedList = computed(() => { // console.log(currentPage.value, pageSize.value, 88) // }) -// 字节转GB -const bytesToGB = (bytes) => { - return Math.round(bytes / (1024 * 1024 * 1024)); -} - // 分页大小变化 const handleSizeChange = (val) => { pageSize.value = val diff --git a/packages/web/src/utils/index.js b/packages/web/src/utils/index.js index 31735c4..7754096 100644 --- a/packages/web/src/utils/index.js +++ b/packages/web/src/utils/index.js @@ -566,3 +566,8 @@ export const clearEdges = (items) => ...item, children: clearEdges(item.edges.children), })); + +// 字节转GB +export const bytesToGB = (bytes) => { + return Math.round(bytes / (1024 * 1024 * 1024)); +}