fix: bugs fix and polish components for continue profiling (#281)

This commit is contained in:
Fine0830 2023-06-12 18:24:13 +08:00 committed by GitHub
parent 22db68646c
commit 62a82590c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 45 additions and 34 deletions

View File

@ -20,7 +20,9 @@ import type { EBPFTaskList, EBPFProfilingSchedule, AnalyzationTrees } from "@/ty
import type { Instance } from "@/types/selector"; import type { Instance } from "@/types/selector";
import { store } from "@/store"; import { store } from "@/store";
import graphql from "@/graphql"; import graphql from "@/graphql";
import type { MonitorInstance, MonitorProcess } from "@/types/continous-profiling";
import type { AxiosResponse } from "axios"; import type { AxiosResponse } from "axios";
import { dateFormat } from "@/utils/dateFormat";
interface ContinousProfilingState { interface ContinousProfilingState {
strategyList: Array<Recordable<StrategyItem>>; strategyList: Array<Recordable<StrategyItem>>;
@ -106,16 +108,20 @@ export const continousProfilingStore = defineStore({
if (res.data.errors) { if (res.data.errors) {
return res.data; return res.data;
} }
this.strategyList = (res.data.data.strategyList || []).map((d: StrategyItem, index: number) => { const list = res.data.data.strategyList || [];
if (!list.length) {
this.taskList = [];
this.instances = [];
this.instance = null;
}
const arr = list.length ? res.data.data.strategyList : [{ type: "", checkItems: [{ type: "" }] }];
this.strategyList = arr.map((d: StrategyItem, index: number) => {
return { return {
...d, ...d,
id: index, id: index,
}; };
}); });
this.setSelectedStrategy(this.strategyList[0] || {}); this.setSelectedStrategy(list[0] || {});
if (!this.strategyList.length) {
this.taskList = [];
}
if (!this.selectedStrategy.type) { if (!this.selectedStrategy.type) {
return res.data; return res.data;
} }
@ -132,10 +138,29 @@ export const continousProfilingStore = defineStore({
target: this.selectedStrategy.type, target: this.selectedStrategy.type,
}); });
this.instancesLoading = false; this.instancesLoading = false;
if (!res.data.errors) { if (res.data.errors) {
this.instances = res.data.data.instances || []; return res.data;
this.instance = this.instances[0] || null;
} }
this.instances = (res.data.data.instances || [])
.map((d: MonitorInstance) => {
const processes = (d.processes || [])
.sort((c: MonitorProcess, d: MonitorProcess) => d.lastTriggerTimestamp - c.lastTriggerTimestamp)
.map((p: MonitorProcess) => {
return {
...p,
lastTriggerTime: d.lastTriggerTimestamp ? dateFormat(d.lastTriggerTimestamp) : "",
labels: p.labels.join("; "),
};
});
return {
...d,
processes,
lastTriggerTime: d.lastTriggerTimestamp ? dateFormat(d.lastTriggerTimestamp) : "",
};
})
.sort((a: MonitorInstance, b: MonitorInstance) => b.lastTriggerTimestamp - a.lastTriggerTimestamp);
this.instance = this.instances[0] || null;
return res.data; return res.data;
}, },
}, },

View File

