From 217427e072cde0a81641a0b2b7d7c893fce7f638 Mon Sep 17 00:00:00 2001 From: Peter Nguyen Date: Tue, 6 Jan 2026 02:29:51 -0800 Subject: [PATCH] Loki Language Provider: Add missing interpolation to fetchLabelsByLabelsEndpoint (#114608) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Plugins: Implement bug fix for loki label selectors w/ variable interpolation * Chore: Add test to ensure result is interpolated --------- Co-authored-by: Zoltán Bedi --- .../datasource/loki/LanguageProvider.test.ts | 17 +++++++++++++++++ .../plugins/datasource/loki/LanguageProvider.ts | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/public/app/plugins/datasource/loki/LanguageProvider.test.ts b/public/app/plugins/datasource/loki/LanguageProvider.test.ts index 447911c70a5..fb2e483a888 100644 --- a/public/app/plugins/datasource/loki/LanguageProvider.test.ts +++ b/public/app/plugins/datasource/loki/LanguageProvider.test.ts @@ -560,6 +560,23 @@ describe('Language completion provider', () => { start: 1560153109000, }); }); + + it('should interpolate variables in stream selector', async () => { + const datasource = setup({}); + jest.spyOn(datasource, 'getTimeRangeParams').mockReturnValue({ start: 0, end: 1 }); + jest + .spyOn(datasource, 'interpolateString') + .mockImplementation((string: string) => string.replace(/\$test_var/g, 'age')); + + const languageProvider = new LanguageProvider(datasource); + languageProvider.request = jest.fn().mockResolvedValue([]); + await languageProvider.fetchLabels({ streamSelector: '{age="new", $test_var="new"}' }); + expect(languageProvider.request).toHaveBeenCalledWith('labels', { + end: 1, + query: '{age="new", age="new"}', + start: 0, + }); + }); }); it('should filter internal labels', async () => { diff --git a/public/app/plugins/datasource/loki/LanguageProvider.ts b/public/app/plugins/datasource/loki/LanguageProvider.ts index a6851e474d4..2670ee99dcb 100644 --- a/public/app/plugins/datasource/loki/LanguageProvider.ts +++ b/public/app/plugins/datasource/loki/LanguageProvider.ts @@ -175,7 +175,8 @@ export default class LokiLanguageProvider extends LanguageProvider { const { start, end } = this.datasource.getTimeRangeParams(range); const params: Record = { start, end }; if (options?.streamSelector && options?.streamSelector !== EMPTY_SELECTOR) { - params['query'] = options.streamSelector; + const interpolatedStreamSelector = this.datasource.interpolateString(options.streamSelector); + params['query'] = interpolatedStreamSelector; } const res = await this.request(url, params); if (Array.isArray(res)) {