From 222325c7f192ec8644b46c417bc2d09946181291 Mon Sep 17 00:00:00 2001 From: Stephanie Closson Date: Thu, 7 Apr 2022 13:49:54 -0300 Subject: [PATCH] Fix: Parse exemplars before parsing heatmap data (#47463) * parse exemplars before parsing the heatmap. Exemplars are overlayed. Not part of the main heatmap * added tests --- .../prometheus/result_transformer.test.ts | 65 +++++++++++++++++++ .../prometheus/result_transformer.ts | 21 +++--- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/public/app/plugins/datasource/prometheus/result_transformer.test.ts b/public/app/plugins/datasource/prometheus/result_transformer.test.ts index d61dee2fbad..b7087c11d1e 100644 --- a/public/app/plugins/datasource/prometheus/result_transformer.test.ts +++ b/public/app/plugins/datasource/prometheus/result_transformer.test.ts @@ -251,6 +251,71 @@ describe('Prometheus Result Transformer', () => { expect(series.data[0].fields[2].values.toArray()).toEqual([10, 0, 30]); expect(series.data[0].fields[3].values.toArray()).toEqual([10, 0, 10]); }); + + it('Retains exemplar frames when data returned is a heatmap', () => { + const options = { + targets: [ + { + format: 'heatmap', + refId: 'A', + }, + ], + } as unknown as DataQueryRequest; + const response = { + state: 'Done', + data: [ + new MutableDataFrame({ + refId: 'A', + fields: [ + { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, + { + name: 'Value', + type: FieldType.number, + values: [10, 10, 0], + labels: { le: '1' }, + }, + ], + }), + new MutableDataFrame({ + refId: 'A', + name: 'exemplar', + meta: { + custom: { + resultType: 'exemplar', + }, + }, + fields: [ + { name: 'Time', type: FieldType.time, values: [6, 5, 4, 3, 2, 1] }, + { + name: 'Value', + type: FieldType.number, + values: [30, 10, 40, 90, 14, 21], + labels: { le: '6' }, + }, + { + name: 'Test', + type: FieldType.string, + values: ['hello', 'doctor', 'name', 'continue', 'yesterday', 'tomorrow'], + labels: { le: '6' }, + }, + ], + }), + ], + } as unknown as DataQueryResponse; + + const series = transformV2(response, options, {}); + expect(series.data[0].fields.length).toEqual(2); + expect(series.data.length).toEqual(2); + expect(series.data[1].fields[2].values.toArray()).toEqual([ + 'hello', + 'doctor', + 'name', + 'continue', + 'yesterday', + 'tomorrow', + ]); + expect(series.data[1].fields.length).toEqual(3); + }); }); describe('transformDFToTable', () => { it('transforms dataFrame with response length 1 to table dataFrame', () => { diff --git a/public/app/plugins/datasource/prometheus/result_transformer.ts b/public/app/plugins/datasource/prometheus/result_transformer.ts index d3d5b1f9595..62b8d2f3422 100644 --- a/public/app/plugins/datasource/prometheus/result_transformer.ts +++ b/public/app/plugins/datasource/prometheus/result_transformer.ts @@ -72,16 +72,8 @@ export function transformV2( const [tableFrames, framesWithoutTable] = partition(response.data, (df) => isTableResult(df, request)); const processedTableFrames = transformDFToTable(tableFrames); - const [heatmapResults, framesWithoutTableAndHeatmaps] = partition(framesWithoutTable, (df) => - isHeatmapResult(df, request) - ); - - const processedHeatmapFrames = mergeHeatmapFrames( - transformToHistogramOverTime(heatmapResults.sort(sortSeriesByLabel)) - ); - - const [exemplarFrames, framesWithoutTableHeatmapsAndExemplars] = partition( - framesWithoutTableAndHeatmaps, + const [exemplarFrames, framesWithoutTableAndExemplars] = partition( + framesWithoutTable, (df) => df.meta?.custom?.resultType === 'exemplar' ); @@ -103,6 +95,15 @@ export function transformV2( return { ...dataFrame, meta: { ...dataFrame.meta, dataTopic: DataTopic.Annotations } }; }); + const [heatmapResults, framesWithoutTableHeatmapsAndExemplars] = partition( + framesWithoutTableAndExemplars, + (df) => isHeatmapResult(df, request) + ); + + const processedHeatmapFrames = mergeHeatmapFrames( + transformToHistogramOverTime(heatmapResults.sort(sortSeriesByLabel)) + ); + // Everything else is processed as time_series result and graph preferredVisualisationType const otherFrames = framesWithoutTableHeatmapsAndExemplars.map((dataFrame) => { const df = {