diff --git a/pkg/tsdb/testdatasource/scenarios.go b/pkg/tsdb/testdatasource/scenarios.go index 1c4e5b4d26f..e49d760cef2 100644 --- a/pkg/tsdb/testdatasource/scenarios.go +++ b/pkg/tsdb/testdatasource/scenarios.go @@ -177,9 +177,12 @@ Timestamps will line up evenly on timeStepSeconds (For example, 60 seconds means }) s.registerScenario(&Scenario{ - ID: string(serverError500Query), - Name: "Server Error (500)", - handler: s.handleServerError500Scenario, + // Is no longer strictly a _server_ error scenario, but ID is kept for legacy :) + ID: string(serverError500Query), + Name: "Conditional Error", + handler: s.handleServerError500Scenario, + StringInput: "1,20,90,30,5,0", + Description: "Returns an error when the String Input field is empty", }) s.registerScenario(&Scenario{ @@ -449,7 +452,19 @@ func (s *Service) handlePredictablePulseScenario(ctx context.Context, req *backe } func (s *Service) handleServerError500Scenario(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { - panic("Test Data Panic!") + for _, q := range req.Queries { + model, err := simplejson.NewJson(q.JSON) + if err != nil { + continue + } + + stringInput := model.Get("stringInput").MustString() + if stringInput == "" { + panic("Test Data Panic!") + } + } + + return s.handleCSVMetricValuesScenario(ctx, req) } func (s *Service) handleClientSideScenario(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { diff --git a/public/app/plugins/datasource/testdata/QueryEditor.tsx b/public/app/plugins/datasource/testdata/QueryEditor.tsx index f3590a6ed14..a10116b875f 100644 --- a/public/app/plugins/datasource/testdata/QueryEditor.tsx +++ b/public/app/plugins/datasource/testdata/QueryEditor.tsx @@ -21,6 +21,7 @@ import { defaultStreamQuery } from './runStreams'; import { CSVFileEditor } from './components/CSVFileEditor'; import { CSVContentEditor } from './components/CSVContentEditor'; import { USAQueryEditor, usaQueryModes } from './components/USAQueryEditor'; +import ErrorEditor from './components/ErrorEditor'; const showLabelsFor = ['random_walk', 'predictable_pulse']; const endpoints = [ @@ -69,6 +70,7 @@ export const QueryEditor = ({ query, datasource, onChange, onRunQuery }: Props) [scenarioList, query] ); const scenarioId = currentScenario?.id; + const description = currentScenario?.description; const onScenarioChange = (item: SelectableValue) => { const scenario = scenarioList?.find((sc) => sc.id === item.value); @@ -287,6 +289,9 @@ export const QueryEditor = ({ query, datasource, onChange, onRunQuery }: Props) {scenarioId === 'node_graph' && ( onChange({ ...query, nodes: val })} query={query} /> )} + {scenarioId === 'server_error_500' && } + + {description &&

{description}

} ); }; diff --git a/public/app/plugins/datasource/testdata/components/ErrorEditor.tsx b/public/app/plugins/datasource/testdata/components/ErrorEditor.tsx new file mode 100644 index 00000000000..a8447118a88 --- /dev/null +++ b/public/app/plugins/datasource/testdata/components/ErrorEditor.tsx @@ -0,0 +1,36 @@ +import { InlineField, InlineFieldRow, Select } from '@grafana/ui'; +import React from 'react'; +import { EditorProps } from '../QueryEditor'; + +const ERROR_OPTIONS = [ + { + label: 'Server panic', + value: 'server_panic', + }, + { + label: 'Frontend exception', + value: 'frontend_exception', + }, + { + label: 'Frontend observable', + value: 'frontend_observable', + }, +]; + +const FrontendErrorQueryEditor: React.FC = ({ query, onChange }) => { + return ( + + +