diff --git a/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx b/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx index e0abf6b80db..bf459cf6ab4 100644 --- a/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx +++ b/public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx @@ -34,7 +34,7 @@ export const LokiQueryEditor = React.memo((props) => { const [queryPatternsModalOpen, setQueryPatternsModalOpen] = useState(false); const [dataIsStale, setDataIsStale] = useState(false); const [labelBrowserVisible, setLabelBrowserVisible] = useState(false); - const [queryStats, setQueryStats] = useState(); + const [queryStats, setQueryStats] = useState(null); const { flag: explain, setFlag: setExplain } = useFlag(lokiQueryEditorExplainKey); const timerange = datasource.getTimeRange(); diff --git a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx index 0cae11d26e3..caf85fde0c5 100644 --- a/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx +++ b/public/app/plugins/datasource/loki/components/monaco-query-field/MonacoQueryField.tsx @@ -9,8 +9,6 @@ import { selectors } from '@grafana/e2e-selectors'; import { languageConfiguration, monarchlanguage } from '@grafana/monaco-logql'; import { useTheme2, ReactMonacoEditor, Monaco, monacoTypes, MonacoEditor } from '@grafana/ui'; -import { isValidQuery } from '../../queryUtils'; - import { Props } from './MonacoQueryFieldProps'; import { getOverrideServices } from './getOverrideServices'; import { getCompletionProvider, getSuggestOptions } from './monaco-completion-provider'; @@ -153,7 +151,7 @@ const MonacoQueryField = ({ }; const onTypeDebounced = debounce(async (query: string) => { - if (!onQueryType || (isValidQuery(query) === false && query !== '')) { + if (!onQueryType) { return; } diff --git a/public/app/plugins/datasource/loki/components/stats.test.ts b/public/app/plugins/datasource/loki/components/stats.test.ts index 86849ac0e34..149175f40a8 100644 --- a/public/app/plugins/datasource/loki/components/stats.test.ts +++ b/public/app/plugins/datasource/loki/components/stats.test.ts @@ -54,15 +54,20 @@ describe('shouldUpdateStats', () => { describe('makeStatsRequest', () => { const datasource = createLokiDatasource(); - it('should return undefined if there is no query', () => { + it('should return null if there is no query', () => { const query = ''; - expect(getStats(datasource, query)).resolves.toBe(undefined); // change + expect(getStats(datasource, query)).resolves.toBe(null); }); - it('should return undefined if the response has no data', () => { + it('should return null if the query is invalid', () => { + const query = '{job="grafana",'; + expect(getStats(datasource, query)).resolves.toBe(null); + }); + + it('should return null if the response has no data', () => { const query = '{job="grafana"}'; datasource.getQueryStats = jest.fn().mockResolvedValue({ streams: 0, chunks: 0, bytes: 0, entries: 0 }); - expect(getStats(datasource, query)).resolves.toBe(undefined); + expect(getStats(datasource, query)).resolves.toBe(null); }); it('should return the stats if the response has data', () => { diff --git a/public/app/plugins/datasource/loki/components/stats.ts b/public/app/plugins/datasource/loki/components/stats.ts index d68314cd21d..0eaca03c350 100644 --- a/public/app/plugins/datasource/loki/components/stats.ts +++ b/public/app/plugins/datasource/loki/components/stats.ts @@ -3,13 +3,18 @@ import { DateTime, isDateTime, TimeRange } from '@grafana/data'; import { LokiDatasource } from '../datasource'; import { QueryStats } from '../types'; -export async function getStats(datasource: LokiDatasource, query: string): Promise { +export async function getStats(datasource: LokiDatasource, query: string): Promise { if (!query) { - return undefined; + return null; } const response = await datasource.getQueryStats(query); - return Object.values(response).every((v) => v === 0) ? undefined : response; + + if (!response) { + return null; + } + + return Object.values(response).every((v) => v === 0) ? null : response; } /** diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index e65b09fc2af..f615db3e723 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -419,7 +419,12 @@ export class LokiDatasource return res.data ?? (res || []); } - async getQueryStats(query: string): Promise { + async getQueryStats(query: string): Promise { + // if query is invalid, clear stats, and don't request + if (!isValidQuery(query)) { + return undefined; + } + const { start, end } = this.getTimeRangeParams(); const labelMatchers = getStreamSelectorsFromQuery(query); diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx index 12ee13f284c..83874e9d541 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryBuilderOptions.tsx @@ -18,7 +18,7 @@ export interface Props { maxLines: number; app?: CoreApp; datasource: LokiDatasource; - queryStats: QueryStats | undefined; + queryStats: QueryStats | null; } export const LokiQueryBuilderOptions = React.memo( diff --git a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx index d4a7c3edb80..07d5ea9f412 100644 --- a/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx +++ b/public/app/plugins/datasource/loki/querybuilder/components/LokiQueryCodeEditor.tsx @@ -14,7 +14,7 @@ import { LokiQueryBuilderExplained } from './LokiQueryBuilderExplained'; type Props = LokiQueryEditorProps & { showExplain: boolean; - setQueryStats: React.Dispatch>; + setQueryStats: React.Dispatch>; }; export function LokiQueryCodeEditor({ diff --git a/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup.tsx b/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup.tsx index 9e093588bf0..fe6fd638ec4 100644 --- a/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup.tsx +++ b/public/app/plugins/datasource/prometheus/querybuilder/shared/QueryOptionGroup.tsx @@ -10,7 +10,7 @@ import { QueryStats } from 'app/plugins/datasource/loki/types'; export interface Props { title: string; collapsedInfo: string[]; - queryStats?: QueryStats; + queryStats?: QueryStats | null; children: React.ReactNode; }