diff --git a/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.test.tsx index 7517e96d3ba..df6c715954c 100644 --- a/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.test.tsx +++ b/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.test.tsx @@ -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, }); }); diff --git a/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx b/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx index bb606cfcbb9..33cc68f2320 100644 --- a/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx +++ b/public/app/plugins/datasource/prometheus/components/VariableQueryEditor.tsx @@ -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, }); }; diff --git a/public/app/plugins/datasource/prometheus/migrations/variableMigration.ts b/public/app/plugins/datasource/prometheus/migrations/variableMigration.ts index 9e695cc3eb2..260d00a84d3 100644 --- a/public/app/plugins/datasource/prometheus/migrations/variableMigration.ts +++ b/public/app/plugins/datasource/prometheus/migrations/variableMigration.ts @@ -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})`; }