|
|
@@ -0,0 +1,104 @@
|
|
|
+import _ from 'lodash';
|
|
|
+import moment from 'moment';
|
|
|
+import q from 'q';
|
|
|
+import { PrometheusDatasource } from '../datasource';
|
|
|
+
|
|
|
+describe('PrometheusDatasource', () => {
|
|
|
+ let ctx: any = {};
|
|
|
+ let instanceSettings = {
|
|
|
+ url: 'proxied',
|
|
|
+ directUrl: 'direct',
|
|
|
+ user: 'test',
|
|
|
+ password: 'mupp',
|
|
|
+ jsonData: {},
|
|
|
+ };
|
|
|
+
|
|
|
+ ctx.backendSrvMock = {};
|
|
|
+ ctx.templateSrvMock = {
|
|
|
+ replace: a => a,
|
|
|
+ };
|
|
|
+ ctx.timeSrvMock = {};
|
|
|
+
|
|
|
+ beforeEach(() => {
|
|
|
+ ctx.ds = new PrometheusDatasource(instanceSettings, q, ctx.backendSrvMock, ctx.templateSrvMock, ctx.timeSrvMock);
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('When converting prometheus histogram to heatmap format', () => {
|
|
|
+ beforeEach(() => {
|
|
|
+ ctx.query = {
|
|
|
+ range: { from: moment(1443454528000), to: moment(1443454528000) },
|
|
|
+ targets: [{ expr: 'test{job="testjob"}', format: 'heatmap', legendFormat: '{{le}}' }],
|
|
|
+ interval: '60s',
|
|
|
+ };
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should convert cumullative histogram to ordinary', () => {
|
|
|
+ const resultMock = [
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '10' },
|
|
|
+ values: [[1443454528.0, '10'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '20' },
|
|
|
+ values: [[1443454528.0, '20'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '30' },
|
|
|
+ values: [[1443454528.0, '25'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ const responseMock = { data: { data: { result: resultMock } } };
|
|
|
+
|
|
|
+ const expected = [
|
|
|
+ {
|
|
|
+ target: '10',
|
|
|
+ datapoints: [[10, 1443454528000], [10, 1443454528000]],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ target: '20',
|
|
|
+ datapoints: [[10, 1443454528000], [0, 1443454528000]],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ target: '30',
|
|
|
+ datapoints: [[5, 1443454528000], [0, 1443454528000]],
|
|
|
+ },
|
|
|
+ ];
|
|
|
+
|
|
|
+ ctx.ds.performTimeSeriesQuery = jest.fn().mockReturnValue(responseMock);
|
|
|
+ return ctx.ds.query(ctx.query).then(result => {
|
|
|
+ let results = result.data;
|
|
|
+ return expect(results).toEqual(expected);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should sort series by label value', () => {
|
|
|
+ const resultMock = [
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '2' },
|
|
|
+ values: [[1443454528.0, '10'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '4' },
|
|
|
+ values: [[1443454528.0, '20'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '+Inf' },
|
|
|
+ values: [[1443454528.0, '25'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ {
|
|
|
+ metric: { __name__: 'metric', job: 'testjob', le: '1' },
|
|
|
+ values: [[1443454528.0, '25'], [1443454528.0, '10']],
|
|
|
+ },
|
|
|
+ ];
|
|
|
+ const responseMock = { data: { data: { result: resultMock } } };
|
|
|
+
|
|
|
+ const expected = ['1', '2', '4', '+Inf'];
|
|
|
+
|
|
|
+ ctx.ds.performTimeSeriesQuery = jest.fn().mockReturnValue(responseMock);
|
|
|
+ return ctx.ds.query(ctx.query).then(result => {
|
|
|
+ let seriesLabels = _.map(result.data, 'target');
|
|
|
+ return expect(seriesLabels).toEqual(expected);
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|