From ded351dc796851ec42ed48616dddcd5db392f635 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Wed, 26 Apr 2023 13:38:46 +0100 Subject: [PATCH] [v9.4.x] Azure Monitor: Fix bug that was not showing resources for certain locations (#66617) Azure Monitor: Fix bug that was not showing resources for certain locations (#66502) (cherry picked from commit d43482a4632dfd990d214c10f7c34daad897e99c) Co-authored-by: Alyssa Bull <58453566+alyssabull@users.noreply.github.com> --- .../MetricsQueryEditor.test.tsx | 2 +- .../resourcePicker/resourcePickerData.test.ts | 16 +++--- .../resourcePicker/resourcePickerData.ts | 49 +++++-------------- 3 files changed, 21 insertions(+), 46 deletions(-) diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx index b5ddf15c837..4e4893c320d 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx @@ -45,7 +45,7 @@ export function createMockResourcePickerData() { mockResourcePicker.getResourcesForResourceGroup = jest.fn().mockResolvedValue(mockResourcesByResourceGroup()); mockResourcePicker.getResourceURIFromWorkspace = jest.fn().mockReturnValue(''); mockResourcePicker.getResourceURIDisplayProperties = jest.fn().mockResolvedValue({}); - mockResourcePicker.getLogsLocations = jest.fn().mockResolvedValue(mockGetValidLocations()); + mockResourcePicker.getLocations = jest.fn().mockResolvedValue(mockGetValidLocations()); return mockResourcePicker; } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.test.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.test.ts index 634394593e8..ea89b0b360d 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.test.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.test.ts @@ -32,11 +32,11 @@ const createResourcePickerData = (responses: AzureGraphResponse[]) => { postResource.mockResolvedValueOnce(res); }); resourcePickerData.postResource = postResource; - const logLocationsMap = mockGetValidLocations(); - const getLogsLocations = jest.spyOn(resourcePickerData, 'getLogsLocations').mockResolvedValue(logLocationsMap); - resourcePickerData.logLocationsMap = logLocationsMap; - resourcePickerData.logLocations = Array.from(logLocationsMap.values()).map((location) => `"${location.name}"`); - return { resourcePickerData, postResource, mockDatasource, getValidLocations: getLogsLocations }; + const locationsMap = mockGetValidLocations(); + const getLocations = jest.spyOn(resourcePickerData, 'getLocations').mockResolvedValue(locationsMap); + resourcePickerData.locationsMap = locationsMap; + resourcePickerData.locations = Array.from(locationsMap.values()).map((location) => `"${location.name}"`); + return { resourcePickerData, postResource, mockDatasource, getValidLocations: getLocations }; }; describe('AzureMonitor resourcePickerData', () => { @@ -397,13 +397,12 @@ describe('AzureMonitor resourcePickerData', () => { const { resourcePickerData, getValidLocations } = createResourcePickerData([createMockARGSubscriptionResponse()]); getValidLocations.mockRestore(); const subscriptions = await resourcePickerData.getSubscriptions(); - const locations = await resourcePickerData.getLogsLocations(subscriptions); + const locations = await resourcePickerData.getLocations(subscriptions); expect(locations.size).toBe(1); expect(locations.has('northeurope')).toBe(true); expect(locations.get('northeurope')?.name).toBe('northeurope'); expect(locations.get('northeurope')?.displayName).toBe('North Europe'); - expect(locations.get('northeurope')?.supportsLogs).toBe(true); }); it('returns the raw locations map if provider is undefined', async () => { @@ -413,13 +412,12 @@ describe('AzureMonitor resourcePickerData', () => { getValidLocations.mockRestore(); mockDatasource.azureMonitorDatasource.getProvider = jest.fn().mockResolvedValue(undefined); const subscriptions = await resourcePickerData.getSubscriptions(); - const locations = await resourcePickerData.getLogsLocations(subscriptions); + const locations = await resourcePickerData.getLocations(subscriptions); expect(locations.size).toBe(1); expect(locations.has('northeurope')).toBe(true); expect(locations.get('northeurope')?.name).toBe('northeurope'); expect(locations.get('northeurope')?.displayName).toBe('North Europe'); - expect(locations.get('northeurope')?.supportsLogs).toBe(false); }); }); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts index 148dbb62fdc..38038f050f6 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/resourcePicker/resourcePickerData.ts @@ -39,8 +39,8 @@ export default class ResourcePickerData extends DataSourceWithBackend = new Map(); - logLocations: string[] = []; + locationsMap: Map = new Map(); + locations: string[] = []; constructor( instanceSettings: DataSourceInstanceSettings, @@ -57,9 +57,9 @@ export default class ResourcePickerData extends DataSourceWithBackend { const subscriptions = await this.getSubscriptions(); - if (this.logLocationsMap.size === 0) { - this.logLocationsMap = await this.getLogsLocations(subscriptions); - this.logLocations = Array.from(this.logLocationsMap.values()).map((location) => `"${location.name}"`); + if (this.locationsMap.size === 0) { + this.locationsMap = await this.getLocations(subscriptions); + this.locations = Array.from(this.locationsMap.values()).map((location) => `"${location.name}"`); } if (!currentSelection) { @@ -140,7 +140,7 @@ export default class ResourcePickerData extends DataSourceWithBackend { - if (!this.logLocations) { + if (!this.locations) { return []; } + const { data: response } = await this.makeResourceGraphRequest(` resources | where id hasprefix "${resourceGroupId}" - ${await this.filterByType(type)} and location in (${this.logLocations}) + ${await this.filterByType(type)} and location in (${this.locations}) `); return response.map((item) => { @@ -264,7 +265,7 @@ export default class ResourcePickerData extends DataSourceWithBackend> { + async getLocations(subscriptions: ResourceRowGroup): Promise> { const subscriptionIds = subscriptions.map((sub) => sub.id); const locations = await this.azureMonitorDatasource.getLocations(subscriptionIds); - const insightsProvider = await this.azureMonitorDatasource.getProvider('Microsoft.Insights'); - const logsProvider = insightsProvider?.resourceTypes.find((provider) => provider.resourceType === 'logs'); - - if (!logsProvider) { - return locations; - } - - const logsLocations = logsProvider.locations.map((location) => ({ - displayName: location, - name: '', - supportsLogs: true, - })); - - const logLocationsMap = new Map(); - - for (const logLocation of logsLocations) { - const name = - Array.from(locations.values()).find((location) => logLocation.displayName === location.displayName)?.name || ''; - - if (name !== '') { - logLocationsMap.set(name, { ...logLocation, name }); - } - } - - return logLocationsMap; + return locations; } parseRows(resources: Array): ResourceRow[] { @@ -445,7 +422,7 @@ export default class ResourcePickerData extends DataSourceWithBackend