diff --git a/packages/grafana-data/src/transformations/transformers/filter.ts b/packages/grafana-data/src/transformations/transformers/filter.ts index 64a102b5514..4b80fe4672e 100644 --- a/packages/grafana-data/src/transformations/transformers/filter.ts +++ b/packages/grafana-data/src/transformations/transformers/filter.ts @@ -22,9 +22,23 @@ export const filterFieldsTransformer: DataTransformerInfo = { * Return a modified copy of the series. If the transform is not or should not * be applied, just return the input series */ - operator: (options: FilterOptions) => (source) => { + operator: (options: FilterOptions, replace) => (source) => { if (!options.include && !options.exclude) { - return source.pipe(noopTransformer.operator({})); + return source.pipe(noopTransformer.operator({}, replace)); + } + + if (replace) { + if (typeof options.include?.options === 'string') { + options.include.options = replace(options.include?.options); + } else if (typeof options.include?.options?.pattern === 'string') { + options.include.options.pattern = replace(options.include?.options.pattern); + } + + if (typeof options.exclude?.options === 'string') { + options.exclude.options = replace(options.exclude?.options); + } else if (typeof options.exclude?.options?.pattern === 'string') { + options.exclude.options.pattern = replace(options.exclude?.options.pattern); + } } return source.pipe( diff --git a/packages/grafana-data/src/transformations/transformers/filterByName.test.ts b/packages/grafana-data/src/transformations/transformers/filterByName.test.ts index fa9b5cae4b9..459154a7905 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByName.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByName.test.ts @@ -1,4 +1,5 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; +import { ScopedVars } from '../../types'; import { FieldType } from '../../types/dataFrame'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; @@ -195,5 +196,38 @@ describe('filterByName transformer', () => { expect(filtered.fields[0].name).toBe('B'); }); }); + + it('uses template variable substituion', async () => { + const cfg = { + id: DataTransformerID.filterFieldsByName, + options: { + include: { + pattern: '/^$var1/', + }, + }, + replace: (target: string | undefined, scopedVars?: ScopedVars, format?: string | Function): string => { + if (!target) { + return ''; + } + const variables: ScopedVars = { + var1: { + value: 'startsWith', + text: 'Test', + }, + }; + for (const key of Object.keys(variables)) { + return target.replace(`$${key}`, variables[key].value); + } + return target; + }, + }; + + await expect(transformDataFrame([cfg], [seriesWithNamesToMatch])).toEmitValuesWith((received) => { + const data = received[0]; + const filtered = data[0]; + expect(filtered.fields.length).toBe(2); + expect(filtered.fields[0].name).toBe('startsWithA'); + }); + }); }); }); diff --git a/packages/grafana-data/src/transformations/transformers/filterByName.ts b/packages/grafana-data/src/transformations/transformers/filterByName.ts index 0f461eb81f9..7a9ee71c737 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByName.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByName.ts @@ -20,12 +20,15 @@ export const filterFieldsByNameTransformer: DataTransformerInfo (source) => + operator: (options, replace) => (source) => source.pipe( - filterFieldsTransformer.operator({ - include: getMatcherConfig(options.include), - exclude: getMatcherConfig(options.exclude), - }) + filterFieldsTransformer.operator( + { + include: getMatcherConfig(options.include), + exclude: getMatcherConfig(options.exclude), + }, + replace + ) ), };