mirror of
https://github.com/hi2shark/nazhua.git
synced 2026-01-19 18:49:36 +08:00
🪄 优化提取算法,单个时间单个服务的重复数据去重
This commit is contained in:
parent
247115c3c3
commit
057e0f5f11
@ -11,6 +11,21 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="right-box">
|
<div class="right-box">
|
||||||
|
<div
|
||||||
|
class="refresh-data-group"
|
||||||
|
title="是否自动刷新"
|
||||||
|
@click="switchRefresh"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="switch-box"
|
||||||
|
:class="{
|
||||||
|
active: refreshData,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<span class="switch-dot" />
|
||||||
|
</div>
|
||||||
|
<span class="label-text">刷新</span>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
class="peak-shaving-group"
|
class="peak-shaving-group"
|
||||||
title="过滤太高或太低的数据"
|
title="过滤太高或太低的数据"
|
||||||
@ -62,16 +77,37 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const refreshData = ref(true);
|
||||||
const peakShaving = ref(false);
|
const peakShaving = ref(false);
|
||||||
|
|
||||||
const monitorData = ref([]);
|
const monitorData = ref([]);
|
||||||
|
|
||||||
const monitorChartData = computed(() => {
|
const monitorChartData = computed(() => {
|
||||||
|
/**
|
||||||
|
* 处理监控数据以生成分类的平均延迟随时间变化的列表。
|
||||||
|
*
|
||||||
|
* @returns {Object} 返回一个对象,包含:
|
||||||
|
* - cateList {Array}: 唯一监控名称的列表。
|
||||||
|
* - dateList {Array}: 排序后的唯一时间戳列表。
|
||||||
|
* - valueList {Array}: 包含以下内容的对象列表:
|
||||||
|
* - name {String}: 监控名称。
|
||||||
|
* - data {Array}: [时间戳, 平均延迟] 对的数组。
|
||||||
|
*
|
||||||
|
* 该函数执行以下步骤:
|
||||||
|
* 1. 遍历监控数据以分类和过滤平均延迟。
|
||||||
|
* 2. 如果启用了削峰,则应用削峰以过滤异常值。
|
||||||
|
* 3. 构建监控名称到其各自时间戳和平均延迟的映射。
|
||||||
|
* 4. 将映射转换为监控名称、时间戳和平均延迟数据的列表。
|
||||||
|
* 5. 删除重复的时间戳并对其进行排序。
|
||||||
|
*/
|
||||||
const cateMap = {};
|
const cateMap = {};
|
||||||
const dateMap = {};
|
|
||||||
monitorData.value.forEach((i) => {
|
monitorData.value.forEach((i) => {
|
||||||
|
const dateMap = {};
|
||||||
if (!cateMap[i.monitor_name]) {
|
if (!cateMap[i.monitor_name]) {
|
||||||
cateMap[i.monitor_name] = [];
|
cateMap[i.monitor_name] = {
|
||||||
|
dateMap,
|
||||||
|
avgs: [],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
const {
|
const {
|
||||||
threshold,
|
threshold,
|
||||||
@ -80,49 +116,47 @@ const monitorChartData = computed(() => {
|
|||||||
min,
|
min,
|
||||||
} = peakShaving.value ? getThreshold(i.avg_delay, 2) : {};
|
} = peakShaving.value ? getThreshold(i.avg_delay, 2) : {};
|
||||||
i.created_at.forEach((o, index) => {
|
i.created_at.forEach((o, index) => {
|
||||||
if (!dateMap[o]) {
|
if (dateMap[o]) {
|
||||||
dateMap[o] = [];
|
return;
|
||||||
}
|
}
|
||||||
const avgDelay = i.avg_delay[index];
|
const avgDelay = i.avg_delay[index];
|
||||||
if (peakShaving.value) {
|
if (peakShaving.value) {
|
||||||
if (Math.abs(avgDelay - mean) > threshold && max / min > 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (avgDelay === 0) {
|
if (avgDelay === 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (Math.abs(avgDelay - mean) > threshold && max / min > 2) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
dateMap[o].push({
|
|
||||||
name: i.monitor_name,
|
|
||||||
value: (avgDelay).toFixed(2) * 1,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
const dateList = [];
|
|
||||||
Object.keys(dateMap).forEach((i) => {
|
|
||||||
if (dateMap[i]?.length) {
|
|
||||||
const time = parseInt(i, 10);
|
|
||||||
dateList.push(time);
|
|
||||||
dateMap[i].forEach((o) => {
|
|
||||||
cateMap[o.name].push([time, o.value]);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
dateMap[o] = (avgDelay).toFixed(2) * 1;
|
||||||
});
|
});
|
||||||
dateList.sort((a, b) => a - b);
|
});
|
||||||
|
let dateList = [];
|
||||||
const cateList = [];
|
const cateList = [];
|
||||||
const valueList = [];
|
const valueList = [];
|
||||||
Object.keys(cateMap).forEach((i) => {
|
Object.keys(cateMap).forEach((i) => {
|
||||||
if (cateMap[i]?.length) {
|
const {
|
||||||
cateList.push(i);
|
dateMap,
|
||||||
}
|
avgs,
|
||||||
|
} = cateMap[i];
|
||||||
|
Object.entries(dateMap).forEach(([key, value]) => {
|
||||||
|
const time = parseInt(key, 10);
|
||||||
|
avgs.push([time, value]);
|
||||||
|
dateList.push(time);
|
||||||
|
});
|
||||||
valueList.push({
|
valueList.push({
|
||||||
name: i,
|
name: i,
|
||||||
data: cateMap[i],
|
data: avgs,
|
||||||
});
|
});
|
||||||
|
if (avgs.length) {
|
||||||
|
cateList.push(i);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
// 去重
|
||||||
|
dateList = Array.from(new Set(dateList)).sort((a, b) => a - b);
|
||||||
return {
|
return {
|
||||||
cateList,
|
|
||||||
dateList,
|
dateList,
|
||||||
|
cateList,
|
||||||
valueList,
|
valueList,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@ -131,6 +165,10 @@ function switchPeakShaving() {
|
|||||||
peakShaving.value = !peakShaving.value;
|
peakShaving.value = !peakShaving.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function switchRefresh() {
|
||||||
|
refreshData.value = !refreshData.value;
|
||||||
|
}
|
||||||
|
|
||||||
async function loadMonitor() {
|
async function loadMonitor() {
|
||||||
await request({
|
await request({
|
||||||
url: (
|
url: (
|
||||||
@ -147,11 +185,13 @@ async function loadMonitor() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let loadMonitorTimer = null;
|
let loadMonitorTimer = null;
|
||||||
async function setTimeLoadMonitor() {
|
async function setTimeLoadMonitor(force = false) {
|
||||||
if (loadMonitorTimer) {
|
if (loadMonitorTimer) {
|
||||||
clearTimeout(loadMonitorTimer);
|
clearTimeout(loadMonitorTimer);
|
||||||
}
|
}
|
||||||
|
if (refreshData.value || force) {
|
||||||
await loadMonitor();
|
await loadMonitor();
|
||||||
|
}
|
||||||
let monitorRefreshTime = parseInt(config.nazhua.monitorRefreshTime, 10);
|
let monitorRefreshTime = parseInt(config.nazhua.monitorRefreshTime, 10);
|
||||||
// 0 为不刷新
|
// 0 为不刷新
|
||||||
if (monitorRefreshTime === 0) {
|
if (monitorRefreshTime === 0) {
|
||||||
@ -169,7 +209,7 @@ async function setTimeLoadMonitor() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
setTimeLoadMonitor();
|
setTimeLoadMonitor(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
@ -197,7 +237,14 @@ onUnmounted(() => {
|
|||||||
color: #eee;
|
color: #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
.peak-shaving-group {
|
.right-box {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.peak-shaving-group,
|
||||||
|
.refresh-data-group {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 6px;
|
gap: 6px;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user