Prometheus: Make result transformer more robust for empty responses

- some prometheus-compatible backends may return `null` instead of empty lists
- test for lists before iterating
- added tests for empty responses
This commit is contained in:
David Kaltschmidt 2018-12-07 11:13:48 +01:00
parent dbb34020ca
commit c0c06e4dd8
2 changed files with 28 additions and 3 deletions

View File

@ -16,7 +16,7 @@ export class ResultTransformer {
options.valueWithRefId
),
];
} else if (options.format === 'heatmap') {
} else if (prometheusResult && options.format === 'heatmap') {
let seriesList = [];
prometheusResult.sort(sortSeriesByLabel);
for (const metricData of prometheusResult) {
@ -24,7 +24,7 @@ export class ResultTransformer {
}
seriesList = this.transformToHistogramOverTime(seriesList);
return seriesList;
} else {
} else if (prometheusResult) {
const seriesList = [];
for (const metricData of prometheusResult) {
if (response.data.data.resultType === 'matrix') {
@ -82,7 +82,7 @@ export class ResultTransformer {
let i, j;
const metricLabels = {};
if (md.length === 0) {
if (!md || md.length === 0) {
return table;
}

View File

@ -10,6 +10,31 @@ describe('Prometheus Result Transformer', () => {
ctx.resultTransformer = new ResultTransformer(ctx.templateSrv);
});
describe('When nothing is returned', () => {
test('should return empty series', () => {
const response = {
status: 'success',
data: {
resultType: '',
result: null,
},
};
const series = ctx.resultTransformer.transform({ data: response }, {});
expect(series).toEqual([]);
});
test('should return empty table', () => {
const response = {
status: 'success',
data: {
resultType: '',
result: null,
},
};
const table = ctx.resultTransformer.transform({ data: response }, { format: 'table' });
expect(table).toMatchObject([{ type: 'table', rows: [] }]);
});
});
describe('When resultFormat is table', () => {
const response = {
status: 'success',