mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Merge pull request #14104 from grafana/davkal/prometheus-rule-expansion
Prometheus: fix rules expansion
This commit is contained in:
commit
c20c787b62
@ -10,6 +10,7 @@ import { BackendSrv } from 'app/core/services/backend_srv';
|
|||||||
|
|
||||||
import addLabelToQuery from './add_label_to_query';
|
import addLabelToQuery from './add_label_to_query';
|
||||||
import { getQueryHints } from './query_hints';
|
import { getQueryHints } from './query_hints';
|
||||||
|
import { expandRecordingRules } from './language_utils';
|
||||||
|
|
||||||
export function alignRange(start, end, step) {
|
export function alignRange(start, end, step) {
|
||||||
const alignedEnd = Math.ceil(end / step) * step;
|
const alignedEnd = Math.ceil(end / step) * step;
|
||||||
@ -468,11 +469,8 @@ export class PrometheusDatasource {
|
|||||||
return `sum(${query.trim()}) by ($1)`;
|
return `sum(${query.trim()}) by ($1)`;
|
||||||
}
|
}
|
||||||
case 'EXPAND_RULES': {
|
case 'EXPAND_RULES': {
|
||||||
const mapping = action.mapping;
|
if (action.mapping) {
|
||||||
if (mapping) {
|
return expandRecordingRules(query, action.mapping);
|
||||||
const ruleNames = Object.keys(mapping);
|
|
||||||
const rulesRegex = new RegExp(`(\\s|^)(${ruleNames.join('|')})(\\s|$|\\()`, 'ig');
|
|
||||||
return query.replace(rulesRegex, (match, pre, name, post) => mapping[name]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -83,3 +83,9 @@ export function parseSelector(query: string, cursorOffset = 1): { labelKeys: any
|
|||||||
|
|
||||||
return { labelKeys, selector: selectorString };
|
return { labelKeys, selector: selectorString };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function expandRecordingRules(query: string, mapping: { [name: string]: string }): string {
|
||||||
|
const ruleNames = Object.keys(mapping);
|
||||||
|
const rulesRegex = new RegExp(`(\\s|^)(${ruleNames.join('|')})(\\s|$|\\(|\\[|\\{)`, 'ig');
|
||||||
|
return query.replace(rulesRegex, (match, pre, name, post) => `${pre}${mapping[name]}${post}`);
|
||||||
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { parseSelector } from '../language_utils';
|
import { expandRecordingRules, parseSelector } from '../language_utils';
|
||||||
|
|
||||||
describe('parseSelector()', () => {
|
describe('parseSelector()', () => {
|
||||||
let parsed;
|
let parsed;
|
||||||
@ -62,3 +62,25 @@ describe('parseSelector()', () => {
|
|||||||
expect(parsed.selector).toBe('{__name__="bar:metric:1m"}');
|
expect(parsed.selector).toBe('{__name__="bar:metric:1m"}');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('expandRecordingRules()', () => {
|
||||||
|
it('returns query w/o recording rules as is', () => {
|
||||||
|
expect(expandRecordingRules('metric', {})).toBe('metric');
|
||||||
|
expect(expandRecordingRules('metric + metric', {})).toBe('metric + metric');
|
||||||
|
expect(expandRecordingRules('metric{}', {})).toBe('metric{}');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('does not modify recording rules name in label values', () => {
|
||||||
|
expect(expandRecordingRules('{__name__="metric"} + bar', { metric: 'foo', bar: 'super' })).toBe(
|
||||||
|
'{__name__="metric"} + super'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns query with expanded recording rules', () => {
|
||||||
|
expect(expandRecordingRules('metric', { metric: 'foo' })).toBe('foo');
|
||||||
|
expect(expandRecordingRules('metric + metric', { metric: 'foo' })).toBe('foo + foo');
|
||||||
|
expect(expandRecordingRules('metric{}', { metric: 'foo' })).toBe('foo{}');
|
||||||
|
expect(expandRecordingRules('metric[]', { metric: 'foo' })).toBe('foo[]');
|
||||||
|
expect(expandRecordingRules('metric + foo', { metric: 'foo', foo: 'bar' })).toBe('foo + bar');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
Loading…
Reference in New Issue
Block a user