fix: label_values w/ empty filters in prom datasource variable query (#78242)

* fix: handle empty filters in prometheus datasource variable query function `label_values`
This commit is contained in:
Darren Janeczek 2023-11-20 16:36:06 -05:00 committed by GitHub
parent 2f2ce3edbb
commit efdfa29fe2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 35 additions and 3 deletions

View File

@ -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: {},
});
});
});
// <LegacyPrometheus>
it('label_values(metric, resource) should generate series query with correct time', async () => {
const query = setupMetricFindQuery({

View File

@ -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('') !== '{}';
}