From de4ac8ae59abc67c401f83bc78eae858a3e1e287 Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Mon, 10 Jan 2022 11:22:06 +0100 Subject: [PATCH] AzureMonitor: Filter list of resources by resourceType (#43522) --- .../azure_monitor_datasource.test.ts | 49 ++++++++++++------- .../azure_monitor/azure_monitor_datasource.ts | 27 +++++----- 2 files changed, 45 insertions(+), 31 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 a856374d0a6..022569cdb0b 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 @@ -1,10 +1,10 @@ -import AzureMonitorDatasource from '../datasource'; - -import { TemplateSrv } from 'app/features/templating/template_srv'; import { DataSourceInstanceSettings } from '@grafana/data'; -import { AzureDataSourceJsonData, AzureQueryType, DatasourceValidationResult } from '../types'; +import { TemplateSrv } from 'app/features/templating/template_srv'; + import createMockQuery from '../__mocks__/query'; import { singleVariable, subscriptionsVariable } from '../__mocks__/variables'; +import AzureMonitorDatasource from '../datasource'; +import { AzureDataSourceJsonData, AzureQueryType, DatasourceValidationResult } from '../types'; const templateSrv = new TemplateSrv(); @@ -163,7 +163,7 @@ describe('AzureMonitorDatasource', () => { beforeEach(() => { ctx.ds.azureMonitorDatasource.getResource = jest.fn().mockImplementation((path: string) => { const basePath = 'azuremonitor/subscriptions/9935389e-9122-4ef9-95f9-1513dd24753f/resourceGroups'; - expect(path).toBe(basePath + '/nodesapp/resources?api-version=2018-01-01'); + expect(path).toBe(basePath + '/nodesapp/resources?api-version=2021-04-01'); return Promise.resolve(response); }); }); @@ -192,6 +192,16 @@ describe('AzureMonitorDatasource', () => { }); describe('When performing getResourceNames', () => { + let subscription = '9935389e-9122-4ef9-95f9-1513dd24753f'; + let resourceGroup = 'nodeapp'; + let metricDefinition = 'microsoft.insights/components'; + + beforeEach(() => { + subscription = '9935389e-9122-4ef9-95f9-1513dd24753f'; + resourceGroup = 'nodeapp'; + metricDefinition = 'microsoft.insights/components'; + }); + describe('and there are no special cases', () => { const response = { value: [ @@ -200,23 +210,25 @@ describe('AzureMonitorDatasource', () => { type: 'microsoft.insights/alertrules', }, { - name: 'nodeapp', - type: 'microsoft.insights/components', + name: resourceGroup, + type: metricDefinition, }, ], }; beforeEach(() => { ctx.ds.azureMonitorDatasource.getResource = jest.fn().mockImplementation((path: string) => { - const basePath = 'azuremonitor/subscriptions/9935389e-9122-4ef9-95f9-1513dd24753f/resourceGroups'; - expect(path).toBe(basePath + '/nodeapp/resources?api-version=2018-01-01'); + const basePath = `azuremonitor/subscriptions/${subscription}/resourceGroups`; + expect(path).toBe( + `${basePath}/${resourceGroup}/resources?$filter=resourceType eq '${metricDefinition}'&api-version=2021-04-01` + ); return Promise.resolve(response); }); }); it('should return list of Resource Names', () => { return ctx.ds - .getResourceNames('9935389e-9122-4ef9-95f9-1513dd24753f', 'nodeapp', 'microsoft.insights/components') + .getResourceNames(subscription, resourceGroup, metricDefinition) .then((results: Array<{ text: string; value: string }>) => { expect(results.length).toEqual(1); expect(results[0].text).toEqual('nodeapp'); @@ -225,8 +237,9 @@ describe('AzureMonitorDatasource', () => { }); it('should return ignore letter case', () => { + metricDefinition = 'microsoft.insights/Components'; return ctx.ds - .getResourceNames('9935389e-9122-4ef9-95f9-1513dd24753f', 'nodeapp', 'microsoft.insights/Components') + .getResourceNames(subscription, resourceGroup, metricDefinition) .then((results: Array<{ text: string; value: string }>) => { expect(results.length).toEqual(1); expect(results[0].text).toEqual('nodeapp'); @@ -251,19 +264,19 @@ describe('AzureMonitorDatasource', () => { beforeEach(() => { ctx.ds.azureMonitorDatasource.getResource = jest.fn().mockImplementation((path: string) => { - const basePath = 'azuremonitor/subscriptions/9935389e-9122-4ef9-95f9-1513dd24753f/resourceGroups'; - expect(path).toBe(basePath + '/nodeapp/resources?api-version=2018-01-01'); + const basePath = `azuremonitor/subscriptions/${subscription}/resourceGroups`; + expect(path).toBe( + basePath + + `/${resourceGroup}/resources?$filter=resourceType eq '${metricDefinition}'&api-version=2021-04-01` + ); return Promise.resolve(response); }); }); it('should return list of Resource Names', () => { + metricDefinition = 'Microsoft.Storage/storageAccounts/blobServices'; return ctx.ds - .getResourceNames( - '9935389e-9122-4ef9-95f9-1513dd24753f', - 'nodeapp', - 'Microsoft.Storage/storageAccounts/blobServices' - ) + .getResourceNames(subscription, resourceGroup, metricDefinition) .then((results: Array<{ text: string; value: string }>) => { expect(results.length).toEqual(1); expect(results[0].text).toEqual('storagetest/default'); 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 f06919c4840..2930269776e 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 @@ -1,29 +1,30 @@ +import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data'; +import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime'; +import { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { filter, startsWith } from 'lodash'; -import UrlBuilder from './url_builder'; -import ResponseParser from './response_parser'; -import SupportedNamespaces from './supported_namespaces'; + +import { resourceTypeDisplayNames } from '../azureMetadata'; +import { getAuthType, getAzureCloud, getAzurePortalUrl } from '../credentials'; import TimegrainConverter from '../time_grain_converter'; import { - AzureMonitorQuery, AzureDataSourceJsonData, AzureMonitorMetricDefinitionsResponse, + AzureMonitorQuery, AzureMonitorResourceGroupsResponse, AzureQueryType, DatasourceValidationResult, } from '../types'; -import { DataSourceInstanceSettings, ScopedVars } from '@grafana/data'; -import { DataSourceWithBackend, getTemplateSrv } from '@grafana/runtime'; - -import { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv'; -import { getAuthType, getAzureCloud, getAzurePortalUrl } from '../credentials'; -import { resourceTypeDisplayNames } from '../azureMetadata'; import { routeNames } from '../utils/common'; +import ResponseParser from './response_parser'; +import SupportedNamespaces from './supported_namespaces'; +import UrlBuilder from './url_builder'; const defaultDropdownValue = 'select'; export default class AzureMonitorDatasource extends DataSourceWithBackend { apiVersion = '2018-01-01'; apiPreviewVersion = '2017-12-01-preview'; + listByResourceGroupApiVersion = '2021-04-01'; defaultSubscriptionId?: string; resourcePath: string; azurePortalUrl: string; @@ -134,7 +135,7 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend { return ResponseParser.parseResponseValues(result, 'name', 'name'); }); @@ -142,7 +143,7 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend { return ResponseParser.parseResponseValues(result, 'type', 'type'); @@ -195,7 +196,7 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend { if (!startsWith(metricDefinition, 'Microsoft.Storage/storageAccounts/')) { return ResponseParser.parseResourceNames(result, metricDefinition);