You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.1 KiB
156 lines
3.1 KiB
<template>
|
|
<Block title="资源使用情况">
|
|
<div style="display: flex; align-items: center">
|
|
<div class="alarm-left">
|
|
<div
|
|
class="alarm-left-item"
|
|
v-for="{ title, bg, count, color, icon } in alarmConfig"
|
|
:style="{ background: bg }"
|
|
>
|
|
<div class="title">
|
|
{{ title }}
|
|
</div>
|
|
<div class="count" :style="{ color }">
|
|
{{ count }}
|
|
</div>
|
|
<svg-icon :icon="icon" class="icon-bg" />
|
|
</div>
|
|
</div>
|
|
<ul class="usage">
|
|
<li v-for="item in config">
|
|
<echarts-plus :options="getOptions(item)" />
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</Block>
|
|
</template>
|
|
|
|
<script setup>
|
|
import Block from '~/vgpu/views/monitor/overview/Block.vue';
|
|
import monitorApi from '~/vgpu/api/monitor';
|
|
import { onMounted, ref, defineProps} from 'vue';
|
|
import EchartsPlus from '@/components/Echarts-plus.vue';
|
|
import getOptions from './config';
|
|
import { getDataByPath } from '@/utils';
|
|
|
|
const props = defineProps(['data']);
|
|
|
|
const config = ref([
|
|
{
|
|
title: 'vgpu分配率',
|
|
path: 'distributionRate.vgpu',
|
|
percent: 0,
|
|
},
|
|
|
|
{
|
|
title: '算力分配率',
|
|
path: 'distributionRate.core',
|
|
percent: 0,
|
|
},
|
|
{
|
|
title: '显存分配率',
|
|
path: 'distributionRate.memory',
|
|
percent: 0,
|
|
},
|
|
{
|
|
title: '算力利用率',
|
|
path: 'useRate.core',
|
|
percent: 0,
|
|
},
|
|
|
|
{
|
|
title: '显存利用率',
|
|
path: 'useRate.memory',
|
|
percent: 0,
|
|
},
|
|
]);
|
|
|
|
const alarmConfig = ref([
|
|
{
|
|
title: 'vgpu超配比',
|
|
bg: '#FEF2F2',
|
|
count: 0,
|
|
icon: 'alarm-warning',
|
|
color: '#DC2626',
|
|
path: 'scaling.vgpu',
|
|
},
|
|
{
|
|
title: '算力超配比',
|
|
bg: '#F5F7FA',
|
|
count: 0,
|
|
icon: 'alarm-history',
|
|
path: 'scaling.memory',
|
|
},
|
|
{
|
|
title: '显存超配比',
|
|
bg: '#F5F7FA',
|
|
count: 0,
|
|
icon: 'alarm-history',
|
|
path: 'scaling.core',
|
|
},
|
|
]);
|
|
|
|
onMounted(async () => {
|
|
const res = await monitorApi.usage(props.data);
|
|
|
|
config.value = config.value.map((item) => {
|
|
return { ...item, count: getDataByPath(res, item.path) };
|
|
});
|
|
|
|
alarmConfig.value = alarmConfig.value.map((item) => {
|
|
return { ...item, count: getDataByPath(res, item.path) };
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<style scoped lang="scss">
|
|
.alarm-left {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 12px;
|
|
&-item {
|
|
width: 202px;
|
|
height: 80px;
|
|
border-radius: 6px;
|
|
padding: 16px;
|
|
position: relative;
|
|
.title {
|
|
color: #324558;
|
|
font-family: 'PingFang SC';
|
|
font-size: 12px;
|
|
font-style: normal;
|
|
font-weight: 400;
|
|
line-height: 18px; /* 150% */
|
|
margin-bottom: 10px;
|
|
}
|
|
.count {
|
|
font-family: Roboto;
|
|
font-size: 20px;
|
|
font-style: normal;
|
|
font-weight: 700;
|
|
line-height: 100%; /* 20px */
|
|
}
|
|
.icon-bg {
|
|
position: absolute;
|
|
right: 10px;
|
|
bottom: -10px;
|
|
width: 56px;
|
|
height: 56px;
|
|
}
|
|
}
|
|
}
|
|
.usage {
|
|
flex: 1;
|
|
list-style: none;
|
|
margin: 0;
|
|
padding: 0;
|
|
//padding-left: 180px;
|
|
display: flex;
|
|
height: 200px;
|
|
gap: 20px;
|
|
li {
|
|
flex: 1;
|
|
}
|
|
}
|
|
</style>
|