From b0925ed4ee822645729ddc294d07b0cf54f04346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Thu, 2 Jun 2022 11:13:57 +0200 Subject: [PATCH] Loki: do not produce histogram for instant queries (#50019) * loki: no histogram for instant queries * added test --- .../datasource/loki/datasource.test.ts | 11 +++++++- .../app/plugins/datasource/loki/datasource.ts | 28 +++++++++++-------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/public/app/plugins/datasource/loki/datasource.test.ts b/public/app/plugins/datasource/loki/datasource.test.ts index 1919f610ee2..515e773d9e2 100644 --- a/public/app/plugins/datasource/loki/datasource.test.ts +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -25,7 +25,7 @@ import { CustomVariableModel } from '../../../features/variables/types'; import { isMetricsQuery, LokiDatasource, RangeQueryOptions } from './datasource'; import { makeMockLokiDatasource } from './mocks'; -import { LokiQuery, LokiResponse, LokiResultType } from './types'; +import { LokiQuery, LokiQueryType, LokiResponse, LokiResultType } from './types'; jest.mock('@grafana/runtime', () => ({ // @ts-ignore @@ -997,6 +997,15 @@ describe('LokiDatasource', () => { expect(ds.getLogsVolumeDataProvider(options)).toBeDefined(); }); + + it('does not create provider if there is only an instant logs query', () => { + const ds = createLokiDSForTests(); + const options = getQueryOptions({ + targets: [{ expr: '{label=value', refId: 'A', queryType: LokiQueryType.Instant }], + }); + + expect(ds.getLogsVolumeDataProvider(options)).not.toBeDefined(); + }); }); describe('importing queries', () => { diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index 828b3be499b..f051816185e 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -141,22 +141,28 @@ export class LokiDatasource } getLogsVolumeDataProvider(request: DataQueryRequest): Observable | undefined { - const isLogsVolumeAvailable = request.targets.some((target) => target.expr && !isMetricsQuery(target.expr)); + const isQuerySuitable = (query: LokiQuery) => { + const normalized = getNormalizedLokiQuery(query); + const { expr } = normalized; + // it has to be a logs-producing range-query + return expr && !isMetricsQuery(expr) && normalized.queryType === LokiQueryType.Range; + }; + + const isLogsVolumeAvailable = request.targets.some(isQuerySuitable); + if (!isLogsVolumeAvailable) { return undefined; } const logsVolumeRequest = cloneDeep(request); - logsVolumeRequest.targets = logsVolumeRequest.targets - .filter((target) => target.expr && !isMetricsQuery(target.expr)) - .map((target) => { - return { - ...target, - instant: false, - volumeQuery: true, - expr: `sum by (level) (count_over_time(${target.expr}[$__interval]))`, - }; - }); + logsVolumeRequest.targets = logsVolumeRequest.targets.filter(isQuerySuitable).map((target) => { + return { + ...target, + instant: false, + volumeQuery: true, + expr: `sum by (level) (count_over_time(${target.expr}[$__interval]))`, + }; + }); return queryLogsVolume(this, logsVolumeRequest, { extractLevel,