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>
 |