Explore: Convert nodes with "*" to regular expressions when a Graphite query is mapped to Loki (#34014)

This commit is contained in:
Piotr Jamróz 2021-05-14 14:59:16 +02:00 committed by GitHub
parent 81f6c806e1
commit bf467f8eae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 12 deletions

View File

@ -12,6 +12,17 @@ const GRAPHITE_TO_LOKI_OPERATOR = {
'!=~': '!~',
};
/**
* Converts Graphite glob-like pattern to a regular expression
*/
function convertGlobToRegEx(text: string): string {
if (text.includes('*') || text.includes('{')) {
return '^' + text.replace(/\*/g, '.*').replace(/\{/g, '(').replace(/}/g, ')').replace(/,/g, '|');
} else {
return text;
}
}
export default function fromGraphiteQueries(
graphiteQueries: GraphiteQuery[],
graphiteDataSource: GraphiteDatasource
@ -62,17 +73,12 @@ function fromGraphite(graphiteQuery: GraphiteQueryModel, config: GraphiteToLokiQ
return true;
}
if (value.includes('{')) {
labels[matcher.labelName] = {
value: value.replace(/\*/g, '.*').replace(/\{/g, '(').replace(/}/g, ')').replace(/,/g, '|'),
operator: '=~',
};
} else {
labels[matcher.labelName] = {
value: value,
operator: '=',
};
}
const converted = convertGlobToRegEx(value);
labels[matcher.labelName] = {
value: converted,
operator: converted !== value ? '=~' : '=',
};
return true;
}
return targetNodes[index] === matcher.value || matcher.value === '*';

View File

@ -34,7 +34,7 @@ describe('importing from Graphite queries', () => {
beforeEach(() => {});
it('test', () => {
it('test matching mappings', () => {
mockSettings(['servers.(cluster).(server).*']);
const lokiQueries = fromGraphiteQueries(
[
@ -45,6 +45,8 @@ describe('importing from Graphite queries', () => {
// tags: captured
mockGraphiteQuery("interpolate(seriesByTag('cluster=west', 'server=002'), inf))"),
mockGraphiteQuery("interpolate(seriesByTag('foo=bar', 'server=002'), inf))"),
// regexp
mockGraphiteQuery('interpolate(alias(servers.eas*.{001,002}.request.POST.200,1,2))'),
// not captured
mockGraphiteQuery('interpolate(alias(test.west.001.cpu))'),
mockGraphiteQuery('interpolate(alias(servers.west.001))'),
@ -56,8 +58,12 @@ describe('importing from Graphite queries', () => {
{ refId: 'A', expr: '{cluster="west", server="001"}' },
{ refId: 'A', expr: '{cluster="east", server="001"}' },
{ refId: 'A', expr: '{server="002"}' },
{ refId: 'A', expr: '{cluster="west", server="002"}' },
{ refId: 'A', expr: '{foo="bar", server="002"}' },
{ refId: 'A', expr: '{cluster=~"^eas.*", server=~"^(001|002)"}' },
{ refId: 'A', expr: '' },
{ refId: 'A', expr: '' },
]);