mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Tempo: escape span names in TraceQL editor (#95483)
This commit is contained in:
parent
eae83609b8
commit
fb51a5e21f
@ -5,6 +5,7 @@ import { getTemplateSrv } from '@grafana/runtime';
|
|||||||
import { VariableFormatID } from '@grafana/schema';
|
import { VariableFormatID } from '@grafana/schema';
|
||||||
|
|
||||||
import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen';
|
import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen';
|
||||||
|
import { getEscapedSpanNames } from '../datasource';
|
||||||
import TempoLanguageProvider from '../language_provider';
|
import TempoLanguageProvider from '../language_provider';
|
||||||
import { Scope } from '../types';
|
import { Scope } from '../types';
|
||||||
|
|
||||||
@ -28,14 +29,20 @@ export const interpolateFilters = (filters: TraceqlFilter[], scopedVars?: Scoped
|
|||||||
return interpolatedFilters;
|
return interpolatedFilters;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const isRegExpOperator = (operator: string) => operator === '=~' || operator === '!~';
|
||||||
|
|
||||||
|
const escapeValues = (values: string[]) => getEscapedSpanNames(values);
|
||||||
|
|
||||||
export const valueHelper = (f: TraceqlFilter) => {
|
export const valueHelper = (f: TraceqlFilter) => {
|
||||||
if (Array.isArray(f.value) && f.value.length > 1) {
|
const value = Array.isArray(f.value) && isRegExpOperator(f.operator!) ? escapeValues(f.value) : f.value;
|
||||||
return `"${f.value.join('|')}"`;
|
|
||||||
|
if (Array.isArray(value) && value.length > 1) {
|
||||||
|
return `"${value.join('|')}"`;
|
||||||
}
|
}
|
||||||
if (f.valueType === 'string') {
|
if (f.valueType === 'string') {
|
||||||
return `"${f.value}"`;
|
return `"${value}"`;
|
||||||
}
|
}
|
||||||
return f.value;
|
return value;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const scopeHelper = (f: TraceqlFilter, lp: TempoLanguageProvider) => {
|
export const scopeHelper = (f: TraceqlFilter, lp: TempoLanguageProvider) => {
|
||||||
|
@ -173,6 +173,20 @@ describe('Language_provider', () => {
|
|||||||
lp.generateQueryFromFilters([{ id: 'foo', tag: 'footag', value: '1234', operator: '>', valueType: 'integer' }])
|
lp.generateQueryFromFilters([{ id: 'foo', tag: 'footag', value: '1234', operator: '>', valueType: 'integer' }])
|
||||||
).toBe('{.footag>1234}');
|
).toBe('{.footag>1234}');
|
||||||
});
|
});
|
||||||
|
it.each([['=~'], ['!~']])('a field with a regexp operator (%s)', (operator) => {
|
||||||
|
expect(
|
||||||
|
lp.generateQueryFromFilters([
|
||||||
|
{
|
||||||
|
id: 'span-name',
|
||||||
|
tag: 'name',
|
||||||
|
operator,
|
||||||
|
scope: TraceqlSearchScope.Span,
|
||||||
|
value: ['api/v2/variants/by-upc/(?P<upc>[\\s\\S]*)/$'],
|
||||||
|
valueType: 'string',
|
||||||
|
},
|
||||||
|
])
|
||||||
|
).toBe(`{name${operator}"api/v2/variants/by-upc/\\\\(\\\\?P<upc>\\\\[\\\\\\\\s\\\\\\\\S\\\\]\\\\*\\\\)/\\\\$"}`);
|
||||||
|
});
|
||||||
it('two fields with everything filled in', () => {
|
it('two fields with everything filled in', () => {
|
||||||
expect(
|
expect(
|
||||||
lp.generateQueryFromFilters([
|
lp.generateQueryFromFilters([
|
||||||
|
Loading…
Reference in New Issue
Block a user