diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/datasource.ts index a6d66c28ed6b..78212a24e472 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/datasource.ts @@ -24,6 +24,17 @@ export default function createMockDatasource(overrides?: DeepPartial supportedTimeGrains: [], dimensions: [], }), + getProvider: jest.fn().mockResolvedValueOnce({ + namespace: 'Microsoft.Insights', + resourceTypes: [ + { resourceType: 'logs', locations: ['North Europe'], apiVersions: ['2022-11-11'], capabilities: '' }, + ], + }), + getLocations: jest + .fn() + .mockResolvedValueOnce( + new Map([['northeurope', { displayName: 'North Europe', name: 'northeurope', supportsLogs: false }]]) + ), }, getAzureLogAnalyticsWorkspaces: jest.fn().mockResolvedValueOnce([]), diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/resourcePickerRows.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/resourcePickerRows.ts index b421466ec9a5..18f7ca495aa1 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/resourcePickerRows.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/__mocks__/resourcePickerRows.ts @@ -1,4 +1,5 @@ import { ResourceRowGroup, ResourceRowType } from '../components/ResourcePicker/types'; +import { AzureMonitorLocations } from '../types'; export const createMockSubscriptions = (): ResourceRowGroup => [ { @@ -117,3 +118,6 @@ export const mockSearchResults = (): ResourceRowGroup => [ location: 'northeurope', }, ]; + +export const mockGetValidLocations = (): Map => + new Map([['northeurope', { displayName: 'North Europe', name: 'northeurope', supportsLogs: true }]]); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/index.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/index.ts index 0295adade607..7514607b8897 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/index.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/index.ts @@ -1,3 +1,2 @@ -export * from './locations'; export * from './resourceTypes'; export * from './logsResourceTypes'; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/locations.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/locations.ts deleted file mode 100644 index bde06002c658..000000000000 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azureMetadata/locations.ts +++ /dev/null @@ -1,359 +0,0 @@ -// Unfortunately this list is manually maintained as there's no (nice) automated way to get -// data from Azure. - -export const locationMetadata = [ - { - location: 'eastus', - displayName: 'East US', - supportsLogs: true, - }, - { - location: 'eastus2', - displayName: 'East US 2', - supportsLogs: true, - }, - { - location: 'southcentralus', - displayName: 'South Central US', - supportsLogs: true, - }, - { - location: 'westus2', - displayName: 'West US 2', - supportsLogs: true, - }, - { - location: 'westus3', - displayName: 'West US 3', - supportsLogs: true, - }, - { - location: 'australiaeast', - displayName: 'Australia East', - supportsLogs: true, - }, - { - location: 'southeastasia', - displayName: 'Southeast Asia', - supportsLogs: true, - }, - { - location: 'northeurope', - displayName: 'North Europe', - supportsLogs: true, - }, - { - location: 'uksouth', - displayName: 'UK South', - supportsLogs: true, - }, - { - location: 'westeurope', - displayName: 'West Europe', - supportsLogs: true, - }, - { - location: 'centralus', - displayName: 'Central US', - supportsLogs: true, - }, - { - location: 'northcentralus', - displayName: 'North Central US', - supportsLogs: true, - }, - { - location: 'westus', - displayName: 'West US', - supportsLogs: true, - }, - { - location: 'southafricanorth', - displayName: 'South Africa North', - supportsLogs: true, - }, - { - location: 'centralindia', - displayName: 'Central India', - supportsLogs: true, - }, - { - location: 'eastasia', - displayName: 'East Asia', - supportsLogs: true, - }, - { - location: 'japaneast', - displayName: 'Japan East', - supportsLogs: true, - }, - { - location: 'jioindiawest', - displayName: 'Jio India West', - supportsLogs: true, - }, - { - location: 'koreacentral', - displayName: 'Korea Central', - supportsLogs: true, - }, - { - location: 'canadacentral', - displayName: 'Canada Central', - supportsLogs: true, - }, - { - location: 'francecentral', - displayName: 'France Central', - supportsLogs: true, - }, - { - location: 'germanywestcentral', - displayName: 'Germany West Central', - supportsLogs: true, - }, - { - location: 'norwayeast', - displayName: 'Norway East', - supportsLogs: true, - }, - { - location: 'switzerlandnorth', - displayName: 'Switzerland North', - supportsLogs: true, - }, - { - location: 'uaenorth', - displayName: 'UAE North', - supportsLogs: true, - }, - { - location: 'brazilsouth', - displayName: 'Brazil South', - supportsLogs: true, - }, - { - location: 'centralusstage', - displayName: 'Central US (Stage)', - supportsLogs: true, - }, - { - location: 'eastusstage', - displayName: 'East US (Stage)', - supportsLogs: true, - }, - { - location: 'eastus2stage', - displayName: 'East US 2 (Stage)', - supportsLogs: true, - }, - { - location: 'northcentralusstage', - displayName: 'North Central US (Stage)', - supportsLogs: true, - }, - { - location: 'southcentralusstage', - displayName: 'South Central US (Stage)', - supportsLogs: true, - }, - { - location: 'westusstage', - displayName: 'West US (Stage)', - supportsLogs: true, - }, - { - location: 'westus2stage', - displayName: 'West US 2 (Stage)', - supportsLogs: true, - }, - { - location: 'asia', - displayName: 'Asia', - supportsLogs: true, - }, - { - location: 'asiapacific', - displayName: 'Asia Pacific', - supportsLogs: true, - }, - { - location: 'australia', - displayName: 'Australia', - supportsLogs: true, - }, - { - location: 'brazil', - displayName: 'Brazil', - supportsLogs: true, - }, - { - location: 'canada', - displayName: 'Canada', - supportsLogs: true, - }, - { - location: 'europe', - displayName: 'Europe', - supportsLogs: true, - }, - { - location: 'global', - displayName: 'Global', - supportsLogs: true, - }, - { - location: 'india', - displayName: 'India', - supportsLogs: true, - }, - { - location: 'japan', - displayName: 'Japan', - supportsLogs: true, - }, - { - location: 'uk', - displayName: 'United Kingdom', - supportsLogs: true, - }, - { - location: 'unitedstates', - displayName: 'United States', - supportsLogs: true, - }, - { - location: 'eastasiastage', - displayName: 'East Asia (Stage)', - supportsLogs: true, - }, - { - location: 'southeastasiastage', - displayName: 'Southeast Asia (Stage)', - supportsLogs: true, - }, - { - location: 'westcentralus', - displayName: 'West Central US', - supportsLogs: true, - }, - { - location: 'southafricawest', - displayName: 'South Africa West', - supportsLogs: true, - }, - { - location: 'australiacentral', - displayName: 'Australia Central', - supportsLogs: true, - }, - { - location: 'australiacentral2', - displayName: 'Australia Central 2', - supportsLogs: true, - }, - { - location: 'australiasoutheast', - displayName: 'Australia Southeast', - supportsLogs: true, - }, - { - location: 'japanwest', - displayName: 'Japan West', - supportsLogs: true, - }, - { - location: 'koreasouth', - displayName: 'Korea South', - supportsLogs: true, - }, - { - location: 'southindia', - displayName: 'South India', - supportsLogs: true, - }, - { - location: 'westindia', - displayName: 'West India', - supportsLogs: true, - }, - { - location: 'canadaeast', - displayName: 'Canada East', - supportsLogs: true, - }, - { - location: 'francesouth', - displayName: 'France South', - supportsLogs: true, - }, - { - location: 'germanynorth', - displayName: 'Germany North', - supportsLogs: true, - }, - { - location: 'norwaywest', - displayName: 'Norway West', - supportsLogs: true, - }, - { - location: 'switzerlandwest', - displayName: 'Switzerland West', - supportsLogs: true, - }, - { - location: 'ukwest', - displayName: 'UK West', - supportsLogs: true, - }, - { - location: 'uaecentral', - displayName: 'UAE Central', - supportsLogs: true, - }, - { - location: 'brazilsoutheast', - displayName: 'Brazil Southeast', - supportsLogs: true, - }, - { - location: 'chinaeast', - displayName: 'China Eest', - supportsLogs: true, - }, - { - location: 'chinaeast2', - displayName: 'China Eest 2', - supportsLogs: true, - }, - { - location: 'chinanorth', - displayName: 'China North', - supportsLogs: true, - }, - { - location: 'chinanorth2', - displayName: 'China North 2', - supportsLogs: true, - }, - { - location: 'chinanorth3', - displayName: 'China North 3', - supportsLogs: true, - }, -]; - -export const logsSupportedLocationsKusto = locationMetadata - .filter((v) => v.supportsLogs) - .map((v) => `"${v.location}"`) - .join(','); - -// Object, keyed by location ID -export const locationDisplayNames: Record = locationMetadata.reduce( - (acc, location) => ({ - ...acc, - [location.location]: location.displayName, - }), - {} -); 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 540d3e04834c..6b0807cb7c01 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 @@ -7,7 +7,7 @@ import createMockQuery from '../__mocks__/query'; import { createTemplateVariables } from '../__mocks__/utils'; import { singleVariable, subscriptionsVariable } from '../__mocks__/variables'; import AzureMonitorDatasource from '../datasource'; -import { AzureDataSourceJsonData, AzureQueryType } from '../types'; +import { AzureDataSourceJsonData, AzureMonitorLocationsResponse, AzureQueryType } from '../types'; const templateSrv = new TemplateSrv(); @@ -351,6 +351,89 @@ describe('AzureMonitorDatasource', () => { }); }); + describe('When performing getLocations', () => { + const sub1Response: AzureMonitorLocationsResponse = { + value: [ + { + id: '/subscriptions/mock-subscription-id-1/locations/northeurope', + name: 'northeurope', + displayName: 'North Europe', + regionalDisplayName: '(Europe) North Europe', + metadata: { + regionType: 'Physical', + regionCategory: 'Recommended', + geographyGroup: 'EU', + longitude: '-0', + latitude: '0', + physicalLocation: 'Europe', + pairedRegion: [], + }, + }, + ], + }; + + const sub2Response: AzureMonitorLocationsResponse = { + value: [ + { + id: '/subscriptions/mock-subscription-id-2/locations/eastus2', + name: 'eastus2', + displayName: 'East US 2', + regionalDisplayName: '(US) East US 2', + metadata: { + regionType: 'Physical', + regionCategory: 'Recommended', + geographyGroup: 'US', + longitude: '-0', + latitude: '0', + physicalLocation: 'US', + pairedRegion: [], + }, + }, + ], + }; + + beforeEach(() => { + ctx.ds.azureMonitorDatasource.getResource = jest.fn().mockImplementation((path: string) => { + const expectedPaths = [1, 2].map( + (sub) => `azuremonitor/subscriptions/mock-subscription-id-${sub}/locations?api-version=2020-01-01` + ); + expect(expectedPaths).toContain(path); + if (path.includes('mock-subscription-id-1')) { + return Promise.resolve(sub1Response); + } else { + return Promise.resolve(sub2Response); + } + }); + }); + + it('should return a locations map', async () => { + const result = await ctx.ds.azureMonitorDatasource.getLocations(['mock-subscription-id-1']); + + expect(result.size).toBe(1); + expect(result.has('northeurope')).toBe(true); + expect(result.get('northeurope')?.name).toBe('northeurope'); + expect(result.get('northeurope')?.displayName).toBe('North Europe'); + expect(result.get('northeurope')?.supportsLogs).toBe(undefined); + }); + + it('should return a locations map with locations deduped', async () => { + const result = await ctx.ds.azureMonitorDatasource.getLocations([ + 'mock-subscription-id-1', + 'mock-subscription-id-2', + ]); + + expect(result.size).toBe(2); + expect(result.has('northeurope')).toBe(true); + expect(result.get('northeurope')?.name).toBe('northeurope'); + expect(result.get('northeurope')?.displayName).toBe('North Europe'); + expect(result.get('northeurope')?.supportsLogs).toBe(undefined); + expect(result.has('eastus2')).toBe(true); + expect(result.get('eastus2')?.name).toBe('eastus2'); + expect(result.get('eastus2')?.displayName).toBe('East US 2'); + expect(result.get('eastus2')?.supportsLogs).toBe(undefined); + }); + }); + describe('Legacy Azure Monitor Query Object data fetchers', () => { describe('When performing getSubscriptions', () => { const response = { 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 b55f3c235a38..ad4e4659c31f 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 @@ -19,6 +19,7 @@ import { GetMetricNamesQuery, GetMetricMetadataQuery, AzureMetricQuery, + AzureMonitorLocations, } from '../types'; import { routeNames } from '../utils/common'; import migrateQuery from '../utils/migrateQuery'; @@ -36,6 +37,8 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend(); + for (const subscription of subscriptions) { + const subLocations = ResponseParser.parseLocations( + await this.getResource( + `${routeNames.azureMonitor}/subscriptions/${subscription}/locations?api-version=${this.locationsApiVersion}` + ) + ); + for (const location of subLocations) { + locationMap.set(location.name, location); + } + } + + return locationMap; + } } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts index e17da74b6c30..63eac9c4ecb2 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/response_parser.ts @@ -3,9 +3,11 @@ import { find, get } from 'lodash'; import TimeGrainConverter from '../time_grain_converter'; import { AzureMonitorLocalizedValue, + AzureMonitorLocations, AzureMonitorMetricAvailabilityMetadata, AzureMonitorMetricsMetadataResponse, AzureMonitorOption, + AzureMonitorLocationsResponse, } from '../types'; export default class ResponseParser { static parseResponseValues( @@ -170,4 +172,18 @@ export default class ResponseParser { return list; } + + static parseLocations(result: AzureMonitorLocationsResponse) { + const locations: AzureMonitorLocations[] = []; + + if (!result) { + return locations; + } + + for (const location of result.value) { + locations.push({ name: location.name, displayName: location.displayName, supportsLogs: undefined }); + } + + return locations; + } } 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 245be1f4ef2d..2022c0ac7eae 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 @@ -10,6 +10,7 @@ import createMockQuery from '../../__mocks__/query'; import { createMockResourceGroupsBySubscription, createMockSubscriptions, + mockGetValidLocations, mockResourcesByResourceGroup, } from '../../__mocks__/resourcePickerRows'; import ResourcePickerData from '../../resourcePicker/resourcePickerData'; @@ -44,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()); 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 bd69cf7bcf71..5e379f8fd938 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 @@ -5,6 +5,7 @@ import { } from '../__mocks__/argResourcePickerResponse'; import createMockDatasource from '../__mocks__/datasource'; import { createMockInstanceSetttings } from '../__mocks__/instanceSettings'; +import { mockGetValidLocations } from '../__mocks__/resourcePickerRows'; import { AzureGraphResponse } from '../types'; import ResourcePickerData from './resourcePickerData'; @@ -21,9 +22,13 @@ const createResourcePickerData = (responses: AzureGraphResponse[]) => { postResource.mockResolvedValueOnce(res); }); resourcePickerData.postResource = postResource; - - return { resourcePickerData, 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 }; }; + describe('AzureMonitor resourcePickerData', () => { describe('getSubscriptions', () => { it('makes 1 call to ARG with the correct path and query arguments', async () => { @@ -375,4 +380,35 @@ describe('AzureMonitor resourcePickerData', () => { } }); }); + + describe('getValidLocations', () => { + it('returns a locations map', async () => { + const { resourcePickerData, getValidLocations } = createResourcePickerData([createMockARGSubscriptionResponse()]); + getValidLocations.mockRestore(); + const subscriptions = await resourcePickerData.getSubscriptions(); + const locations = await resourcePickerData.getLogsLocations(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 () => { + const { resourcePickerData, mockDatasource, getValidLocations } = createResourcePickerData([ + createMockARGSubscriptionResponse(), + ]); + getValidLocations.mockRestore(); + mockDatasource.azureMonitorDatasource.getProvider = jest.fn().mockResolvedValue(undefined); + const subscriptions = await resourcePickerData.getSubscriptions(); + const locations = await resourcePickerData.getLogsLocations(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 2f8674950ca0..ef92baea60b4 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 @@ -3,12 +3,7 @@ import { uniq } from 'lodash'; import { DataSourceInstanceSettings } from '@grafana/data'; import { DataSourceWithBackend } from '@grafana/runtime'; -import { - locationDisplayNames, - logsSupportedLocationsKusto, - logsResourceTypes, - resourceTypeDisplayNames, -} from '../azureMetadata'; +import { logsResourceTypes, resourceTypeDisplayNames } from '../azureMetadata'; import AzureMonitorDatasource from '../azure_monitor/azure_monitor_datasource'; import { ResourceRow, ResourceRowGroup, ResourceRowType } from '../components/ResourcePicker/types'; import { addResources, parseResourceDetails, parseResourceURI } from '../components/ResourcePicker/utils'; @@ -16,9 +11,11 @@ import { AzureDataSourceJsonData, AzureGraphResponse, AzureMetricResource, + AzureMonitorLocations, AzureMonitorQuery, AzureResourceGraphOptions, AzureResourceSummaryItem, + ProviderResourceType, RawAzureResourceGroupItem, RawAzureResourceItem, RawAzureSubscriptionItem, @@ -36,6 +33,8 @@ export default class ResourcePickerData extends DataSourceWithBackend = new Map(); + logLocations: string[] = []; constructor( instanceSettings: DataSourceInstanceSettings, @@ -51,6 +50,12 @@ 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 (!currentSelection) { return subscriptions; } @@ -119,7 +124,7 @@ export default class ResourcePickerData extends DataSourceWithBackend { + if (!this.logLocations) { + return []; + } const { data: response } = await this.makeResourceGraphRequest(` resources | where id hasprefix "${resourceGroupId}" - ${await this.filterByType(type)} and location in (${logsSupportedLocationsKusto}) + ${await this.filterByType(type)} and location in (${this.logLocations}) `); return response.map((item) => { @@ -240,7 +248,7 @@ export default class ResourcePickerData extends DataSourceWithBackend> { + 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: ProviderResourceType) => provider.resourceType === 'logs' + ); + + if (!logsProvider) { + return locations; + } + + const logsLocations = logsProvider.locations.map((location: AzureMonitorLocations) => ({ + 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; + } } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types/types.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types/types.ts index 8f92203f8b50..13d4c9902db2 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types/types.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types/types.ts @@ -258,3 +258,48 @@ export interface LegacyAzureGetMetricMetadataQuery { customNamespace?: string; metricName: string; } + +export interface AzureMonitorLocations { + displayName: string; + name: string; + supportsLogs?: boolean; +} + +export interface AzureMonitorProvidersResponse { + namespace: string; + resourceTypes: ProviderResourceType[]; +} + +export interface ProviderResourceType { + resourceType: string; + locations: string[]; + apiVersions: string[]; + capabilities: string; +} + +export interface AzureMonitorLocationsResponse { + value: Location[]; +} + +interface Location { + id: string; + name: string; + displayName: string; + regionalDisplayName: string; + metadata: LocationMetadata; +} + +interface LocationMetadata { + regionType: string; + regionCategory: string; + geographyGroup: string; + longitude: string; + latitude: string; + physicalLocation: string; + pairedRegion: LocationPairedRegion[]; +} + +interface LocationPairedRegion { + name: string; + id: string; +}