-
diff --git a/src/views/dashboard/related/trace/components/Table/data.ts b/src/views/dashboard/related/trace/components/Table/data.ts
index cc486536..4eff830e 100644
--- a/src/views/dashboard/related/trace/components/Table/data.ts
+++ b/src/views/dashboard/related/trace/components/Table/data.ts
@@ -48,7 +48,7 @@ export const ProfileConstant = [
label: "application",
value: "Operation",
},
-];
+] as const;
export const TraceConstant = [
{
@@ -83,7 +83,7 @@ export const TraceConstant = [
label: "application",
value: "Attached Events",
},
-];
+] as const;
export const StatisticsConstant = [
{
@@ -121,4 +121,4 @@ export const StatisticsConstant = [
value: "Hits",
key: "count",
},
-];
+] as const;
diff --git a/src/views/dashboard/related/trace/Filter.vue b/src/views/dashboard/related/trace/components/TraceList/Filter.vue
similarity index 77%
rename from src/views/dashboard/related/trace/Filter.vue
rename to src/views/dashboard/related/trace/components/TraceList/Filter.vue
index 5f65ea56..fc09eb19 100644
--- a/src/views/dashboard/related/trace/Filter.vue
+++ b/src/views/dashboard/related/trace/components/TraceList/Filter.vue
@@ -13,52 +13,56 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. -->
-
-
-
{{ t("service") }}:
-
+
+
+
+ {{ t("service") }}:
+
+
+
+ {{ t("instance") }}:
+
+
+
+ {{ t("endpoint") }}:
+
+
+
+ {{ t("status") }}:
+
+
-
-
{{ t("instance") }}:
-
+
+
+ {{ t("runQuery") }}
+
-
- {{ t("endpoint") }}:
-
-
-
- {{ t("status") }}:
-
-
-
- {{ t("search") }}
-
@@ -72,7 +76,7 @@ limitations under the License. -->
-
{{ t("timeRange") }}:
+
{{ t("timeRange") }}
import type { PropType } from "vue";
import { useI18n } from "vue-i18n";
import type { Option, DurationTime, Duration } from "@/types/app";
- import { useTraceStore } from "@/store/modules/trace";
+ import { useTraceStore, PageSize } from "@/store/modules/trace";
import { useDashboardStore } from "@/store/modules/dashboard";
import { useAppStoreWithOut, InitializationDurationRow } from "@/store/modules/app";
import { useSelectorStore } from "@/store/modules/selectors";
import timeFormat from "@/utils/timeFormat";
import ConditionTags from "@/views/components/ConditionTags.vue";
import { ElMessage } from "element-plus";
- import { EntityType, QueryOrders, Status } from "../../data";
- import type { LayoutConfig } from "@/types/dashboard";
+ import { EntityType, QueryOrders, Status } from "@/views/dashboard/data";
+ import type { LayoutConfig, FilterDuration } from "@/types/dashboard";
import { useDuration } from "@/hooks/useDuration";
/*global defineProps, defineEmits, Recordable */
@@ -108,7 +112,7 @@ limitations under the License. -->
needQuery: { type: Boolean, default: true },
data: {
type: Object as PropType,
- default: () => ({ graph: {} }),
+ default: () => ({}),
},
});
const { t } = useI18n();
@@ -117,20 +121,19 @@ limitations under the License. -->
const dashboardStore = useDashboardStore();
const traceStore: ReturnType = useTraceStore();
const { setDurationRow, getDurationTime, getMaxRange } = useDuration();
- const filters = reactive(props.data.filters || {});
- const traceId = ref(filters.traceId || "");
- const { duration: filtersDuration } = filters;
- const duration = ref(
+ const filters = computed(() => props.data.filters || {});
+ const traceId = ref(filters.value.traceId || "");
+ const { duration: filtersDuration } = filters.value;
+ const duration = ref(
filtersDuration
? { start: filtersDuration.startTime || "", end: filtersDuration.endTime || "", step: filtersDuration.step || "" }
: getDurationTime(),
);
const minTraceDuration = ref();
const maxTraceDuration = ref();
- const tagsList = ref([]);
const tagsMap = ref([]);
const state = reactive({
- status: filters.status === "ERROR" ? Status[2] : Status[0],
+ status: filters.value.status === "ERROR" ? Status[2] : Status[0],
instance: { value: "0", label: "All" },
endpoint: { value: "0", label: "All" },
service: { value: "", label: "" },
@@ -139,9 +142,9 @@ limitations under the License. -->
const maxRange = computed(() =>
getMaxRange(appStore.coldStageMode ? appStore.recordsTTL?.coldTrace || 0 : appStore.recordsTTL?.trace || 0),
);
- if (filters.queryOrder) {
+ if (filters.value.queryOrder) {
traceStore.setTraceCondition({
- queryOrder: filters.queryOrder,
+ queryOrder: filters.value.queryOrder,
});
}
if (props.needQuery) {
@@ -149,7 +152,7 @@ limitations under the License. -->
}
async function init() {
- duration.value = filters.duration || appStore.durationTime;
+ duration.value = filters.value.duration || appStore.durationTime;
if (dashboardStore.entity === EntityType[1].value) {
await getServices();
}
@@ -221,8 +224,10 @@ limitations under the License. -->
minTraceDuration: Number(minTraceDuration.value),
maxTraceDuration: Number(maxTraceDuration.value),
traceId: traceId.value || undefined,
- paging: { pageNum: 1, pageSize: 20 },
};
+ if (!traceStore.hasQueryTracesV2Support) {
+ param.paging = { pageNum: 1, pageSize: PageSize };
+ }
if (props.data.filters && props.data.filters.id) {
param = {
...param,
@@ -267,8 +272,7 @@ limitations under the License. -->
emits("get", state.service.id);
}
}
- function updateTags(data: { tagsMap: Array; tagsList: string[] }) {
- tagsList.value = data.tagsList;
+ function updateTags(data: { tagsMap: Array }) {
tagsMap.value = data.tagsMap;
}
async function searchEndpoints(keyword: string) {
@@ -345,21 +349,12 @@ limitations under the License. -->
.row {
margin-bottom: 5px;
- position: relative;
}
.traceId {
width: 270px;
}
- .search-btn {
- cursor: pointer;
- width: 80px;
- position: absolute;
- top: 0;
- right: 10px;
- }
-
.label {
line-height: 24px;
}
diff --git a/src/views/dashboard/related/trace/Header.vue b/src/views/dashboard/related/trace/components/TraceList/SearchBar.vue
similarity index 99%
rename from src/views/dashboard/related/trace/Header.vue
rename to src/views/dashboard/related/trace/components/TraceList/SearchBar.vue
index e876719a..17b7ca10 100644
--- a/src/views/dashboard/related/trace/Header.vue
+++ b/src/views/dashboard/related/trace/components/TraceList/SearchBar.vue
@@ -91,7 +91,7 @@ limitations under the License. -->
import timeFormat from "@/utils/timeFormat";
import ConditionTags from "@/views/components/ConditionTags.vue";
import { ElMessage } from "element-plus";
- import { EntityType, QueryOrders, Status } from "../../data";
+ import { EntityType, QueryOrders, Status } from "@/views/dashboard/data";
import type { LayoutConfig } from "@/types/dashboard";
const FiltersKeys: { [key: string]: string } = {
diff --git a/src/views/dashboard/related/trace/TraceList.vue b/src/views/dashboard/related/trace/components/TraceList/SegmentList.vue
similarity index 97%
rename from src/views/dashboard/related/trace/TraceList.vue
rename to src/views/dashboard/related/trace/components/TraceList/SegmentList.vue
index de502c21..30fc9ce1 100644
--- a/src/views/dashboard/related/trace/TraceList.vue
+++ b/src/views/dashboard/related/trace/components/TraceList/SegmentList.vue
@@ -83,9 +83,9 @@ limitations under the License. -->
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/MinTimeline.vue b/src/views/dashboard/related/trace/components/TraceQuery/MinTimeline.vue
new file mode 100644
index 00000000..0f1c45a7
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/MinTimeline.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineMarker.vue b/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineMarker.vue
new file mode 100644
index 00000000..d5af258c
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineMarker.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+ {{ marker.duration }}ms
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineOverlay.vue b/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineOverlay.vue
new file mode 100644
index 00000000..50adc50f
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineOverlay.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineSelector.vue b/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineSelector.vue
new file mode 100644
index 00000000..b9535e80
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/MinTimelineSelector.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/SpanNode.vue b/src/views/dashboard/related/trace/components/TraceQuery/SpanNode.vue
new file mode 100644
index 00000000..0d56da28
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/SpanNode.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+ {{ span.label || "Unknown" }}
+
+
+ {{ span.duration }}ms
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/TimelineTool.vue b/src/views/dashboard/related/trace/components/TraceQuery/TimelineTool.vue
new file mode 100644
index 00000000..8db99b36
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/TimelineTool.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/TraceContent.vue b/src/views/dashboard/related/trace/components/TraceQuery/TraceContent.vue
new file mode 100644
index 00000000..f96d3d39
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/TraceContent.vue
@@ -0,0 +1,175 @@
+
+
+
+
+
+
{{ trace.label }}
+
+
+
+ {{ t("download") }}
+
+
+
+
+ Download JSON
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/TracesTable.vue b/src/views/dashboard/related/trace/components/TraceQuery/TracesTable.vue
new file mode 100644
index 00000000..2d21326c
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/TracesTable.vue
@@ -0,0 +1,379 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/dashboard/related/trace/components/TraceQuery/useHooks.ts b/src/views/dashboard/related/trace/components/TraceQuery/useHooks.ts
new file mode 100644
index 00000000..4ba391e1
--- /dev/null
+++ b/src/views/dashboard/related/trace/components/TraceQuery/useHooks.ts
@@ -0,0 +1,128 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { ref, computed } from "vue";
+
+export const adjustPercentValue = (value: number) => {
+ if (value <= 0) {
+ return 0;
+ }
+ if (value >= 100) {
+ return 100;
+ }
+ return value;
+};
+
+const calculateX = ({
+ parentRect,
+ x,
+ opositeX,
+ isSmallerThanOpositeX,
+}: {
+ parentRect: DOMRect;
+ x: number;
+ opositeX: number;
+ isSmallerThanOpositeX: boolean;
+}) => {
+ let value = ((x - parentRect.left) / (parentRect.right - parentRect.left)) * 100;
+ if (isSmallerThanOpositeX) {
+ if (value >= opositeX) {
+ value = opositeX - 1;
+ }
+ } else if (value <= opositeX) {
+ value = opositeX + 1;
+ }
+ return adjustPercentValue(value);
+};
+
+export const useRangeTimestampHandler = ({
+ rootEl,
+ minTimestamp,
+ maxTimestamp,
+ selectedTimestamp,
+ isSmallerThanOpositeX,
+ setTimestamp,
+}: {
+ rootEl: SVGSVGElement | null;
+ minTimestamp: number;
+ maxTimestamp: number;
+ selectedTimestamp: number;
+ isSmallerThanOpositeX: boolean;
+ setTimestamp: (value: number) => void;
+}) => {
+ const currentX = ref();
+ const mouseDownX = ref();
+ const isDragging = ref(false);
+ const selectedTimestampComputed = ref(selectedTimestamp);
+ const opositeX = computed(() => {
+ return ((selectedTimestampComputed.value - minTimestamp) / (maxTimestamp - minTimestamp)) * 100;
+ });
+
+ const onMouseMove = (e: MouseEvent) => {
+ if (!rootEl) {
+ return;
+ }
+ const x = calculateX({
+ parentRect: rootEl.getBoundingClientRect(),
+ x: e.pageX,
+ opositeX: opositeX.value,
+ isSmallerThanOpositeX,
+ });
+ currentX.value = x;
+ };
+
+ const onMouseUp = (e: MouseEvent) => {
+ if (!rootEl) {
+ return;
+ }
+
+ const x = calculateX({
+ parentRect: rootEl.getBoundingClientRect(),
+ x: e.pageX,
+ opositeX: opositeX.value,
+ isSmallerThanOpositeX,
+ });
+ const timestamp = (x / 100) * (maxTimestamp - minTimestamp) + minTimestamp;
+ selectedTimestampComputed.value = timestamp;
+ setTimestamp(timestamp);
+ currentX.value = undefined;
+ mouseDownX.value = undefined;
+ isDragging.value = false;
+
+ document.removeEventListener("mousemove", onMouseMove);
+ document.removeEventListener("mouseup", onMouseUp);
+ };
+
+ const onMouseDown = (e: MouseEvent) => {
+ if (!rootEl) {
+ return;
+ }
+ const x = calculateX({
+ parentRect: rootEl.getBoundingClientRect(),
+ x: (e.currentTarget as SVGRectElement).getBoundingClientRect().x + 3,
+ opositeX: opositeX.value,
+ isSmallerThanOpositeX,
+ });
+ currentX.value = x;
+ mouseDownX.value = x;
+ isDragging.value = true;
+
+ document.addEventListener("mousemove", onMouseMove);
+ document.addEventListener("mouseup", onMouseUp);
+ };
+
+ return { currentX, mouseDownX, onMouseDown, isDragging };
+};
diff --git a/src/views/dashboard/related/trace/components/List.vue b/src/views/dashboard/related/trace/components/VisGraph/List.vue
similarity index 73%
rename from src/views/dashboard/related/trace/components/List.vue
rename to src/views/dashboard/related/trace/components/VisGraph/List.vue
index 5c8e04d7..ae781d11 100644
--- a/src/views/dashboard/related/trace/components/List.vue
+++ b/src/views/dashboard/related/trace/components/VisGraph/List.vue
@@ -17,56 +17,59 @@ limitations under the License. -->
class="charts-item mr-5"
v-for="(i, index) in traceStore.serviceList"
:key="index"
- :style="`color:${computedScale(index)}`"
+ :style="`color:${getServiceColor(i)}`"
>
{{ i }}
-
- {{ t("exportImage") }}
+
+
-
+
diff --git a/src/views/dashboard/related/trace/components/Tree.vue b/src/views/dashboard/related/trace/components/VisGraph/Tree.vue
similarity index 76%
rename from src/views/dashboard/related/trace/components/Tree.vue
rename to src/views/dashboard/related/trace/components/VisGraph/Tree.vue
index 5b7b926e..d125ab40 100644
--- a/src/views/dashboard/related/trace/components/Tree.vue
+++ b/src/views/dashboard/related/trace/components/VisGraph/Tree.vue
@@ -17,7 +17,7 @@ limitations under the License. -->
class="time-charts-item mr-5"
v-for="(i, index) in traceStore.serviceList"
:key="index"
- :style="`color:${computedScale(index)}`"
+ :style="`color:${getServiceColor(i)}`"
>
{{ i }}
@@ -35,40 +35,44 @@ limitations under the License. -->
-
+
diff --git a/src/views/dashboard/related/trace/components/constant.ts b/src/views/dashboard/related/trace/components/VisGraph/constant.ts
similarity index 75%
rename from src/views/dashboard/related/trace/components/constant.ts
rename to src/views/dashboard/related/trace/components/VisGraph/constant.ts
index 1a2337a2..12282a12 100644
--- a/src/views/dashboard/related/trace/components/constant.ts
+++ b/src/views/dashboard/related/trace/components/VisGraph/constant.ts
@@ -21,3 +21,9 @@ export enum TraceGraphType {
TABLE = "Table",
STATISTICS = "Statistics",
}
+export const GraphTypeOptions = [
+ { value: "List", icon: "list-bulleted", label: "list" },
+ { value: "Tree", icon: "issue-child", label: "tree" },
+ { value: "Table", icon: "table", label: "table" },
+ { value: "Statistics", icon: "statistics-bulleted", label: "statistics" },
+] as const;
diff --git a/src/views/dashboard/related/trace/components/index.ts b/src/views/dashboard/related/trace/components/VisGraph/index.ts
similarity index 100%
rename from src/views/dashboard/related/trace/components/index.ts
rename to src/views/dashboard/related/trace/components/VisGraph/index.ts