mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
parent
e9b9a08dd0
commit
e3a4d7c099
@ -5,6 +5,7 @@ import { selectOptionInTest } from 'test/helpers/selectOptionInTest';
|
|||||||
|
|
||||||
import { PrometheusDatasource } from '../datasource';
|
import { PrometheusDatasource } from '../datasource';
|
||||||
import PrometheusLanguageProvider from '../language_provider';
|
import PrometheusLanguageProvider from '../language_provider';
|
||||||
|
import { migrateVariableEditorBackToVariableSupport } from '../migrations/variableMigration';
|
||||||
import { PromVariableQuery, PromVariableQueryType, StandardPromVariableQuery } from '../types';
|
import { PromVariableQuery, PromVariableQueryType, StandardPromVariableQuery } from '../types';
|
||||||
|
|
||||||
import { PromVariableQueryEditor, Props, variableMigration } from './VariableQueryEditor';
|
import { PromVariableQueryEditor, Props, variableMigration } from './VariableQueryEditor';
|
||||||
@ -60,6 +61,53 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
expect(migration).toEqual(expected);
|
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(() => {
|
beforeEach(() => {
|
||||||
props = {
|
props = {
|
||||||
datasource: {
|
datasource: {
|
||||||
@ -118,7 +166,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
|
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: 'label_names(that)',
|
query: 'label_names(that)',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -137,7 +184,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
|
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: 'label_names()',
|
query: 'label_names()',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -176,7 +222,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
await waitFor(() =>
|
await waitFor(() =>
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: 'metrics(a)',
|
query: 'metrics(a)',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -200,7 +245,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
await waitFor(() =>
|
await waitFor(() =>
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: 'label_values(this)',
|
query: 'label_values(this)',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -228,7 +272,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
await waitFor(() =>
|
await waitFor(() =>
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: 'label_values(that,this)',
|
query: 'label_values(that,this)',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
@ -251,7 +294,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
|
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: 'query_result(a)',
|
query: 'query_result(a)',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -273,7 +315,6 @@ describe('PromVariableQueryEditor', () => {
|
|||||||
|
|
||||||
expect(onChange).toHaveBeenCalledWith({
|
expect(onChange).toHaveBeenCalledWith({
|
||||||
query: '{a: "example"}',
|
query: '{a: "example"}',
|
||||||
labelFilters: [],
|
|
||||||
refId,
|
refId,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -67,7 +67,7 @@ export const PromVariableQueryEditor = ({ onChange, query, datasource }: Props)
|
|||||||
setQryType(variableQuery.qryType);
|
setQryType(variableQuery.qryType);
|
||||||
setLabel(variableQuery.label ?? '');
|
setLabel(variableQuery.label ?? '');
|
||||||
setMetric(variableQuery.metric ?? '');
|
setMetric(variableQuery.metric ?? '');
|
||||||
setLabelFilters(query.labelFilters ?? []);
|
setLabelFilters(variableQuery.labelFilters ?? []);
|
||||||
setVarQuery(variableQuery.varQuery ?? '');
|
setVarQuery(variableQuery.varQuery ?? '');
|
||||||
setSeriesQuery(variableQuery.seriesQuery ?? '');
|
setSeriesQuery(variableQuery.seriesQuery ?? '');
|
||||||
}, [query]);
|
}, [query]);
|
||||||
@ -119,16 +119,15 @@ export const PromVariableQueryEditor = ({ onChange, query, datasource }: Props)
|
|||||||
refId: 'PrometheusVariableQueryEditor-VariableQuery',
|
refId: 'PrometheusVariableQueryEditor-VariableQuery',
|
||||||
};
|
};
|
||||||
|
|
||||||
const updatedVar = { ...queryVar, ...updateVar };
|
let updateLabelFilters = updLabelFilters ? { labelFilters: updLabelFilters } : { labelFilters: labelFilters };
|
||||||
|
|
||||||
|
const updatedVar = { ...queryVar, ...updateVar, ...updateLabelFilters };
|
||||||
|
|
||||||
const queryString = migrateVariableEditorBackToVariableSupport(updatedVar);
|
const queryString = migrateVariableEditorBackToVariableSupport(updatedVar);
|
||||||
|
|
||||||
let lblFltrs = updLabelFilters ? updLabelFilters : labelFilters;
|
|
||||||
|
|
||||||
// setting query.query property allows for update of variable definition
|
// setting query.query property allows for update of variable definition
|
||||||
onChange({
|
onChange({
|
||||||
query: queryString,
|
query: queryString,
|
||||||
labelFilters: lblFltrs,
|
|
||||||
refId,
|
refId,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
import { promQueryModeller } from '../querybuilder/PromQueryModeller';
|
||||||
|
import { buildVisualQueryFromString } from '../querybuilder/parsing';
|
||||||
import { PromVariableQuery, PromVariableQueryType as QueryType } from '../types';
|
import { PromVariableQuery, PromVariableQueryType as QueryType } from '../types';
|
||||||
|
|
||||||
export const PrometheusLabelNamesRegex = /^label_names\(\)\s*$/;
|
export const PrometheusLabelNamesRegex = /^label_names\(\)\s*$/;
|
||||||
@ -41,12 +43,15 @@ export function migrateVariableQueryToEditor(rawQuery: string | PromVariableQuer
|
|||||||
if (labelValues) {
|
if (labelValues) {
|
||||||
const label = labelValues[2];
|
const label = labelValues[2];
|
||||||
const metric = labelValues[1];
|
const metric = labelValues[1];
|
||||||
|
|
||||||
if (metric) {
|
if (metric) {
|
||||||
|
const visQuery = buildVisualQueryFromString(metric);
|
||||||
return {
|
return {
|
||||||
...queryBase,
|
...queryBase,
|
||||||
qryType: QueryType.LabelValues,
|
qryType: QueryType.LabelValues,
|
||||||
label,
|
label,
|
||||||
metric,
|
metric: visQuery.query.metric,
|
||||||
|
labelFilters: visQuery.query.labels,
|
||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
return {
|
return {
|
||||||
@ -97,7 +102,14 @@ export function migrateVariableEditorBackToVariableSupport(QueryVariable: PromVa
|
|||||||
return 'label_names()';
|
return 'label_names()';
|
||||||
case QueryType.LabelValues:
|
case QueryType.LabelValues:
|
||||||
if (QueryVariable.metric) {
|
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 {
|
} else {
|
||||||
return `label_values(${QueryVariable.label})`;
|
return `label_values(${QueryVariable.label})`;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user