From 7cf2733e12333d72801348b6eb144b741840f924 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Mon, 5 Jun 2023 14:35:04 +0100 Subject: [PATCH] [v10.0.x] Loki: Fix error when empty template variables response (#69559) Loki: Fix error when empty template variables response (#69373) * Loki: Fix error when empty template variables * Update * Add test * Add test for statsMetadataRequest (cherry picked from commit 3150d804288b18d7c59bf3db66c32c32c29beb76) Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> --- .../datasource/loki/datasource.test.ts | 20 ++++++++++++++++++- .../app/plugins/datasource/loki/datasource.ts | 18 +++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/datasource/loki/datasource.test.ts b/public/app/plugins/datasource/loki/datasource.test.ts index ff23e68c88c..577e74d47e6 100644 --- a/public/app/plugins/datasource/loki/datasource.test.ts +++ b/public/app/plugins/datasource/loki/datasource.test.ts @@ -32,7 +32,7 @@ import { LokiDatasource, REF_ID_DATA_SAMPLES } from './datasource'; import { createLokiDatasource, createMetadataRequest } from './mocks'; import { runSplitQuery } from './querySplitting'; import { parseToNodeNamesArray } from './queryUtils'; -import { LokiOptions, LokiQuery, LokiQueryType, LokiVariableQueryType, SupportingQueryType } from './types'; +import { LokiOptions, LokiQuery, LokiQueryType, LokiVariableQueryType, QueryStats, SupportingQueryType } from './types'; import { LokiVariableSupport } from './variables'; jest.mock('@grafana/runtime', () => { @@ -1139,6 +1139,24 @@ describe('LokiDatasource', () => { }); }); }); + + describe('getQueryStats', () => { + it('uses statsMetadataRequest', async () => { + const ds = createLokiDatasource(templateSrvStub); + const spy = jest.spyOn(ds, 'statsMetadataRequest').mockResolvedValue({} as QueryStats); + ds.getQueryStats('{foo="bar"}'); + expect(spy).toHaveBeenCalled(); + }); + }); + + describe('statsMetadataRequest', () => { + it('throws error if url starts with /', () => { + const ds = createLokiDatasource(); + expect(async () => { + await ds.statsMetadataRequest('/index'); + }).rejects.toThrow('invalid metadata request url: /index'); + }); + }); }); describe('applyTemplateVariables', () => { diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index 889a5632c79..9266652e9bc 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -419,7 +419,21 @@ export class LokiDatasource } const res = await this.getResource(url, params, options); - return res.data ?? (res || []); + return res.data || []; + } + + // We need a specific metadata method for stats endpoint as it does not return res.data, + // but it returns stats directly in res object. + async statsMetadataRequest( + url: string, + params?: Record, + options?: Partial + ): Promise { + if (url.startsWith('/')) { + throw new Error(`invalid metadata request url: ${url}`); + } + + return await this.getResource(url, params, options); } async getQueryStats(query: string): Promise { @@ -435,7 +449,7 @@ export class LokiDatasource for (const labelMatcher of labelMatchers) { try { - const data = await this.metadataRequest( + const data = await this.statsMetadataRequest( 'index/stats', { query: labelMatcher, start, end }, { showErrorAlert: false }