From f445c5e6c8ec1ec797a005fc7b67e2c0e8bd8d56 Mon Sep 17 00:00:00 2001 From: Qiuxia Fan Date: Thu, 26 May 2022 11:03:32 +0800 Subject: [PATCH] sort spans in segments --- src/types/trace.d.ts | 9 ++++- src/views/dashboard/related/trace/Detail.vue | 16 ++++----- .../trace/components/D3Graph/Index.vue | 36 +++++++++++++++---- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/types/trace.d.ts b/src/types/trace.d.ts index 82e0f669..569e7173 100644 --- a/src/types/trace.d.ts +++ b/src/types/trace.d.ts @@ -46,8 +46,15 @@ export interface Span { children?: Span[]; tags?: Array>; logs?: log[]; + parentSegmentId?: string; + refs?: Ref[]; } - +export type Ref = { + type: string; + parentSegmentId: string; + parentSpanId: number; + traceId: string; +}; export interface log { time: number; data: Map; diff --git a/src/views/dashboard/related/trace/Detail.vue b/src/views/dashboard/related/trace/Detail.vue index cb70683b..4d217ce1 100644 --- a/src/views/dashboard/related/trace/Detail.vue +++ b/src/views/dashboard/related/trace/Detail.vue @@ -64,7 +64,11 @@ limitations under the License. -->
(false); - const traceId = ref( - traceStore.currentTrace.traceIds && - traceStore.currentTrace.traceIds[0] && - traceStore.currentTrace.traceIds[0].value - ); + const traceId = ref(""); const displayMode = ref("List"); const pageNum = ref(1); const pageSize = 10; @@ -183,7 +181,7 @@ export default defineComponent({ const showTraceLogs = ref(false); function handleClick() { - copy(traceId.value); + copy(traceId.value || traceStore.currentTrace.traceIds[0].value); } async function changeTraceId(opt: Option[] | any) { diff --git a/src/views/dashboard/related/trace/components/D3Graph/Index.vue b/src/views/dashboard/related/trace/components/D3Graph/Index.vue index 893a45fb..35f3db68 100644 --- a/src/views/dashboard/related/trace/components/D3Graph/Index.vue +++ b/src/views/dashboard/related/trace/components/D3Graph/Index.vue @@ -31,7 +31,7 @@ import _ from "lodash"; import * as d3 from "d3"; import ListGraph from "../../utils/d3-trace-list"; import TreeGraph from "../../utils/d3-trace-tree"; -import { Span } from "@/types/trace"; +import { Span, Ref } from "@/types/trace"; import SpanDetail from "./SpanDetail.vue"; /* global defineProps, Nullable, defineExpose*/ @@ -45,6 +45,7 @@ const showDetail = ref(false); const fixSpansSize = ref(0); const segmentId = ref([]); const currentSpan = ref>([]); +const refSpans = ref>([]); const tree = ref(null); const traceGraph = ref>(null); defineExpose({ @@ -103,14 +104,17 @@ function changeTree() { segmentId.value = []; const segmentGroup: any = {}; const segmentIdGroup: any = []; - const fixSpans: any[] = []; - const segmentHeaders: any = []; + const fixSpans: Span[] = []; + const segmentHeaders: Span[] = []; for (const span of props.data) { + if (span.refs.length) { + refSpans.value.push(...span.refs); + } if (span.parentSpanId === -1) { segmentHeaders.push(span); } else { - const index = props.data.findIndex( - (i: any) => + const item = props.data.find( + (i: Span) => i.segmentId === span.segmentId && i.spanId === span.spanId - 1 ); const fixSpanKeyContent = { @@ -119,7 +123,7 @@ function changeTree() { spanId: span.spanId - 1, parentSpanId: span.spanId - 2, }; - if (index === -1 && !_.find(fixSpans, fixSpanKeyContent)) { + if (!item && !_.find(fixSpans, fixSpanKeyContent)) { fixSpans.push({ ...fixSpanKeyContent, refs: [], @@ -133,6 +137,8 @@ function changeTree() { layer: "Broken", tags: [], logs: [], + startTime: 0, + endTime: 0, }); } } @@ -167,6 +173,8 @@ function changeTree() { layer: "Broken", tags: [], logs: [], + startTime: 0, + endTime: 0, }); } // if root broken node is not exist, create a root broken node. @@ -191,6 +199,8 @@ function changeTree() { layer: "Broken", tags: [], logs: [], + startTime: 0, + endTime: 0, }); } } @@ -268,14 +278,28 @@ function changeTree() { } function collapse(d: Span) { if (d.children) { + const item = refSpans.value.find( + (s: Ref) => + s.parentSpanId === d.spanId && s.parentSegmentId === d.segmentId + ); let dur = d.endTime - d.startTime; d.children.forEach((i: Span) => { dur -= i.endTime - i.startTime; }); d.dur = dur < 0 ? 0 : dur; + if (item) { + d.children = d.children.sort(compare("startTime")); + } d.children.forEach((i: Span) => collapse(i)); } } +function compare(p: string) { + return (m: any, n: any) => { + const a = m[p]; + const b = n[p]; + return a - b; + }; +} onBeforeUnmount(() => { d3.selectAll(".d3-tip").remove(); window.removeEventListener("resize", resize);