mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Tracing: Improve frame type checking (#76898)
Improve frame type checking
This commit is contained in:
parent
f1ce73dc2c
commit
37dbf037de
@ -143,58 +143,6 @@ describe('transformTraceData()', () => {
|
|||||||
expect(transformTraceData(traceData)).toEqual(null);
|
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', () => {
|
it('should return trace data with correct traceName based on root span with missing ref', () => {
|
||||||
const traceData = {
|
const traceData = {
|
||||||
traceID,
|
traceID,
|
||||||
|
@ -74,7 +74,7 @@ export function orderTags(tags: TraceKeyValuePair[], topPrefixes?: string[]) {
|
|||||||
* generally requires.
|
* generally requires.
|
||||||
*/
|
*/
|
||||||
export default function transformTraceData(data: TraceResponse | undefined): Trace | null {
|
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;
|
return null;
|
||||||
}
|
}
|
||||||
const traceID = data.traceID.toLowerCase();
|
const traceID = data.traceID.toLowerCase();
|
||||||
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
@ -6,19 +6,26 @@ export function transformDataFrames(frame?: DataFrame): Trace | null {
|
|||||||
if (!frame) {
|
if (!frame) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
let data: TraceResponse =
|
let data: TraceResponse | null =
|
||||||
frame.fields.length === 1
|
frame.fields.length === 1
|
||||||
? // For backward compatibility when we sent whole json response in a single field/value
|
? // For backward compatibility when we sent whole json response in a single field/value
|
||||||
frame.fields[0].values[0]
|
frame.fields[0].values[0]
|
||||||
: transformTraceDataFrame(frame);
|
: transformTraceDataFrame(frame);
|
||||||
|
|
||||||
|
if (!data) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return transformTraceData(data);
|
return transformTraceData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
function transformTraceDataFrame(frame: DataFrame): TraceResponse {
|
export function transformTraceDataFrame(frame: DataFrame): TraceResponse | null {
|
||||||
const view = new DataFrameView<TraceSpanRow>(frame);
|
const view = new DataFrameView<TraceSpanRow>(frame);
|
||||||
const processes: Record<string, TraceProcess> = {};
|
const processes: Record<string, TraceProcess> = {};
|
||||||
for (let i = 0; i < view.length; i++) {
|
for (let i = 0; i < view.length; i++) {
|
||||||
const span = view.get(i);
|
const span = view.get(i);
|
||||||
|
if (!span.spanID) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
if (!processes[span.spanID]) {
|
if (!processes[span.spanID]) {
|
||||||
processes[span.spanID] = {
|
processes[span.spanID] = {
|
||||||
serviceName: span.serviceName,
|
serviceName: span.serviceName,
|
||||||
|
Loading…
Reference in New Issue
Block a user