@ -22,6 +22,7 @@ declare module '@vue/runtime-core' {
ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup']
ElOption: typeof import('element-plus/es')['ElOption'] ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination'] ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
ElPopover: typeof import('element-plus/es')['ElPopover'] ElPopover: typeof import('element-plus/es')['ElPopover']
ElProgress: typeof import('element-plus/es')['ElProgress'] ElProgress: typeof import('element-plus/es')['ElProgress']
ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadio: typeof import('element-plus/es')['ElRadio']

View File

@ -285,7 +285,7 @@ limitations under the License. -->
} }
.tab-name { .tab-name {
max-width: 110px; max-width: 130px;
height: 20px; height: 20px;
line-height: 20px; line-height: 20px;
outline: none; outline: none;
@ -348,7 +348,7 @@ limitations under the License. -->
.vue-grid-item:not(.vue-grid-placeholder) { .vue-grid-item:not(.vue-grid-placeholder) {
background: #fff; background: #fff;
box-shadow: 0px 1px 4px 0px #00000029; box-shadow: 0 1px 4px 0 #00000029;
border-radius: 3px; border-radius: 3px;
} }

View File

@ -68,14 +68,14 @@ limitations under the License. -->
background background
layout="prev, pager, next" layout="prev, pager, next"
:page-size="pageSize" :page-size="pageSize"
:total="instances.length" :total="continousProfilingStore.instances.length"
@current-change="changePage" @current-change="changePage"
@prev-click="changePage" @prev-click="changePage"
@next-click="changePage" @next-click="changePage"
/> />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref, computed, watch } from "vue"; import { ref, watch } from "vue";
import type { PropType } from "vue"; import type { PropType } from "vue";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import { useContinousProfilingStore } from "@/store/modules/continous-profiling"; import { useContinousProfilingStore } from "@/store/modules/continous-profiling";
@ -85,7 +85,6 @@ limitations under the License. -->
import router from "@/router"; import router from "@/router";
import { HeaderLabels, HeaderChildLabels } from "../data"; import { HeaderLabels, HeaderChildLabels } from "../data";
import { EntityType } from "../../../data"; import { EntityType } from "../../../data";
import { dateFormat } from "@/utils/dateFormat";
/*global defineProps */ /*global defineProps */
const props = defineProps({ const props = defineProps({
@ -99,23 +98,6 @@ limitations under the License. -->
const selectorStore = useSelectorStore(); const selectorStore = useSelectorStore();
const continousProfilingStore = useContinousProfilingStore(); const continousProfilingStore = useContinousProfilingStore();
const pageSize = 10; const pageSize = 10;
const instances = computed(() => {
return continousProfilingStore.instances
.map((d: MonitorInstance) => {
const processes = (d.processes || [])
.sort((c: MonitorProcess, d: MonitorProcess) => d.lastTriggerTimestamp - c.lastTriggerTimestamp)
.map((p: MonitorProcess) => {
return {
...p,
lastTriggerTime: d.lastTriggerTimestamp ? dateFormat(d.lastTriggerTimestamp) : "",
labels: p.labels.join("; "),
};
});
return { ...d, processes, lastTriggerTime: d.lastTriggerTimestamp ? dateFormat(d.lastTriggerTimestamp) : "" };
})
.sort((a: MonitorInstance, b: MonitorInstance) => b.lastTriggerTimestamp - a.lastTriggerTimestamp);
});
const currentInstances = ref<MonitorInstance[]>([]); const currentInstances = ref<MonitorInstance[]>([]);
function viewProcessDashboard(process: MonitorProcess, instance: MonitorInstance) { function viewProcessDashboard(process: MonitorProcess, instance: MonitorInstance) {
@ -137,7 +119,7 @@ limitations under the License. -->
} }
async function changePage(pageIndex: number) { async function changePage(pageIndex: number) {
currentInstances.value = instances.value.filter((d: unknown, index: number) => { currentInstances.value = continousProfilingStore.instances.filter((d: unknown, index: number) => {
if (index >= (pageIndex - 1) * pageSize && index < pageIndex * pageSize) { if (index >= (pageIndex - 1) * pageSize && index < pageIndex * pageSize) {
return d; return d;
} }
@ -145,9 +127,11 @@ limitations under the License. -->
} }
watch( watch(
() => instances.value, () => continousProfilingStore.instances,
() => { () => {
currentInstances.value = instances.value.filter((_: unknown, index: number) => index < pageSize); currentInstances.value = continousProfilingStore.instances.filter(
(_: unknown, index: number) => index < pageSize,
);
}, },
); );
</script> </script>

View File

@ -37,6 +37,7 @@ limitations under the License. -->
:class="{ :class="{
selected: continousProfilingStore.selectedStrategy.id === i.id, selected: continousProfilingStore.selectedStrategy.id === i.id,
}" }"
v-if="i.type"
> >
<div class="ell"> <div class="ell">
<span class="sm"> <span class="sm">

View File

@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. --> limitations under the License. -->
<template> <template>
<div class="flex-v content"> <div class="content">
<Timeline /> <Timeline />
<ProfilingPanel :config="config" /> <ProfilingPanel :config="config" />
</div> </div>