[v9.5.x] Tempo: Escape regex-sensitive characters in span name before building promql query (#68318)

* Tempo: Escape regex-sensitive characters in span name before building promql query (#66301)

* Tempo: escape regex-sensitive characters in span name before building promql query

* Make gen-cue

* Add type

* Add tests

* Test

* Minor update

---------

Co-authored-by: Joey Tawadrous <joey.tawadrous@grafana.com>
(cherry picked from commit 8b1afb594d)

* Changelog prettier

---------

Co-authored-by: gordeevnm <gordeevnm@gmail.com>
This commit is contained in:
Joey
2023-05-12 10:30:17 +01:00
committed by GitHub
co-authored by gordeevnm
parent 8ef9345b1a
commit c95eda4b35
2 changed files with 20 additions and 1 deletions
@@ -31,6 +31,7 @@ import {
makeServiceGraphViewRequest,
makeTempoLink,
getFieldConfig,
getEscapedSpanNames,
} from './datasource';
import mockJson from './mockJsonResponse.json';
import mockServiceGraph from './mockServiceGraph.json';
@@ -590,6 +591,20 @@ describe('Tempo service graph view', () => {
expect(builtQuery).toBe('sum(rate(traces_spanmetrics_calls_total{}[$__rate_interval]))');
});
it('should escape span names correctly', () => {
const spanNames = [
'/actuator/health/**',
'$type + [test]|HTTP POST - post',
'server.cluster.local:9090^/sample.test(.*)?',
];
let escaped = getEscapedSpanNames(spanNames);
expect(escaped).toEqual([
'/actuator/health/\\\\*\\\\*',
'\\\\$type \\\\+ \\\\[test\\\\]\\\\|HTTP POST - post',
'server\\\\.cluster\\\\.local:9090\\\\^/sample\\\\.test\\\\(\\\\.\\\\*\\\\)\\\\?',
]);
});
it('should get field config correctly', () => {
let datasourceUid = 's4Jvz8Qnk';
let tempoDatasourceUid = 'EbPO1fYnz';
@@ -597,7 +597,7 @@ function errorAndDurationQuery(
let serviceGraphViewMetrics = [];
let errorRateBySpanName = '';
let durationsBySpanName: string[] = [];
const spanNames = rateResponse.data[0][0]?.fields[1]?.values.toArray() ?? [];
const spanNames = getEscapedSpanNames(rateResponse.data[0][0]?.fields[1]?.values.toArray() ?? []);
if (spanNames.length > 0) {
errorRateBySpanName = buildExpr(errorRateMetric, 'span_name=~"' + spanNames.join('|') + '"', request);
@@ -663,6 +663,10 @@ function makePromLink(title: string, expr: string, datasourceUid: string, instan
};
}
export function getEscapedSpanNames(values: string[]) {
return values.map((value: string) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\\\$&'));
}
export function getFieldConfig(
datasourceUid: string,
tempoDatasourceUid: string,