diff --git a/src/views/dashboard/related/trace/components/D3Graph/Index.vue b/src/views/dashboard/related/trace/components/D3Graph/Index.vue
index 11d9d6b0..d491c19c 100644
--- a/src/views/dashboard/related/trace/components/D3Graph/Index.vue
+++ b/src/views/dashboard/related/trace/components/D3Graph/Index.vue
@@ -17,7 +17,7 @@ limitations under the License. -->
Span Details
-
{{
+
{{
`Parent Span: ${span.parentSegmentId}`
}}
@@ -116,8 +116,8 @@ limitations under the License. -->
});
}
}
- function viewParentSpan() {
- tree.value.highlightParents();
+ function viewParentSpan(span: Recordable) {
+ tree.value.highlightParents(span);
}
function traverseTree(node: Recordable, spanId: string, segmentId: string, data: Recordable) {
if (!node || node.isBroken) {
diff --git a/src/views/dashboard/related/trace/components/List.vue b/src/views/dashboard/related/trace/components/List.vue
index 518d1a1f..119e13a8 100644
--- a/src/views/dashboard/related/trace/components/List.vue
+++ b/src/views/dashboard/related/trace/components/List.vue
@@ -55,12 +55,12 @@ limitations under the License. -->
function downloadTrace() {
const serializer = new XMLSerializer();
- const svgNode: any = d3.select(".trace-list-dowanload").node();
+ const svgNode: any = d3.select(".trace-list").node();
const source = `\r\n${serializer.serializeToString(svgNode)}`;
const canvas = document.createElement("canvas");
const context: any = canvas.getContext("2d");
- canvas.width = (d3.select(".trace-list-dowanload") as Recordable)._groups[0][0].clientWidth;
- canvas.height = (d3.select(".trace-list-dowanload") as Recordable)._groups[0][0].clientHeight;
+ canvas.width = (d3.select(".trace-list") as Recordable)._groups[0][0].clientWidth;
+ canvas.height = (d3.select(".trace-list") as Recordable)._groups[0][0].clientHeight;
context.fillStyle = appStore.theme === Themes.Dark ? "#212224" : `#fff`;
context.fillRect(0, 0, canvas.width, canvas.height);
const image = new Image();
diff --git a/src/views/dashboard/related/trace/utils/d3-trace-list.ts b/src/views/dashboard/related/trace/utils/d3-trace-list.ts
index f266c866..e8599f3a 100644
--- a/src/views/dashboard/related/trace/utils/d3-trace-list.ts
+++ b/src/views/dashboard/related/trace/utils/d3-trace-list.ts
@@ -48,11 +48,11 @@ export default class ListGraph {
this.el = el;
this.width = el.getBoundingClientRect().width - 10;
this.height = el.getBoundingClientRect().height - 10;
- d3.select(`.${this.el?.className} .trace-list-dowanload`).remove();
+ d3.select(`.${this.el?.className} .trace-list`).remove();
this.svg = d3
.select(this.el)
.append("svg")
- .attr("class", "trace-list-dowanload")
+ .attr("class", "trace-list")
.attr("width", this.width > 0 ? this.width : 10)
.attr("height", this.height > 0 ? this.height : 10)
.attr("transform", `translate(-5, 0)`);
@@ -118,10 +118,6 @@ export default class ListGraph {
}
draw(callback: Function) {
this.update(this.root, callback);
- // d3.select("body").on("click", function (event) {
- // if (event.target.closest("#action-box")) return;
- // d3.select("#action-box").style("display", "none");
- // });
}
click(d: Recordable, scope: Recordable) {
if (!d.data.type) return;
@@ -172,7 +168,7 @@ export default class ListGraph {
d3.select("#action-box")
.style("display", "block")
.style("left", `${event.pageX - 70}px`)
- .style("top", `${event.pageY - 100}px`);
+ .style("top", `${event.pageY + 30}px`);
t.selectedNode = d3.select(this);
if (t.handleSelectSpan) {
t.handleSelectSpan(d);
@@ -407,38 +403,37 @@ export default class ListGraph {
callback();
}
}
- highlightParents() {
- if (!this.selectedNode) {
+ highlightParents(span: Recordable) {
+ if (!span) {
return;
}
const nodes = this.root.descendants().map((node: { id: number }) => {
d3.select(`#list-node-${node.id}`).classed("highlightedParent", false);
return node;
});
- const selectedNode = this.selectedNode.datum();
- const parentSpans = selectedNode.data.refs.map((d: Recordable) => d);
- if (selectedNode.data?.parentSpanId !== -1) {
- parentSpans.push({
- parentSegmentId: selectedNode.data.segmentId,
- parentSpanId: selectedNode.data.parentSpanId,
- traceId: selectedNode.data.traceId,
- });
- }
- const parents = parentSpans.map((d: Recordable) => {
- return nodes.find(
- (node: Recordable) =>
- d.parentSpanId === node.data.spanId &&
- d.parentSegmentId === node.data.segmentId &&
- d.traceId === node.data.traceId,
- );
- });
- for (const node of parents) {
- if (node) {
- d3.select(`#list-node-${node.id}`).classed("highlightedParent", true);
- }
+ const parentSpan = nodes.find(
+ (node: Recordable) =>
+ span.parentSpanId === node.data.spanId &&
+ span.parentSegmentId === node.data.segmentId &&
+ span.traceId === node.data.traceId,
+ );
+ if (parentSpan) {
+ d3.select(`#list-node-${parentSpan.id}`).classed("highlightedParent", true);
}
d3.select("#action-box").style("display", "none");
this.selectedNode.classed("highlighted", false);
+ if (!parentSpan) return;
+ const container = document.querySelector(".trace-chart .charts");
+ const containerRect = container?.getBoundingClientRect();
+ if (!containerRect) return;
+ const targetElement = document.querySelector(`#list-node-${parentSpan.id}`);
+ if (!targetElement) return;
+ const targetRect = targetElement.getBoundingClientRect();
+ container?.scrollTo({
+ left: targetRect.left - containerRect.left + container?.scrollLeft,
+ top: targetRect.top - containerRect.top + container?.scrollTop - 100,
+ behavior: "smooth",
+ });
}
visDate(date: number, pattern = "YYYY-MM-DD HH:mm:ss:SSS") {
return dayjs(date).format(pattern);