diff --git a/packages/grafana-prometheus/src/language_provider.test.ts b/packages/grafana-prometheus/src/language_provider.test.ts index ca4b8a6b9ce..b8f230a33ab 100644 --- a/packages/grafana-prometheus/src/language_provider.test.ts +++ b/packages/grafana-prometheus/src/language_provider.test.ts @@ -825,6 +825,21 @@ describe('PrometheusLanguageProvider with feature toggle', () => { expect(result).toEqual(['label1', 'label2']); }); + it('queryLabelKeys should interpolate variables', async () => { + const provider = new PrometheusLanguageProvider({ + ...defaultDatasource, + interpolateString: (string: string) => string.replace(/\$/g, 'interpolated_'), + } as PrometheusDatasource); + const resourceClientSpy = jest + .spyOn(provider['resourceClient'], 'queryLabelKeys') + .mockResolvedValue(['label1', 'label2']); + + const result = await provider.queryLabelKeys(timeRange, '{job="$job"}'); + + expect(resourceClientSpy).toHaveBeenCalledWith(timeRange, '{job="interpolated_job"}', undefined); + expect(result).toEqual(['label1', 'label2']); + }); + it('should delegate to resource client queryLabelValues', async () => { const provider = new PrometheusLanguageProvider(defaultDatasource); const resourceClientSpy = jest @@ -836,6 +851,26 @@ describe('PrometheusLanguageProvider with feature toggle', () => { expect(resourceClientSpy).toHaveBeenCalledWith(timeRange, 'job', '{job="grafana"}', undefined); expect(result).toEqual(['value1', 'value2']); }); + + it('queryLabelValues should interpolate variables', async () => { + const provider = new PrometheusLanguageProvider({ + ...defaultDatasource, + interpolateString: (string: string) => string.replace(/\$/g, 'interpolated_'), + } as PrometheusDatasource); + const resourceClientSpy = jest + .spyOn(provider['resourceClient'], 'queryLabelValues') + .mockResolvedValue(['label1', 'label2']); + + const result = await provider.queryLabelValues(timeRange, '$label', '{job="$job"}'); + + expect(resourceClientSpy).toHaveBeenCalledWith( + timeRange, + 'interpolated_label', + '{job="interpolated_job"}', + undefined + ); + expect(result).toEqual(['label1', 'label2']); + }); }); describe('retrieveMethods', () => { diff --git a/packages/grafana-prometheus/src/language_provider.ts b/packages/grafana-prometheus/src/language_provider.ts index 99f7d15dbfa..2e96e4fd65f 100644 --- a/packages/grafana-prometheus/src/language_provider.ts +++ b/packages/grafana-prometheus/src/language_provider.ts @@ -682,7 +682,8 @@ export class PrometheusLanguageProvider extends PromQlLanguageProvider implement * @returns {Promise} Array of matching label key names, sorted alphabetically */ public queryLabelKeys = async (timeRange: TimeRange, match?: string, limit?: number): Promise => { - return await this.resourceClient.queryLabelKeys(timeRange, match, limit); + const interpolatedMatch = match ? this.datasource.interpolateString(match) : match; + return await this.resourceClient.queryLabelKeys(timeRange, interpolatedMatch, limit); }; /** @@ -716,7 +717,13 @@ export class PrometheusLanguageProvider extends PromQlLanguageProvider implement match?: string, limit?: number ): Promise => { - return await this.resourceClient.queryLabelValues(timeRange, labelKey, match, limit); + const interpolatedMatch = match ? this.datasource.interpolateString(match) : match; + return await this.resourceClient.queryLabelValues( + timeRange, + this.datasource.interpolateString(labelKey), + interpolatedMatch, + limit + ); }; }