mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
FieldValues: Use plain arrays instead of Vector (part 3 of 2) (#66612)
Co-authored-by: Ryan McKinley <ryantxu@gmail.com>
This commit is contained in:
@@ -396,9 +396,9 @@ describe('PrometheusDatasource', () => {
|
||||
ds.performTimeSeriesQuery = jest.fn().mockReturnValue(of(responseMock));
|
||||
await expect(ds.query(query)).toEmitValuesWith((result) => {
|
||||
const results = result[0].data;
|
||||
expect(results[0].fields[1].values.toArray()).toEqual([10, 10]);
|
||||
expect(results[0].fields[2].values.toArray()).toEqual([10, 0]);
|
||||
expect(results[0].fields[3].values.toArray()).toEqual([5, 0]);
|
||||
expect(results[0].fields[1].values).toEqual([10, 10]);
|
||||
expect(results[0].fields[2].values).toEqual([10, 0]);
|
||||
expect(results[0].fields[3].values).toEqual([5, 0]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1018,27 +1018,27 @@ describe('PrometheusDatasource2', () => {
|
||||
});
|
||||
|
||||
it('should fill null until first datapoint in response', () => {
|
||||
expect(results.data[0].fields[0].values.get(0)).toBe(start * 1000);
|
||||
expect(results.data[0].fields[1].values.get(0)).toBe(null);
|
||||
expect(results.data[0].fields[0].values.get(1)).toBe((start + step * 1) * 1000);
|
||||
expect(results.data[0].fields[1].values.get(1)).toBe(3846);
|
||||
expect(results.data[0].fields[0].values[0]).toBe(start * 1000);
|
||||
expect(results.data[0].fields[1].values[0]).toBe(null);
|
||||
expect(results.data[0].fields[0].values[1]).toBe((start + step * 1) * 1000);
|
||||
expect(results.data[0].fields[1].values[1]).toBe(3846);
|
||||
});
|
||||
|
||||
it('should fill null after last datapoint in response', () => {
|
||||
const length = (end - start) / step + 1;
|
||||
expect(results.data[0].fields[0].values.get(length - 2)).toBe((end - step * 1) * 1000);
|
||||
expect(results.data[0].fields[1].values.get(length - 2)).toBe(3848);
|
||||
expect(results.data[0].fields[0].values.get(length - 1)).toBe(end * 1000);
|
||||
expect(results.data[0].fields[1].values.get(length - 1)).toBe(null);
|
||||
expect(results.data[0].fields[0].values[length - 2]).toBe((end - step * 1) * 1000);
|
||||
expect(results.data[0].fields[1].values[length - 2]).toBe(3848);
|
||||
expect(results.data[0].fields[0].values[length - 1]).toBe(end * 1000);
|
||||
expect(results.data[0].fields[1].values[length - 1]).toBe(null);
|
||||
});
|
||||
|
||||
it('should fill null at gap between series', () => {
|
||||
expect(results.data[0].fields[0].values.get(2)).toBe((start + step * 2) * 1000);
|
||||
expect(results.data[0].fields[1].values.get(2)).toBe(null);
|
||||
expect(results.data[1].fields[0].values.get(1)).toBe((start + step * 1) * 1000);
|
||||
expect(results.data[1].fields[1].values.get(1)).toBe(null);
|
||||
expect(results.data[1].fields[0].values.get(3)).toBe((start + step * 3) * 1000);
|
||||
expect(results.data[1].fields[1].values.get(3)).toBe(null);
|
||||
expect(results.data[0].fields[0].values[2]).toBe((start + step * 2) * 1000);
|
||||
expect(results.data[0].fields[1].values[2]).toBe(null);
|
||||
expect(results.data[1].fields[0].values[1]).toBe((start + step * 1) * 1000);
|
||||
expect(results.data[1].fields[1].values[1]).toBe(null);
|
||||
expect(results.data[1].fields[0].values[3]).toBe((start + step * 3) * 1000);
|
||||
expect(results.data[1].fields[1].values[3]).toBe(null);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -866,10 +866,10 @@ export class PrometheusDatasource
|
||||
const timeValueTuple: Array<[number, number]> = [];
|
||||
|
||||
let idx = 0;
|
||||
valueField.values.toArray().forEach((value: string) => {
|
||||
valueField.values.forEach((value: string) => {
|
||||
let timeStampValue: number;
|
||||
let valueValue: number;
|
||||
const time = timeField.values.get(idx);
|
||||
const time = timeField.values[idx];
|
||||
|
||||
// If we want to use value as a time, we use value as timeStampValue and valueValue will be 1
|
||||
if (options.annotation.useValueForTime) {
|
||||
|
||||
@@ -268,7 +268,7 @@ describe('QueryCache', function () {
|
||||
// All of the new values should be the ones that were stored, this is overkill
|
||||
secondFrames.forEach((frame, frameIdx) => {
|
||||
frame.fields.forEach((field, fieldIdx) => {
|
||||
secondFrames[frameIdx].fields[fieldIdx].values.toArray().forEach((value) => {
|
||||
secondFrames[frameIdx].fields[fieldIdx].values.forEach((value) => {
|
||||
expect(secondStoredFrames[frameIdx].fields[fieldIdx].values).toContain(value);
|
||||
});
|
||||
});
|
||||
@@ -394,12 +394,8 @@ describe('QueryCache', function () {
|
||||
|
||||
// Since the step is 15s, and the request was 30 seconds later, we should have 2 extra frames, but we should evict the first two, so we should get the same length
|
||||
expect(firstMergedLength).toEqual(secondMergedLength);
|
||||
expect(firstQueryResult[0].fields[0].values.toArray()[2]).toEqual(
|
||||
secondQueryResult[0].fields[0].values.toArray()[0]
|
||||
);
|
||||
expect(firstQueryResult[0].fields[0].values.toArray()[0] + 30000).toEqual(
|
||||
secondQueryResult[0].fields[0].values.toArray()[0]
|
||||
);
|
||||
expect(firstQueryResult[0].fields[0].values[2]).toEqual(secondQueryResult[0].fields[0].values[0]);
|
||||
expect(firstQueryResult[0].fields[0].values[0] + 30000).toEqual(secondQueryResult[0].fields[0].values[0]);
|
||||
|
||||
cache.set(targetIdentity, `'1=1'|${interval}|${JSON.stringify(thirdRange.raw)}`);
|
||||
|
||||
@@ -418,7 +414,7 @@ describe('QueryCache', function () {
|
||||
);
|
||||
|
||||
const cachedAfterThird = storage.cache.get(targetIdentity);
|
||||
const storageLengthAfterThirdQuery = cachedAfterThird?.frames[0].fields[0].values.toArray().length;
|
||||
const storageLengthAfterThirdQuery = cachedAfterThird?.frames[0].fields[0].values.length;
|
||||
expect(storageLengthAfterThirdQuery).toEqual(20);
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import {
|
||||
ArrayVector,
|
||||
DataFrame,
|
||||
DataQueryRequest,
|
||||
dateTime,
|
||||
@@ -360,16 +359,15 @@ export class QueryCache {
|
||||
|
||||
// amend & re-cache
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
||||
let prevTable: Table = cachedFrame.fields.map((field) => field.values.toArray()) as Table;
|
||||
let prevTable: Table = cachedFrame.fields.map((field) => field.values) as Table;
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
||||
let nextTable: Table = respFrame.fields.map((field) => field.values.toArray()) as Table;
|
||||
let nextTable: Table = respFrame.fields.map((field) => field.values) as Table;
|
||||
|
||||
let amendedTable = amendTable(prevTable, nextTable);
|
||||
if (amendedTable) {
|
||||
for (let i = 0; i < amendedTable.length; i++) {
|
||||
cachedFrame.fields[i].values = new ArrayVector(amendedTable[i]);
|
||||
cachedFrame.fields[i].values = amendedTable[i];
|
||||
}
|
||||
|
||||
cachedFrame.length = cachedFrame.fields[0].values.length;
|
||||
}
|
||||
}
|
||||
@@ -380,13 +378,13 @@ export class QueryCache {
|
||||
|
||||
cachedFrames.forEach((frame) => {
|
||||
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
||||
let table: Table = frame.fields.map((field) => field.values.toArray()) as Table;
|
||||
let table: Table = frame.fields.map((field) => field.values) as Table;
|
||||
|
||||
let trimmed = trimTable(table, newFrom, newTo);
|
||||
|
||||
if (trimmed[0].length > 0) {
|
||||
for (let i = 0; i < trimmed.length; i++) {
|
||||
frame.fields[i].values = new ArrayVector(trimmed[i]);
|
||||
frame.fields[i].values = trimmed[i];
|
||||
}
|
||||
nonEmptyCachedFrames.push(frame);
|
||||
}
|
||||
@@ -409,7 +407,7 @@ export class QueryCache {
|
||||
config: {
|
||||
...field.config, // prevents mutatative exemplars links (re)enrichment
|
||||
},
|
||||
values: new ArrayVector(field.values.toArray().slice()),
|
||||
values: field.values.slice(),
|
||||
})),
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
import { clone } from 'lodash';
|
||||
|
||||
import { ArrayVector } from '@grafana/data/src';
|
||||
|
||||
/**
|
||||
*
|
||||
* @param length - Number of values to add
|
||||
* @param start - First timestamp (ms)
|
||||
* @param step - step duration (ms)
|
||||
*/
|
||||
export const getMockTimeFrameArray = (length: number, start: number, step: number): ArrayVector => {
|
||||
let timeValues = [];
|
||||
export const getMockTimeFrameArray = (length: number, start: number, step: number) => {
|
||||
let timeValues: number[] = [];
|
||||
for (let i = 0; i < length; i++) {
|
||||
timeValues.push(start + i * step);
|
||||
}
|
||||
|
||||
return new ArrayVector(timeValues);
|
||||
return timeValues;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -22,8 +20,8 @@ export const getMockTimeFrameArray = (length: number, start: number, step: numbe
|
||||
* @param values
|
||||
* @param high
|
||||
*/
|
||||
export const getMockValueFrameArray = (length: number, values = 0): ArrayVector => {
|
||||
return new ArrayVector(Array(length).fill(values));
|
||||
export const getMockValueFrameArray = (length: number, values = 0): number[] => {
|
||||
return Array(length).fill(values);
|
||||
};
|
||||
|
||||
const timeFrameWithMissingValuesInMiddle = getMockTimeFrameArray(721, 1675262550000, 30000);
|
||||
@@ -31,9 +29,9 @@ const timeFrameWithMissingValuesAtStart = getMockTimeFrameArray(721, 16752625500
|
||||
const timeFrameWithMissingValuesAtEnd = getMockTimeFrameArray(721, 1675262550000, 30000);
|
||||
|
||||
// Deleting some out the middle
|
||||
timeFrameWithMissingValuesInMiddle.toArray().splice(360, 721 - 684);
|
||||
timeFrameWithMissingValuesAtStart.toArray().splice(0, 721 - 684);
|
||||
timeFrameWithMissingValuesAtEnd.toArray().splice(721 - 684, 721 - 684);
|
||||
timeFrameWithMissingValuesInMiddle.splice(360, 721 - 684);
|
||||
timeFrameWithMissingValuesAtStart.splice(0, 721 - 684);
|
||||
timeFrameWithMissingValuesAtEnd.splice(721 - 684, 721 - 684);
|
||||
|
||||
const mockLabels = {
|
||||
__name__: 'cortex_request_duration_seconds_bucket',
|
||||
|
||||
@@ -366,9 +366,9 @@ describe('Prometheus Result Transformer', () => {
|
||||
|
||||
const series = transformV2(response, options, {});
|
||||
expect(series.data[0].fields.length).toEqual(4);
|
||||
expect(series.data[0].fields[1].values.toArray()).toEqual([10, 10, 0]);
|
||||
expect(series.data[0].fields[2].values.toArray()).toEqual([10, 0, 30]);
|
||||
expect(series.data[0].fields[3].values.toArray()).toEqual([10, 0, 10]);
|
||||
expect(series.data[0].fields[1].values).toEqual([10, 10, 0]);
|
||||
expect(series.data[0].fields[2].values).toEqual([10, 0, 30]);
|
||||
expect(series.data[0].fields[3].values).toEqual([10, 0, 10]);
|
||||
expect(series.data[0].fields[1].name).toEqual('1');
|
||||
expect(series.data[0].fields[2].name).toEqual('2');
|
||||
expect(series.data[0].fields[3].name).toEqual('+Inf');
|
||||
@@ -467,9 +467,9 @@ describe('Prometheus Result Transformer', () => {
|
||||
|
||||
const series = transformV2(response, options, {});
|
||||
expect(series.data[0].fields.length).toEqual(4);
|
||||
expect(series.data[0].fields[1].values.toArray()).toEqual([10, 10, 0]);
|
||||
expect(series.data[0].fields[2].values.toArray()).toEqual([10, 0, 30]);
|
||||
expect(series.data[0].fields[3].values.toArray()).toEqual([10, 0, 10]);
|
||||
expect(series.data[0].fields[1].values).toEqual([10, 10, 0]);
|
||||
expect(series.data[0].fields[2].values).toEqual([10, 0, 30]);
|
||||
expect(series.data[0].fields[3].values).toEqual([10, 0, 10]);
|
||||
});
|
||||
|
||||
it('results with heatmap format and multiple histograms should be grouped and de-accumulated by non-le labels', () => {
|
||||
@@ -600,17 +600,17 @@ describe('Prometheus Result Transformer', () => {
|
||||
|
||||
const series = transformV2(response, options, {});
|
||||
expect(series.data[0].fields.length).toEqual(4);
|
||||
expect(series.data[0].fields[1].values.toArray()).toEqual([10, 10, 0]);
|
||||
expect(series.data[0].fields[2].values.toArray()).toEqual([10, 0, 30]);
|
||||
expect(series.data[0].fields[3].values.toArray()).toEqual([10, 0, 10]);
|
||||
expect(series.data[0].fields[1].values).toEqual([10, 10, 0]);
|
||||
expect(series.data[0].fields[2].values).toEqual([10, 0, 30]);
|
||||
expect(series.data[0].fields[3].values).toEqual([10, 0, 10]);
|
||||
|
||||
expect(series.data[1].fields[1].values.toArray()).toEqual([0, 10, 10]);
|
||||
expect(series.data[1].fields[2].values.toArray()).toEqual([20, 0, 30]);
|
||||
expect(series.data[1].fields[3].values.toArray()).toEqual([10, 0, 20]);
|
||||
expect(series.data[1].fields[1].values).toEqual([0, 10, 10]);
|
||||
expect(series.data[1].fields[2].values).toEqual([20, 0, 30]);
|
||||
expect(series.data[1].fields[3].values).toEqual([10, 0, 20]);
|
||||
|
||||
expect(series.data[2].fields[1].values.toArray()).toEqual([30, 30, 60]);
|
||||
expect(series.data[2].fields[2].values.toArray()).toEqual([0, 10, 0]);
|
||||
expect(series.data[2].fields[3].values.toArray()).toEqual([10, 0, 0]);
|
||||
expect(series.data[2].fields[1].values).toEqual([30, 30, 60]);
|
||||
expect(series.data[2].fields[2].values).toEqual([0, 10, 0]);
|
||||
expect(series.data[2].fields[3].values).toEqual([10, 0, 0]);
|
||||
});
|
||||
|
||||
it('Retains exemplar frames when data returned is a heatmap', () => {
|
||||
@@ -667,14 +667,7 @@ describe('Prometheus Result Transformer', () => {
|
||||
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[2].values).toEqual(['hello', 'doctor', 'name', 'continue', 'yesterday', 'tomorrow']);
|
||||
expect(series.data[1].fields.length).toEqual(3);
|
||||
});
|
||||
|
||||
@@ -765,9 +758,9 @@ describe('Prometheus Result Transformer', () => {
|
||||
expect(tableDf.fields.length).toBe(4);
|
||||
expect(tableDf.fields[0].name).toBe('Time');
|
||||
expect(tableDf.fields[1].name).toBe('label1');
|
||||
expect(tableDf.fields[1].values.get(0)).toBe('value1');
|
||||
expect(tableDf.fields[1].values[0]).toBe('value1');
|
||||
expect(tableDf.fields[2].name).toBe('label2');
|
||||
expect(tableDf.fields[2].values.get(0)).toBe('value2');
|
||||
expect(tableDf.fields[2].values[0]).toBe('value2');
|
||||
expect(tableDf.fields[3].name).toBe('Value');
|
||||
});
|
||||
|
||||
@@ -789,9 +782,9 @@ describe('Prometheus Result Transformer', () => {
|
||||
expect(tableDf.fields.length).toBe(4);
|
||||
expect(tableDf.fields[0].name).toBe('Time');
|
||||
expect(tableDf.fields[1].name).toBe('label1');
|
||||
expect(tableDf.fields[1].values.get(0)).toBe('value1');
|
||||
expect(tableDf.fields[1].values[0]).toBe('value1');
|
||||
expect(tableDf.fields[2].name).toBe('label2');
|
||||
expect(tableDf.fields[2].values.get(0)).toBe('value2');
|
||||
expect(tableDf.fields[2].values[0]).toBe('value2');
|
||||
expect(tableDf.fields[3].name).toBe('Value');
|
||||
});
|
||||
|
||||
@@ -824,16 +817,16 @@ describe('Prometheus Result Transformer', () => {
|
||||
expect(transformedTableDataFrames[0].fields.length).toBe(4);
|
||||
expect(transformedTableDataFrames[0].fields[0].name).toBe('Time');
|
||||
expect(transformedTableDataFrames[0].fields[1].name).toBe('label1');
|
||||
expect(transformedTableDataFrames[0].fields[1].values.get(0)).toBe(value1);
|
||||
expect(transformedTableDataFrames[0].fields[1].values[0]).toBe(value1);
|
||||
expect(transformedTableDataFrames[0].fields[2].name).toBe('label2');
|
||||
expect(transformedTableDataFrames[0].fields[2].values.get(0)).toBe(value2);
|
||||
expect(transformedTableDataFrames[0].fields[2].values[0]).toBe(value2);
|
||||
expect(transformedTableDataFrames[0].fields[3].name).toBe('Value #A');
|
||||
|
||||
// Expect the invalid/empty results not to throw an error and to return empty arrays
|
||||
expect(transformedTableDataFrames[1].fields[1].labels).toBe(undefined);
|
||||
expect(transformedTableDataFrames[1].fields[1].name).toBe('Value #B');
|
||||
expect(transformedTableDataFrames[1].fields[1].values.toArray()).toEqual([]);
|
||||
expect(transformedTableDataFrames[1].fields[0].values.toArray()).toEqual([]);
|
||||
expect(transformedTableDataFrames[1].fields[1].values).toEqual([]);
|
||||
expect(transformedTableDataFrames[1].fields[0].values).toEqual([]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -901,22 +894,20 @@ describe('Prometheus Result Transformer', () => {
|
||||
format: 'table',
|
||||
},
|
||||
});
|
||||
expect(result[0].fields[0].values.toArray()).toEqual([
|
||||
1443454528000, 1443454530000, 1443454529000, 1443454531000,
|
||||
]);
|
||||
expect(result[0].fields[0].values).toEqual([1443454528000, 1443454530000, 1443454529000, 1443454531000]);
|
||||
expect(result[0].fields[0].name).toBe('Time');
|
||||
expect(result[0].fields[0].type).toBe(FieldType.time);
|
||||
expect(result[0].fields[1].values.toArray()).toEqual(['test', 'test', 'test2', 'test2']);
|
||||
expect(result[0].fields[1].values).toEqual(['test', 'test', 'test2', 'test2']);
|
||||
expect(result[0].fields[1].name).toBe('__name__');
|
||||
expect(result[0].fields[1].config.filterable).toBe(true);
|
||||
expect(result[0].fields[1].type).toBe(FieldType.string);
|
||||
expect(result[0].fields[2].values.toArray()).toEqual(['', '', 'localhost:8080', 'localhost:8080']);
|
||||
expect(result[0].fields[2].values).toEqual(['', '', 'localhost:8080', 'localhost:8080']);
|
||||
expect(result[0].fields[2].name).toBe('instance');
|
||||
expect(result[0].fields[2].type).toBe(FieldType.string);
|
||||
expect(result[0].fields[3].values.toArray()).toEqual(['testjob', 'testjob', 'otherjob', 'otherjob']);
|
||||
expect(result[0].fields[3].values).toEqual(['testjob', 'testjob', 'otherjob', 'otherjob']);
|
||||
expect(result[0].fields[3].name).toBe('job');
|
||||
expect(result[0].fields[3].type).toBe(FieldType.string);
|
||||
expect(result[0].fields[4].values.toArray()).toEqual([3846, 3848, 3847, 3849]);
|
||||
expect(result[0].fields[4].values).toEqual([3846, 3848, 3847, 3849]);
|
||||
expect(result[0].fields[4].name).toEqual('Value');
|
||||
expect(result[0].fields[4].type).toBe(FieldType.number);
|
||||
expect(result[0].refId).toBe('A');
|
||||
@@ -952,13 +943,13 @@ describe('Prometheus Result Transformer', () => {
|
||||
|
||||
it('should return data frame', () => {
|
||||
const result = transform({ data: response } as any, { ...options, target: { format: 'table' } });
|
||||
expect(result[0].fields[0].values.toArray()).toEqual([1443454528000]);
|
||||
expect(result[0].fields[0].values).toEqual([1443454528000]);
|
||||
expect(result[0].fields[0].name).toBe('Time');
|
||||
expect(result[0].fields[1].values.toArray()).toEqual(['test']);
|
||||
expect(result[0].fields[1].values).toEqual(['test']);
|
||||
expect(result[0].fields[1].name).toBe('__name__');
|
||||
expect(result[0].fields[2].values.toArray()).toEqual(['testjob']);
|
||||
expect(result[0].fields[2].values).toEqual(['testjob']);
|
||||
expect(result[0].fields[2].name).toBe('job');
|
||||
expect(result[0].fields[3].values.toArray()).toEqual([3846]);
|
||||
expect(result[0].fields[3].values).toEqual([3846]);
|
||||
expect(result[0].fields[3].name).toEqual('Value');
|
||||
});
|
||||
|
||||
@@ -976,7 +967,7 @@ describe('Prometheus Result Transformer', () => {
|
||||
},
|
||||
};
|
||||
const result = transform({ data: response } as any, { ...options, target: { format: 'table' } });
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([102]);
|
||||
expect(result[0].fields[1].values).toEqual([102]);
|
||||
expect(result[0].fields[1].type).toEqual(FieldType.number);
|
||||
});
|
||||
});
|
||||
@@ -1046,10 +1037,10 @@ describe('Prometheus Result Transformer', () => {
|
||||
]);
|
||||
|
||||
const result = transform({ data: response } as any, { query: options, target: options } as any);
|
||||
expect(result[0].fields[0].values.toArray()).toEqual([1445000010000, 1445000020000, 1445000030000]);
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([10, 10, 0]);
|
||||
expect(result[0].fields[2].values.toArray()).toEqual([10, 0, 30]);
|
||||
expect(result[0].fields[3].values.toArray()).toEqual([10, 0, 10]);
|
||||
expect(result[0].fields[0].values).toEqual([1445000010000, 1445000020000, 1445000030000]);
|
||||
expect(result[0].fields[1].values).toEqual([10, 10, 0]);
|
||||
expect(result[0].fields[2].values).toEqual([10, 0, 30]);
|
||||
expect(result[0].fields[3].values).toEqual([10, 0, 10]);
|
||||
});
|
||||
|
||||
it('should handle missing datapoints', () => {
|
||||
@@ -1078,9 +1069,9 @@ describe('Prometheus Result Transformer', () => {
|
||||
},
|
||||
]);
|
||||
const result = transform({ data: response } as any, { query: options, target: options } as any);
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([1, 2]);
|
||||
expect(result[0].fields[2].values.toArray()).toEqual([1, 3, 1]);
|
||||
expect(result[0].fields[3].values.toArray()).toEqual([1, 2]);
|
||||
expect(result[0].fields[1].values).toEqual([1, 2]);
|
||||
expect(result[0].fields[2].values).toEqual([1, 3, 1]);
|
||||
expect(result[0].fields[3].values).toEqual([1, 2]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1137,8 +1128,8 @@ describe('Prometheus Result Transformer', () => {
|
||||
end: 2,
|
||||
},
|
||||
});
|
||||
expect(result[0].fields[0].values.toArray()).toEqual([0, 1000, 2000]);
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([10, 10, 0]);
|
||||
expect(result[0].fields[0].values).toEqual([0, 1000, 2000]);
|
||||
expect(result[0].fields[1].values).toEqual([10, 10, 0]);
|
||||
expect(result[0].name).toBe('test{job="testjob"}');
|
||||
});
|
||||
|
||||
@@ -1148,8 +1139,8 @@ describe('Prometheus Result Transformer', () => {
|
||||
query: { step: 1, start: 0, end: 2 },
|
||||
});
|
||||
|
||||
expect(result[0].fields[0].values.toArray()).toEqual([0, 1000, 2000]);
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([null, 10, 0]);
|
||||
expect(result[0].fields[0].values).toEqual([0, 1000, 2000]);
|
||||
expect(result[0].fields[1].values).toEqual([null, 10, 0]);
|
||||
});
|
||||
|
||||
it('should use __name__ label as series name', () => {
|
||||
@@ -1242,8 +1233,8 @@ describe('Prometheus Result Transformer', () => {
|
||||
};
|
||||
|
||||
const result = transform({ data: response } as any, { ...options, query: { step: 2, start: 0, end: 8 } });
|
||||
expect(result[0].fields[0].values.toArray()).toEqual([0, 2000, 4000, 6000, 8000]);
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([null, null, 10, null, 10]);
|
||||
expect(result[0].fields[0].values).toEqual([0, 2000, 4000, 6000, 8000]);
|
||||
expect(result[0].fields[1].values).toEqual([null, null, 10, null, 10]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1262,7 +1253,7 @@ describe('Prometheus Result Transformer', () => {
|
||||
...options,
|
||||
target: { format: 'table' },
|
||||
});
|
||||
expect(result[0].fields[1].values.toArray()).toEqual([Number.POSITIVE_INFINITY]);
|
||||
expect(result[0].fields[1].values).toEqual([Number.POSITIVE_INFINITY]);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1290,7 +1281,7 @@ describe('Prometheus Result Transformer', () => {
|
||||
...options,
|
||||
target: { format: 'table' },
|
||||
});
|
||||
expect(result[0].fields[3].values.toArray()).toEqual([Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]);
|
||||
expect(result[0].fields[3].values).toEqual([Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,7 +3,6 @@ import { flatten, forOwn, groupBy, partition } from 'lodash';
|
||||
|
||||
import {
|
||||
ArrayDataFrame,
|
||||
ArrayVector,
|
||||
CoreApp,
|
||||
DataFrame,
|
||||
DataFrameType,
|
||||
@@ -226,7 +225,7 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] {
|
||||
name: label,
|
||||
config: { filterable: true },
|
||||
type: numberField ? FieldType.number : FieldType.string,
|
||||
values: new ArrayVector(),
|
||||
values: [],
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -234,10 +233,10 @@ export function transformDFToTable(dfs: DataFrame[]): DataFrame[] {
|
||||
|
||||
// Fill valueField, timeField and labelFields with values
|
||||
dataFramesByRefId[refId].forEach((df) => {
|
||||
const timeFields = df.fields[0]?.values ?? new ArrayVector();
|
||||
const dataFields = df.fields[1]?.values ?? new ArrayVector();
|
||||
timeFields.toArray().forEach((value) => timeField.values.add(value));
|
||||
dataFields.toArray().forEach((value) => {
|
||||
const timeFields = df.fields[0]?.values ?? [];
|
||||
const dataFields = df.fields[1]?.values ?? [];
|
||||
timeFields.forEach((value) => timeField.values.add(value));
|
||||
dataFields.forEach((value) => {
|
||||
valueField.values.add(parseSampleValue(value));
|
||||
const labelsForField = df.fields[1].labels ?? {};
|
||||
labelFields.forEach((field) => field.values.add(getLabelValue(labelsForField, field.name)));
|
||||
@@ -515,12 +514,13 @@ function transformMetricDataToTable(md: MatrixOrVectorResult[], options: Transfo
|
||||
// Labels have string field type, otherwise table tries to figure out the type which can result in unexpected results
|
||||
// Only "le" label has a number field type
|
||||
const numberField = label === HISTOGRAM_QUANTILE_LABEL_NAME;
|
||||
return {
|
||||
const field: Field = {
|
||||
name: label,
|
||||
config: { filterable: true },
|
||||
type: numberField ? FieldType.number : FieldType.string,
|
||||
values: new ArrayVector(),
|
||||
values: [],
|
||||
};
|
||||
return field;
|
||||
});
|
||||
const valueField = getValueField({ data: [], valueName: valueText });
|
||||
|
||||
@@ -528,12 +528,12 @@ function transformMetricDataToTable(md: MatrixOrVectorResult[], options: Transfo
|
||||
if (isMatrixData(d)) {
|
||||
d.values.forEach((val) => {
|
||||
timeField.values.add(val[0] * 1000);
|
||||
metricFields.forEach((metricField) => metricField.values.add(getLabelValue(d.metric, metricField.name)));
|
||||
metricFields.forEach((metricField) => metricField.values.push(getLabelValue(d.metric, metricField.name)));
|
||||
valueField.values.add(parseSampleValue(val[1]));
|
||||
});
|
||||
} else {
|
||||
timeField.values.add(d.value[0] * 1000);
|
||||
metricFields.forEach((metricField) => metricField.values.add(getLabelValue(d.metric, metricField.name)));
|
||||
metricFields.forEach((metricField) => metricField.values.push(getLabelValue(d.metric, metricField.name)));
|
||||
valueField.values.add(parseSampleValue(d.value[1]));
|
||||
}
|
||||
});
|
||||
@@ -561,7 +561,7 @@ function getTimeField(data: PromValue[], isMs = false): MutableField {
|
||||
name: TIME_SERIES_TIME_FIELD_NAME,
|
||||
type: FieldType.time,
|
||||
config: {},
|
||||
values: new ArrayVector<number>(data.map((val) => (isMs ? val[0] : val[0] * 1000))),
|
||||
values: data.map((val) => (isMs ? val[0] : val[0] * 1000)),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -588,7 +588,7 @@ function getValueField({
|
||||
displayNameFromDS,
|
||||
},
|
||||
labels,
|
||||
values: new ArrayVector<number | null>(data.map((val) => (parseValue ? parseSampleValue(val[1]) : val[1]))),
|
||||
values: data.map((val) => (parseValue ? parseSampleValue(val[1]) : val[1])),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -660,8 +660,8 @@ function transformToHistogramOverTime(seriesList: DataFrame[]) {
|
||||
}
|
||||
|
||||
for (let j = 0; j < topSeries.values.length; j++) {
|
||||
const bottomPoint = bottomSeries.values.get(j) || [0];
|
||||
topSeries.values.toArray()[j] -= bottomPoint;
|
||||
const bottomPoint = bottomSeries.values[j] || [0];
|
||||
topSeries.values[j] -= bottomPoint;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user