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

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;