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
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( export default function fromGraphiteQueries(
graphiteQueries: GraphiteQuery[], graphiteQueries: GraphiteQuery[],
graphiteDataSource: GraphiteDatasource graphiteDataSource: GraphiteDatasource
@@ -62,17 +73,12 @@ function fromGraphite(graphiteQuery: GraphiteQueryModel, config: GraphiteToLokiQ
return true; return true;
} }
if (value.includes('{')) { const converted = convertGlobToRegEx(value);
labels[matcher.labelName] = { labels[matcher.labelName] = {
value: value.replace(/\*/g, '.*').replace(/\{/g, '(').replace(/}/g, ')').replace(/,/g, '|'), value: converted,
operator: '=~', operator: converted !== value ? '=~' : '=',
}; };
} else {
labels[matcher.labelName] = {
value: value,
operator: '=',
};
}
return true; return true;
} }
return targetNodes[index] === matcher.value || matcher.value === '*'; return targetNodes[index] === matcher.value || matcher.value === '*';

View File

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