Tempo: Upgrade interpolation for Tempo (#89664)

Upgrade interpolation for Tempo
This commit is contained in:
Joey
2024-06-25 14:06:51 +01:00
committed by GitHub
parent 5da94bb669
commit 66dc20f46f
5 changed files with 43 additions and 25 deletions
@@ -18,7 +18,7 @@ import { GroupByField } from './GroupByField';
import InlineSearchField from './InlineSearchField';
import SearchField from './SearchField';
import TagsInput from './TagsInput';
import { filterScopedTag, filterTitle, generateQueryFromFilters, replaceAt } from './utils';
import { filterScopedTag, filterTitle, generateQueryFromFilters, interpolateFilters, replaceAt } from './utils';
interface Props {
datasource: TempoDatasource;
@@ -62,9 +62,10 @@ const TraceQLSearch = ({ datasource, query, onChange, onClearResults, app, addVa
onChange({ ...query, filters: query.filters.filter((f) => f.id !== s.id) });
};
const templateVariables = getTemplateSrv().getVariables();
useEffect(() => {
setTraceQlQuery(generateQueryFromFilters(query.filters || []));
}, [query]);
setTraceQlQuery(generateQueryFromFilters(interpolateFilters(query.filters || [])));
}, [query, templateVariables]);
const findFilter = useCallback((id: string) => query.filters?.find((f) => f.id === id), [query.filters]);
@@ -1,11 +1,33 @@
import { startCase, uniq } from 'lodash';
import { AdHocVariableFilter, SelectableValue } from '@grafana/data';
import { AdHocVariableFilter, ScopedVars, SelectableValue } from '@grafana/data';
import { getTemplateSrv } from '@grafana/runtime';
import { VariableFormatID } from '@grafana/schema';
import { TraceqlFilter, TraceqlSearchScope } from '../dataquery.gen';
import { intrinsics } from '../traceql/traceql';
import { Scope } from '../types';
export const interpolateFilters = (filters: TraceqlFilter[], scopedVars?: ScopedVars) => {
const interpolatedFilters = filters.map((filter) => {
const updatedFilter = {
...filter,
tag: getTemplateSrv().replace(filter.tag ?? '', scopedVars ?? {}),
};
if (filter.value) {
updatedFilter.value =
typeof filter.value === 'string'
? getTemplateSrv().replace(filter.value ?? '', scopedVars ?? {}, VariableFormatID.Pipe)
: filter.value.map((v) => getTemplateSrv().replace(v ?? '', scopedVars ?? {}, VariableFormatID.Pipe));
}
return updatedFilter;
});
return interpolatedFilters;
};
export const generateQueryFromFilters = (filters: TraceqlFilter[]) => {
return `{${filters
.filter((f) => f.tag && f.operator && f.value?.length)
@@ -112,7 +112,7 @@ describe('Tempo data source', () => {
config.liveEnabled = true;
const ds = new TempoDatasource(defaultSettings, templateSrv);
await lastValueFrom(ds.query(traceqlSearchQuery as DataQueryRequest<TempoQuery>));
expect(handleStreamingSearch).toHaveBeenCalledTimes(2);
expect(handleStreamingSearch).toHaveBeenCalledTimes(1);
expect(request).toHaveBeenCalledTimes(0);
});
@@ -120,7 +120,7 @@ describe('Tempo data source', () => {
config.liveEnabled = false;
const ds = new TempoDatasource(defaultSettings, templateSrv);
await lastValueFrom(ds.query(traceqlQuery as DataQueryRequest<TempoQuery>));
expect(handleStreamingSearch).toHaveBeenCalledTimes(2);
expect(handleStreamingSearch).toHaveBeenCalledTimes(1);
expect(request).toHaveBeenCalledTimes(1);
});
@@ -128,8 +128,8 @@ describe('Tempo data source', () => {
config.liveEnabled = false;
const ds = new TempoDatasource(defaultSettings, templateSrv);
await lastValueFrom(ds.query(traceqlSearchQuery as DataQueryRequest<TempoQuery>));
expect(handleStreamingSearch).toHaveBeenCalledTimes(2);
expect(request).toHaveBeenCalledTimes(2);
expect(handleStreamingSearch).toHaveBeenCalledTimes(1);
expect(request).toHaveBeenCalledTimes(1);
});
});
@@ -34,7 +34,11 @@ import {
} from '@grafana/runtime';
import { BarGaugeDisplayMode, TableCellDisplayMode, VariableFormatID } from '@grafana/schema';
import { generateQueryFromAdHocFilters, generateQueryFromFilters } from './SearchTraceQLEditor/utils';
import {
generateQueryFromAdHocFilters,
generateQueryFromFilters,
interpolateFilters,
} from './SearchTraceQLEditor/utils';
import { TempoVariableQuery, TempoVariableQueryType } from './VariableQueryEditor';
import { PrometheusDatasource, PromQuery } from './_importedDependencies/datasources/prometheus/types';
import { TraceqlFilter, TraceqlSearchScope } from './dataquery.gen';
@@ -470,21 +474,7 @@ export class TempoDatasource extends DataSourceWithBackend<TempoQuery, TempoJson
const expandedQuery = { ...query };
if (query.filters) {
expandedQuery.filters = query.filters.map((filter) => {
const updatedFilter = {
...filter,
tag: this.templateSrv.replace(filter.tag ?? '', scopedVars),
};
if (filter.value) {
updatedFilter.value =
typeof filter.value === 'string'
? this.templateSrv.replace(filter.value ?? '', scopedVars, VariableFormatID.Pipe)
: filter.value.map((v) => this.templateSrv.replace(v ?? '', scopedVars, VariableFormatID.Pipe));
}
return updatedFilter;
});
expandedQuery.filters = interpolateFilters(query.filters, scopedVars);
}
if (query.groupBy) {
@@ -1,4 +1,6 @@
import { LanguageProvider, SelectableValue } from '@grafana/data';
import { getTemplateSrv } from '@grafana/runtime';
import { VariableFormatID } from '@grafana/schema';
import { getAllTags, getTagsByScope, getUnscopedTags } from './SearchTraceQLEditor/utils';
import { TraceqlSearchScope } from './dataquery.gen';
@@ -132,7 +134,10 @@ export default class TempoLanguageProvider extends LanguageProvider {
async getOptionsV2(tag: string, query?: string): Promise<Array<SelectableValue<string>>> {
const encodedTag = this.encodeTag(tag);
const response = await this.request(`/api/v2/search/tag/${encodedTag}/values`, query ? { q: query } : {});
const response = await this.request(
`/api/v2/search/tag/${encodedTag}/values`,
query ? { q: getTemplateSrv().replace(query, {}, VariableFormatID.Pipe) } : {}
);
let options: Array<SelectableValue<string>> = [];
if (response && response.tagValues) {
response.tagValues.forEach((v: { type: string; value?: string }) => {