diff --git a/package.json b/package.json
index 21844a9..6061fd4 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
"flag-icons": "^7.2.3",
"font-logos": "^1.3.0",
"remixicon": "^4.5.0",
+ "uniqolor": "^1.1.1",
"vue": "^3.5.12",
"vue-echarts": "^7.0.3",
"vue-router": "^4.4.5",
diff --git a/src/components/charts/line.js b/src/components/charts/line.js
index 67e0203..eb5a5e7 100644
--- a/src/components/charts/line.js
+++ b/src/components/charts/line.js
@@ -3,7 +3,7 @@ import { CanvasRenderer } from 'echarts/renderers';
import { LineChart } from 'echarts/charts';
import {
TooltipComponent,
- LegendComponent,
+ // LegendComponent,
GridComponent,
DataZoomComponent,
} from 'echarts/components';
@@ -15,7 +15,7 @@ use([
CanvasRenderer,
LineChart,
TooltipComponent,
- LegendComponent,
+ // LegendComponent,
GridComponent,
DataZoomComponent,
]);
@@ -28,6 +28,7 @@ export default (
) => {
const fontFamily = config.nazhua.disableSarasaTermSC === true ? undefined : 'Sarasa Term SC';
const option = {
+ darkMode: mode === 'dark',
tooltip: {
trigger: 'axis',
axisPointer: {
@@ -49,26 +50,35 @@ export default (
fontSize: 14,
},
},
- legend: {
- top: 5,
- data: cateList,
- textStyle: {
- color: mode === 'dark' ? '#ddd' : '#222',
- fontFamily,
- fontSize: 14,
- },
- },
+ // legend: {
+ // show: false,
+ // data: cateList.map((i) => ({
+ // name: i.name,
+ // itemStyle: {
+ // color: i.color,
+ // },
+ // lineStyle: {
+ // color: i.color,
+ // },
+ // })),
+ // textStyle: {
+ // color: mode === 'dark' ? '#ddd' : '#222',
+ // fontFamily,
+ // fontSize: 14,
+ // },
+ // },
grid: {
- left: 0,
+ top: 10,
+ left: 5,
right: 5,
- bottom: 0,
+ bottom: 50,
containLabel: true,
},
dataZoom: [{
id: 'dataZoomX',
type: 'slider',
xAxisIndex: [0],
- filterMode: 'filter',
+ filterMode: 'none',
}],
yAxis: {
type: 'value',
@@ -96,9 +106,8 @@ export default (
},
},
series: valueList.map((i) => ({
+ ...i,
type: 'line',
- data: i.data,
- name: i.name,
smooth: true,
connectNulls: true,
legendHoverLink: false,
diff --git a/src/views/components/server-detail/server-monitor.vue b/src/views/components/server-detail/server-monitor.vue
index 67931e7..e007f71 100644
--- a/src/views/components/server-detail/server-monitor.vue
+++ b/src/views/components/server-detail/server-monitor.vue
@@ -43,6 +43,42 @@
+
+
+
+
+
+ {{ cateItem.name }}
+
+
+ {{ cateItem.avg }}ms
+
+
+ -ms
+
+
+
+
{
const dateMap = {};
if (!cateMap[i.monitor_name]) {
cateMap[i.monitor_name] = {
+ id: i.monitor_id,
dateMap,
avgs: [],
};
@@ -132,10 +172,11 @@ const monitorChartData = computed(() => {
});
});
let dateList = [];
+ let valueList = [];
const cateList = [];
- const valueList = [];
Object.keys(cateMap).forEach((i) => {
const {
+ id,
dateMap,
avgs,
} = cateMap[i];
@@ -144,16 +185,44 @@ const monitorChartData = computed(() => {
avgs.push([time, value]);
dateList.push(time);
});
- valueList.push({
- name: i,
- data: avgs,
- });
+ const color = getLineColor(id);
if (avgs.length) {
- cateList.push(i);
+ if (!validate.hasOwn(showCates.value, id)) {
+ showCates.value[id] = true;
+ }
+ const cateItem = {
+ id,
+ name: i,
+ color,
+ avg: (avgs.reduce((a, b) => a + b[1], 0) / avgs.length).toFixed(2) * 1,
+ over: ((avgs.filter((o) => o[1] > 0).length / avgs.length) * 100).toFixed(2) * 1,
+ };
+ if (Number.isNaN(cateItem.avg)) {
+ cateItem.avg = 0;
+ }
+ const titles = [
+ cateItem.name,
+ `平均延迟:${cateItem.avg}ms`,
+ `执行成功:${cateItem.over}%`,
+ ];
+ cateItem.title = titles.join('\n');
+ cateList.push(cateItem);
+ valueList.push({
+ id,
+ name: i,
+ data: avgs,
+ itemStyle: {
+ color,
+ },
+ lineStyle: {
+ color,
+ },
+ });
}
});
// 去重
dateList = Array.from(new Set(dateList)).sort((a, b) => a - b);
+ valueList = valueList.filter((i) => showCates.value[i.id]);
return {
dateList,
cateList,
@@ -169,6 +238,10 @@ function switchRefresh() {
refreshData.value = !refreshData.value;
}
+function toggleShowCate(id) {
+ showCates.value[id] = !showCates.value[id];
+}
+
async function loadMonitor() {
await request({
url: (
@@ -221,7 +294,7 @@ onUnmounted(() => {
diff --git a/src/views/composable/server-monitor.js b/src/views/composable/server-monitor.js
index 3500e15..3183b7b 100644
--- a/src/views/composable/server-monitor.js
+++ b/src/views/composable/server-monitor.js
@@ -1,3 +1,5 @@
+import uniqolor from 'uniqolor';
+
/**
* 计算数据的阈值和平均值
*
@@ -30,3 +32,20 @@ export function getThreshold(data, tolerance = 2) {
max,
};
}
+
+const lineNameColorMap = {};
+const lineColorNameMap = {};
+
+export function getLineColor(name) {
+ if (lineNameColorMap[name]) {
+ return lineNameColorMap[name];
+ }
+ const { color } = uniqolor.random({
+ saturation: [75, 90],
+ lightness: [65, 70],
+ differencePoint: 100,
+ });
+ lineNameColorMap[name] = color;
+ lineColorNameMap[color] = name;
+ return color;
+}
diff --git a/yarn.lock b/yarn.lock
index 95e1364..674189b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2900,6 +2900,11 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
+uniqolor@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/uniqolor/-/uniqolor-1.1.1.tgz#ef35e41d930d31b90228a18d82dd151b8106b2f3"
+ integrity sha512-HUwezlXCwm5bzsEXW7AP7ybezH13uWENRgYT+3dOdhJPvpYucSqvIGckMiLn+Uy2j0NVf3fPp43uZ4aun3t4Ww==
+
update-browserslist-db@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"