diff --git a/packages/grafana-prometheus/src/result_transformer.test.ts b/packages/grafana-prometheus/src/result_transformer.test.ts index 1da1426e73d..3e882fcf60a 100644 --- a/packages/grafana-prometheus/src/result_transformer.test.ts +++ b/packages/grafana-prometheus/src/result_transformer.test.ts @@ -261,11 +261,11 @@ describe('Prometheus Result Transformer', () => { createDataFrame({ refId: 'A', fields: [ - { name: 'time', type: FieldType.time, values: [6, 5, 4] }, + { name: 'time', type: FieldType.time, values: [4, 5, 6] }, { name: 'value', type: FieldType.number, - values: [6, 5, 4], + values: [4, 5, 6], labels: { label1: 'value1', label2: 'value2' }, }, ], @@ -288,11 +288,13 @@ describe('Prometheus Result Transformer', () => { expect(series.data.length).toEqual(1); expect(series.data[0].fields[0].name).toEqual('Time'); + expect(series.data[0].fields[0].values).toEqual([2, 3, 4, 5, 6, 7]); expect(series.data[0].fields[1].name).toEqual('label1'); expect(series.data[0].fields[2].name).toEqual('label2'); expect(series.data[0].fields[3].name).toEqual('label3'); expect(series.data[0].fields[4].name).toEqual('label4'); expect(series.data[0].fields[5].name).toEqual('Value'); + expect(series.data[0].fields[5].values).toEqual([2, 3, 4, 5, 6, 7]); expect(series.data[0].meta?.preferredVisualisationType).toEqual('rawPrometheus' as PreferredVisualisationType); }); diff --git a/packages/grafana-prometheus/src/result_transformer.ts b/packages/grafana-prometheus/src/result_transformer.ts index 4916c10e68b..4c43a891719 100644 --- a/packages/grafana-prometheus/src/result_transformer.ts +++ b/packages/grafana-prometheus/src/result_transformer.ts @@ -14,6 +14,7 @@ import { getDisplayProcessor, getFieldDisplayName, Labels, + sortDataFrame, TIME_SERIES_TIME_FIELD_NAME, TIME_SERIES_VALUE_FIELD_NAME, } from '@grafana/data'; @@ -210,13 +211,26 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] { }); }); + let prevTime = -Infinity; + let needsSort = false; + // Fill valueField, timeField and labelFields with values dataFramesByRefId[refId].forEach((df) => { timeField.config.interval ??= df.fields[0]?.config.interval; const timeFields = df.fields[0]?.values ?? []; const dataFields = df.fields[1]?.values ?? []; - timeFields.forEach((value) => timeField.values.push(value)); + + timeFields.forEach((value) => { + timeField.values.push(value); + + if (value < prevTime) { + needsSort = true; + } + + prevTime = value; + }); + dataFields.forEach((value) => { valueField.values.push(parseSampleValue(value)); const labelsForField = df.fields[1].labels ?? {}; @@ -225,7 +239,8 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] { }); const fields = [timeField, ...labelFields, valueField]; - return { + + const frame: DataFrame = { refId, fields, // Prometheus specific UI for instant queries @@ -235,7 +250,10 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] { }, length: timeField.values.length, }; + + return needsSort ? sortDataFrame(frame, 0) : frame; }); + return frames; }