From 366129c14ea968dede962680d4ee774226b3a1db Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Fri, 9 Sep 2022 10:17:10 +0200 Subject: [PATCH] AzureMonitor: Fix metric namespace list (#54826) --- .../azure_monitor_datasource.test.ts | 13 ++++--- .../azure_monitor/azure_monitor_datasource.ts | 3 +- .../azure_monitor/url_builder.test.ts | 31 +++++++++++++--- .../azure_monitor/url_builder.ts | 5 ++- .../MetricsQueryEditor/dataHooks.test.ts | 36 +++++++++++++++++++ .../MetricsQueryEditor/dataHooks.ts | 15 ++++---- .../datasource.ts | 2 +- .../variables.ts | 2 +- 8 files changed, 88 insertions(+), 19 deletions(-) diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.test.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.test.ts index 3b7ff7e5967..4a2de1421fe 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.test.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.test.ts @@ -125,7 +125,7 @@ describe('AzureMonitorDatasource', () => { const expected = basePath + '/providers/microsoft.insights/components/resource1' + - '/providers/microsoft.insights/metricNamespaces?region=global&api-version=2017-12-01-preview'; + '/providers/microsoft.insights/metricNamespaces?api-version=2017-12-01-preview®ion=global'; expect(path).toBe(expected); return Promise.resolve(response); }); @@ -133,10 +133,13 @@ describe('AzureMonitorDatasource', () => { it('should return list of Metric Namspaces', () => { return ctx.ds.azureMonitorDatasource - .getMetricNamespaces({ - resourceUri: - '/subscriptions/mock-subscription-id/resourceGroups/nodeapp/providers/microsoft.insights/components/resource1', - }) + .getMetricNamespaces( + { + resourceUri: + '/subscriptions/mock-subscription-id/resourceGroups/nodeapp/providers/microsoft.insights/components/resource1', + }, + true + ) .then((results: Array<{ text: string; value: string }>) => { expect(results.length).toEqual(2); expect(results[0].text).toEqual('Azure.ApplicationInsights'); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts index 256100ea845..5fb9226c020 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts @@ -196,11 +196,12 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend { { resourceUri: '/subscriptions/sub/resource-uri/resource', }, + true, templateSrv ); expect(url).toBe( - '/subscriptions/sub/resource-uri/resource/providers/microsoft.insights/metricNamespaces?region=global&api-version=2017-05-01-preview' + '/subscriptions/sub/resource-uri/resource/providers/microsoft.insights/metricNamespaces?api-version=2017-05-01-preview®ion=global' ); }); }); @@ -172,11 +173,12 @@ describe('AzureMonitorUrlBuilder', () => { metricNamespace: 'Microsoft.NetApp/netAppAccounts/capacityPools/volumes', resourceName: 'rn1/rn2/rn3', }, + true, templateSrv ); expect(url).toBe( '/subscriptions/sub1/resourceGroups/rg/providers/Microsoft.NetApp/netAppAccounts/rn1/capacityPools/rn2/volumes/rn3/' + - 'providers/microsoft.insights/metricNamespaces?region=global&api-version=2017-05-01-preview' + 'providers/microsoft.insights/metricNamespaces?api-version=2017-05-01-preview®ion=global' ); }); }); @@ -192,11 +194,31 @@ describe('AzureMonitorUrlBuilder', () => { metricNamespace: 'Microsoft.Sql/servers/databases', resourceName: 'rn1/rn2', }, + true, templateSrv ); expect(url).toBe( '/subscriptions/sub1/resourceGroups/rg/providers/Microsoft.Sql/servers/rn1/databases/rn2/' + - 'providers/microsoft.insights/metricNamespaces?region=global&api-version=2017-05-01-preview' + 'providers/microsoft.insights/metricNamespaces?api-version=2017-05-01-preview®ion=global' + ); + }); + + it('should omit global region if specified', () => { + const url = UrlBuilder.buildAzureMonitorGetMetricNamespacesUrl( + '', + '2017-05-01-preview', + { + subscription: 'sub1', + resourceGroup: 'rg', + metricNamespace: 'Microsoft.Sql/servers/databases', + resourceName: 'rn1/rn2', + }, + false, + templateSrv + ); + expect(url).toBe( + '/subscriptions/sub1/resourceGroups/rg/providers/Microsoft.Sql/servers/rn1/databases/rn2/' + + 'providers/microsoft.insights/metricNamespaces?api-version=2017-05-01-preview' ); }); }); @@ -212,11 +234,12 @@ describe('AzureMonitorUrlBuilder', () => { metricNamespace: 'Microsoft.Sql/servers', resourceName: 'rn', }, + true, templateSrv ); expect(url).toBe( '/subscriptions/sub1/resourceGroups/rg/providers/Microsoft.Sql/servers/rn/' + - 'providers/microsoft.insights/metricNamespaces?region=global&api-version=2017-05-01-preview' + 'providers/microsoft.insights/metricNamespaces?api-version=2017-05-01-preview®ion=global' ); }); }); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/url_builder.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/url_builder.ts index 9b41f1e5030..9caa26ccdc7 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/url_builder.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/url_builder.ts @@ -52,6 +52,7 @@ export default class UrlBuilder { baseUrl: string, apiVersion: string, query: GetMetricNamespacesQuery, + globalRegion: boolean, templateSrv: TemplateSrv ) { let resourceUri: string; @@ -68,7 +69,9 @@ export default class UrlBuilder { }); } - return `${baseUrl}${resourceUri}/providers/microsoft.insights/metricNamespaces?region=global&api-version=${apiVersion}`; + return `${baseUrl}${resourceUri}/providers/microsoft.insights/metricNamespaces?api-version=${apiVersion}${ + globalRegion ? '®ion=global' : '' + }`; } static buildAzureMonitorGetMetricNamesUrl( diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.test.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.test.ts index 40132775c45..3ca999e8e25 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.test.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.test.ts @@ -234,4 +234,40 @@ describe('AzureMonitor: metrics dataHooks', () => { }); }); }); + + describe('useMetricNamespaces', () => { + const metricNamespacesConfig = { + name: 'useMetricNamespaces', + hook: useMetricNamespaces, + emptyQueryPartial: { + resourceGroup: 'rg', + resourceName: 'rn', + metricNamespace: 'azure/vm', + }, + customProperties: {}, + expectedOptions: [ + { label: 'Compute Virtual Machine', value: 'azure/vmc' }, + { label: 'Database NS', value: 'azure/dbns' }, + { label: 'azure/vm', value: 'azure/vm' }, + ], + }; + + it('call getMetricNamespaces without global region', async () => { + const query = { + ...bareQuery, + azureMonitor: metricNamespacesConfig.emptyQueryPartial, + }; + const { result, waitForNextUpdate } = renderHook(() => + metricNamespacesConfig.hook(query, datasource, onChange, jest.fn()) + ); + await waitForNextUpdate(WAIT_OPTIONS); + + expect(result.current).toEqual(metricNamespacesConfig.expectedOptions); + expect(datasource.azureMonitorDatasource.getMetricNamespaces).toHaveBeenCalledWith( + expect.objectContaining(metricNamespacesConfig.emptyQueryPartial), + // Here, "global" should be false + false + ); + }); + }); }); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.ts index 07d9dad3933..fe54cf91258 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/dataHooks.ts @@ -48,12 +48,15 @@ export const useMetricNamespaces: DataHook = (query, datasource, onChange, setEr return; } - const results = await datasource.azureMonitorDatasource.getMetricNamespaces({ - subscription, - metricNamespace, - resourceGroup, - resourceName, - }); + const results = await datasource.azureMonitorDatasource.getMetricNamespaces( + { + subscription, + metricNamespace, + resourceGroup, + resourceName, + }, + false + ); const options = formatOptions(results, metricNamespace); // Do some cleanup of the query state if need be diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts index 6f3515680de..7cb01dab7a1 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts @@ -152,7 +152,7 @@ export default class Datasource extends DataSourceWithBackend