diff --git a/public/app/plugins/datasource/tempo/graphTransform.test.ts b/public/app/plugins/datasource/tempo/graphTransform.test.ts index c5e8f9f049b..a81f776de51 100644 --- a/public/app/plugins/datasource/tempo/graphTransform.test.ts +++ b/public/app/plugins/datasource/tempo/graphTransform.test.ts @@ -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] }, + ], +}); diff --git a/public/app/plugins/datasource/tempo/graphTransform.ts b/public/app/plugins/datasource/tempo/graphTransform.ts index 292d059876f..eb36c6f8737 100644 --- a/public/app/plugins/datasource/tempo/graphTransform.ts +++ b/public/app/plugins/datasource/tempo/graphTransform.ts @@ -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];