diff --git a/e2e/dashboards-suite/dashboard-public-create.spec.ts b/e2e/dashboards-suite/dashboard-public-create.spec.ts index 304f502dfa3..5b0bb7b159d 100644 --- a/e2e/dashboards-suite/dashboard-public-create.spec.ts +++ b/e2e/dashboards-suite/dashboard-public-create.spec.ts @@ -8,7 +8,11 @@ e2e.scenario({ skipScenario: false, scenario: () => { // Opening a dashboard without template variables - e2e().intercept('POST', '/api/ds/query').as('query'); + e2e() + .intercept({ + pathname: '/api/ds/query', + }) + .as('query'); e2e.flows.openDashboard({ uid: 'ZqZnVvFZz' }); e2e().wait('@query'); @@ -65,7 +69,12 @@ e2e.scenario({ skipScenario: false, scenario: () => { // Opening a dashboard without template variables - e2e().intercept('POST', '/api/ds/query').as('query'); + e2e() + .intercept({ + method: 'POST', + pathname: '/api/ds/query', + }) + .as('query'); e2e.flows.openDashboard({ uid: 'ZqZnVvFZz' }); e2e().wait('@query'); @@ -109,7 +118,12 @@ e2e.scenario({ skipScenario: false, scenario: () => { // Opening a dashboard without template variables - e2e().intercept('/api/ds/query').as('query'); + e2e() + .intercept({ + method: 'POST', + pathname: '/api/ds/query', + }) + .as('query'); e2e.flows.openDashboard({ uid: 'ZqZnVvFZz' }); e2e().wait('@query'); diff --git a/e2e/dashboards-suite/load-options-from-url.spec.ts b/e2e/dashboards-suite/load-options-from-url.spec.ts index d4e2f486eed..e42a55d7056 100644 --- a/e2e/dashboards-suite/load-options-from-url.spec.ts +++ b/e2e/dashboards-suite/load-options-from-url.spec.ts @@ -9,7 +9,7 @@ describe('Variables - Load options from Url', () => { e2e() .intercept({ method: 'POST', - url: '/api/ds/query', + pathname: '/api/ds/query*', }) .as('query'); @@ -61,7 +61,7 @@ describe('Variables - Load options from Url', () => { e2e() .intercept({ method: 'POST', - url: '/api/ds/query', + pathname: '/api/ds/query', }) .as('query'); @@ -124,7 +124,7 @@ describe('Variables - Load options from Url', () => { e2e() .intercept({ method: 'POST', - url: '/api/ds/query', + pathname: '/api/ds/query', }) .as('query'); diff --git a/e2e/dashboards-suite/set-options-from-ui.spec.ts b/e2e/dashboards-suite/set-options-from-ui.spec.ts index 94d1fbe60fd..c6d61d78c1d 100644 --- a/e2e/dashboards-suite/set-options-from-ui.spec.ts +++ b/e2e/dashboards-suite/set-options-from-ui.spec.ts @@ -61,7 +61,11 @@ describe('Variables - Set options from ui', () => { it('adding a value that is not part of dependents options should add the new values dependant options', () => { e2e.flows.login('admin', 'admin'); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1&var-datacenter=A&var-server=AA&var-pod=AAA` }); - e2e().intercept('/api/ds/query').as('query'); + e2e() + .intercept({ + pathname: '/api/ds/query', + }) + .as('query'); e2e().wait('@query'); @@ -119,7 +123,7 @@ describe('Variables - Set options from ui', () => { e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1&var-datacenter=A&var-datacenter=B&var-server=AA&var-server=BB&var-pod=AAA&var-pod=BBB`, }); - e2e().intercept('/api/ds/query').as('query'); + e2e().intercept({ pathname: '/api/ds/query' }).as('query'); e2e().wait('@query'); diff --git a/e2e/panels-suite/panelEdit_base.spec.ts b/e2e/panels-suite/panelEdit_base.spec.ts index 6d38ba9b1b2..2ae5daa1cd2 100644 --- a/e2e/panels-suite/panelEdit_base.spec.ts +++ b/e2e/panels-suite/panelEdit_base.spec.ts @@ -9,7 +9,11 @@ e2e.scenario({ addScenarioDashBoard: false, skipScenario: false, scenario: () => { - e2e().intercept('/api/ds/query').as('query'); + e2e() + .intercept({ + pathname: '/api/ds/query', + }) + .as('query'); e2e.flows.openDashboard({ uid: 'TkZXxlNG3' }); e2e().wait('@query'); diff --git a/e2e/sql-suite/mysql.spec.ts b/e2e/sql-suite/mysql.spec.ts index ab535220c98..91ab9d7379a 100644 --- a/e2e/sql-suite/mysql.spec.ts +++ b/e2e/sql-suite/mysql.spec.ts @@ -11,24 +11,30 @@ describe('MySQL datasource', () => { it('code editor autocomplete should handle table name escaping/quoting', () => { e2e.flows.login('admin', 'admin'); - e2e().intercept('POST', '**/api/ds/query', (req) => { - if (req.body.queries[0].refId === 'datasets') { - req.alias = 'datasets'; - req.reply({ - body: datasetResponse, - }); - } else if (req.body.queries[0].refId === 'tables') { - req.alias = 'tables'; - req.reply({ - body: tablesResponse, - }); - } else if (req.body.queries[0].refId === 'fields') { - req.alias = 'fields'; - req.reply({ - body: fieldsResponse, - }); + e2e().intercept( + 'POST', + { + pathname: '/api/ds/query', + }, + (req) => { + if (req.body.queries[0].refId === 'datasets') { + req.alias = 'datasets'; + req.reply({ + body: datasetResponse, + }); + } else if (req.body.queries[0].refId === 'tables') { + req.alias = 'tables'; + req.reply({ + body: tablesResponse, + }); + } else if (req.body.queries[0].refId === 'fields') { + req.alias = 'fields'; + req.reply({ + body: fieldsResponse, + }); + } } - }); + ); e2e.pages.Explore.visit(); diff --git a/e2e/various-suite/exemplars.spec.ts b/e2e/various-suite/exemplars.spec.ts index 164296d70e0..70c286902a0 100644 --- a/e2e/various-suite/exemplars.spec.ts +++ b/e2e/various-suite/exemplars.spec.ts @@ -32,16 +32,21 @@ describe('Exemplars', () => { }); it('should be able to navigate to configured data source', () => { - e2e().intercept('/api/ds/query', (req) => { - const datasourceType = req.body.queries[0].datasource.type; - if (datasourceType === 'prometheus') { - req.reply({ fixture: 'exemplars-query-response.json' }); - } else if (datasourceType === 'tempo') { - req.reply({ fixture: 'tempo-response.json' }); - } else { - req.reply({}); + e2e().intercept( + { + pathname: '/api/ds/query', + }, + (req) => { + const datasourceType = req.body.queries[0].datasource.type; + if (datasourceType === 'prometheus') { + req.reply({ fixture: 'exemplars-query-response.json' }); + } else if (datasourceType === 'tempo') { + req.reply({ fixture: 'tempo-response.json' }); + } else { + req.reply({}); + } } - }); + ); e2e.pages.Explore.visit(); diff --git a/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts b/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts index f703528d10a..40b17f3fdb0 100644 --- a/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts +++ b/packages/grafana-runtime/src/utils/DataSourceWithBackend.test.ts @@ -98,7 +98,7 @@ describe('DataSourceWithBackend', () => { "hideFromInspector": false, "method": "POST", "requestId": undefined, - "url": "/api/ds/query", + "url": "/api/ds/query?ds_type=dummy", } `); }); @@ -153,7 +153,7 @@ describe('DataSourceWithBackend', () => { "hideFromInspector": false, "method": "POST", "requestId": undefined, - "url": "/api/ds/query?expression=true", + "url": "/api/ds/query?ds_type=dummy&expression=true", } `); }); @@ -222,7 +222,7 @@ describe('DataSourceWithBackend', () => { "hideFromInspector": true, "method": "POST", "requestId": undefined, - "url": "/api/ds/query", + "url": "/api/ds/query?ds_type=dummy", } `); }); diff --git a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts index 8b8b142948c..5b3793cfcbf 100644 --- a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts +++ b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts @@ -202,10 +202,16 @@ class DataSourceWithBackend< headers[PluginRequestHeaders.PluginID] = Array.from(pluginIDs).join(', '); headers[PluginRequestHeaders.DatasourceUID] = Array.from(dsUIDs).join(', '); - let url = '/api/ds/query'; + let url = '/api/ds/query?ds_type=' + this.type; + if (hasExpr) { headers[PluginRequestHeaders.FromExpression] = 'true'; - url += '?expression=true'; + url += '&expression=true'; + } + + // Appending request ID to url to facilitate client-side performance metrics. See #65244 for more context. + if (requestId) { + url += `&requestId=${requestId}`; } if (request.dashboardUID) {