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 ( <>