AzureMonitor: Fixes metric definition for Azure Storage queue/file/bl… (#49412)

* AzureMonitor: Fixes metric definition for Azure Storage queue/file/blob/table resources. (#49101)

* Appropriately set metric definition

- Nested storage account resources (queues/blobs/tables/files) require metric definition of Microsoft.Storage/storageAccounts
- Update tests accordingly

* Restructure getResourceNames test

- Add expect on getResource args

* Update to fix issue for new query editor

- Reconstruct resourceUri if the resource is a storage account
- Correctly push storage namespaces as options for metric namespaces
- Filter options appropriately

* Fix duplicate options

* Fix lint issues

* Add comment explaining URI modification

(cherry picked from commit 34fa7b493c)

# Conflicts:
#	public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.test.ts
#	public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts
#	public/app/plugins/datasource/grafana-azure-monitor-datasource/components/NewMetricsQueryEditor/dataHooks.ts

* Fix lint issue
This commit is contained in:
Andreas Christou
2022-05-23 16:00:51 +01:00
committed by GitHub
parent 8f87fd9bfe
commit 4ed9a00909
3 changed files with 24 additions and 4 deletions
@@ -1,3 +1,5 @@
import { startsWith } from 'lodash';
import { DataSourceInstanceSettings } from '@grafana/data';
import { TemplateSrv } from 'app/features/templating/template_srv';
@@ -275,12 +277,26 @@ describe('AzureMonitorDatasource', () => {
it('should return list of Resource Names', () => {
metricDefinition = 'Microsoft.Storage/storageAccounts/blobServices';
const validMetricDefinition = startsWith(metricDefinition, 'Microsoft.Storage/storageAccounts/')
? 'Microsoft.Storage/storageAccounts'
: metricDefinition;
ctx.ds.azureMonitorDatasource.getResource = jest.fn().mockImplementation((path: string) => {
const basePath = `azuremonitor/subscriptions/${subscription}/resourceGroups`;
expect(path).toBe(
basePath +
`/${resourceGroup}/resources?$filter=resourceType eq '${validMetricDefinition}'&api-version=2021-04-01`
);
return Promise.resolve(response);
});
return ctx.ds
.getResourceNames(subscription, resourceGroup, metricDefinition)
.then((results: Array<{ text: string; value: string }>) => {
expect(results.length).toEqual(1);
expect(results[0].text).toEqual('storagetest/default');
expect(results[0].value).toEqual('storagetest/default');
expect(ctx.ds.azureMonitorDatasource.getResource).toHaveBeenCalledWith(
`azuremonitor/subscriptions/${subscription}/resourceGroups/${resourceGroup}/resources?$filter=resourceType eq '${validMetricDefinition}'&api-version=2021-04-01`
);
});
});
});
@@ -197,9 +197,12 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend<AzureM
}
getResourceNames(subscriptionId: string, resourceGroup: string, metricDefinition: string, skipToken?: string) {
const validMetricDefinition = startsWith(metricDefinition, 'Microsoft.Storage/storageAccounts/')
? 'Microsoft.Storage/storageAccounts'
: metricDefinition;
let url =
`${this.resourcePath}/${subscriptionId}/resourceGroups/${resourceGroup}/resources?` +
`$filter=resourceType eq '${metricDefinition}'&` +
`$filter=resourceType eq '${validMetricDefinition}'&` +
`api-version=${this.listByResourceGroupApiVersion}`;
if (skipToken) {
url += `&$skiptoken=${skipToken}`;
@@ -240,7 +243,6 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend<AzureM
resourceName,
this.apiPreviewVersion
);
return this.getResource(url).then((result: any) => {
return ResponseParser.parseResponseValues(result, 'name', 'properties.metricNamespaceName');
});
@@ -31,9 +31,11 @@ const MetricNamespaceField: React.FC<MetricNamespaceFieldProps> = ({
);
const options = useMemo(() => [...metricNamespaces, variableOptionGroup], [metricNamespaces, variableOptionGroup]);
const optionValues = metricNamespaces.map((m) => m.value).concat(variableOptionGroup.options.map((p) => p.value));
const optionValues = metricNamespaces
.map((m) => m.value.toLowerCase())
.concat(variableOptionGroup.options.map((p) => p.value));
const value = query.azureMonitor?.metricNamespace;
if (value && !optionValues.includes(value)) {
if (value && !optionValues.includes(value.toLowerCase())) {
options.push({ label: value, value });
}