From 6a72d97265edf71de458f5ba188db8ff99db6e13 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Mon, 31 Jan 2022 15:40:58 -0800 Subject: [PATCH] TestData: support raw results in the raw frames editor (#44609) --- .../src/dataframe/DataFrameJSON.ts | 1 - .../src/dataframe/processDataFrame.ts | 2 +- pkg/tsdb/testdatasource/scenarios.go | 2 +- .../testdata/components/RawFrameEditor.tsx | 70 +++++++++++++++---- .../plugins/datasource/testdata/datasource.ts | 9 ++- 5 files changed, 67 insertions(+), 17 deletions(-) diff --git a/packages/grafana-data/src/dataframe/DataFrameJSON.ts b/packages/grafana-data/src/dataframe/DataFrameJSON.ts index ae80255cf90..98fbd050903 100644 --- a/packages/grafana-data/src/dataframe/DataFrameJSON.ts +++ b/packages/grafana-data/src/dataframe/DataFrameJSON.ts @@ -153,7 +153,6 @@ export function dataFrameFromJSON(dto: DataFrameJSON): DataFrame { // Find the longest field length const length = data ? data.values.reduce((max, vals) => Math.max(max, vals.length), 0) : 0; - const fields = schema.fields.map((f, index) => { let buffer = data ? data.values[index] : []; let origLen = buffer.length; diff --git a/packages/grafana-data/src/dataframe/processDataFrame.ts b/packages/grafana-data/src/dataframe/processDataFrame.ts index 954e6f29780..d3478cac95b 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.ts @@ -308,7 +308,7 @@ export const isDataFrame = (data: any): data is DataFrame => data && data.hasOwn export function toDataFrame(data: any): DataFrame { if ('fields' in data) { // DataFrameDTO does not have length - if ('length' in data) { + if ('length' in data && data.fields[0]?.values?.get) { return data as DataFrame; } diff --git a/pkg/tsdb/testdatasource/scenarios.go b/pkg/tsdb/testdatasource/scenarios.go index c73377f9382..b93cfe0ae9b 100644 --- a/pkg/tsdb/testdatasource/scenarios.go +++ b/pkg/tsdb/testdatasource/scenarios.go @@ -195,7 +195,7 @@ Timestamps will line up evenly on timeStepSeconds (For example, 60 seconds means s.registerScenario(&Scenario{ ID: string(rawFrameQuery), - Name: "Raw Frame", + Name: "Raw Frames", }) s.registerScenario(&Scenario{ diff --git a/public/app/plugins/datasource/testdata/components/RawFrameEditor.tsx b/public/app/plugins/datasource/testdata/components/RawFrameEditor.tsx index b08b87b76d1..ea2ff4d7af9 100644 --- a/public/app/plugins/datasource/testdata/components/RawFrameEditor.tsx +++ b/public/app/plugins/datasource/testdata/components/RawFrameEditor.tsx @@ -1,21 +1,67 @@ -import React from 'react'; -import { InlineField, TextArea } from '@grafana/ui'; +import React, { useState } from 'react'; +import { Alert, CodeEditor } from '@grafana/ui'; import { EditorProps } from '../QueryEditor'; +import { isArray } from 'lodash'; +import { toDataQueryResponse } from '@grafana/runtime'; +import { dataFrameToJSON, toDataFrame, toDataFrameDTO } from '@grafana/data'; export const RawFrameEditor = ({ onChange, query }: EditorProps) => { - const onContent = (rawFrameContent: string) => { - onChange({ ...query, rawFrameContent }); + const [error, setError] = useState(); + const [warning, setWarning] = useState(); + + const onSaveFrames = (rawFrameContent: string) => { + try { + const json = JSON.parse(rawFrameContent); + if (isArray(json)) { + setError(undefined); + setWarning(undefined); + onChange({ ...query, rawFrameContent }); + return; + } + + let data: any = undefined; + + // Copy paste from panel json + if (isArray(json.series) && json.state) { + data = json.series.map((v: any) => toDataFrameDTO(toDataFrame(v))); + } else { + // Chek if it is a copy of the raw resuls + const v = toDataQueryResponse({ data: json }); + if (v.data?.length && !v.error) { + data = v.data.map((f) => dataFrameToJSON(f)); + } + } + + if (data) { + console.log('Original', json); + console.log('Save', data); + setError(undefined); + setWarning('Converted to direct frame result'); + onChange({ ...query, rawFrameContent: JSON.stringify(data, null, 2) }); + return; + } + + setError('Unable to read dataframes in text'); + } catch (e) { + console.log('Error parsing json', e); + setError('Enter JSON array of data frames (or raw query results body)'); + setWarning(undefined); + } }; return ( - -