Prometheus: Add label filters to label_values query type variable query (#70644)

* add labelfilters to label_values query type with tests

* fix tests
This commit is contained in:
Brendan O'Handley 2023-06-27 08:58:46 -04:00 committed by GitHub
parent e9b9a08dd0
commit e3a4d7c099
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 66 additions and 14 deletions

View File

@ -5,6 +5,7 @@ import { selectOptionInTest } from 'test/helpers/selectOptionInTest';
import { PrometheusDatasource } from '../datasource';
import PrometheusLanguageProvider from '../language_provider';
import { migrateVariableEditorBackToVariableSupport } from '../migrations/variableMigration';
import { PromVariableQuery, PromVariableQueryType, StandardPromVariableQuery } from '../types';
import { PromVariableQueryEditor, Props, variableMigration } from './VariableQueryEditor';
@ -60,6 +61,53 @@ describe('PromVariableQueryEditor', () => {
expect(migration).toEqual(expected);
});
test('Migrates label filters to the query object for label_values()', () => {
const query: StandardPromVariableQuery = {
query: 'label_values(metric{label="value"},name)',
refId: 'StandardVariableQuery',
};
const migration: PromVariableQuery = variableMigration(query);
const expected: PromVariableQuery = {
qryType: PromVariableQueryType.LabelValues,
label: 'name',
metric: 'metric',
labelFilters: [
{
label: 'label',
op: '=',
value: 'value',
},
],
refId: 'PrometheusDatasource-VariableQuery',
};
expect(migration).toEqual(expected);
});
test('Migrates a query object with label filters to an expression correctly', () => {
const query: PromVariableQuery = {
qryType: PromVariableQueryType.LabelValues,
label: 'name',
metric: 'metric',
labelFilters: [
{
label: 'label',
op: '=',
value: 'value',
},
],
refId: 'PrometheusDatasource-VariableQuery',
};
const migration: string = migrateVariableEditorBackToVariableSupport(query);
const expected = 'label_values(metric{label="value"},name)';
expect(migration).toEqual(expected);
});
beforeEach(() => {
props = {
datasource: {
@ -118,7 +166,6 @@ describe('PromVariableQueryEditor', () => {
expect(onChange).toHaveBeenCalledWith({
query: 'label_names(that)',
labelFilters: [],
refId,
});
});
@ -137,7 +184,6 @@ describe('PromVariableQueryEditor', () => {
expect(onChange).toHaveBeenCalledWith({
query: 'label_names()',
labelFilters: [],
refId,
});
});
@ -176,7 +222,6 @@ describe('PromVariableQueryEditor', () => {
await waitFor(() =>
expect(onChange).toHaveBeenCalledWith({
query: 'metrics(a)',
labelFilters: [],
refId,
})
);
@ -200,7 +245,6 @@ describe('PromVariableQueryEditor', () => {
await waitFor(() =>
expect(onChange).toHaveBeenCalledWith({
query: 'label_values(this)',
labelFilters: [],
refId,
})
);
@ -228,7 +272,6 @@ describe('PromVariableQueryEditor', () => {
await waitFor(() =>
expect(onChange).toHaveBeenCalledWith({
query: 'label_values(that,this)',
labelFilters: [],
refId,
})
);
@ -251,7 +294,6 @@ describe('PromVariableQueryEditor', () => {
expect(onChange).toHaveBeenCalledWith({
query: 'query_result(a)',
labelFilters: [],
refId,
});
});
@ -273,7 +315,6 @@ describe('PromVariableQueryEditor', () => {
expect(onChange).toHaveBeenCalledWith({
query: '{a: "example"}',
labelFilters: [],
refId,
});
});

View File

@ -67,7 +67,7 @@ export const PromVariableQueryEditor = ({ onChange, query, datasource }: Props)
setQryType(variableQuery.qryType);
setLabel(variableQuery.label ?? '');
setMetric(variableQuery.metric ?? '');
setLabelFilters(query.labelFilters ?? []);
setLabelFilters(variableQuery.labelFilters ?? []);
setVarQuery(variableQuery.varQuery ?? '');
setSeriesQuery(variableQuery.seriesQuery ?? '');
}, [query]);
@ -119,16 +119,15 @@ export const PromVariableQueryEditor = ({ onChange, query, datasource }: Props)
refId: 'PrometheusVariableQueryEditor-VariableQuery',
};
const updatedVar = { ...queryVar, ...updateVar };
let updateLabelFilters = updLabelFilters ? { labelFilters: updLabelFilters } : { labelFilters: labelFilters };
const updatedVar = { ...queryVar, ...updateVar, ...updateLabelFilters };
const queryString = migrateVariableEditorBackToVariableSupport(updatedVar);
let lblFltrs = updLabelFilters ? updLabelFilters : labelFilters;
// setting query.query property allows for update of variable definition
onChange({
query: queryString,
labelFilters: lblFltrs,
refId,
});
};

View File

@ -1,3 +1,5 @@
import { promQueryModeller } from '../querybuilder/PromQueryModeller';
import { buildVisualQueryFromString } from '../querybuilder/parsing';
import { PromVariableQuery, PromVariableQueryType as QueryType } from '../types';
export const PrometheusLabelNamesRegex = /^label_names\(\)\s*$/;
@ -41,12 +43,15 @@ export function migrateVariableQueryToEditor(rawQuery: string | PromVariableQuer
if (labelValues) {
const label = labelValues[2];
const metric = labelValues[1];
if (metric) {
const visQuery = buildVisualQueryFromString(metric);
return {
...queryBase,
qryType: QueryType.LabelValues,
label,
metric,
metric: visQuery.query.metric,
labelFilters: visQuery.query.labels,
};
} else {
return {
@ -97,7 +102,14 @@ export function migrateVariableEditorBackToVariableSupport(QueryVariable: PromVa
return 'label_names()';
case QueryType.LabelValues:
if (QueryVariable.metric) {
return `label_values(${QueryVariable.metric},${QueryVariable.label})`;
const visualQueryQuery = {
metric: QueryVariable.metric,
labels: QueryVariable.labelFilters ?? [],
operations: [],
};
const metric = promQueryModeller.renderQuery(visualQueryQuery);
return `label_values(${metric},${QueryVariable.label})`;
} else {
return `label_values(${QueryVariable.label})`;
}