diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts index 842ca2745ac..4a580f0adff 100644 --- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts +++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts @@ -151,9 +151,9 @@ describe('generateQueryFromAdHocFilters generates the correct query for', () => expect( generateQueryFromAdHocFilters([ { key: 'footag', operator: '=', value: 'foovalue' }, - { key: 'bartag', operator: '=', value: 'barvalue' }, + { key: 'bartag', operator: '=', value: '0' }, ]) - ).toBe('{footag="foovalue" && bartag="barvalue"}'); + ).toBe('{footag="foovalue" && bartag=0}'); }); it('a filter with intrinsic values', () => { diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.ts b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.ts index 795577ad1bc..82078699814 100644 --- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.ts +++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.ts @@ -81,9 +81,16 @@ const adHocValueHelper = (f: AdHocVariableFilter) => { if (intrinsics.find((t) => t === f.key)) { return f.value; } + if (parseInt(f.value, 10).toString() === f.value) { + return f.value; + } return `"${f.value}"`; }; +export const getTagWithoutScope = (tag: string) => { + return tag.replace(/^(event|link|resource|span)\./, ''); +}; + export const filterScopedTag = (f: TraceqlFilter) => { return scopeHelper(f) + f.tag; }; diff --git a/public/app/plugins/datasource/tempo/datasource.test.ts b/public/app/plugins/datasource/tempo/datasource.test.ts index 43dbb94b2a7..5f7a3a47be5 100644 --- a/public/app/plugins/datasource/tempo/datasource.test.ts +++ b/public/app/plugins/datasource/tempo/datasource.test.ts @@ -1192,10 +1192,7 @@ describe('should provide functionality for ad-hoc filters', () => { }, }; const response = await datasource.getTagValues(options); - expect(response).toEqual([ - { text: { type: 'value1', value: 'value1', label: 'value1' } }, - { text: { type: 'value2', value: 'value2', label: 'value2' } }, - ]); + expect(response).toEqual([{ text: 'value1' }, { text: 'value2' }]); }); }); diff --git a/public/app/plugins/datasource/tempo/datasource.ts b/public/app/plugins/datasource/tempo/datasource.ts index da625c8b8bc..1cd98a01071 100644 --- a/public/app/plugins/datasource/tempo/datasource.ts +++ b/public/app/plugins/datasource/tempo/datasource.ts @@ -37,6 +37,7 @@ import { BarGaugeDisplayMode, TableCellDisplayMode, VariableFormatID } from '@gr import { generateQueryFromAdHocFilters, generateQueryFromFilters, + getTagWithoutScope, interpolateFilters, } from './SearchTraceQLEditor/utils'; import { TempoVariableQuery, TempoVariableQueryType } from './VariableQueryEditor'; @@ -180,7 +181,7 @@ export class TempoDatasource extends DataSourceWithBackend tag !== undefined).map((tag) => ({ text: tag })); } - async labelValuesQuery(labelName?: string, query?: string): Promise> { + async labelValuesQuery(labelName?: string): Promise> { if (!labelName) { return []; } @@ -202,7 +203,7 @@ export class TempoDatasource extends DataSourceWithBackend): Promise> { const query = generateQueryFromAdHocFilters(options.filters); - return this.labelValuesQuery(options.key.replace(/^(resource|span)\./, ''), query); + return this.tagValuesQuery(options.key, query); + } + + async tagValuesQuery(tag: string, query: string): Promise> { + let options; + try { + // For V2, we need to send scope and tag name, e.g. `span.http.status_code`, + // unless the tag has intrinsic scope + options = await this.languageProvider.getOptionsV2(tag, query); + } catch { + // For V1, the tag name (e.g. `http.status_code`) is enough + options = await this.languageProvider.getOptionsV1(getTagWithoutScope(tag)); + } + + return options.flatMap((option: SelectableValue) => + option.value !== undefined ? [{ text: option.value }] : [] + ); } init = async () => {