Cloudwatch: Fix duplicate metric data (#28642)

* Cloudwatch: Fix duplicate metric data

* Refactor reduce function to for of
This commit is contained in:
Zoltán Bedi 2020-10-29 17:05:36 +01:00 committed by GitHub
parent 9717ec77e2
commit 6dbf1f830a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 39 deletions

View File

@ -1,7 +1,7 @@
import { CloudWatchDatasource } from './datasource'; import { DataQueryResponse, dateTime, DefaultTimeRange } from '@grafana/data';
import { TemplateSrv } from '../../../features/templating/template_srv';
import { setBackendSrv } from '@grafana/runtime'; import { setBackendSrv } from '@grafana/runtime';
import { DataQueryResponse, DefaultTimeRange } from '@grafana/data'; import { TemplateSrv } from '../../../features/templating/template_srv';
import { CloudWatchDatasource } from './datasource';
describe('datasource', () => { describe('datasource', () => {
describe('query', () => { describe('query', () => {
@ -35,6 +35,33 @@ describe('datasource', () => {
}); });
}); });
describe('performTimeSeriesQuery', () => {
it('should return the same length of data as result', async () => {
const { datasource } = setup();
const awsRequestMock = jest.spyOn(datasource, 'awsRequest');
const buildCloudwatchConsoleUrlMock = jest.spyOn(datasource, 'buildCloudwatchConsoleUrl');
buildCloudwatchConsoleUrlMock.mockImplementation(() => '');
awsRequestMock.mockImplementation(async () => {
return {
results: {
a: { refId: 'a', series: [{ name: 'cpu', points: [1, 1] }], meta: { gmdMeta: '' } },
b: { refId: 'b', series: [{ name: 'memory', points: [2, 2] }], meta: { gmdMeta: '' } },
},
};
});
const response: DataQueryResponse = await datasource.performTimeSeriesQuery(
{
queries: [
{ datasourceId: 1, refId: 'a' },
{ datasourceId: 1, refId: 'b' },
],
} as any,
{ from: dateTime(), to: dateTime() } as any
);
expect(response.data.length).toEqual(2);
});
});
describe('describeLogGroup', () => { describe('describeLogGroup', () => {
it('replaces region correctly in the query', async () => { it('replaces region correctly in the query', async () => {
const { datasource, datasourceRequestMock } = setup(); const { datasource, datasourceRequestMock } = setup();

View File

@ -595,44 +595,45 @@ export class CloudWatchDatasource extends DataSourceApi<CloudWatchQuery, CloudWa
return { data: [] }; return { data: [] };
} }
return Object.values(request.queries).reduce( const data = dataframes.map(frame => {
({ data, error }: any, queryRequest: any) => { const queryResult = res.results[frame.refId!];
const queryResult = res.results[queryRequest.refId]; const error = queryResult.error ? { message: queryResult.error } : null;
if (!queryResult) { if (!queryResult) {
return { data, error }; return { frame, error };
}
const requestQuery = request.queries.find(q => q.refId === frame.refId!) as any;
const link = this.buildCloudwatchConsoleUrl(
requestQuery!,
from.toISOString(),
to.toISOString(),
frame.refId!,
queryResult.meta.gmdMeta
);
if (link) {
for (const field of frame.fields) {
field.config.links = [
{
url: link,
title: 'View in CloudWatch console',
targetBlank: true,
},
];
} }
}
return { frame, error };
});
const link = this.buildCloudwatchConsoleUrl( return {
queryRequest, data: data.map(o => o.frame),
from.toISOString(), error: data
to.toISOString(), .map(o => o.error)
queryRequest.refId, .reduce((err, error) => {
queryResult.meta.gmdMeta return err || error;
); }, null),
};
return {
error: error || queryResult.error ? { message: queryResult.error } : null,
data: [
...data,
...dataframes.map(frame => {
if (link) {
for (const field of frame.fields) {
field.config.links = [
{
url: link,
title: 'View in CloudWatch console',
targetBlank: true,
},
];
}
}
return frame;
}),
],
};
},
{ data: [], error: null }
);
} catch (err) { } catch (err) {
if (/^Throttling:.*/.test(err.data.message)) { if (/^Throttling:.*/.test(err.data.message)) {
const failedRedIds = Object.keys(err.data.results); const failedRedIds = Object.keys(err.data.results);