diff --git a/src/hooks/useExpressionsProcessor.ts b/src/hooks/useExpressionsProcessor.ts index 5abb9230..7f035f74 100644 --- a/src/hooks/useExpressionsProcessor.ts +++ b/src/hooks/useExpressionsProcessor.ts @@ -17,6 +17,7 @@ import { RespFields, MaximumEntities, MaxQueryLength } from "./data"; import { EntityType, ExpressionResultType } from "@/views/dashboard/data"; import { ElMessage } from "element-plus"; +import { useTopologyStore } from "@/store/modules/topology"; import { useDashboardStore } from "@/store/modules/dashboard"; import { useSelectorStore } from "@/store/modules/selectors"; import { useAppStoreWithOut } from "@/store/modules/app"; @@ -391,11 +392,11 @@ export async function useExpressionsQueryPodsMetrics( return resp; } -export async function useQueryTopologyExpressionsProcessor(metrics: string[], instances: (Call | Node)[]) { +export function useQueryTopologyExpressionsProcessor(metrics: string[], instances: (Call | Node)[]) { const appStore = useAppStoreWithOut(); const dashboardStore = useDashboardStore(); - function getExpressionQuery(partMetrics: string[]) { + function getExpressionQuery(partMetrics?: string[]) { const conditions: { [key: string]: unknown } = { duration: appStore.durationTime, }; @@ -449,7 +450,7 @@ export async function useQueryTopologyExpressionsProcessor(metrics: string[], in }; variables.push(`$entity${index}: Entity!`); conditions[`entity${index}`] = entity; - const f = partMetrics.map((name: string, idx: number) => { + const f = (partMetrics || metrics).map((name: string, idx: number) => { if (index === 0) { variables.push(`$expression${idx}: String!`); conditions[`expression${idx}`] = name; @@ -483,19 +484,31 @@ export async function useQueryTopologyExpressionsProcessor(metrics: string[], in } return obj; } - - const count = Math.floor(MaxQueryLength / instances.length); - const metricsArr = chunkArray(metrics, count); - const promiseArr = metricsArr.map((d: Array) => getExpressionQuery(d)); - const responseList = await Promise.all(promiseArr); - - let resp = {}; - for (const item of responseList) { - resp = { - ...resp, - ...item, - }; + async function fetchMetrics(partMetrics: string[]) { + const topologyStore = useTopologyStore(); + const param = getExpressionQuery(partMetrics); + const res = await topologyStore.getTopologyExpressionValue(param); + if (res.errors) { + ElMessage.error(res.errors); + return; + } + return handleExpressionValues(res.data); } - return { getExpressionQuery, handleExpressionValues }; + async function getMetrics() { + const count = Math.floor(MaxQueryLength / instances.length); + const metricsArr = chunkArray(metrics, count); + const promiseArr = metricsArr.map((d: string[]) => fetchMetrics(d)); + const responseList = await Promise.all(promiseArr); + let resp = {}; + for (const item of responseList) { + resp = { + ...resp, + ...item, + }; + } + return resp; + } + + return { getMetrics, getExpressionQuery }; } diff --git a/src/store/modules/topology.ts b/src/store/modules/topology.ts index 66354f01..c5379cfd 100644 --- a/src/store/modules/topology.ts +++ b/src/store/modules/topology.ts @@ -24,7 +24,6 @@ import { useAppStoreWithOut } from "@/store/modules/app"; import type { AxiosResponse } from "axios"; import query from "@/graphql/fetch"; import { useQueryTopologyExpressionsProcessor } from "@/hooks/useExpressionsProcessor"; -import { ElMessage } from "element-plus"; interface MetricVal { [key: string]: { values: { id: string; value: unknown }[] }; @@ -443,7 +442,7 @@ export const topologyStore = defineStore({ return { calls, nodes }; }, - async getNodeExpressionValue(param: { queryStr: string; conditions: { [key: string]: unknown } }) { + async getTopologyExpressionValue(param: { queryStr: string; conditions: { [key: string]: unknown } }) { const res: AxiosResponse = await query(param); if (res.data.errors) { @@ -461,14 +460,8 @@ export const topologyStore = defineStore({ if (!calls.length) { return; } - const { getExpressionQuery, handleExpressionValues } = useQueryTopologyExpressionsProcessor(expressions, calls); - const param = getExpressionQuery(); - const res = await this.getNodeExpressionValue(param); - if (res.errors) { - ElMessage.error(res.errors); - return; - } - const metrics = handleExpressionValues(res.data); + const { getMetrics } = useQueryTopologyExpressionsProcessor(expressions, calls); + const metrics = await getMetrics(); if (type === "SERVER") { this.setLinkServerMetrics(metrics); } else { @@ -484,17 +477,11 @@ export const topologyStore = defineStore({ this.setNodeMetricValue({}); return; } - const { getExpressionQuery, handleExpressionValues } = useQueryTopologyExpressionsProcessor( + const { getMetrics } = useQueryTopologyExpressionsProcessor( expressions, this.nodes.filter((d: Node) => d.isReal), ); - const param = getExpressionQuery(); - const res = await this.getNodeExpressionValue(param); - if (res.errors) { - ElMessage.error(res.errors); - return; - } - const metrics = handleExpressionValues(res.data); + const metrics = await getMetrics(); this.setNodeMetricValue(metrics); }, async getHierarchyServiceTopology() { @@ -550,17 +537,6 @@ export const topologyStore = defineStore({ this.setHierarchyInstanceTopology(res.data.data.hierarchyInstanceTopology || {}, levels); return res.data; }, - async queryHierarchyExpressions(expressions: string[], nodes: Node[]) { - const { getExpressionQuery, handleExpressionValues } = useQueryTopologyExpressionsProcessor(expressions, nodes); - const param = getExpressionQuery(); - const res = await this.getNodeExpressionValue(param); - if (res.errors) { - ElMessage.error(res.errors); - return; - } - const metrics = handleExpressionValues(res.data); - return metrics; - }, async queryHierarchyNodeExpressions(expressions: string[], layer: string) { const nodes = this.hierarchyServiceNodes.filter((n: HierarchyNode) => n.layer === layer); if (!nodes.length) { @@ -571,7 +547,8 @@ export const topologyStore = defineStore({ this.setHierarchyNodeMetricValue({}, layer); return; } - const metrics = await this.queryHierarchyExpressions(expressions, nodes); + const { getMetrics } = useQueryTopologyExpressionsProcessor(expressions, nodes); + const metrics = await getMetrics(); this.setHierarchyNodeMetricValue(metrics, layer); }, async queryHierarchyInstanceNodeExpressions(expressions: string[], layer: string) { @@ -585,7 +562,8 @@ export const topologyStore = defineStore({ this.setHierarchyInstanceNodeMetricValue({}, layer); return; } - const metrics = await this.queryHierarchyExpressions(expressions, nodes); + const { getMetrics } = useQueryTopologyExpressionsProcessor(expressions, nodes); + const metrics = await getMetrics(); this.setHierarchyInstanceNodeMetricValue(metrics, layer); }, }, diff --git a/src/views/dashboard/related/topology/config/Settings.vue b/src/views/dashboard/related/topology/config/Settings.vue index 6c0e0841..2ae5a942 100644 --- a/src/views/dashboard/related/topology/config/Settings.vue +++ b/src/views/dashboard/related/topology/config/Settings.vue @@ -244,12 +244,12 @@ limitations under the License. --> async function setLegend() { updateSettings(); const expression = dashboardStore.selectedGrid.legendMQE && dashboardStore.selectedGrid.legendMQE.expression; - const { getExpressionQuery } = useQueryTopologyExpressionsProcessor( + const { getExpressionQuery } = await useQueryTopologyExpressionsProcessor( [expression], topologyStore.nodes.filter((d: Node) => d.isReal), ); const param = getExpressionQuery(); - const res = await topologyStore.getNodeExpressionValue(param); + const res = await topologyStore.getTopologyExpressionValue(param); if (res.errors) { ElMessage.error(res.errors); } else { diff --git a/src/views/dashboard/related/topology/service/ServiceMap.vue b/src/views/dashboard/related/topology/service/ServiceMap.vue index eba245d6..6280a13f 100644 --- a/src/views/dashboard/related/topology/service/ServiceMap.vue +++ b/src/views/dashboard/related/topology/service/ServiceMap.vue @@ -285,12 +285,12 @@ limitations under the License. --> if (!expression) { return; } - const { getExpressionQuery } = useQueryTopologyExpressionsProcessor( + const { getExpressionQuery } = await useQueryTopologyExpressionsProcessor( [expression], topologyStore.nodes.filter((d: Node) => d.isReal), ); const param = getExpressionQuery(); - const res = await topologyStore.getNodeExpressionValue(param); + const res = await topologyStore.getTopologyExpressionValue(param); if (res.errors) { ElMessage.error(res.errors); } else {