diff --git a/public/app/plugins/datasource/loki/datasource.ts b/public/app/plugins/datasource/loki/datasource.ts index eebd2908408..7b3869b1910 100644 --- a/public/app/plugins/datasource/loki/datasource.ts +++ b/public/app/plugins/datasource/loki/datasource.ts @@ -347,17 +347,16 @@ export class LokiDatasource extends DataSourceApi { let expression = query.expr ?? ''; switch (action.type) { case 'ADD_FILTER': { - expression = addLabelToQuery(expression, action.key, action.value); + expression = addLabelToQuery(expression, action.key, action.value, undefined, true); break; } case 'ADD_FILTER_OUT': { - expression = addLabelToQuery(expression, action.key, action.value, '!='); + expression = addLabelToQuery(expression, action.key, action.value, '!=', true); break; } default: break; } - return { ...query, expr: expression }; } diff --git a/public/app/plugins/datasource/prometheus/add_label_to_query.test.ts b/public/app/plugins/datasource/prometheus/add_label_to_query.test.ts index 3386bb5f563..a33160f331d 100644 --- a/public/app/plugins/datasource/prometheus/add_label_to_query.test.ts +++ b/public/app/plugins/datasource/prometheus/add_label_to_query.test.ts @@ -63,6 +63,15 @@ describe('addLabelToQuery()', () => { expect(addLabelToQuery('{x="y"} |="yy"', 'bar', 'baz')).toBe('{bar="baz",x="y"} |="yy"'); expect(addLabelToQuery('{x="y"} |="yy" !~"xx"', 'bar', 'baz')).toBe('{bar="baz",x="y"} |="yy" !~"xx"'); }); + + it('should add label to query properly with Loki datasource', () => { + expect(addLabelToQuery('{job="grafana"} |= "foo-bar"', 'filename', 'test.txt', undefined, true)).toBe( + '{filename="test.txt",job="grafana"} |= "foo-bar"' + ); + expect(addLabelToQuery('{job="grafana"} |= "foo-bar"', 'filename', 'test.txt')).toBe( + '{filename="test.txt",job="grafana"} |= "foo{filename="test.txt"}-bar"' + ); + }); }); describe('addLabelToSelector()', () => { diff --git a/public/app/plugins/datasource/prometheus/add_label_to_query.ts b/public/app/plugins/datasource/prometheus/add_label_to_query.ts index 8b5cc758a76..147ed81fbdd 100644 --- a/public/app/plugins/datasource/prometheus/add_label_to_query.ts +++ b/public/app/plugins/datasource/prometheus/add_label_to_query.ts @@ -18,8 +18,13 @@ const builtInWords = [ const metricNameRegexp = /([A-Za-z:][\w:]*)\b(?![\(\]{=!",])/g; const selectorRegexp = /{([^{]*)}/g; -// addLabelToQuery('foo', 'bar', 'baz') => 'foo{bar="baz"}' -export function addLabelToQuery(query: string, key: string, value: string, operator?: string): string { +export function addLabelToQuery( + query: string, + key: string, + value: string, + operator?: string, + hasNoMetrics?: boolean +): string { if (!key || !value) { throw new Error('Need label to add to query.'); } @@ -35,7 +40,17 @@ export function addLabelToQuery(query: string, key: string, value: string, opera const isColonBounded = word.endsWith(':'); previousWord = word; - if (!insideSelector && !isColonBounded && !previousWordIsKeyWord && builtInWords.indexOf(word) === -1) { + + // with Prometheus datasource, adds an empty selector to a bare metric name + // but doesn't add it with Loki datasource so there are no unnecessary labels + // e.g. when the filter contains a dash (-) character inside + if ( + !hasNoMetrics && + !insideSelector && + !isColonBounded && + !previousWordIsKeyWord && + builtInWords.indexOf(word) === -1 + ) { return `${word}{}`; } return word;