Tempo/ServiceGraph: Specify explicit field types (#69759)

Assign field types to service graph fields
This commit is contained in:
Domas 2023-06-09 12:17:05 +03:00 committed by GitHub
parent 5a2e66676e
commit 1696bc201e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 9 deletions

View File

@ -1,4 +1,4 @@
import { DataFrameView, dateTime, createDataFrame } from '@grafana/data';
import { DataFrameView, dateTime, createDataFrame, FieldType } from '@grafana/data';
import { createGraphFrames, mapPromMetricsToServiceMap } from './graphTransform';
import { bigResponse } from './testResponse';
@ -59,6 +59,26 @@ describe('createGraphFrames', () => {
});
});
it('assigns correct field type even if values are numbers', async () => {
const range = {
from: dateTime('2000-01-01T00:00:00'),
to: dateTime('2000-01-01T00:01:00'),
};
const { nodes } = mapPromMetricsToServiceMap([{ data: [serverIsANumber, serverIsANumber] }], {
...range,
raw: range,
});
expect(nodes.fields).toMatchObject([
{ name: 'id', values: ['0', '1'], type: FieldType.string },
{ name: 'title', values: ['0', '1'], type: FieldType.string },
{ name: 'mainstat', values: [NaN, NaN], type: FieldType.number },
{ name: 'secondarystat', values: [10, 20], type: FieldType.number },
{ name: 'arc__success', values: [1, 1], type: FieldType.number },
{ name: 'arc__failed', values: [0, 0], type: FieldType.number },
]);
});
describe('mapPromMetricsToServiceMap', () => {
it('transforms prom metrics to service graph', async () => {
const range = {
@ -191,3 +211,16 @@ const invalidFailedPromMetric = createDataFrame({
{ name: 'Value #traces_service_graph_request_failed_total', values: [20, 40] },
],
});
const serverIsANumber = createDataFrame({
refId: 'traces_service_graph_request_total',
fields: [
{ name: 'Time', values: [1628169788000, 1628169788000] },
{ name: 'client', values: ['0', '1'] },
{ name: 'instance', values: ['127.0.0.1:12345', '127.0.0.1:12345'] },
{ name: 'job', values: ['local_scrape', 'local_scrape'] },
{ name: 'server', values: ['0', '1'] },
{ name: 'tempo_config', values: ['default', 'default'] },
{ name: 'Value #traces_service_graph_request_total', values: [10, 20] },
],
});

View File

@ -7,6 +7,7 @@ import {
MutableDataFrame,
NodeGraphDataFrameFieldNames as Fields,
TimeRange,
FieldType,
} from '@grafana/data';
import { getNonOverlappingDuration, getStats, makeFrames, makeSpanMap } from '../../../core/utils/tracing';
@ -188,28 +189,35 @@ function createServiceMapDataFrames() {
}
const nodes = createDF('Nodes', [
{ name: Fields.id },
{ name: Fields.title, config: { displayName: 'Service name' } },
{ name: Fields.mainStat, config: { unit: 'ms/r', displayName: 'Average response time' } },
{ name: Fields.id, type: FieldType.string },
{ name: Fields.title, type: FieldType.string, config: { displayName: 'Service name' } },
{ name: Fields.mainStat, type: FieldType.number, config: { unit: 'ms/r', displayName: 'Average response time' } },
{
name: Fields.secondaryStat,
type: FieldType.number,
config: { unit: 'r/sec', displayName: 'Requests per second' },
},
{
name: Fields.arc + 'success',
type: FieldType.number,
config: { displayName: 'Success', color: { fixedColor: 'green', mode: FieldColorModeId.Fixed } },
},
{
name: Fields.arc + 'failed',
type: FieldType.number,
config: { displayName: 'Failed', color: { fixedColor: 'red', mode: FieldColorModeId.Fixed } },
},
]);
const edges = createDF('Edges', [
{ name: Fields.id },
{ name: Fields.source },
{ name: Fields.target },
{ name: Fields.mainStat, config: { unit: 'ms/r', displayName: 'Average response time' } },
{ name: Fields.secondaryStat, config: { unit: 'r/sec', displayName: 'Requests per second' } },
{ name: Fields.id, type: FieldType.string },
{ name: Fields.source, type: FieldType.string },
{ name: Fields.target, type: FieldType.string },
{ name: Fields.mainStat, type: FieldType.number, config: { unit: 'ms/r', displayName: 'Average response time' } },
{
name: Fields.secondaryStat,
type: FieldType.number,
config: { unit: 'r/sec', displayName: 'Requests per second' },
},
]);
return [nodes, edges];