[v9.3.x] Prometheus: bug in creating autocomplete queries with labels (#68029)

Prometheus: bug in creating autocomplete queries with labels (#68003)

Fix bug formatting multiple prometheus labels when doing metric query

(cherry picked from commit a1bc1bd368)
This commit is contained in:
Galen Kistler
2023-05-08 13:30:28 -05:00
committed by GitHub
parent 29a8ed190e
commit b1e51ffefd
2 changed files with 54 additions and 20 deletions
@@ -7,7 +7,7 @@ import { DataSourceInstanceSettings, MetricFindValue } from '@grafana/data/src';
import { PrometheusDatasource } from '../../datasource';
import { PromOptions } from '../../types';
import { MetricSelect } from './MetricSelect';
import { formatPrometheusLabelFilters, formatPrometheusLabelFiltersToString, MetricSelect } from './MetricSelect';
const instanceSettings = {
url: 'proxied',
@@ -129,6 +129,43 @@ describe('MetricSelect', () => {
await userEvent.type(input, 'new');
await waitFor(() => expect(document.querySelector('mark')).not.toBeInTheDocument());
});
it('label filters properly join', () => {
const query = formatPrometheusLabelFilters([
{
value: 'value',
label: 'label',
op: '=',
},
{
value: 'value2',
label: 'label2',
op: '=',
},
]);
query.forEach((label) => {
expect(label.includes(',', 0));
});
});
it('label filter creation', () => {
const labels = [
{
value: 'value',
label: 'label',
op: '=',
},
{
value: 'value2',
label: 'label2',
op: '=',
},
];
const queryString = formatPrometheusLabelFiltersToString('query', labels);
queryString.split(',').forEach((queryChunk) => {
expect(queryChunk.length).toBeGreaterThan(1); // must be longer then ','
});
});
});
async function openMetricSelect() {
@@ -65,24 +65,6 @@ export function MetricSelect({ datasource, query, onChange, onGetMetrics, labels
[styles.highlight]
);
const formatLabelFilters = (labelsFilters: QueryBuilderLabelFilter[]): string[] => {
return labelsFilters.map((label) => {
return `,${label.label}="${label.value}"`;
});
};
/**
* Transform queryString and any currently set label filters into label_values() string
*/
const queryAndFilterToLabelValuesString = (
queryString: string,
labelsFilters: QueryBuilderLabelFilter[] | undefined
): string => {
return `label_values({__name__=~".*${queryString}"${
labelsFilters ? formatLabelFilters(labelsFilters).join() : ''
}},__name__)`;
};
/**
* Reformat the query string and label filters to return all valid results for current query editor state
*/
@@ -92,7 +74,7 @@ export function MetricSelect({ datasource, query, onChange, onGetMetrics, labels
): string => {
const queryString = regexifyLabelValuesQueryString(query);
return queryAndFilterToLabelValuesString(queryString, labelsFilters);
return formatPrometheusLabelFiltersToString(queryString, labelsFilters);
};
/**
@@ -161,3 +143,18 @@ const getStyles = (theme: GrafanaTheme2) => ({
background-color: ${theme.colors.warning.main};
`,
});
export const formatPrometheusLabelFiltersToString = (
queryString: string,
labelsFilters: QueryBuilderLabelFilter[] | undefined
): string => {
const filterArray = labelsFilters ? formatPrometheusLabelFilters(labelsFilters) : [];
return `label_values({__name__=~".*${queryString}"${filterArray ? filterArray.join('') : ''}},__name__)`;
};
export const formatPrometheusLabelFilters = (labelsFilters: QueryBuilderLabelFilter[]): string[] => {
return labelsFilters.map((label) => {
return `,${label.label}="${label.value}"`;
});
};