Files
Leon Sorokin b24ba7b7ae FieldValues: Use plain arrays instead of Vector (part 3 of 2) (#66612)
Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
2023-04-20 17:59:18 +03:00

54 lines
1.6 KiB
TypeScript

import { DataFrame, DataFrameView, TraceSpanRow } from '@grafana/data';
import { Trace, TraceProcess, TraceResponse, transformTraceData } from '../components';
export function transformDataFrames(frame?: DataFrame): Trace | null {
if (!frame) {
return null;
}
let data: TraceResponse =
frame.fields.length === 1
? // For backward compatibility when we sent whole json response in a single field/value
frame.fields[0].values[0]
: transformTraceDataFrame(frame);
return transformTraceData(data);
}
function transformTraceDataFrame(frame: DataFrame): TraceResponse {
const view = new DataFrameView<TraceSpanRow>(frame);
const processes: Record<string, TraceProcess> = {};
for (let i = 0; i < view.length; i++) {
const span = view.get(i);
if (!processes[span.spanID]) {
processes[span.spanID] = {
serviceName: span.serviceName,
tags: span.serviceTags,
};
}
}
return {
traceID: view.get(0).traceID,
processes,
spans: view.toArray().map((s, index) => {
const references = [];
if (s.parentSpanID) {
references.push({ refType: 'CHILD_OF' as const, spanID: s.parentSpanID, traceID: s.traceID });
}
if (s.references) {
references.push(...s.references.map((reference) => ({ refType: 'FOLLOWS_FROM' as const, ...reference })));
}
return {
...s,
duration: s.duration * 1000,
startTime: s.startTime * 1000,
processID: s.spanID,
flags: 0,
references,
logs: s.logs?.map((l) => ({ ...l, timestamp: l.timestamp * 1000 })) || [],
dataFrameRowIndex: index,
};
}),
};
}