signoz/frontend/src/utils/getSpanTreeMetadata.ts
Pranshu Chittora 80c80b2180
feat: missing spans handling by returning a forest of trees (#1365)
* feat: spanToTree 2.0

* feat: spanToTree EPIFI data

* feat: missing spans multiple trees

* chore: migrated to popoverss

Co-authored-by: Palash <palashgdev@gmail.com>
2022-07-08 16:18:08 +05:30

61 lines
1.6 KiB
TypeScript

/* eslint-disable no-param-reassign */
import { errorColor } from 'lib/getRandomColor';
import { ITraceForest, ITraceTree } from 'types/api/trace/getTraceItem';
/**
* Traverses the Span Tree data and returns the relevant meta data.
* Metadata includes globalStart, globalEnd,
*/
export const getSpanTreeMetadata = (
treesData: ITraceForest,
spanServiceColours: { [key: string]: string },
): GetSpanTreeMetaData => {
let globalStart = Number.POSITIVE_INFINITY;
let globalEnd = Number.NEGATIVE_INFINITY;
let totalSpans = 0;
let levels = 1;
const traverse = (treeNode: ITraceTree, level = 0): void => {
if (!treeNode) {
return;
}
totalSpans += 1;
levels = Math.max(levels, level);
const { startTime, value } = treeNode;
if (startTime !== null && value !== null) {
const endTime = startTime + value / 1e6;
globalStart = Math.min(globalStart, startTime);
globalEnd = Math.max(globalEnd, endTime);
}
if (treeNode.hasError) {
treeNode.serviceColour = errorColor;
} else treeNode.serviceColour = spanServiceColours[treeNode.serviceName];
treeNode.children.forEach((childNode) => {
traverse(childNode, level + 1);
});
};
treesData.spanTree.forEach((treeData) => {
traverse(treeData, 1);
});
treesData.missingSpanTree.forEach((treeData) => {
traverse(treeData, 1);
});
return {
globalStart,
globalEnd,
spread: globalEnd - globalStart,
totalSpans,
levels,
treesData,
};
};
interface GetSpanTreeMetaData {
globalStart: number;
globalEnd: number;
spread: number;
totalSpans: number;
levels: number;
treesData: ITraceForest;
}