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.
94 lines
2.4 KiB
94 lines
2.4 KiB
import cardApi from '~/vgpu/api/card';
|
|
import { onMounted, ref, watch, watchEffect } from 'vue';
|
|
import { timeParse } from '@/utils';
|
|
|
|
const useInstantVector = (configs, parseQuery = (query) => query, times) => {
|
|
const data = ref(configs);
|
|
|
|
const fetchInstantData = async () => {
|
|
const reqs = configs.map(
|
|
async ({ query, totalQuery, percentQuery, cntQuery }, index) => {
|
|
if (parseQuery(query).includes('undefined')) {
|
|
return;
|
|
}
|
|
if (query) {
|
|
const usedData = await cardApi.getInstantVector({
|
|
query: parseQuery(query),
|
|
});
|
|
|
|
const used = usedData.data.length ? usedData.data[0]?.value : 0;
|
|
data.value[index].count = used;
|
|
data.value[index].used = used;
|
|
}
|
|
|
|
if (totalQuery) {
|
|
const totalData = await cardApi.getInstantVector({
|
|
query: parseQuery(totalQuery),
|
|
});
|
|
if (totalData.data[0]) {
|
|
data.value[index].total = totalData.data[0].value;
|
|
}
|
|
}
|
|
if (data.value[index].total !== 0) {
|
|
data.value[index].percent = data.value[index].used / data.value[index].total * 100;
|
|
}
|
|
if (percentQuery) {
|
|
const percentData = await cardApi.getRangeVector({
|
|
query: parseQuery(percentQuery),
|
|
range: {
|
|
start: timeParse(times?.value[0]),
|
|
end: timeParse(times?.value[1]),
|
|
step: '1m',
|
|
},
|
|
});
|
|
|
|
data.value[index].data = percentData.data[0]?.values;
|
|
}
|
|
},
|
|
);
|
|
|
|
Promise.all(reqs);
|
|
};
|
|
|
|
const fetchRangeData = async () => {
|
|
const reqs = configs.map(
|
|
async ({ query, totalQuery, percentQuery }, index) => {
|
|
if (parseQuery(query).includes('undefined')) {
|
|
return;
|
|
}
|
|
|
|
if (percentQuery) {
|
|
const percentData = await cardApi.getRangeVector({
|
|
query: parseQuery(percentQuery),
|
|
range: {
|
|
start: timeParse(times.value[0]),
|
|
end: timeParse(times.value[1]),
|
|
step: '1m',
|
|
},
|
|
});
|
|
|
|
data.value[index].data = percentData.data[0]?.values;
|
|
}
|
|
},
|
|
);
|
|
|
|
Promise.all(reqs);
|
|
};
|
|
|
|
watchEffect(() => {
|
|
fetchInstantData();
|
|
});
|
|
|
|
watch(
|
|
times,
|
|
() => {
|
|
fetchRangeData();
|
|
},
|
|
// { immediate: true },
|
|
);
|
|
|
|
return data;
|
|
};
|
|
|
|
export default useInstantVector;
|