Tracing: Improve frame type checking (#76898)

Improve frame type checking
This commit is contained in:
Joey 2023-10-25 10:16:17 +01:00 committed by GitHub
parent f1ce73dc2c
commit 37dbf037de
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 55 additions and 55 deletions

View File

@ -143,58 +143,6 @@ describe('transformTraceData()', () => {
expect(transformTraceData(traceData)).toEqual(null);
});
it('should return null for any span without a spanID', () => {
const traceData = {
traceID,
processes,
spans: [
{
traceID,
operationName: 'rootOperation',
references: [
{
refType: 'CHILD_OF',
traceID,
spanID: rootSpanID,
},
],
startTime,
duration,
tags: [],
processID: 'p1',
},
],
} as unknown as TraceResponse;
expect(transformTraceData(traceData)).toEqual(null);
});
it('should return null for any span without a processID', () => {
const traceData = {
traceID,
processes,
spans: [
{
traceID,
spanID: '41f71485ed2593e4',
operationName: 'rootOperation',
references: [
{
refType: 'CHILD_OF',
traceID,
spanID: rootSpanID,
},
],
startTime,
duration,
tags: [],
},
],
} as unknown as TraceResponse;
expect(transformTraceData(traceData)).toEqual(null);
});
it('should return trace data with correct traceName based on root span with missing ref', () => {
const traceData = {
traceID,

View File

@ -74,7 +74,7 @@ export function orderTags(tags: TraceKeyValuePair[], topPrefixes?: string[]) {
* generally requires.
*/
export default function transformTraceData(data: TraceResponse | undefined): Trace | null {
if (!data?.traceID || data?.spans.some((x) => !x.processID || !x.spanID)) {
if (!data?.traceID) {
return null;
}
const traceID = data.traceID.toLowerCase();

View File

@ -0,0 +1,45 @@
import { createDataFrame } from '@grafana/data';
import { transformTraceDataFrame } from './transform';
describe('transformTraceDataFrame()', () => {
const fields = [
{ name: 'traceID', values: ['trace1'] },
{ name: 'operationName', values: ['operation1'] },
{ name: 'kind', values: ['server'] },
{ name: 'tags', values: [[{ key: 'key1', value: 'value1' }]] },
];
it('should return transformed data', () => {
const dummyDataFrame = createDataFrame({
fields: fields.concat([...fields, { name: 'spanID', values: ['span1'] }]),
});
expect(transformTraceDataFrame(dummyDataFrame)).toEqual({
processes: { span1: { serviceName: undefined, tags: undefined } },
spans: [
{
dataFrameRowIndex: 0,
duration: NaN,
flags: 0,
kind: 'server',
logs: [],
operationName: 'operation1',
processID: 'span1',
references: [],
spanID: 'span1',
startTime: NaN,
tags: [{ key: 'key1', value: 'value1' }],
traceID: 'trace1',
},
],
traceID: 'trace1',
});
});
it('should return null for any span without a spanID', () => {
const dummyDataFrame = createDataFrame({
fields: fields,
});
expect(transformTraceDataFrame(dummyDataFrame)).toEqual(null);
});
});

View File

@ -6,19 +6,26 @@ export function transformDataFrames(frame?: DataFrame): Trace | null {
if (!frame) {
return null;
}
let data: TraceResponse =
let data: TraceResponse | null =
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);
if (!data) {
return null;
}
return transformTraceData(data);
}
function transformTraceDataFrame(frame: DataFrame): TraceResponse {
export function transformTraceDataFrame(frame: DataFrame): TraceResponse | null {
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 (!span.spanID) {
return null;
}
if (!processes[span.spanID]) {
processes[span.spanID] = {
serviceName: span.serviceName,