Azure Monitor: Fix bug with template variables. (#41669)

This commit is contained in:
Sarah Zinger
2021-11-16 08:43:57 -05:00
committed by GitHub
parent 543b1a7e39
commit c907b5315a
3 changed files with 298 additions and 33 deletions
@@ -75,15 +75,6 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.resourceGroups && defaultSubscriptionId) {
const queryDetails: ResourceGroupsQuery = {
kind: 'ResourceGroupsQuery',
rawQuery,
subscription: defaultSubscriptionId,
};
return queryDetails;
}
if (matchesForQuery.resourceGroupsWithSub) {
const queryDetails: ResourceGroupsQuery = {
kind: 'ResourceGroupsQuery',
@@ -93,12 +84,11 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.metricDefinitions && defaultSubscriptionId) {
const queryDetails: MetricDefinitionsQuery = {
kind: 'MetricDefinitionsQuery',
if (matchesForQuery.resourceGroups && defaultSubscriptionId) {
const queryDetails: ResourceGroupsQuery = {
kind: 'ResourceGroupsQuery',
rawQuery,
subscription: defaultSubscriptionId,
resourceGroup: matchesForQuery.metricDefinitions[1],
};
return queryDetails;
}
@@ -113,13 +103,12 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.resourceNames && defaultSubscriptionId) {
const queryDetails: ResourceNamesQuery = {
kind: 'ResourceNamesQuery',
if (matchesForQuery.metricDefinitions && defaultSubscriptionId) {
const queryDetails: MetricDefinitionsQuery = {
kind: 'MetricDefinitionsQuery',
rawQuery,
subscription: defaultSubscriptionId,
resourceGroup: matchesForQuery.resourceNames[1],
metricDefinition: matchesForQuery.resourceNames[2],
resourceGroup: matchesForQuery.metricDefinitions[1],
};
return queryDetails;
}
@@ -135,14 +124,13 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.metricNamespace && defaultSubscriptionId) {
const queryDetails: MetricNamespaceQuery = {
kind: 'MetricNamespaceQuery',
if (matchesForQuery.resourceNames && defaultSubscriptionId) {
const queryDetails: ResourceNamesQuery = {
kind: 'ResourceNamesQuery',
rawQuery,
subscription: defaultSubscriptionId,
resourceGroup: matchesForQuery.metricNamespace[1],
metricDefinition: matchesForQuery.metricNamespace[2],
resourceName: matchesForQuery.metricNamespace[3],
resourceGroup: matchesForQuery.resourceNames[1],
metricDefinition: matchesForQuery.resourceNames[2],
};
return queryDetails;
}
@@ -159,6 +147,18 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.metricNamespace && defaultSubscriptionId) {
const queryDetails: MetricNamespaceQuery = {
kind: 'MetricNamespaceQuery',
rawQuery,
subscription: defaultSubscriptionId,
resourceGroup: matchesForQuery.metricNamespace[1],
metricDefinition: matchesForQuery.metricNamespace[2],
resourceName: matchesForQuery.metricNamespace[3],
};
return queryDetails;
}
if (matchesForQuery.metricNames && defaultSubscriptionId) {
if (matchesForQuery.metricNames[3].indexOf(',') === -1) {
const queryDetails: MetricNamesQuery = {
@@ -187,15 +187,6 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.workspacesQuery && defaultSubscriptionId) {
const queryDetails: WorkspacesQuery = {
kind: 'WorkspacesQuery',
rawQuery,
subscription: defaultSubscriptionId,
};
return queryDetails;
}
if (matchesForQuery.workspacesQueryWithSub) {
const queryDetails: WorkspacesQuery = {
kind: 'WorkspacesQuery',
@@ -205,6 +196,15 @@ const createGrafanaTemplateVariableQuery = (rawQuery: string, datasource: DataSo
return queryDetails;
}
if (matchesForQuery.workspacesQuery && defaultSubscriptionId) {
const queryDetails: WorkspacesQuery = {
kind: 'WorkspacesQuery',
rawQuery,
subscription: defaultSubscriptionId,
};
return queryDetails;
}
// fallback
const queryDetails: SubscriptionsQuery = { kind: 'SubscriptionsQuery', rawQuery };
return queryDetails;
@@ -0,0 +1,241 @@
import { migrateStringQueriesToObjectQueries } from './grafanaTemplateVariableFns';
import { AzureMonitorQuery, AzureQueryType } from './types';
import createMockDatasource from './__mocks__/datasource';
describe('migrateStringQueriesToObjectQueries', () => {
const expectedMigrations: Array<{ input: string; output: AzureMonitorQuery }> = [
{
input: 'Subscriptions()',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: { kind: 'SubscriptionsQuery', rawQuery: 'Subscriptions()' },
subscription: 'defaultSubscriptionId',
},
},
{
input: 'ResourceGroups()',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'ResourceGroupsQuery',
rawQuery: 'ResourceGroups()',
subscription: 'defaultSubscriptionId',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'ResourceGroups(subId)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'ResourceGroupsQuery',
rawQuery: 'ResourceGroups(subId)',
subscription: 'subId',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'Namespaces(rg)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'MetricDefinitionsQuery',
rawQuery: 'Namespaces(rg)',
subscription: 'defaultSubscriptionId',
resourceGroup: 'rg',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'Namespaces(subId, rg)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'MetricDefinitionsQuery',
rawQuery: 'Namespaces(subId, rg)',
subscription: 'subId',
resourceGroup: 'rg',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'ResourceNames(rg, md)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'ResourceNamesQuery',
rawQuery: 'ResourceNames(rg, md)',
subscription: 'defaultSubscriptionId',
resourceGroup: 'rg',
metricDefinition: 'md',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'ResourceNames(subId, rg, md)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'ResourceNamesQuery',
rawQuery: 'ResourceNames(subId, rg, md)',
subscription: 'subId',
resourceGroup: 'rg',
metricDefinition: 'md',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'MetricNamespace(rg, md, rn)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'MetricNamespaceQuery',
rawQuery: 'MetricNamespace(rg, md, rn)',
subscription: 'defaultSubscriptionId',
resourceGroup: 'rg',
metricDefinition: 'md',
resourceName: 'rn',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'MetricNamespace(subId, rg, md, rn)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'MetricNamespaceQuery',
rawQuery: 'MetricNamespace(subId, rg, md, rn)',
subscription: 'subId',
resourceGroup: 'rg',
metricDefinition: 'md',
resourceName: 'rn',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'MetricNames(rg, md, rn, mn)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'MetricNamesQuery',
rawQuery: 'MetricNames(rg, md, rn, mn)',
subscription: 'defaultSubscriptionId',
resourceGroup: 'rg',
metricDefinition: 'md',
resourceName: 'rn',
metricNamespace: 'mn',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'MetricNames(subId, rg, md, rn, mn)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'MetricNamesQuery',
rawQuery: 'MetricNames(subId, rg, md, rn, mn)',
subscription: 'subId',
resourceGroup: 'rg',
metricDefinition: 'md',
resourceName: 'rn',
metricNamespace: 'mn',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'AppInsightsMetricNames()',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'AppInsightsMetricNameQuery',
rawQuery: 'AppInsightsMetricNames()',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'AppInsightsGroupBys(mn)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'AppInsightsGroupByQuery',
rawQuery: 'AppInsightsGroupBys(mn)',
metricName: 'mn',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'workspaces()',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'WorkspacesQuery',
rawQuery: 'workspaces()',
subscription: 'defaultSubscriptionId',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'workspaces(subId)',
output: {
refId: 'A',
queryType: AzureQueryType.GrafanaTemplateVariableFn,
grafanaTemplateVariableFn: {
kind: 'WorkspacesQuery',
rawQuery: 'workspaces(subId)',
subscription: 'subId',
},
subscription: 'defaultSubscriptionId',
},
},
{
input: 'some kind of kql query',
output: {
refId: 'A',
queryType: AzureQueryType.LogAnalytics,
azureLogAnalytics: {
query: 'some kind of kql query',
resource: '',
},
subscription: 'defaultSubscriptionId',
},
},
];
it('successfully converts all old string queries into formatted query objects', async () => {
return expectedMigrations.map(async ({ input, output }) => {
const datasource = createMockDatasource({
azureMonitorDatasource: {
defaultSubscriptionId: 'defaultSubscriptionId',
},
});
const actual = await migrateStringQueriesToObjectQueries(input, { datasource });
expect(actual).toEqual(output);
});
});
});
@@ -427,6 +427,30 @@ describe('VariableSupport', () => {
});
});
it('can handle legacy string queries', (done) => {
const expectedResults = ['test'];
const variableSupport = new VariableSupport(
createMockDatasource({
azureMonitorDatasource: {
defaultSubscriptionId: 'defaultSubscriptionId',
},
getMetricDefinitions: jest.fn((sub: string, rg: string) => {
if (sub === 'subscriptionId' && rg === 'resourceGroup') {
return Promise.resolve(expectedResults);
}
return Promise.resolve([`getMetricDefinitions unexpected input: ${sub}, ${rg}`]);
}),
})
);
const mockRequest = {
targets: [('Namespaces(subscriptionId, resourceGroup)' as unknown) as AzureMonitorQuery],
} as DataQueryRequest<AzureMonitorQuery>;
const observables = variableSupport.query(mockRequest);
observables.subscribe((result: DataQueryResponseData) => {
expect(result.data[0].source).toEqual(expectedResults);
done();
});
});
it('returns an empty array for unknown queries', (done) => {
const variableSupport = new VariableSupport(createMockDatasource());
const mockRequest = {