diff --git a/frontend/src/container/GantChart/SpanLength/index.tsx b/frontend/src/container/GantChart/SpanLength/index.tsx
index 4e27e6e624..4102757577 100644
--- a/frontend/src/container/GantChart/SpanLength/index.tsx
+++ b/frontend/src/container/GantChart/SpanLength/index.tsx
@@ -1,7 +1,4 @@
-import {
- IIntervalUnit,
- resolveTimeFromInterval,
-} from 'container/TraceDetail/utils';
+import { convertTimeToRelevantUnit } from 'container/TraceDetail/utils';
import useThemeMode from 'hooks/useThemeMode';
import React from 'react';
import { toFixed } from 'utils/toFixed';
@@ -13,12 +10,12 @@ interface SpanLengthProps {
leftOffset: string;
bgColor: string;
inMsCount: number;
- intervalUnit: IIntervalUnit;
}
function SpanLength(props: SpanLengthProps): JSX.Element {
- const { width, leftOffset, bgColor, intervalUnit, inMsCount } = props;
+ const { width, leftOffset, bgColor, inMsCount } = props;
const { isDarkMode } = useThemeMode();
+ const { time, timeUnitName } = convertTimeToRelevantUnit(inMsCount);
return (
{`${toFixed(
- resolveTimeFromInterval(inMsCount, intervalUnit),
+ time,
2,
- )} ${intervalUnit.name}`}
+ )} ${timeUnitName}`}
);
}
diff --git a/frontend/src/container/GantChart/Trace/index.tsx b/frontend/src/container/GantChart/Trace/index.tsx
index a0c01cc00e..db607092eb 100644
--- a/frontend/src/container/GantChart/Trace/index.tsx
+++ b/frontend/src/container/GantChart/Trace/index.tsx
@@ -153,7 +153,6 @@ function Trace(props: TraceProps): JSX.Element {
width={width.toString()}
bgColor={serviceColour}
inMsCount={inMsCount / 1e6}
- intervalUnit={intervalUnit}
/>
diff --git a/frontend/src/container/Timeline/index.tsx b/frontend/src/container/Timeline/index.tsx
index 0bee6414a1..7a9d6a0a65 100644
--- a/frontend/src/container/Timeline/index.tsx
+++ b/frontend/src/container/Timeline/index.tsx
@@ -37,11 +37,10 @@ function Timeline({
});
let intervalUnit = INTERVAL_UNITS[0];
- for (let idx = 0; idx < INTERVAL_UNITS.length; idx += 1) {
+ for (let idx = INTERVAL_UNITS.length - 1; idx >= 0; idx -= 1) {
const standardInterval = INTERVAL_UNITS[idx];
- if (baseSpread * standardInterval.multiplier < 1) {
- const index = idx;
- if (index > 1) intervalUnit = INTERVAL_UNITS[index - 1];
+ if (baseSpread * standardInterval.multiplier >= 1) {
+ intervalUnit = INTERVAL_UNITS[idx];
break;
}
}
diff --git a/frontend/src/container/TraceDetail/utils.ts b/frontend/src/container/TraceDetail/utils.ts
index 22cb741293..3c83607ce6 100644
--- a/frontend/src/container/TraceDetail/utils.ts
+++ b/frontend/src/container/TraceDetail/utils.ts
@@ -13,8 +13,9 @@ export const filterSpansByString = (
return JSON.stringify(spanWithoutChildren).includes(searchString);
});
+type TTimeUnitName = 'ms' | 's' | 'm';
export interface IIntervalUnit {
- name: 'ms' | 's' | 'm';
+ name: TTimeUnitName;
multiplier: number;
}
export const INTERVAL_UNITS: IIntervalUnit[] = [
@@ -39,6 +40,28 @@ export const resolveTimeFromInterval = (
return intervalTime * intervalUnit.multiplier;
};
+export const convertTimeToRelevantUnit = (
+ intervalTime: number,
+): { time: number; timeUnitName: TTimeUnitName } => {
+ let relevantTime = {
+ time: intervalTime,
+ timeUnitName: INTERVAL_UNITS[0].name,
+ };
+
+ for (let idx = INTERVAL_UNITS.length - 1; idx >= 0; idx -= 1) {
+ const intervalUnit = INTERVAL_UNITS[idx];
+ const convertedTimeForInterval = intervalTime * intervalUnit.multiplier;
+ if (convertedTimeForInterval >= 1) {
+ relevantTime = {
+ time: convertedTimeForInterval,
+ timeUnitName: intervalUnit.name,
+ };
+ break;
+ }
+ }
+ return relevantTime;
+};
+
export const getSortedData = (treeData: ITraceTree): undefined | ITraceTree => {
const traverse = (treeNode: ITraceTree, level = 0): void => {
if (!treeNode) {
diff --git a/frontend/src/container/TraceFlameGraph/index.tsx b/frontend/src/container/TraceFlameGraph/index.tsx
index 08a998fe77..026efe58ca 100644
--- a/frontend/src/container/TraceFlameGraph/index.tsx
+++ b/frontend/src/container/TraceFlameGraph/index.tsx
@@ -1,14 +1,9 @@
/* eslint-disable react/no-unstable-nested-components */
import Color from 'color';
import { ITraceMetaData } from 'container/GantChart';
-import {
- IIntervalUnit,
- resolveTimeFromInterval,
-} from 'container/TraceDetail/utils';
import useThemeMode from 'hooks/useThemeMode';
import React, { useLayoutEffect, useMemo, useState } from 'react';
import { ITraceTree } from 'types/api/trace/getTraceItem';
-import { toFixed } from 'utils/toFixed';
import {
SpanItemContainer,
@@ -98,14 +93,13 @@ function TraceFlameGraph(props: {
onSpanSelect: SpanItemProps['onSpanSelect'];
hoveredSpanId: string;
selectedSpanId: string;
- intervalUnit: IIntervalUnit;
}): JSX.Element {
const { treeData, traceMetaData, onSpanHover } = props;
if (!treeData || treeData.id === 'empty' || !traceMetaData) {
return
;
}
- const { intervalUnit, onSpanSelect, hoveredSpanId, selectedSpanId } = props;
+ const { onSpanSelect, hoveredSpanId, selectedSpanId } = props;
const { globalStart, spread, levels } = traceMetaData;
function RenderSpanRecursive({
@@ -131,10 +125,7 @@ function TraceFlameGraph(props: {
const leftOffset = ((spanData.startTime - globalStart) * 100) / spread;
const width = ((spanData.value / 1e6) * 100) / spread;
- const toolTipText = `${spanData.name}\n${toFixed(
- resolveTimeFromInterval(spanData.value / 1e6, intervalUnit),
- 2,
- )} ${intervalUnit.name}`;
+ const toolTipText = `${spanData.name}`;
return (
<>