palash-signoz 9f7c60d2c1
Fe: Feat/trace detail (#764)
* feat: new trace detail page flame graph

* feat: new trace detail page layout

* test: trace detail is wip

* chore: trace details in wip

* feat: trace detail page timeline component

* chore: spantoTree is updated

* chore: gantchart is updated

* chore: onClick is added

* chore: isSpanPresentInSearchString util is added

* chore: trace graph is updated

* chore: added the hack to work

* feat: is span present util is added

* chore: in span ms is added

* chore: tooltip is updated

* WIP: chore: trace details changes are updated

* feat: getTraceItem is added

* feat: trace detail page is updated

* feat: trace detail styling changes

* feat: trace detail page is updated

* feat: implement span hover, select, focus and reset

* feat: reset focus

* feat: spanId as query table and unfurling

* feat: trace details is updated

* chore: remove lodash

* chore: remove lodash

* feat: trace details is updated

* feat: new trace detail page styling changes

* feat: new trace detail page styling changes

* feat: improved styling

* feat: remove horizontal scrolling

* feat: new trace detail page modify caret icon

* chore styles are updated

* Revert "chore: Trace styles"

* chore styles are updated

* feat: timeline normalisation

* chore: remove mock data

* chore: sort tree data util is added and selected span component is updated

* chore: trace changes are updated

* chore: trace changes are updated

* chore: trace changes are updated

* feat: refactored time units for new trace detail page

* chore: remove mockdata

* feat: new trace detail page themeing and interval loop fix

* chore: error tag is updated

* chore: error tag is updated

* chore: error tag is updated

* chore: error tag is updated

* chore: console is removed

* fix: error tag expand button

* chore: expanded panel is updated

* feat: scroll span from gantt chart intoview

* chore: trace detail is removed

Co-authored-by: Pranshu Chittora <pranshu@signoz.io>
2022-03-03 19:04:23 +05:30

106 lines
2.6 KiB
TypeScript

import React, { useState, useMemo } from 'react';
import { isEqual } from 'lodash-es';
import styles from './style.module.css';
import { useMeasure } from 'react-use';
import { toFixed } from 'utils/toFixed';
import {
INTERVAL_UNITS,
resolveTimeFromInterval,
} from 'container/TraceDetail/utils';
import useThemeMode from 'hooks/useThemeMode';
import { Interval } from './types';
import { getIntervalSpread, getIntervals } from './utils';
interface TimelineProps {
traceMetaData: object;
globalTraceMetadata: object;
intervalUnit: object;
setIntervalUnit: Function;
}
const Timeline = ({
traceMetaData,
globalTraceMetadata,
intervalUnit,
setIntervalUnit,
}: TimelineProps) => {
const [ref, { width }] = useMeasure<HTMLDivElement>();
const { isDarkMode } = useThemeMode();
const Timeline_Height = 22;
const Timeline_H_Spacing = 0;
const [intervals, setIntervals] = useState<Interval[] | null>(null);
useMemo(() => {
const {
baseInterval,
baseSpread,
intervalSpreadNormalized,
} = getIntervalSpread({
globalTraceMetadata: globalTraceMetadata,
localTraceMetaData: traceMetaData,
});
let intervalUnit = INTERVAL_UNITS[0];
for (const idx in INTERVAL_UNITS) {
const standard_interval = INTERVAL_UNITS[idx];
if (baseSpread * standard_interval.multiplier < 1) {
intervalUnit = INTERVAL_UNITS[idx - 1];
break;
}
}
setIntervalUnit(intervalUnit);
setIntervals(
getIntervals({
baseInterval,
baseSpread,
intervalSpreadNormalized,
intervalUnit,
}),
);
}, [traceMetaData, globalTraceMetadata]);
return (
<div ref={ref} style={{ flex: 1, overflow: 'inherit' }}>
<svg
style={{ overflow: 'inherit' }}
viewBox={`0 0 ${width} ${Timeline_Height}`}
xmlns="http://www.w3.org/2000/svg"
className={styles['svg-container']}
>
<line
x1={Timeline_H_Spacing}
y1={Timeline_Height}
x2={width - Timeline_H_Spacing}
y2={Timeline_Height}
stroke={isDarkMode ? 'white' : 'black'}
strokeWidth="1"
/>
{intervals &&
intervals.map((interval, index) => (
<g
transform={`translate(${
Timeline_H_Spacing +
(interval.percentage * (width - 2 * Timeline_H_Spacing)) / 100
},0)`}
className={styles['timeline-tick']}
key={interval.label + interval.percentage + index}
>
<text y={13} fill={isDarkMode ? 'white' : 'black'}>
{interval.label}
</text>
<line
y1={Timeline_Height - 5}
y2={Timeline_Height + 0.5}
stroke={isDarkMode ? 'white' : 'black'}
strokeWidth="1"
/>
</g>
))}
</svg>
</div>
);
};
export default Timeline;