mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: do not unescape external AM label values (#45334)
This commit is contained in:
parent
e1ff4dc9fe
commit
651bb773db
@ -31,16 +31,23 @@ describe('Alertmanager utils', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should parse escaped values correctly', () => {
|
// Alertmanager has some strict requirements for label values;
|
||||||
expect(parseMatcher('foo=~"bar\\"baz\\""')).toEqual<Matcher>({
|
// we should not automatically encode or decode any values sent
|
||||||
|
// and instead let AM return any errors like (matcher value contains unescaped double quote: bar"baz")
|
||||||
|
// and allow the user to update the values to the correct format
|
||||||
|
//
|
||||||
|
// see https://github.com/prometheus/alertmanager/blob/4030e3670b359b8814aa8340ea1144f32b1f5ab3/pkg/labels/parse.go#L55-L99
|
||||||
|
// and https://github.com/prometheus/alertmanager/blob/4030e3670b359b8814aa8340ea1144f32b1f5ab3/pkg/labels/parse.go#L101-L178
|
||||||
|
it('should not parse escaped values', () => {
|
||||||
|
expect(parseMatcher('foo="^[a-z0-9-]{1}[a-z0-9-]{0,30}$"')).toEqual<Matcher>({
|
||||||
name: 'foo',
|
name: 'foo',
|
||||||
value: 'bar"baz"',
|
value: '"^[a-z0-9-]{1}[a-z0-9-]{0,30}$"',
|
||||||
isRegex: true,
|
isRegex: false,
|
||||||
isEqual: true,
|
isEqual: true,
|
||||||
});
|
});
|
||||||
expect(parseMatcher('foo=~bar\\"baz\\"')).toEqual<Matcher>({
|
expect(parseMatcher('foo=~bar\\"baz\\"')).toEqual<Matcher>({
|
||||||
name: 'foo',
|
name: 'foo',
|
||||||
value: 'bar"baz"',
|
value: 'bar\\"baz\\"',
|
||||||
isRegex: true,
|
isRegex: true,
|
||||||
isEqual: true,
|
isEqual: true,
|
||||||
});
|
});
|
||||||
|
@ -118,14 +118,6 @@ const matcherOperators = [
|
|||||||
MatcherOperator.equal,
|
MatcherOperator.equal,
|
||||||
];
|
];
|
||||||
|
|
||||||
function unescapeMatcherValue(value: string) {
|
|
||||||
let trimmed = value.trim().replace(/\\"/g, '"');
|
|
||||||
if (trimmed.startsWith('"') && trimmed.endsWith('"') && !trimmed.endsWith('\\"')) {
|
|
||||||
trimmed = trimmed.substr(1, trimmed.length - 2);
|
|
||||||
}
|
|
||||||
return trimmed.replace(/\\"/g, '"');
|
|
||||||
}
|
|
||||||
|
|
||||||
export function parseMatcher(matcher: string): Matcher {
|
export function parseMatcher(matcher: string): Matcher {
|
||||||
const trimmed = matcher.trim();
|
const trimmed = matcher.trim();
|
||||||
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
||||||
@ -141,7 +133,7 @@ export function parseMatcher(matcher: string): Matcher {
|
|||||||
}
|
}
|
||||||
const [operator, idx] = operatorsFound[0];
|
const [operator, idx] = operatorsFound[0];
|
||||||
const name = trimmed.substr(0, idx).trim();
|
const name = trimmed.substr(0, idx).trim();
|
||||||
const value = unescapeMatcherValue(trimmed.substr(idx + operator.length).trim());
|
const value = trimmed.substr(idx + operator.length).trim();
|
||||||
if (!name) {
|
if (!name) {
|
||||||
throw new Error(`Invalid matcher: ${trimmed}`);
|
throw new Error(`Invalid matcher: ${trimmed}`);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user