Prometheus: Sort Table format data frames by first field's values (#99223)

This commit is contained in:
Leon Sorokin 2025-01-20 09:42:13 -06:00 committed by GitHub
parent cc3b3ccdef
commit 863d56b7e1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 4 deletions

View File

@ -261,11 +261,11 @@ describe('Prometheus Result Transformer', () => {
createDataFrame({ createDataFrame({
refId: 'A', refId: 'A',
fields: [ fields: [
{ name: 'time', type: FieldType.time, values: [6, 5, 4] }, { name: 'time', type: FieldType.time, values: [4, 5, 6] },
{ {
name: 'value', name: 'value',
type: FieldType.number, type: FieldType.number,
values: [6, 5, 4], values: [4, 5, 6],
labels: { label1: 'value1', label2: 'value2' }, labels: { label1: 'value1', label2: 'value2' },
}, },
], ],
@ -288,11 +288,13 @@ describe('Prometheus Result Transformer', () => {
expect(series.data.length).toEqual(1); expect(series.data.length).toEqual(1);
expect(series.data[0].fields[0].name).toEqual('Time'); 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[1].name).toEqual('label1');
expect(series.data[0].fields[2].name).toEqual('label2'); expect(series.data[0].fields[2].name).toEqual('label2');
expect(series.data[0].fields[3].name).toEqual('label3'); expect(series.data[0].fields[3].name).toEqual('label3');
expect(series.data[0].fields[4].name).toEqual('label4'); expect(series.data[0].fields[4].name).toEqual('label4');
expect(series.data[0].fields[5].name).toEqual('Value'); 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); expect(series.data[0].meta?.preferredVisualisationType).toEqual('rawPrometheus' as PreferredVisualisationType);
}); });

View File

@ -14,6 +14,7 @@ import {
getDisplayProcessor, getDisplayProcessor,
getFieldDisplayName, getFieldDisplayName,
Labels, Labels,
sortDataFrame,
TIME_SERIES_TIME_FIELD_NAME, TIME_SERIES_TIME_FIELD_NAME,
TIME_SERIES_VALUE_FIELD_NAME, TIME_SERIES_VALUE_FIELD_NAME,
} from '@grafana/data'; } 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 // Fill valueField, timeField and labelFields with values
dataFramesByRefId[refId].forEach((df) => { dataFramesByRefId[refId].forEach((df) => {
timeField.config.interval ??= df.fields[0]?.config.interval; timeField.config.interval ??= df.fields[0]?.config.interval;
const timeFields = df.fields[0]?.values ?? []; const timeFields = df.fields[0]?.values ?? [];
const dataFields = df.fields[1]?.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) => { dataFields.forEach((value) => {
valueField.values.push(parseSampleValue(value)); valueField.values.push(parseSampleValue(value));
const labelsForField = df.fields[1].labels ?? {}; const labelsForField = df.fields[1].labels ?? {};
@ -225,7 +239,8 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] {
}); });
const fields = [timeField, ...labelFields, valueField]; const fields = [timeField, ...labelFields, valueField];
return {
const frame: DataFrame = {
refId, refId,
fields, fields,
// Prometheus specific UI for instant queries // Prometheus specific UI for instant queries
@ -235,7 +250,10 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] {
}, },
length: timeField.values.length, length: timeField.values.length,
}; };
return needsSort ? sortDataFrame(frame, 0) : frame;
}); });
return frames; return frames;
} }