From efdfa29fe281945193a5f4072ac4550285049c13 Mon Sep 17 00:00:00 2001 From: Darren Janeczek <38694490+darrenjaneczek@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:36:06 -0500 Subject: [PATCH] fix: `label_values` w/ empty filters in prom datasource variable query (#78242) * fix: handle empty filters in prometheus datasource variable query function `label_values` --- .../prometheus/metric_find_query.test.ts | 24 +++++++++++++++++++ .../prometheus/metric_find_query.ts | 14 ++++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/public/app/plugins/datasource/prometheus/metric_find_query.test.ts b/public/app/plugins/datasource/prometheus/metric_find_query.test.ts index 3a9a777ad8b..4646150f2ce 100644 --- a/public/app/plugins/datasource/prometheus/metric_find_query.test.ts +++ b/public/app/plugins/datasource/prometheus/metric_find_query.test.ts @@ -104,6 +104,30 @@ describe('PrometheusMetricFindQuery', () => { }); }); + const emptyFilters = ['{}', '{ }', ' { } ', ' {} ']; + + emptyFilters.forEach((emptyFilter) => { + const queryString = `label_values(${emptyFilter}, resource)`; + it(`Empty filter, query, ${queryString} should just generate label search query`, async () => { + const query = setupMetricFindQuery({ + query: queryString, + response: { + data: ['value1', 'value2', 'value3'], + }, + }); + const results = await query.process(raw); + + expect(results).toHaveLength(3); + expect(fetchMock).toHaveBeenCalledTimes(1); + expect(fetchMock).toHaveBeenCalledWith({ + method: 'GET', + url: `/api/datasources/uid/ABCDEF/resources/api/v1/label/resource/values?start=${raw.from.unix()}&end=${raw.to.unix()}`, + hideFromInspector: true, + headers: {}, + }); + }); + }); + // it('label_values(metric, resource) should generate series query with correct time', async () => { const query = setupMetricFindQuery({ diff --git a/public/app/plugins/datasource/prometheus/metric_find_query.ts b/public/app/plugins/datasource/prometheus/metric_find_query.ts index c4383540212..36cb5ed4715 100644 --- a/public/app/plugins/datasource/prometheus/metric_find_query.ts +++ b/public/app/plugins/datasource/prometheus/metric_find_query.ts @@ -48,10 +48,13 @@ export default class PrometheusMetricFindQuery { const labelValuesQuery = this.query.match(labelValuesRegex); if (labelValuesQuery) { - if (labelValuesQuery[1]) { - return this.labelValuesQuery(labelValuesQuery[2], labelValuesQuery[1]); + const filter = labelValuesQuery[1]; + const label = labelValuesQuery[2]; + if (isFilterDefined(filter)) { + return this.labelValuesQuery(label, filter); } else { - return this.labelValuesQuery(labelValuesQuery[2]); + // Exclude the filter part of the expression because it is blank or empty + return this.labelValuesQuery(label); } } @@ -192,3 +195,8 @@ export default class PrometheusMetricFindQuery { }); } } + +function isFilterDefined(filter: string) { + // We consider blank strings or the empty filter {} as an undefined filter + return filter && filter.split(' ').join('') !== '{}'; +}