From 86302bc1ec1149e5ac02cd332aa4aa39fc4eda30 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Mon, 1 May 2023 19:41:40 -0700 Subject: [PATCH] DataFrame: Deprecate MutableDataFrame (#67569) --- .betterer.results | 4 +- .../src/dataframe/MutableDataFrame.ts | 6 ++ .../src/dataframe/processDataFrame.test.ts | 4 +- .../src/dataframe/processDataFrame.ts | 35 +++++++++- .../src/field/fieldDisplay.test.ts | 39 ++++++----- .../src/field/fieldOverrides.test.ts | 16 ++--- .../field/getFieldDisplayValuesProxy.test.tsx | 4 +- .../src/transformations/fieldReducer.test.ts | 5 +- .../transformers/groupingToMatrix.ts | 25 +++++--- .../grafana-data/src/utils/flotPairs.test.ts | 4 +- .../src/utils/DataSourceWithBackend.test.ts | 12 ++-- .../GraphNG/nullInsertThreshold.test.ts | 30 ++++----- .../components/GraphNG/nullToValue.test.ts | 10 +-- .../loki/LogContextProvider.test.ts | 10 +-- .../datasource/loki/getDerivedFields.test.ts | 4 +- .../datasource/mssql/datasource.test.ts | 18 +++--- .../datasource/mysql/specs/datasource.test.ts | 20 +++--- .../datasource/postgres/datasource.test.ts | 26 ++++---- .../prometheus/result_transformer.test.ts | 64 +++++++++---------- .../datasource/tempo/datasource.test.ts | 16 ++--- .../datasource/tempo/graphTransform.test.ts | 14 ++-- .../tempo/resultTransformer.test.ts | 4 +- .../datasource/testdata/nodeGraphUtils.ts | 23 +++++-- .../plugins/datasource/zipkin/datasource.ts | 4 +- .../components/FlameGraph/FlameGraph.test.tsx | 4 +- .../FlameGraph/FlameGraphMetadata.test.ts | 4 +- .../FlameGraph/FlameGraphTooltip.test.tsx | 4 +- .../FlameGraph/dataTransform.test.ts | 6 +- .../components/FlameGraph/rendering.test.ts | 4 +- .../components/FlameGraphContainer.test.tsx | 4 +- .../FlameGraphTopTableContainer.test.tsx | 4 +- .../app/plugins/panel/logs/LogsPanel.test.tsx | 6 +- .../app/plugins/panel/nodeGraph/utils.test.ts | 22 +++---- .../plugins/ExemplarsPlugin.test.tsx | 22 +++---- .../plugins/panel/timeseries/utils.test.ts | 8 +-- 35 files changed, 266 insertions(+), 219 deletions(-) diff --git a/.betterer.results b/.betterer.results index 84d3ed13d5e..7f301119b7d 100644 --- a/.betterer.results +++ b/.betterer.results @@ -86,7 +86,9 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "18"], [0, 0, 0, "Do not use any type assertions.", "19"], [0, 0, 0, "Do not use any type assertions.", "20"], - [0, 0, 0, "Do not use any type assertions.", "21"] + [0, 0, 0, "Do not use any type assertions.", "21"], + [0, 0, 0, "Do not use any type assertions.", "22"], + [0, 0, 0, "Do not use any type assertions.", "23"] ], "packages/grafana-data/src/datetime/datemath.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], diff --git a/packages/grafana-data/src/dataframe/MutableDataFrame.ts b/packages/grafana-data/src/dataframe/MutableDataFrame.ts index 94c8a599cde..7d96a8f592c 100644 --- a/packages/grafana-data/src/dataframe/MutableDataFrame.ts +++ b/packages/grafana-data/src/dataframe/MutableDataFrame.ts @@ -10,10 +10,16 @@ import { guessFieldTypeFromValue, guessFieldTypeForField, toDataFrameDTO } from /** @deprecated */ export type MutableField = Field; +/** @deprecated */ type MutableVectorCreator = (buffer?: any[]) => any[]; export const MISSING_VALUE = undefined; // Treated as connected in new graph panel +/** + * MutableDataFrame is a complex wrapper around the DataFrame interface + * + * @deprecated use standard DataFrame, or create one with PartialDataFrame + */ export class MutableDataFrame extends FunctionalVector implements DataFrame { name?: string; refId?: string; diff --git a/packages/grafana-data/src/dataframe/processDataFrame.test.ts b/packages/grafana-data/src/dataframe/processDataFrame.test.ts index a6906452f7c..4d5c6485004 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.test.ts @@ -2,8 +2,8 @@ import { dateTime } from '../datetime/moment_wrapper'; import { DataFrameDTO, FieldType, TableData, TimeSeries } from '../types/index'; import { ArrayDataFrame } from './ArrayDataFrame'; -import { MutableDataFrame } from './MutableDataFrame'; import { + createDataFrame, guessFieldTypeFromValue, guessFieldTypes, isDataFrame, @@ -130,7 +130,7 @@ describe('toDataFrame', () => { }); it('Guess Column Types from series', () => { - const series = new MutableDataFrame({ + const series = createDataFrame({ fields: [ { name: 'A (number)', values: [123, null] }, { name: 'B (strings)', values: [null, 'Hello'] }, diff --git a/packages/grafana-data/src/dataframe/processDataFrame.ts b/packages/grafana-data/src/dataframe/processDataFrame.ts index 25047ee86db..09e67d8349d 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.ts @@ -27,7 +27,6 @@ import { import { arrayToDataFrame } from './ArrayDataFrame'; import { dataFrameFromJSON } from './DataFrameJSON'; -import { MutableDataFrame } from './MutableDataFrame'; function convertTableToDataFrame(table: TableData): DataFrame { const fields = table.columns.map((c) => { @@ -315,7 +314,7 @@ export function toDataFrame(data: any): DataFrame { } // This will convert the array values into Vectors - return new MutableDataFrame(data as DataFrameDTO); + return createDataFrame(data as DataFrameDTO); } // Handle legacy docs/json type @@ -567,3 +566,35 @@ export function preProcessPanelData(data: PanelData, lastResult?: PanelData): Pa timings: { dataProcessingTime: STOPTIME - STARTTIME }, }; } + +export interface PartialDataFrame extends Omit { + fields: Array>; +} + +export function createDataFrame(input: PartialDataFrame): DataFrame { + let length = 0; + const fields = input.fields.map((p, idx) => { + const { state, ...field } = p; + if (!field.name) { + field.name = `Field ${idx + 1}`; + } + if (!field.config) { + field.config = {}; + } + if (!field.values) { + field.values = new Array(length); + } else if (field.values.length > length) { + length = field.values.length; + } + if (!field.type) { + field.type = guessFieldTypeForField(field as Field) ?? FieldType.other; + } + return field as Field; + }); + + return { + ...input, + fields, + length, + }; +} diff --git a/packages/grafana-data/src/field/fieldDisplay.test.ts b/packages/grafana-data/src/field/fieldDisplay.test.ts index ebea46752bd..a9da5bf0182 100644 --- a/packages/grafana-data/src/field/fieldDisplay.test.ts +++ b/packages/grafana-data/src/field/fieldDisplay.test.ts @@ -508,8 +508,25 @@ function createEmptyDisplayOptions(extend = {}): GetFieldDisplayValuesOptions { } function createDisplayOptions(extend: Partial = {}): GetFieldDisplayValuesOptions { - const options: GetFieldDisplayValuesOptions = { - data: [ + const options = merge( + { + replaceVariables: (value: string) => { + return value; + }, + reduceOptions: { + calcs: [], + }, + fieldConfig: { + overrides: [], + defaults: {}, + }, + theme: createTheme(), + }, + extend + ); + + if (!options.data?.length) { + options.data = [ toDataFrame({ name: 'Series Name', fields: [ @@ -518,21 +535,9 @@ function createDisplayOptions(extend: Partial = {} { name: 'Field 3', values: [2, 4, 6] }, ], }), - ], - replaceVariables: (value: string) => { - return value; - }, - reduceOptions: { - calcs: [], - }, - fieldConfig: { - overrides: [], - defaults: {}, - }, - theme: createTheme(), - }; - - return merge(options, extend); + ]; + } + return options; } describe('fixCellTemplateExpressions', () => { diff --git a/packages/grafana-data/src/field/fieldOverrides.test.ts b/packages/grafana-data/src/field/fieldOverrides.test.ts index d24892db1f0..e136a5a6a12 100644 --- a/packages/grafana-data/src/field/fieldOverrides.test.ts +++ b/packages/grafana-data/src/field/fieldOverrides.test.ts @@ -1,4 +1,4 @@ -import { ArrayDataFrame, MutableDataFrame, toDataFrame } from '../dataframe'; +import { ArrayDataFrame, createDataFrame, toDataFrame } from '../dataframe'; import { rangeUtil } from '../datetime'; import { createTheme } from '../themes'; import { FieldMatcherID } from '../transformations'; @@ -177,11 +177,11 @@ describe('applyFieldOverrides', () => { }; describe('given multiple data frames', () => { - const f0 = new MutableDataFrame({ + const f0 = createDataFrame({ name: 'A', fields: [{ name: 'message', type: FieldType.string, values: [10, 20] }], }); - const f1 = new MutableDataFrame({ + const f1 = createDataFrame({ name: 'B', fields: [{ name: 'info', type: FieldType.string, values: [10, 20] }], }); @@ -676,7 +676,7 @@ describe('getLinksSupplier', () => { getTimeRangeForUrl: () => ({ from: 'now-7d', to: 'now' }), }); - const f0 = new MutableDataFrame({ + const f0 = createDataFrame({ name: 'A', fields: [ { @@ -712,7 +712,7 @@ describe('getLinksSupplier', () => { }); const datasourceUid = '1234'; - const f0 = new MutableDataFrame({ + const f0 = createDataFrame({ name: 'A', fields: [ { @@ -766,7 +766,7 @@ describe('getLinksSupplier', () => { const datasourceUid = '1234'; const range = rangeUtil.relativeToTimeRange({ from: 600, to: 0 }); - const f0 = new MutableDataFrame({ + const f0 = createDataFrame({ name: 'A', fields: [ { @@ -827,7 +827,7 @@ describe('getLinksSupplier', () => { it('handles link click handlers', () => { const onClickSpy = jest.fn(); const replaceSpy = jest.fn(); - const f0 = new MutableDataFrame({ + const f0 = createDataFrame({ name: 'A', fields: [ { @@ -867,7 +867,7 @@ describe('getLinksSupplier', () => { const replaceSpy = jest.fn().mockReturnValue('url interpolated 10'); const onBuildUrlSpy = jest.fn(); - const f0 = new MutableDataFrame({ + const f0 = createDataFrame({ name: 'A', fields: [ { diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx index 92b9181fe72..b17ceef4cb6 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx @@ -1,4 +1,4 @@ -import { MutableDataFrame, toDataFrame } from '../dataframe'; +import { createDataFrame, toDataFrame } from '../dataframe'; import { createTheme } from '../themes'; import { applyFieldOverrides } from './fieldOverrides'; @@ -85,7 +85,7 @@ describe('getFieldDisplayValuesProxy', () => { it('should use default display processor if display is not defined', () => { const p = getFieldDisplayValuesProxy({ - frame: new MutableDataFrame({ fields: [{ name: 'test', values: [1, 2] }] }), + frame: createDataFrame({ fields: [{ name: 'test', values: [1, 2] }] }), rowIndex: 0, }); expect(p.test.text).toBe('1'); diff --git a/packages/grafana-data/src/transformations/fieldReducer.test.ts b/packages/grafana-data/src/transformations/fieldReducer.test.ts index 1a30e1c3239..f4cc0b6b178 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.test.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.test.ts @@ -1,7 +1,6 @@ import { difference } from 'lodash'; -import { MutableDataFrame } from '../dataframe/MutableDataFrame'; -import { guessFieldTypeFromValue } from '../dataframe/processDataFrame'; +import { createDataFrame, guessFieldTypeFromValue } from '../dataframe/processDataFrame'; import { Field, FieldType } from '../types/index'; import { fieldReducers, ReducerID, reduceField } from './fieldReducer'; @@ -24,7 +23,7 @@ function createField(name: string, values?: T[], type?: FieldType): Field } describe('Stats Calculators', () => { - const basicTable = new MutableDataFrame({ + const basicTable = createDataFrame({ fields: [ { name: 'a', values: [10, 20] }, { name: 'b', values: [20, 30] }, diff --git a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts index 3b5721b7b99..741c2a50adf 100644 --- a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts +++ b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts @@ -1,6 +1,5 @@ import { map } from 'rxjs/operators'; -import { MutableDataFrame } from '../../dataframe'; import { getFieldDisplayName } from '../../field/fieldState'; import { DataFrame, DataTransformerInfo, Field, FieldType, SpecialValue } from '../../types'; import { fieldMatchers } from '../matchers'; @@ -75,13 +74,14 @@ export const groupingToMatrixTransformer: DataTransformerInfo { - const series = new MutableDataFrame({ + const series = createDataFrame({ fields: [ { name: 'a', values: [1, 2, 3] }, { name: 'b', values: [100, 200, 300] }, diff --git a/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts b/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts index 439f4a0300d..b4048689c98 100644 --- a/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts +++ b/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts @@ -8,7 +8,7 @@ import { DataSourceInstanceSettings, DataSourceJsonData, DataSourceRef, - MutableDataFrame, + createDataFrame, } from '@grafana/data'; import { @@ -240,10 +240,12 @@ describe('DataSourceWithBackend', () => { let obs = toStreamingDataResponse(rsp, request, standardStreamOptionsProvider); expect(obs).toBeDefined(); - let frame = new MutableDataFrame(); - frame.meta = { - channel: 'a/b/c', - }; + let frame = createDataFrame({ + meta: { + channel: 'a/b/c', + }, + fields: [], + }); rsp.data = [frame]; obs = toStreamingDataResponse(rsp, request, standardStreamOptionsProvider); expect(obs).toBeDefined(); diff --git a/packages/grafana-ui/src/components/GraphNG/nullInsertThreshold.test.ts b/packages/grafana-ui/src/components/GraphNG/nullInsertThreshold.test.ts index ab3343aa1b2..7a2ceb15e8d 100644 --- a/packages/grafana-ui/src/components/GraphNG/nullInsertThreshold.test.ts +++ b/packages/grafana-ui/src/components/GraphNG/nullInsertThreshold.test.ts @@ -1,4 +1,4 @@ -import { FieldType, MutableDataFrame } from '@grafana/data'; +import { FieldType, createDataFrame } from '@grafana/data'; import { applyNullInsertThreshold } from './nullInsertThreshold'; @@ -48,7 +48,7 @@ function genFrame() { describe('nullInsertThreshold Transformer', () => { test('should insert nulls at +threshold between adjacent > threshold: 1', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [1, 3, 10] }, @@ -65,7 +65,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should insert nulls at +threshold between adjacent > threshold: 2', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [5, 7, 11] }, @@ -82,7 +82,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should insert nulls at +interval between adjacent > interval: 1', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 10] }, @@ -99,7 +99,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should insert leading null at beginning +interval when timeRange.from.valueOf() exceeds threshold', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [4, 6, 13] }, @@ -154,7 +154,7 @@ describe('nullInsertThreshold Transformer', () => { // this tests that intervals at 24hr but starting not at 12am UTC are not always snapped to 12am UTC test('should insert leading null at beginning +interval when timeRange.from.valueOf() exceeds threshold 11PM UTC', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { @@ -181,7 +181,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should insert trailing null at end +interval when timeRange.to.valueOf() exceeds threshold', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 10] }, @@ -197,7 +197,7 @@ describe('nullInsertThreshold Transformer', () => { expect(result.fields[2].values).toEqual(['a', null, 'b', null, null, null, null, null, null, 'c', null, null]); // should work for frames with 1 datapoint - const df2 = new MutableDataFrame({ + const df2 = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1] }, @@ -216,7 +216,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should not insert trailing null at end +interval when timeRange.to.valueOf() equals threshold', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1] }, @@ -234,7 +234,7 @@ describe('nullInsertThreshold Transformer', () => { // TODO: make this work test.skip('should insert nulls at +threshold (when defined) instead of +interval', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 2 }, values: [5, 7, 11] }, @@ -251,7 +251,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should noop on 0 datapoints', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [] }, @@ -265,7 +265,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should noop on invalid threshold', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [1, 2, 4] }, @@ -279,7 +279,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should noop on invalid interval', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: -1 }, values: [1, 2, 4] }, @@ -293,7 +293,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should noop when no missing steps', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1, 2, 3] }, @@ -307,7 +307,7 @@ describe('nullInsertThreshold Transformer', () => { }); test('should noop when refFieldName not found', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1, 2, 5] }, diff --git a/packages/grafana-ui/src/components/GraphNG/nullToValue.test.ts b/packages/grafana-ui/src/components/GraphNG/nullToValue.test.ts index a321f6a7e2f..e14f64e1710 100644 --- a/packages/grafana-ui/src/components/GraphNG/nullToValue.test.ts +++ b/packages/grafana-ui/src/components/GraphNG/nullToValue.test.ts @@ -1,11 +1,11 @@ -import { FieldType, MutableDataFrame } from '@grafana/data'; +import { FieldType, createDataFrame } from '@grafana/data'; import { applyNullInsertThreshold } from './nullInsertThreshold'; import { nullToValue } from './nullToValue'; describe('nullToValue Transformer', () => { test('should change all nulls to configured zero value', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [1, 3, 10] }, @@ -32,7 +32,7 @@ describe('nullToValue Transformer', () => { }); test('should change all nulls to configured positive value', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [5, 7, 11] }, @@ -59,7 +59,7 @@ describe('nullToValue Transformer', () => { }); test('should change all nulls to configured negative value', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 10] }, @@ -76,7 +76,7 @@ describe('nullToValue Transformer', () => { }); test('should have no effect without nulls', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, config: { interval: 1 }, values: [1, 2, 3] }, diff --git a/public/app/plugins/datasource/loki/LogContextProvider.test.ts b/public/app/plugins/datasource/loki/LogContextProvider.test.ts index 16bad0e1480..14bb38da2db 100644 --- a/public/app/plugins/datasource/loki/LogContextProvider.test.ts +++ b/public/app/plugins/datasource/loki/LogContextProvider.test.ts @@ -1,12 +1,6 @@ import { of } from 'rxjs'; -import { - DataQueryResponse, - FieldType, - LogRowContextQueryDirection, - LogRowModel, - MutableDataFrame, -} from '@grafana/data'; +import { DataQueryResponse, FieldType, LogRowContextQueryDirection, LogRowModel, createDataFrame } from '@grafana/data'; import LokiLanguageProvider from './LanguageProvider'; import { LogContextProvider } from './LogContextProvider'; @@ -25,7 +19,7 @@ defaultDatasourceMock.languageProvider = defaultLanguageProviderMock; const defaultLogRow = { rowIndex: 0, - dataFrame: new MutableDataFrame({ + dataFrame: createDataFrame({ fields: [ { name: 'ts', diff --git a/public/app/plugins/datasource/loki/getDerivedFields.test.ts b/public/app/plugins/datasource/loki/getDerivedFields.test.ts index 4091d70e09a..554975630e4 100644 --- a/public/app/plugins/datasource/loki/getDerivedFields.test.ts +++ b/public/app/plugins/datasource/loki/getDerivedFields.test.ts @@ -1,4 +1,4 @@ -import { MutableDataFrame } from '@grafana/data'; +import { createDataFrame } from '@grafana/data'; import { getDerivedFields } from './getDerivedFields'; @@ -16,7 +16,7 @@ jest.mock('@grafana/runtime', () => ({ describe('getDerivedFields', () => { it('adds links to fields', () => { - const df = new MutableDataFrame({ fields: [{ name: 'line', values: ['nothing', 'trace1=1234', 'trace2=foo'] }] }); + const df = createDataFrame({ fields: [{ name: 'line', values: ['nothing', 'trace1=1234', 'trace2=foo'] }] }); const newFields = getDerivedFields(df, [ { matcherRegex: 'trace1=(\\w+)', diff --git a/public/app/plugins/datasource/mssql/datasource.test.ts b/public/app/plugins/datasource/mssql/datasource.test.ts index 36a1b17113f..99bfc5eb620 100644 --- a/public/app/plugins/datasource/mssql/datasource.test.ts +++ b/public/app/plugins/datasource/mssql/datasource.test.ts @@ -7,7 +7,7 @@ import { dateTime, FieldType, MetricFindValue, - MutableDataFrame, + createDataFrame, TimeRange, } from '@grafana/data'; import { backendSrv } from 'app/core/services/backend_srv'; @@ -54,7 +54,7 @@ describe('MSSQLDatasource', () => { tempvar: { frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -130,7 +130,7 @@ describe('MSSQLDatasource', () => { refId: 'datasets', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'name', type: FieldType.string, values: ['test1', 'test2', 'test3'] }], }) ), @@ -152,7 +152,7 @@ describe('MSSQLDatasource', () => { refId: 'tables', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'schemaAndName', type: FieldType.string, values: ['test1', 'test2', 'test3'] }], }) ), @@ -175,7 +175,7 @@ describe('MSSQLDatasource', () => { refId: 'columns', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'column', type: FieldType.string, values: ['test1', 'test2', 'test3'] }, { name: 'type', type: FieldType.string, values: ['int', 'char', 'bool'] }, @@ -216,7 +216,7 @@ describe('MSSQLDatasource', () => { tempvar: { frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: '__value', values: ['value1', 'value2', 'value3'] }, { name: '__text', values: ['aTitle', 'aTitle2', 'aTitle3'] }, @@ -254,7 +254,7 @@ describe('MSSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'id', values: [1, 2, 3] }, { name: 'values', values: ['test1', 'test2', 'test3'] }, @@ -297,7 +297,7 @@ describe('MSSQLDatasource', () => { tempvar: { frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: '__text', values: ['aTitle', 'aTitle', 'aTitle'] }, { name: '__value', values: ['same', 'same', 'diff'] }, @@ -330,7 +330,7 @@ describe('MSSQLDatasource', () => { tempvar: { frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'test', values: ['aTitle'] }], }) ), diff --git a/public/app/plugins/datasource/mysql/specs/datasource.test.ts b/public/app/plugins/datasource/mysql/specs/datasource.test.ts index 9e6c749b4d6..2149011f16e 100644 --- a/public/app/plugins/datasource/mysql/specs/datasource.test.ts +++ b/public/app/plugins/datasource/mysql/specs/datasource.test.ts @@ -6,7 +6,7 @@ import { DataSourceInstanceSettings, dateTime, FieldType, - MutableDataFrame, + createDataFrame, } from '@grafana/data'; import { FetchResponse, setBackendSrv } from '@grafana/runtime'; import { backendSrv } from 'app/core/services/backend_srv'; // will use the version in __mocks__ @@ -115,7 +115,7 @@ describe('MySQLDatasource', () => { refId: 'datasets', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'name', type: FieldType.string, values: ['test1', 'test2', 'test3'] }], }) ), @@ -137,7 +137,7 @@ describe('MySQLDatasource', () => { refId: 'tables', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'table_name', type: FieldType.string, values: ['test1', 'test2', 'test3'] }], }) ), @@ -159,7 +159,7 @@ describe('MySQLDatasource', () => { refId: 'fields', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'column_name', type: FieldType.string, values: ['test1', 'test2', 'test3'] }, { name: 'data_type', type: FieldType.string, values: ['int', 'char', 'bool'] }, @@ -199,7 +199,7 @@ describe('MySQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -232,7 +232,7 @@ describe('MySQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -267,7 +267,7 @@ describe('MySQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -300,7 +300,7 @@ describe('MySQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: '__value', values: ['value1', 'value2', 'value3'] }, { name: '__text', values: ['aTitle', 'aTitle2', 'aTitle3'] }, @@ -335,7 +335,7 @@ describe('MySQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'id', values: [1, 2, 3] }, { name: 'values', values: ['test1', 'test2', 'test3'] }, @@ -373,7 +373,7 @@ describe('MySQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: '__text', values: ['aTitle', 'aTitle', 'aTitle'] }, { name: '__value', values: ['same', 'same', 'diff'] }, diff --git a/public/app/plugins/datasource/postgres/datasource.test.ts b/public/app/plugins/datasource/postgres/datasource.test.ts index 48c9a2990c9..5129098192e 100644 --- a/public/app/plugins/datasource/postgres/datasource.test.ts +++ b/public/app/plugins/datasource/postgres/datasource.test.ts @@ -9,7 +9,7 @@ import { dateTime, FieldType, LoadingState, - MutableDataFrame, + createDataFrame, } from '@grafana/data'; import { FetchResponse } from '@grafana/runtime'; import { backendSrv } from 'app/core/services/backend_srv'; // will use the version in __mocks__ @@ -113,7 +113,7 @@ describe('PostgreSQLDatasource', () => { refId: 'A', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'time', values: [1599643351085] }, { name: 'metric', values: [30.226249741223704], labels: { metric: 'America' } }, @@ -204,7 +204,7 @@ describe('PostgreSQLDatasource', () => { refId: 'A', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'time', values: [1599643351085] }, { name: 'metric', values: ['America'] }, @@ -349,7 +349,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tables', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'table', type: FieldType.string, values: ['test1', 'test2', 'test3'] }], }) ), @@ -372,7 +372,7 @@ describe('PostgreSQLDatasource', () => { refId: 'meta', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'version', type: FieldType.string, values: ['test1'] }], }) ), @@ -394,7 +394,7 @@ describe('PostgreSQLDatasource', () => { refId: 'meta', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [{ name: 'extversion', type: FieldType.string, values: ['test1'] }], }) ), @@ -416,7 +416,7 @@ describe('PostgreSQLDatasource', () => { refId: 'columns', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'column', type: FieldType.string, values: ['test1', 'test2', 'test3'] }, { name: 'type', type: FieldType.string, values: ['int', 'char', 'bool'] }, @@ -458,7 +458,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -491,7 +491,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -533,7 +533,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'title', values: ['aTitle', 'aTitle2', 'aTitle3'] }, { name: 'text', values: ['some text', 'some text2', 'some text3'] }, @@ -573,7 +573,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: '__value', values: ['value1', 'value2', 'value3'] }, { name: '__text', values: ['aTitle', 'aTitle2', 'aTitle3'] }, @@ -607,7 +607,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'id', values: [1, 2, 3] }, { name: 'values', values: ['test1', 'test2', 'test3'] }, @@ -644,7 +644,7 @@ describe('PostgreSQLDatasource', () => { refId: 'tempvar', frames: [ dataFrameToJSON( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: '__text', values: ['aTitle', 'aTitle', 'aTitle'] }, { name: '__value', values: ['same', 'same', 'diff'] }, diff --git a/public/app/plugins/datasource/prometheus/result_transformer.test.ts b/public/app/plugins/datasource/prometheus/result_transformer.test.ts index ede4c6e7089..a738eaf9e6f 100644 --- a/public/app/plugins/datasource/prometheus/result_transformer.test.ts +++ b/public/app/plugins/datasource/prometheus/result_transformer.test.ts @@ -3,7 +3,7 @@ import { DataQueryRequest, DataQueryResponse, FieldType, - MutableDataFrame, + createDataFrame, PreferredVisualisationType, } from '@grafana/data'; @@ -191,7 +191,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -226,7 +226,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -238,7 +238,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [2, 3, 7] }, @@ -280,7 +280,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -292,7 +292,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'B', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -325,7 +325,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -337,7 +337,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -349,7 +349,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -390,7 +390,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -402,7 +402,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -414,7 +414,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -426,7 +426,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'B', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -438,7 +438,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'B', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -450,7 +450,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'B', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -485,7 +485,7 @@ describe('Prometheus Result Transformer', () => { state: 'Done', data: [ // 10 - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -497,7 +497,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -509,7 +509,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -522,7 +522,7 @@ describe('Prometheus Result Transformer', () => { ], }), // 20 - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -534,7 +534,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -546,7 +546,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -559,7 +559,7 @@ describe('Prometheus Result Transformer', () => { ], }), // 30 - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -571,7 +571,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -583,7 +583,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -625,7 +625,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -637,7 +637,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', name: 'exemplar', meta: { @@ -675,7 +675,7 @@ describe('Prometheus Result Transformer', () => { const response = { state: 'Done', data: [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'Time', type: FieldType.time, values: [6, 5, 4] }, @@ -687,7 +687,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'A', name: 'exemplar', meta: { @@ -741,7 +741,7 @@ describe('Prometheus Result Transformer', () => { describe('transformDFToTable', () => { it('transforms dataFrame with response length 1 to table dataFrame', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -765,7 +765,7 @@ describe('Prometheus Result Transformer', () => { }); it('transforms dataFrame with response length 2 to table dataFrame', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -794,7 +794,7 @@ describe('Prometheus Result Transformer', () => { const value2 = 'value2'; const dataframes = [ - new MutableDataFrame({ + createDataFrame({ refId: 'A', fields: [ { name: 'time', type: FieldType.time, values: [6, 5, 4] }, @@ -806,7 +806,7 @@ describe('Prometheus Result Transformer', () => { }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'B', fields: [], }), diff --git a/public/app/plugins/datasource/tempo/datasource.test.ts b/public/app/plugins/datasource/tempo/datasource.test.ts index 788a139fcd3..dfd59aec047 100644 --- a/public/app/plugins/datasource/tempo/datasource.test.ts +++ b/public/app/plugins/datasource/tempo/datasource.test.ts @@ -9,7 +9,7 @@ import { FieldType, getDefaultTimeRange, LoadingState, - MutableDataFrame, + createDataFrame, PluginType, } from '@grafana/data'; import { @@ -121,7 +121,7 @@ describe('Tempo data source', () => { it('parses json fields from backend', async () => { setupBackendSrv( - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'traceID', values: ['04450900759028499335'] }, { name: 'spanID', values: ['4322526419282105830'] }, @@ -796,7 +796,7 @@ const defaultSettings: DataSourceInstanceSettings = { readOnly: false, }; -const rateMetric = new MutableDataFrame({ +const rateMetric = createDataFrame({ refId: 'topk(5, sum(rate(traces_spanmetrics_calls_total{span_kind="SPAN_KIND_SERVER"}[$__range])) by (span_name))', fields: [ { name: 'Time', values: [1653725618609, 1653725618609] }, @@ -808,7 +808,7 @@ const rateMetric = new MutableDataFrame({ ], }); -const errorRateMetric = new MutableDataFrame({ +const errorRateMetric = createDataFrame({ refId: 'topk(5, sum(rate(traces_spanmetrics_calls_total{status_code="STATUS_CODE_ERROR",span_name=~"HTTP Client|HTTP GET - root"}[$__range])) by (span_name))', fields: [ @@ -821,7 +821,7 @@ const errorRateMetric = new MutableDataFrame({ ], }); -const durationMetric = new MutableDataFrame({ +const durationMetric = createDataFrame({ refId: 'histogram_quantile(.9, sum(rate(traces_spanmetrics_latency_bucket{span_name=~"HTTP GET - root"}[$__range])) by (le))', fields: [ @@ -833,7 +833,7 @@ const durationMetric = new MutableDataFrame({ ], }); -const totalsPromMetric = new MutableDataFrame({ +const totalsPromMetric = createDataFrame({ refId: 'traces_service_graph_request_total', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, @@ -846,7 +846,7 @@ const totalsPromMetric = new MutableDataFrame({ ], }); -const secondsPromMetric = new MutableDataFrame({ +const secondsPromMetric = createDataFrame({ refId: 'traces_service_graph_request_server_seconds_sum', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, @@ -859,7 +859,7 @@ const secondsPromMetric = new MutableDataFrame({ ], }); -const failedPromMetric = new MutableDataFrame({ +const failedPromMetric = createDataFrame({ refId: 'traces_service_graph_request_failed_total', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, diff --git a/public/app/plugins/datasource/tempo/graphTransform.test.ts b/public/app/plugins/datasource/tempo/graphTransform.test.ts index e9e52bb09d1..1d774070347 100644 --- a/public/app/plugins/datasource/tempo/graphTransform.test.ts +++ b/public/app/plugins/datasource/tempo/graphTransform.test.ts @@ -1,4 +1,4 @@ -import { DataFrameView, dateTime, MutableDataFrame } from '@grafana/data'; +import { DataFrameView, dateTime, createDataFrame } from '@grafana/data'; import { createGraphFrames, mapPromMetricsToServiceMap } from './graphTransform'; import { bigResponse } from './testResponse'; @@ -116,7 +116,7 @@ describe('mapPromMetricsToServiceMap', () => { }); }); -const singleSpanResponse = new MutableDataFrame({ +const singleSpanResponse = createDataFrame({ fields: [ { name: 'traceID', values: ['04450900759028499335'] }, { name: 'spanID', values: ['4322526419282105830'] }, @@ -128,7 +128,7 @@ const singleSpanResponse = new MutableDataFrame({ ], }); -const missingSpanResponse = new MutableDataFrame({ +const missingSpanResponse = createDataFrame({ fields: [ { name: 'traceID', values: ['04450900759028499335', '04450900759028499335'] }, { name: 'spanID', values: ['1', '2'] }, @@ -140,7 +140,7 @@ const missingSpanResponse = new MutableDataFrame({ ], }); -const totalsPromMetric = new MutableDataFrame({ +const totalsPromMetric = createDataFrame({ refId: 'traces_service_graph_request_total', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, @@ -153,7 +153,7 @@ const totalsPromMetric = new MutableDataFrame({ ], }); -const secondsPromMetric = new MutableDataFrame({ +const secondsPromMetric = createDataFrame({ refId: 'traces_service_graph_request_server_seconds_sum', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, @@ -166,7 +166,7 @@ const secondsPromMetric = new MutableDataFrame({ ], }); -const failedPromMetric = new MutableDataFrame({ +const failedPromMetric = createDataFrame({ refId: 'traces_service_graph_request_failed_total', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, @@ -179,7 +179,7 @@ const failedPromMetric = new MutableDataFrame({ ], }); -const invalidFailedPromMetric = new MutableDataFrame({ +const invalidFailedPromMetric = createDataFrame({ refId: 'traces_service_graph_request_failed_total', fields: [ { name: 'Time', values: [1628169788000, 1628169788000] }, diff --git a/public/app/plugins/datasource/tempo/resultTransformer.test.ts b/public/app/plugins/datasource/tempo/resultTransformer.test.ts index 1b78d658d96..83cd753c9b5 100644 --- a/public/app/plugins/datasource/tempo/resultTransformer.test.ts +++ b/public/app/plugins/datasource/tempo/resultTransformer.test.ts @@ -2,7 +2,7 @@ import { collectorTypes } from '@opentelemetry/exporter-collector'; import { FieldType, - MutableDataFrame, + createDataFrame, PluginType, DataSourceInstanceSettings, dateTime, @@ -45,7 +45,7 @@ const defaultSettings: DataSourceInstanceSettings = { }; describe('transformTraceList()', () => { - const lokiDataFrame = new MutableDataFrame({ + const lokiDataFrame = createDataFrame({ fields: [ { name: 'ts', diff --git a/public/app/plugins/datasource/testdata/nodeGraphUtils.ts b/public/app/plugins/datasource/testdata/nodeGraphUtils.ts index 564b70cad70..42c50fe563a 100644 --- a/public/app/plugins/datasource/testdata/nodeGraphUtils.ts +++ b/public/app/plugins/datasource/testdata/nodeGraphUtils.ts @@ -1,4 +1,11 @@ -import { FieldColorModeId, FieldDTO, FieldType, MutableDataFrame, NodeGraphDataFrameFieldNames } from '@grafana/data'; +import { + FieldColorModeId, + FieldDTO, + FieldType, + MutableDataFrame, + NodeGraphDataFrameFieldNames, + DataFrame, +} from '@grafana/data'; import { nodes, edges } from './testData/serviceMapResponse'; @@ -105,16 +112,17 @@ export function generateRandomNodes(count = 10) { meta: { preferredVisualisationType: 'nodeGraph' }, }); - const edgesFrame = new MutableDataFrame({ + const edgesFrame: DataFrame = { name: 'edges', fields: [ - { name: NodeGraphDataFrameFieldNames.id, values: [], type: FieldType.string }, - { name: NodeGraphDataFrameFieldNames.source, values: [], type: FieldType.string }, - { name: NodeGraphDataFrameFieldNames.target, values: [], type: FieldType.string }, - { name: NodeGraphDataFrameFieldNames.mainStat, values: [], type: FieldType.number }, + { name: NodeGraphDataFrameFieldNames.id, values: [], type: FieldType.string, config: {} }, + { name: NodeGraphDataFrameFieldNames.source, values: [], type: FieldType.string, config: {} }, + { name: NodeGraphDataFrameFieldNames.target, values: [], type: FieldType.string, config: {} }, + { name: NodeGraphDataFrameFieldNames.mainStat, values: [], type: FieldType.number, config: {} }, ], meta: { preferredVisualisationType: 'nodeGraph' }, - }); + length: 0, + }; const edgesSet = new Set(); for (const node of nodes) { @@ -140,6 +148,7 @@ export function generateRandomNodes(count = 10) { edgesFrame.fields[3].values.push(Math.random() * 100); } } + edgesFrame.length = edgesFrame.fields[0].values.length; return [nodeFrame, edgesFrame]; } diff --git a/public/app/plugins/datasource/zipkin/datasource.ts b/public/app/plugins/datasource/zipkin/datasource.ts index 0ea00fe33f0..01e525f0e34 100644 --- a/public/app/plugins/datasource/zipkin/datasource.ts +++ b/public/app/plugins/datasource/zipkin/datasource.ts @@ -8,7 +8,7 @@ import { DataSourceInstanceSettings, DataSourceJsonData, FieldType, - MutableDataFrame, + createDataFrame, ScopedVars, } from '@grafana/data'; import { BackendSrvRequest, FetchResponse, getBackendSrv, getTemplateSrv, TemplateSrv } from '@grafana/runtime'; @@ -127,7 +127,7 @@ function responseToDataQueryResponse(response: { data: ZipkinSpan[] }, nodeGraph const emptyDataQueryResponse = { data: [ - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'trace', diff --git a/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraph.test.tsx b/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraph.test.tsx index 0d1b51ba755..6641bf30c4c 100644 --- a/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraph.test.tsx +++ b/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraph.test.tsx @@ -1,7 +1,7 @@ import { fireEvent, render, screen } from '@testing-library/react'; import React, { useState } from 'react'; -import { CoreApp, MutableDataFrame } from '@grafana/data'; +import { CoreApp, createDataFrame } from '@grafana/data'; import { SelectedView } from '../types'; @@ -27,7 +27,7 @@ describe('FlameGraph', () => { const [search] = useState(''); const [selectedView, _] = useState(SelectedView.Both); - const flameGraphData = new MutableDataFrame(data); + const flameGraphData = createDataFrame(data); const container = new FlameGraphDataContainer(flameGraphData); const levels = nestedSetToLevels(container); diff --git a/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphMetadata.test.ts b/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphMetadata.test.ts index 2c1c2dcde10..482a7c4b637 100644 --- a/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphMetadata.test.ts +++ b/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphMetadata.test.ts @@ -1,10 +1,10 @@ -import { MutableDataFrame } from '@grafana/data'; +import { createDataFrame } from '@grafana/data'; import { getMetadata } from './FlameGraphMetadata'; import { FlameGraphDataContainer } from './dataTransform'; function makeDataFrame(fields: Record>, unit?: string) { - return new MutableDataFrame({ + return createDataFrame({ fields: Object.keys(fields).map((key) => ({ name: key, values: fields[key], diff --git a/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphTooltip.test.tsx b/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphTooltip.test.tsx index 087b2107503..8d7e256d3d3 100644 --- a/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphTooltip.test.tsx +++ b/public/app/plugins/panel/flamegraph/components/FlameGraph/FlameGraphTooltip.test.tsx @@ -1,10 +1,10 @@ -import { Field, FieldType, MutableDataFrame } from '@grafana/data'; +import { Field, FieldType, createDataFrame } from '@grafana/data'; import { getTooltipData } from './FlameGraphTooltip'; import { FlameGraphDataContainer } from './dataTransform'; function setupData(unit?: string) { - const flameGraphData = new MutableDataFrame({ + const flameGraphData = createDataFrame({ fields: [ { name: 'level', values: [0] }, unit ? makeField('value', unit, [8_624_078_250]) : { name: 'value', values: [8_624_078_250] }, diff --git a/public/app/plugins/panel/flamegraph/components/FlameGraph/dataTransform.test.ts b/public/app/plugins/panel/flamegraph/components/FlameGraph/dataTransform.test.ts index f6588c98de5..b9a68eea93a 100644 --- a/public/app/plugins/panel/flamegraph/components/FlameGraph/dataTransform.test.ts +++ b/public/app/plugins/panel/flamegraph/components/FlameGraph/dataTransform.test.ts @@ -1,10 +1,10 @@ -import { MutableDataFrame } from '@grafana/data'; +import { createDataFrame } from '@grafana/data'; import { FlameGraphDataContainer, nestedSetToLevels } from './dataTransform'; describe('nestedSetToLevels', () => { it('converts nested set data frame to levels', () => { - const frame = new MutableDataFrame({ + const frame = createDataFrame({ fields: [ { name: 'level', values: [0, 1, 2, 3, 2, 1, 2, 3, 4] }, { name: 'value', values: [10, 5, 3, 1, 1, 4, 3, 2, 1] }, @@ -33,7 +33,7 @@ describe('nestedSetToLevels', () => { }); it('converts nested set data if multiple same level items', () => { - const frame = new MutableDataFrame({ + const frame = createDataFrame({ fields: [ { name: 'level', values: [0, 1, 1, 1] }, { name: 'value', values: [10, 5, 3, 1] }, diff --git a/public/app/plugins/panel/flamegraph/components/FlameGraph/rendering.test.ts b/public/app/plugins/panel/flamegraph/components/FlameGraph/rendering.test.ts index 8a86199f505..3489e2f5378 100644 --- a/public/app/plugins/panel/flamegraph/components/FlameGraph/rendering.test.ts +++ b/public/app/plugins/panel/flamegraph/components/FlameGraph/rendering.test.ts @@ -1,10 +1,10 @@ -import { MutableDataFrame } from '@grafana/data'; +import { createDataFrame } from '@grafana/data'; import { FlameGraphDataContainer, LevelItem } from './dataTransform'; import { getRectDimensionsForLevel } from './rendering'; function makeDataFrame(fields: Record>) { - return new MutableDataFrame({ + return createDataFrame({ fields: Object.keys(fields).map((key) => ({ name: key, values: fields[key], diff --git a/public/app/plugins/panel/flamegraph/components/FlameGraphContainer.test.tsx b/public/app/plugins/panel/flamegraph/components/FlameGraphContainer.test.tsx index c3f5dc8f397..6cb815202ff 100644 --- a/public/app/plugins/panel/flamegraph/components/FlameGraphContainer.test.tsx +++ b/public/app/plugins/panel/flamegraph/components/FlameGraphContainer.test.tsx @@ -2,7 +2,7 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import React from 'react'; -import { CoreApp, MutableDataFrame } from '@grafana/data'; +import { CoreApp, createDataFrame } from '@grafana/data'; import { MIN_WIDTH_TO_SHOW_BOTH_TOPTABLE_AND_FLAMEGRAPH } from '../constants'; @@ -23,7 +23,7 @@ describe('FlameGraphContainer', () => { Object.defineProperty(HTMLElement.prototype, 'clientWidth', { value: 500 }); const FlameGraphContainerWithProps = () => { - const flameGraphData = new MutableDataFrame(data); + const flameGraphData = createDataFrame(data); flameGraphData.meta = { custom: { ProfileTypeID: 'cpu:foo:bar', diff --git a/public/app/plugins/panel/flamegraph/components/TopTable/FlameGraphTopTableContainer.test.tsx b/public/app/plugins/panel/flamegraph/components/TopTable/FlameGraphTopTableContainer.test.tsx index 1e823537ec4..b222b1964c9 100644 --- a/public/app/plugins/panel/flamegraph/components/TopTable/FlameGraphTopTableContainer.test.tsx +++ b/public/app/plugins/panel/flamegraph/components/TopTable/FlameGraphTopTableContainer.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import React, { useState } from 'react'; -import { CoreApp, MutableDataFrame } from '@grafana/data'; +import { CoreApp, createDataFrame } from '@grafana/data'; import { FlameGraphDataContainer, nestedSetToLevels } from '../FlameGraph/dataTransform'; import { data } from '../FlameGraph/testData/dataNestedSet'; @@ -14,7 +14,7 @@ describe('FlameGraphTopTableContainer', () => { const [search, setSearch] = useState(''); const [selectedView, _] = useState(SelectedView.Both); - const flameGraphData = new MutableDataFrame(data); + const flameGraphData = createDataFrame(data); const container = new FlameGraphDataContainer(flameGraphData); const levels = nestedSetToLevels(container); diff --git a/public/app/plugins/panel/logs/LogsPanel.test.tsx b/public/app/plugins/panel/logs/LogsPanel.test.tsx index 99ad2026a78..0581c91629e 100644 --- a/public/app/plugins/panel/logs/LogsPanel.test.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from '@testing-library/react'; import React, { ComponentProps } from 'react'; -import { LoadingState, MutableDataFrame, FieldType, LogsSortOrder } from '@grafana/data'; +import { LoadingState, createDataFrame, FieldType, LogsSortOrder } from '@grafana/data'; import { LogsPanel } from './LogsPanel'; @@ -10,7 +10,7 @@ type LogsPanelProps = ComponentProps; describe('LogsPanel', () => { describe('when returned series include common labels', () => { const seriesWithCommonLabels = [ - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'time', @@ -66,7 +66,7 @@ describe('LogsPanel', () => { }); describe('when returned series does not include common labels', () => { const seriesWithoutCommonLabels = [ - new MutableDataFrame({ + createDataFrame({ fields: [ { name: 'time', diff --git a/public/app/plugins/panel/nodeGraph/utils.test.ts b/public/app/plugins/panel/nodeGraph/utils.test.ts index 4bf9ddc09ab..58607b6b367 100644 --- a/public/app/plugins/panel/nodeGraph/utils.test.ts +++ b/public/app/plugins/panel/nodeGraph/utils.test.ts @@ -1,4 +1,4 @@ -import { DataFrame, FieldType, MutableDataFrame } from '@grafana/data'; +import { DataFrame, FieldType, createDataFrame } from '@grafana/data'; import { NodeDatum, NodeGraphOptions } from './types'; import { @@ -81,27 +81,27 @@ describe('processNodes', () => { it('detects dataframes correctly', () => { const validFrames = [ - new MutableDataFrame({ + createDataFrame({ refId: 'hasPreferredVisualisationType', fields: [], meta: { preferredVisualisationType: 'nodeGraph', }, }), - new MutableDataFrame({ + createDataFrame({ refId: 'hasName', fields: [], name: 'nodes', }), - new MutableDataFrame({ + createDataFrame({ refId: 'nodes', // hasRefId fields: [], }), - new MutableDataFrame({ + createDataFrame({ refId: 'hasValidNodesShape', fields: [{ name: 'id', type: FieldType.string }], }), - new MutableDataFrame({ + createDataFrame({ refId: 'hasValidEdgesShape', fields: [ { name: 'id', type: FieldType.string }, @@ -111,7 +111,7 @@ describe('processNodes', () => { }), ]; const invalidFrames = [ - new MutableDataFrame({ + createDataFrame({ refId: 'invalidData', fields: [], }), @@ -124,7 +124,7 @@ describe('processNodes', () => { }); it('getting fields is case insensitive', () => { - const nodeFrame = new MutableDataFrame({ + const nodeFrame = createDataFrame({ refId: 'nodes', fields: [ { name: 'id', type: FieldType.string, values: ['id'] }, @@ -142,7 +142,7 @@ describe('processNodes', () => { expect(nodeFields.mainStat).toBeDefined(); expect(nodeFields.secondaryStat).toBeDefined(); - const edgeFrame = new MutableDataFrame({ + const edgeFrame = createDataFrame({ refId: 'nodes', fields: [ { name: 'id', type: FieldType.string, values: ['id'] }, @@ -162,7 +162,7 @@ describe('processNodes', () => { it('interpolates panel options correctly', () => { const frames = [ - new MutableDataFrame({ + createDataFrame({ refId: 'nodes', fields: [ { name: 'id', type: FieldType.string }, @@ -173,7 +173,7 @@ describe('processNodes', () => { { name: 'arc__tertiary', type: FieldType.string }, ], }), - new MutableDataFrame({ + createDataFrame({ refId: 'edges', fields: [ { name: 'id', type: FieldType.string }, diff --git a/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.test.tsx b/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.test.tsx index cd3436bddf2..ab905506360 100644 --- a/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.test.tsx +++ b/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.test.tsx @@ -1,16 +1,15 @@ -import { MutableDataFrame, Field } from '@grafana/data/src'; -import { UPlotConfigBuilder } from '@grafana/ui/src'; +import { createDataFrame } from '@grafana/data'; +import { UPlotConfigBuilder } from '@grafana/ui'; import { getVisibleLabels, VisibleExemplarLabels } from './ExemplarsPlugin'; describe('getVisibleLabels()', () => { - const dataFrameSeries1 = new MutableDataFrame({ + const dataFrameSeries1 = createDataFrame({ name: 'tns/app', fields: [ { name: 'Time', values: [1670418750000, 1670418765000, 1670418780000, 1670418795000], - entities: {}, }, { name: 'Value', @@ -19,16 +18,14 @@ describe('getVisibleLabels()', () => { }, values: [0.018963114754098367, 0.019140624999999974, 0.019718309859154928, 0.020064189189189167], }, - ] as unknown as Field[], - length: 4, + ], }); - const dataFrameSeries2 = new MutableDataFrame({ + const dataFrameSeries2 = createDataFrame({ name: 'tns/db', fields: [ { name: 'Time', values: [1670418750000, 1670418765000, 1670418780000, 1670418795000], - entities: {}, }, { name: 'Value', @@ -37,16 +34,14 @@ describe('getVisibleLabels()', () => { }, values: [0.028963114754098367, 0.029140624999999974, 0.029718309859154928, 0.030064189189189167], }, - ] as unknown as Field[], - length: 4, + ], }); - const dataFrameSeries3 = new MutableDataFrame({ + const dataFrameSeries3 = createDataFrame({ name: 'tns/loadgen', fields: [ { name: 'Time', values: [1670418750000, 1670418765000, 1670418780000, 1670418795000], - entities: {}, }, { name: 'Value', @@ -55,8 +50,7 @@ describe('getVisibleLabels()', () => { }, values: [0.028963114754098367, 0.029140624999999974, 0.029718309859154928, 0.030064189189189167], }, - ] as unknown as Field[], - length: 4, + ], }); const frames = [dataFrameSeries1, dataFrameSeries2, dataFrameSeries3]; const config: UPlotConfigBuilder = { diff --git a/public/app/plugins/panel/timeseries/utils.test.ts b/public/app/plugins/panel/timeseries/utils.test.ts index 07ca5d1faf9..78af574e426 100644 --- a/public/app/plugins/panel/timeseries/utils.test.ts +++ b/public/app/plugins/panel/timeseries/utils.test.ts @@ -1,4 +1,4 @@ -import { createTheme, FieldType, MutableDataFrame, toDataFrame } from '@grafana/data'; +import { createTheme, FieldType, createDataFrame, toDataFrame } from '@grafana/data'; import { prepareGraphableFields } from './utils'; @@ -76,7 +76,7 @@ describe('prepare timeseries graph', () => { }); it('will convert NaN and Infinty to nulls', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ fields: [ { name: 'time', type: FieldType.time, values: [995, 9996, 9997, 9998, 9999] }, { name: 'a', values: [-10, NaN, 10, -Infinity, +Infinity] }, @@ -97,7 +97,7 @@ describe('prepare timeseries graph', () => { }); it('will insert nulls given an interval value', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ fields: [ { name: 'time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 6] }, { name: 'a', values: [1, 2, 3] }, @@ -121,7 +121,7 @@ describe('prepare timeseries graph', () => { }); it('will insert and convert nulls to a configure "no value" value', () => { - const df = new MutableDataFrame({ + const df = createDataFrame({ fields: [ { name: 'time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 6] }, { name: 'a', config: { noValue: '20' }, values: [1, 2, 3] },