From 19d4213df6b9975c508390373b2df5ac55426349 Mon Sep 17 00:00:00 2001 From: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Date: Tue, 7 Sep 2021 09:44:45 -0400 Subject: [PATCH] Prometheus: Fix validate selector in metrics browser (#38921) * Fix match[] param in loki and prometheus * Update loki series match param --- public/app/plugins/datasource/loki/datasource.ts | 2 +- .../datasource/loki/language_provider.test.ts | 15 +++++++++++++++ .../plugins/datasource/loki/language_provider.ts | 4 ++-- public/app/plugins/datasource/loki/mocks.ts | 10 +++++----- .../prometheus/language_provider.test.ts | 15 +++++++++++++++ .../datasource/prometheus/language_provider.ts | 2 +- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index eb431ca3d0b..7dd20585c40 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -375,7 +375,7 @@ export class LokiDatasource extends DataSourceApi { const timeParams = this.getTimeRangeParams(); const params = { ...timeParams, - match: expr, + 'match[]': expr, }; const url = `${LOKI_ENDPOINT}/series`; const streams = new Set(); diff --git a/public/app/plugins/datasource/loki/language_provider.test.ts b/public/app/plugins/datasource/loki/language_provider.test.ts index 9d162ac7db0..e09f5045c2d 100644 --- a/public/app/plugins/datasource/loki/language_provider.test.ts +++ b/public/app/plugins/datasource/loki/language_provider.test.ts @@ -87,6 +87,21 @@ describe('Language completion provider', () => { }); }); + describe('fetchSeries', () => { + it('should use match[] parameter', () => { + const datasource = makeMockLokiDatasource({}, { '{foo="bar"}': [{ label1: 'label_val1' }] }); + const languageProvider = new LanguageProvider(datasource); + const fetchSeries = languageProvider.fetchSeries; + const requestSpy = jest.spyOn(languageProvider, 'request'); + fetchSeries('{job="grafana"}'); + expect(requestSpy).toHaveBeenCalledWith('/loki/api/v1/series', { + end: 1560163909000, + 'match[]': '{job="grafana"}', + start: 1560153109000, + }); + }); + }); + describe('label key suggestions', () => { it('returns all label suggestions on empty selector', async () => { const datasource = makeMockLokiDatasource({ label1: [], label2: [] }); diff --git a/public/app/plugins/datasource/loki/language_provider.ts b/public/app/plugins/datasource/loki/language_provider.ts index a5fd487f3f7..855281b762f 100644 --- a/public/app/plugins/datasource/loki/language_provider.ts +++ b/public/app/plugins/datasource/loki/language_provider.ts @@ -454,7 +454,7 @@ export default class LokiLanguageProvider extends LanguageProvider { if (!value) { // Clear value when requesting new one. Empty object being truthy also makes sure we don't request twice. this.seriesCache.set(cacheKey, {}); - const params = { match, start, end }; + const params = { 'match[]': match, start, end }; const data = await this.request(url, params); const { values } = processLabels(data); value = values; @@ -470,7 +470,7 @@ export default class LokiLanguageProvider extends LanguageProvider { fetchSeries = async (match: string): Promise>> => { const url = '/loki/api/v1/series'; const { start, end } = this.datasource.getTimeRangeParams(); - const params = { match, start, end }; + const params = { 'match[]': match, start, end }; return await this.request(url, params); }; diff --git a/public/app/plugins/datasource/loki/mocks.ts b/public/app/plugins/datasource/loki/mocks.ts index 6b565f63d9e..d2849697227 100644 --- a/public/app/plugins/datasource/loki/mocks.ts +++ b/public/app/plugins/datasource/loki/mocks.ts @@ -1,5 +1,5 @@ import { LokiDatasource, LOKI_ENDPOINT } from './datasource'; -import { AbsoluteTimeRange, DataSourceSettings } from '@grafana/data'; +import { DataSourceSettings } from '@grafana/data'; import { LokiOptions } from './types'; import { createDatasourceSettings } from '../../../features/datasources/mocks'; @@ -20,9 +20,9 @@ export function makeMockLokiDatasource(labelsAndValues: Labels, series?: SeriesF const lokiSeriesEndpointRegex = /^\/loki\/api\/v1\/series/; const lokiLabelsEndpoint = `${LOKI_ENDPOINT}/label`; - const rangeMock: AbsoluteTimeRange = { - from: 1560153109000, - to: 1560163909000, + const rangeMock = { + start: 1560153109000, + end: 1560163909000, }; const labels = Object.keys(labelsAndValues); @@ -37,7 +37,7 @@ export function makeMockLokiDatasource(labelsAndValues: Labels, series?: SeriesF if (labelsMatch) { return labelsAndValues[labelsMatch[1]] || []; } else if (seriesMatch && series && params) { - return series[params.match] || []; + return series[params['match[]']] || []; } else { throw new Error(`Unexpected url error, ${url}`); } diff --git a/public/app/plugins/datasource/prometheus/language_provider.test.ts b/public/app/plugins/datasource/prometheus/language_provider.test.ts index e1a3a485268..99a0f1d5fb8 100644 --- a/public/app/plugins/datasource/prometheus/language_provider.test.ts +++ b/public/app/plugins/datasource/prometheus/language_provider.test.ts @@ -64,6 +64,21 @@ describe('Language completion provider', () => { }); }); + describe('fetchSeries', () => { + it('should use match[] parameter', () => { + const languageProvider = new LanguageProvider(datasource); + const fetchSeries = languageProvider.fetchSeries; + const requestSpy = jest.spyOn(languageProvider, 'request'); + fetchSeries('{job="grafana"}'); + expect(requestSpy).toHaveBeenCalled(); + expect(requestSpy).toHaveBeenCalledWith( + '/api/v1/series', + {}, + { end: '1', 'match[]': '{job="grafana"}', start: '0' } + ); + }); + }); + describe('empty query suggestions', () => { it('returns no suggestions on empty context', async () => { const instance = new LanguageProvider(datasource); diff --git a/public/app/plugins/datasource/prometheus/language_provider.ts b/public/app/plugins/datasource/prometheus/language_provider.ts index 120ca45825b..5ef53a53c9f 100644 --- a/public/app/plugins/datasource/prometheus/language_provider.ts +++ b/public/app/plugins/datasource/prometheus/language_provider.ts @@ -494,7 +494,7 @@ export default class PromQlLanguageProvider extends LanguageProvider { fetchSeries = async (match: string): Promise>> => { const url = '/api/v1/series'; const range = this.datasource.getTimeRangeParams(); - const params = { ...range, match }; + const params = { ...range, 'match[]': match }; return await this.request(url, {}, params); };