mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Cloudwatch: Fix duplicate metric data (#28642)
* Cloudwatch: Fix duplicate metric data * Refactor reduce function to for of
This commit is contained in:
parent
9717ec77e2
commit
6dbf1f830a
@ -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();
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user