From 8ddf6de6e7b95ad2e2c5614b66adc31f441de6af Mon Sep 17 00:00:00 2001 From: Marcus Andersson Date: Wed, 19 May 2021 16:24:27 +0200 Subject: [PATCH] Alerting: app specific query editors for Loki and Prometheus (#34365) * Adding simplified version of query editor based on app flag. * cleaned up the absolute time range. * changing placeholder text. * updated snapshot. * added some tests. * adding loki query editor tests. * updating snapshots. --- packages/grafana-data/src/types/app.ts | 1 + packages/grafana-data/src/types/datasource.ts | 1 + .../rule-editor/ExpressionEditor.tsx | 68 +++++++++++++++++-- .../components/AnnotationsQueryEditor.tsx | 7 -- .../components/LokiExploreQueryEditor.tsx | 4 +- .../loki/components/LokiQueryEditor.tsx | 19 +++--- .../components/LokiQueryEditorByApp.test.tsx | 59 ++++++++++++++++ .../loki/components/LokiQueryEditorByApp.tsx | 18 +++++ .../components/LokiQueryEditorForAlerting.tsx | 25 +++++++ .../loki/components/LokiQueryField.tsx | 20 ++++-- .../LokiExploreQueryEditor.test.tsx.snap | 6 -- .../LokiQueryEditor.test.tsx.snap | 14 +--- .../datasource/loki/components/types.ts | 5 ++ public/app/plugins/datasource/loki/module.ts | 4 +- .../prometheus/components/PromQueryEditor.tsx | 17 +++-- .../components/PromQueryEditorByApp.test.tsx | 64 +++++++++++++++++ .../components/PromQueryEditorByApp.tsx | 18 +++++ .../components/PromQueryEditorForAlerting.tsx | 25 +++++++ .../prometheus/components/PromQueryField.tsx | 11 ++- .../PromQueryEditor.test.tsx.snap | 1 + .../datasource/prometheus/components/types.ts | 5 ++ .../plugins/datasource/prometheus/module.ts | 4 +- .../plugins/datasource/tempo/QueryField.tsx | 5 +- 23 files changed, 333 insertions(+), 68 deletions(-) create mode 100644 public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.test.tsx create mode 100644 public/app/plugins/datasource/loki/components/LokiQueryEditorByApp.tsx create mode 100644 public/app/plugins/datasource/loki/components/LokiQueryEditorForAlerting.tsx create mode 100644 public/app/plugins/datasource/loki/components/types.ts create mode 100644 public/app/plugins/datasource/prometheus/components/PromQueryEditorByApp.test.tsx create mode 100644 public/app/plugins/datasource/prometheus/components/PromQueryEditorByApp.tsx create mode 100644 public/app/plugins/datasource/prometheus/components/PromQueryEditorForAlerting.tsx create mode 100644 public/app/plugins/datasource/prometheus/components/types.ts diff --git a/packages/grafana-data/src/types/app.ts b/packages/grafana-data/src/types/app.ts index 4f0c9ff4cec..2324eb3c741 100644 --- a/packages/grafana-data/src/types/app.ts +++ b/packages/grafana-data/src/types/app.ts @@ -7,6 +7,7 @@ export enum CoreApp { Dashboard = 'dashboard', Explore = 'explore', Unknown = 'unknown', + CloudAlerting = 'cloud-alerting', } export interface AppRootProps { diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index b0474f75acc..e314518bf54 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -367,6 +367,7 @@ export interface QueryEditorProps< exploreId?: any; history?: HistoryItem[]; queries?: DataQuery[]; + app?: CoreApp; } // TODO: not really needed but used as type in some data sources and in DataQueryRequest diff --git a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx index bd9e04dc907..7d7906a1c7b 100644 --- a/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx @@ -1,5 +1,10 @@ -import { TextArea } from '@grafana/ui'; -import React, { FC } from 'react'; +import React, { FC, useCallback, useMemo, useState } from 'react'; +import { noop } from 'lodash'; +import { CoreApp, DataQuery } from '@grafana/data'; +import { getDataSourceSrv } from '@grafana/runtime'; +import { useAsync } from 'react-use'; +import { PromQuery } from 'app/plugins/datasource/prometheus/types'; +import { LokiQuery } from 'app/plugins/datasource/loki/types'; interface Props { value?: string; @@ -7,13 +12,62 @@ interface Props { dataSourceName: string; // will be a prometheus or loki datasource } -// @TODO implement proper prom/loki query editor here export const ExpressionEditor: FC = ({ value, onChange, dataSourceName }) => { + const { mapToValue, mapToQuery } = useQueryMappers(dataSourceName); + const [query, setQuery] = useState(mapToQuery({ refId: 'A', hide: false }, value)); + const { error, loading, value: dataSource } = useAsync(() => { + return getDataSourceSrv().get(dataSourceName); + }, [dataSourceName]); + + const onChangeQuery = useCallback( + (query: DataQuery) => { + setQuery(query); + onChange(mapToValue(query)); + }, + [onChange, mapToValue] + ); + + if (loading || dataSource?.name !== dataSourceName) { + return null; + } + + if (error || !dataSource || !dataSource?.components?.QueryEditor) { + const errorMessage = error?.message || 'Data source plugin does not export any Query Editor component'; + return
Could not load query editor due to: {errorMessage}
; + } + + const QueryEditor = dataSource?.components?.QueryEditor; + return ( -