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:
Leon Sorokin
2023-04-20 09:59:18 -05:00
committed by GitHub
parent 24696d593b
commit b24ba7b7ae
109 changed files with 594 additions and 648 deletions

View File

@@ -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);
});
});

View File

@@ -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) {

View File

@@ -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);
});

View File

@@ -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(),
})),
}));
}

View File

@@ -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',

View File

@@ -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]);
});
});
});

View File

@@ -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;
}
}