CloudWatch: Return with error message for empty logs query string (#59584)

pull/59704/head
Shirley 3 years ago committed by GitHub
parent 8152b0e1ef
commit ada0c771ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      public/app/plugins/datasource/cloudwatch/datasource.test.ts
  2. 40
      public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.test.ts
  3. 22
      public/app/plugins/datasource/cloudwatch/query-runner/CloudWatchLogsQueryRunner.ts

@ -6,8 +6,8 @@ import { dateTime, Field } from '@grafana/data';
import { import {
fieldsVariable, fieldsVariable,
logGroupNamesVariable, logGroupNamesVariable,
setupMockedDataSource,
regionVariable, regionVariable,
setupMockedDataSource,
} from './__mocks__/CloudWatchDataSource'; } from './__mocks__/CloudWatchDataSource';
import { setupForLogs } from './__mocks__/logsTestContext'; import { setupForLogs } from './__mocks__/logsTestContext';
import { validLogsQuery, validMetricSearchBuilderQuery } from './__mocks__/queries'; import { validLogsQuery, validMetricSearchBuilderQuery } from './__mocks__/queries';
@ -165,6 +165,7 @@ describe('datasource', () => {
region: '', region: '',
queryMode: 'Logs', queryMode: 'Logs',
logGroupNames: ['test'], logGroupNames: ['test'],
expression: 'some query',
refId: 'a', refId: 'a',
}, },
], ],
@ -195,7 +196,7 @@ describe('datasource', () => {
expect(emits[0].data[0].fields.find((f: Field) => f.name === '@message').config.links).toMatchObject([ expect(emits[0].data[0].fields.find((f: Field) => f.name === '@message').config.links).toMatchObject([
{ {
title: 'View in CloudWatch console', title: 'View in CloudWatch console',
url: "https://us-west-1.console.aws.amazon.com/cloudwatch/home?region=us-west-1#logs-insights:queryDetail=~(end~'2020-12-31T19*3a00*3a00.000Z~start~'2020-12-31T19*3a00*3a00.000Z~timeType~'ABSOLUTE~tz~'UTC~editorString~'~isLiveTail~false~source~(~'test))", url: "https://us-west-1.console.aws.amazon.com/cloudwatch/home?region=us-west-1#logs-insights:queryDetail=~(end~'2020-12-31T19*3a00*3a00.000Z~start~'2020-12-31T19*3a00*3a00.000Z~timeType~'ABSOLUTE~tz~'UTC~editorString~'some*20query~isLiveTail~false~source~(~'test))",
}, },
]); ]);
}); });

@ -1,10 +1,18 @@
import { interval, lastValueFrom, of } from 'rxjs'; import { interval, lastValueFrom, of } from 'rxjs';
import { LogRowModel, MutableDataFrame, FieldType, LogLevel, dataFrameToJSON, DataQueryErrorType } from '@grafana/data'; import {
dataFrameToJSON,
DataQueryErrorType,
DataQueryRequest,
FieldType,
LogLevel,
LogRowModel,
MutableDataFrame,
} from '@grafana/data';
import { genMockFrames, setupMockedLogsQueryRunner } from '../__mocks__/LogsQueryRunner'; import { genMockFrames, setupMockedLogsQueryRunner } from '../__mocks__/LogsQueryRunner';
import { validLogsQuery } from '../__mocks__/queries'; import { validLogsQuery } from '../__mocks__/queries';
import { LogAction } from '../types'; import { CloudWatchQuery, LogAction } from '../types';
import * as rxjsUtils from '../utils/rxjs/increasingInterval'; import * as rxjsUtils from '../utils/rxjs/increasingInterval';
import { LOG_IDENTIFIER_INTERNAL, LOGSTREAM_IDENTIFIER_INTERNAL } from './CloudWatchLogsQueryRunner'; import { LOG_IDENTIFIER_INTERNAL, LOGSTREAM_IDENTIFIER_INTERNAL } from './CloudWatchLogsQueryRunner';
@ -213,4 +221,32 @@ describe('CloudWatchLogsQueryRunner', () => {
expect(i).toBe(3); expect(i).toBe(3);
}); });
}); });
describe('handleLogQueries', () => {
it('should return error message when missing query string', async () => {
const { runner } = setupMockedLogsQueryRunner();
const response = await lastValueFrom(
runner.handleLogQueries(
[
{
datasource: { type: 'cloudwatch', uid: 'Zne6OZIVk' },
id: '',
logGroups: [{ label: '', text: '', value: '' }],
queryMode: 'Logs',
refId: 'A',
region: 'default',
},
],
{ scopedVars: {} } as DataQueryRequest<CloudWatchQuery>
)
);
expect(response).toEqual({
data: [],
error: {
message: 'Query is required',
},
});
});
});
}); });

@ -1,20 +1,20 @@
import { set } from 'lodash'; import { set } from 'lodash';
import { import {
Observable, catchError,
of,
mergeMap,
map,
from,
concatMap, concatMap,
finalize, finalize,
from,
lastValueFrom,
map,
mergeMap,
Observable,
of,
repeat, repeat,
scan, scan,
share, share,
takeWhile, takeWhile,
tap, tap,
zip, zip,
catchError,
lastValueFrom,
} from 'rxjs'; } from 'rxjs';
import { import {
@ -108,6 +108,14 @@ export class CloudWatchLogsQueryRunner extends CloudWatchRequest {
return of({ data: [], error: { message: 'Log group is required' } }); return of({ data: [], error: { message: 'Log group is required' } });
} }
const hasQueryWithMissingQueryString = queryParams.some((qp) => {
return qp.queryString.length === 0;
});
if (hasQueryWithMissingQueryString) {
return of({ data: [], error: { message: 'Query is required' } });
}
const startTime = new Date(); const startTime = new Date();
const timeoutFunc = () => { const timeoutFunc = () => {
return Date.now() >= startTime.valueOf() + rangeUtil.intervalToMs(this.logsTimeout); return Date.now() >= startTime.valueOf() + rangeUtil.intervalToMs(this.logsTimeout);

Loading…
Cancel
Save