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 7b20c3a23ba..7c688ce5eef 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 @@ -25,8 +25,8 @@ export default function createMockDatasource() { getMetricNamespaces: jest.fn().mockResolvedValueOnce([]), getMetricNames: jest.fn().mockResolvedValueOnce([]), getMetricMetadata: jest.fn().mockResolvedValueOnce({ - primaryAggType: 'average', - supportedAggTypes: [], + primaryAggType: 'Average', + supportedAggTypes: ['Average', 'Maximum', 'Minimum'], supportedTimeGrains: [], dimensions: [], }), 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 1d70bd48911..66f636b2ab3 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 @@ -75,7 +75,9 @@ export default class AzureMonitorDatasource extends DataSourceWithBackend { metricNamespace: undefined, resourceName: undefined, metricName: undefined, - aggregation: 'None', + aggregation: undefined, timeGrain: '', dimensionFilters: [], }, @@ -104,7 +104,7 @@ describe('Azure Monitor QueryEditor', () => { const metrics = await screen.findByLabelText('Metric'); await selectEvent.select(metrics, 'Metric B'); - expect(onChange).toHaveBeenCalledWith({ + expect(onChange).toHaveBeenLastCalledWith({ ...mockQuery, azureMonitor: { ...mockQuery.azureMonitor, @@ -112,4 +112,72 @@ describe('Azure Monitor QueryEditor', () => { }, }); }); + + it('should auto select a default aggregation if none exists once a metric is selected', async () => { + const mockDatasource = createMockDatasource(); + const onChange = jest.fn(); + const mockQuery = createMockQuery(); + mockQuery.azureMonitor.aggregation = undefined; + mockDatasource.getMetricNames = jest.fn().mockResolvedValue([ + { + value: 'metric-a', + text: 'Metric A', + }, + { + value: 'metric-b', + text: 'Metric B', + }, + ]); + render( + {}} + /> + ); + await waitFor(() => expect(screen.getByTestId('azure-monitor-metrics-query-editor')).toBeInTheDocument()); + + const metrics = await screen.findByLabelText('Metric'); + await selectEvent.select(metrics, 'Metric B'); + + expect(onChange).toHaveBeenLastCalledWith({ + ...mockQuery, + azureMonitor: { + ...mockQuery.azureMonitor, + metricName: 'metric-b', + aggregation: 'Average', + }, + }); + }); + + it('should change the aggregation type when selected', async () => { + const mockDatasource = createMockDatasource(); + const onChange = jest.fn(); + const mockQuery = createMockQuery(); + render( + {}} + /> + ); + await waitFor(() => expect(screen.getByTestId('azure-monitor-metrics-query-editor')).toBeInTheDocument()); + + const aggregation = await screen.findByLabelText('Aggregation'); + await selectEvent.select(aggregation, 'Maximum'); + + expect(onChange).toHaveBeenLastCalledWith({ + ...mockQuery, + azureMonitor: { + ...mockQuery.azureMonitor, + aggregation: 'Maximum', + }, + }); + }); }); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/NamespaceField.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/NamespaceField.tsx index ca67c427f96..3065195a1ce 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/NamespaceField.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/NamespaceField.tsx @@ -45,7 +45,7 @@ const NamespaceField: React.FC = ({ resourceName: undefined, metricNamespace: undefined, metricName: undefined, - aggregation: 'None', + aggregation: undefined, timeGrain: '', dimensionFilters: [], }, diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceGroupsField.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceGroupsField.tsx index db89bf67963..646536516c5 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceGroupsField.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceGroupsField.tsx @@ -47,7 +47,7 @@ const ResourceGroupsField: React.FC = ({ resourceName: undefined, metricNamespace: undefined, metricName: undefined, - aggregation: 'None', + aggregation: undefined, timeGrain: '', dimensionFilters: [], }, diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceNameField.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceNameField.tsx index 1c5747214bb..57b475afd9a 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceNameField.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/MetricsQueryEditor/ResourceNameField.tsx @@ -45,7 +45,7 @@ const ResourceNameField: React.FC = ({ metricNamespace: undefined, metricName: undefined, - aggregation: 'None', + aggregation: undefined, timeGrain: '', dimensionFilters: [], }, diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/SubscriptionField.tsx b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/SubscriptionField.tsx index bf8b3b33e08..b466ec6d800 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/SubscriptionField.tsx +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/SubscriptionField.tsx @@ -84,7 +84,7 @@ const SubscriptionField: React.FC = ({ metricNamespace: undefined, resourceName: undefined, metricName: undefined, - aggregation: 'None', + aggregation: undefined, timeGrain: '', dimensionFilters: [], }; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/metrics.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/metrics.ts index d476b279f45..5dad776bb73 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/metrics.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/components/metrics.ts @@ -50,8 +50,11 @@ export function useMetricsMetadata( ...query, azureMonitor: { ...query.azureMonitor, - aggregation: metadata.primaryAggType, - timeGrain: 'auto', + aggregation: + query.azureMonitor.aggregation && metadata.supportedAggTypes.includes(query.azureMonitor.aggregation) + ? query.azureMonitor.aggregation + : metadata.primaryAggType, + timeGrain: query.azureMonitor.timeGrain || 'auto', allowedTimeGrainsMs: convertTimeGrainsToMs(metadata.supportedTimeGrains), }, }); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts index 4c60dadab5d..602e79cdf12 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts @@ -63,7 +63,7 @@ export interface AzureMetricQuery { timeGrainUnit?: string; timeGrain: string; allowedTimeGrainsMs: number[]; - aggregation: string; + aggregation: string | undefined; dimensionFilters: AzureMetricDimension[]; alias: string; top: string;