From 16107f3784c9436cc1b882a46d68aaed6cc3e433 Mon Sep 17 00:00:00 2001 From: Alexandru Bumbacea Date: Thu, 26 Nov 2020 11:56:14 +0200 Subject: [PATCH] * prometheus fix variables fetching when customQueryParameters used #28907 (#28949) --- .../prometheus/configuration/PromSettings.tsx | 2 +- .../datasource/prometheus/datasource.test.ts | 28 ++++++++++++++++++- .../datasource/prometheus/datasource.ts | 10 +++++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx b/public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx index f026f8c705a..3a850d3e8b7 100644 --- a/public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx +++ b/public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx @@ -90,7 +90,7 @@ export const PromSettings = (props: Props) => { { directUrl: 'direct', user: 'test', password: 'mupp', - jsonData: {} as any, + jsonData: { + customQueryParameters: '', + } as any, } as unknown) as DataSourceInstanceSettings; beforeEach(() => { @@ -141,6 +143,30 @@ describe('PrometheusDatasource', () => { }); }); + describe('When using customQueryParams', () => { + const promDs = new PrometheusDatasource( + { ...instanceSettings, jsonData: { customQueryParameters: 'customQuery=123' } as any }, + templateSrvStub as any, + timeSrvStub as any + ); + it('added to metadata request', () => { + promDs.metadataRequest('/foo'); + expect(fetchMock.mock.calls.length).toBe(1); + expect(fetchMock.mock.calls[0][0].url).toBe('proxied/foo?customQuery=123'); + }); + it('added to query', () => { + promDs.query({ + range: { from: time({ seconds: 63 }), to: time({ seconds: 183 }) }, + targets: [{ expr: 'test{job="testjob"}', format: 'time_series' }], + interval: '60s', + } as any); + expect(fetchMock.mock.calls.length).toBe(1); + expect(fetchMock.mock.calls[0][0].url).toBe( + 'proxied/api/v1/query_range?query=test%7Bjob%3D%22testjob%22%7D&start=60&end=180&step=60&customQuery=123' + ); + }); + }); + describe('When using adhoc filters', () => { const DEFAULT_QUERY_EXPRESSION = 'metric{job="foo"} - metric'; const target = { expr: DEFAULT_QUERY_EXPRESSION }; diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index 2241b9c9ab6..26e0e2fefbd 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -111,7 +111,7 @@ export class PrometheusDatasource extends DataSourceApi if (data && Object.keys(data).length) { options.url = options.url + - '?' + + (options.url.search(/\?/) >= 0 ? '&' : '?') + Object.entries(data) .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`) .join('&'); @@ -134,7 +134,13 @@ export class PrometheusDatasource extends DataSourceApi // Use this for tab completion features, wont publish response to other components metadataRequest(url: string) { - return this._request(url, null, { method: 'GET', hideFromInspector: true }).toPromise(); // toPromise until we change getTagValues, getTagKeys to Observable + const data: any = {}; + for (const [key, value] of this.customQueryParameters) { + if (data[key] == null) { + data[key] = value; + } + } + return this._request(url, data, { method: 'GET', hideFromInspector: true }).toPromise(); // toPromise until we change getTagValues, getTagKeys to Observable } interpolateQueryExpr(value: string | string[] = [], variable: any) {