diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index 73ab25081af..df1fc6053fb 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -108,16 +108,17 @@ export class PrometheusDatasource { } clampRange(start, end, step) { + const clampedEnd = Math.ceil(end / step) * step; + const clampedRange = Math.floor((end - start) / step) * step; return { - start: start - start % step, - end: end - end % step + step, + end: clampedEnd, + start: clampedEnd - clampedRange, }; } query(options) { var start = this.getPrometheusTime(options.range.from, false); var end = this.getPrometheusTime(options.range.to, true); - var range = Math.ceil(end - start); var queries = []; var activeTargets = []; @@ -130,7 +131,7 @@ export class PrometheusDatasource { } activeTargets.push(target); - queries.push(this.createQuery(target, options, range)); + queries.push(this.createQuery(target, options, start, end)); } // No valid targets, return the empty result to save a round trip. @@ -140,8 +141,7 @@ export class PrometheusDatasource { var allQueryPromise = _.map(queries, query => { if (!query.instant) { - let range = this.clampRange(start, end, query.step); - return this.performTimeSeriesQuery(query, range.start, range.end); + return this.performTimeSeriesQuery(query, query.start, query.end); } else { return this.performInstantQuery(query, end); } @@ -155,14 +155,13 @@ export class PrometheusDatasource { throw response.error; } - let step = queries[index].step; - let { start, end } = this.clampRange(start, end, step); - let transformerOptions = { + // Keeping original start/end for transformers + const transformerOptions = { format: activeTargets[index].format, - step, + step: queries[index].step, legendFormat: activeTargets[index].legendFormat, - start, - end, + start: start, + end: end, responseListLength: responseList.length, responseIndex: index, refId: activeTargets[index].refId, @@ -175,9 +174,10 @@ export class PrometheusDatasource { }); } - createQuery(target, options, range) { + createQuery(target, options, start, end) { var query: any = {}; query.instant = target.instant; + var range = Math.ceil(end - start); var interval = kbn.interval_to_seconds(options.interval); // Minimum interval ("Min step"), if specified for the query. or same as interval otherwise @@ -201,6 +201,12 @@ export class PrometheusDatasource { // Only replace vars in expression after having (possibly) updated interval vars query.expr = this.templateSrv.replace(target.expr, scopedVars, this.interpolateQueryExpr); query.requestId = options.panelId + target.refId; + + // Align query interval with step + const adjusted = this.clampRange(start, end, query.step); + query.start = adjusted.start; + query.end = adjusted.end; + return query; } @@ -280,23 +286,18 @@ export class PrometheusDatasource { return this.$q.when([]); } - var interpolated = this.templateSrv.replace(expr, {}, this.interpolateQueryExpr); - - var step = '60s'; - if (annotation.step) { - step = this.templateSrv.replace(annotation.step); - } - + var step = annotation.step || '60s'; var start = this.getPrometheusTime(options.range.from, false); var end = this.getPrometheusTime(options.range.to, true); - var query = { - expr: interpolated, - step: this.adjustInterval(kbn.interval_to_seconds(step), 0, Math.ceil(end - start), 1), + // Unsetting min interval + const queryOptions = { + ...options, + interval: '0s', }; - let range = this.clampRange(start, end, query.step); + const query = this.createQuery({ expr, interval: step }, queryOptions, start, end); var self = this; - return this.performTimeSeriesQuery(query, range.start, range.end).then(function(results) { + return this.performTimeSeriesQuery(query, query.start, query.end).then(function(results) { var eventList = []; tagKeys = tagKeys.split(','); diff --git a/public/app/plugins/datasource/prometheus/partials/query.editor.html b/public/app/plugins/datasource/prometheus/partials/query.editor.html index 68791d96c19..11a857f37e7 100644 --- a/public/app/plugins/datasource/prometheus/partials/query.editor.html +++ b/public/app/plugins/datasource/prometheus/partials/query.editor.html @@ -14,8 +14,8 @@ data-min-length=0 data-items=1000 ng-model-onblur ng-change="ctrl.refreshMetricData()"> - Controls the name of the time series, using name or pattern. For example {{hostname}} will be replaced with label value for - the label hostname. + Controls the name of the time series, using name or pattern. For example + {{hostname}} will be replaced with label value for the label hostname. @@ -25,7 +25,8 @@ placeholder="{{ctrl.panelCtrl.interval}}" data-min-length=0 data-items=100 ng-model-onblur ng-change="ctrl.refreshMetricData()" /> - Leave blank for auto handling based on time range and panel width + Leave blank for auto handling based on time range and panel width. Note that the actual dates used in the query will be adjusted + to a multiple of the interval step. @@ -57,4 +58,4 @@
- + \ No newline at end of file diff --git a/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts b/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts index 2dfa88b32c5..ef51ff69206 100644 --- a/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts +++ b/public/app/plugins/datasource/prometheus/specs/datasource_specs.ts @@ -4,6 +4,12 @@ import $ from 'jquery'; import helpers from 'test/specs/helpers'; import { PrometheusDatasource } from '../datasource'; +const SECOND = 1000; +const MINUTE = 60 * SECOND; +const HOUR = 60 * MINUTE; + +const time = ({ hours = 0, seconds = 0, minutes = 0 }) => moment(hours * HOUR + minutes * MINUTE + seconds * SECOND); + describe('PrometheusDatasource', function() { var ctx = new helpers.ServiceTestContext(); var instanceSettings = { @@ -29,18 +35,16 @@ describe('PrometheusDatasource', function() { $httpBackend.when('GET', /\.html$/).respond(''); }) ); - describe('When querying prometheus with one target using query editor target spec', function() { var results; - var urlExpected = - 'proxied/api/v1/query_range?query=' + - encodeURIComponent('test{job="testjob"}') + - '&start=1443438660&end=1443460320&step=60'; var query = { - range: { from: moment(1443438674760), to: moment(1443460274760) }, + range: { from: time({ seconds: 63 }), to: time({ seconds: 183 }) }, targets: [{ expr: 'test{job="testjob"}', format: 'time_series' }], interval: '60s', }; + // Interval alignment with step + var urlExpected = + 'proxied/api/v1/query_range?query=' + encodeURIComponent('test{job="testjob"}') + '&start=120&end=240&step=60'; var response = { status: 'success', data: { @@ -48,7 +52,7 @@ describe('PrometheusDatasource', function() { result: [ { metric: { __name__: 'test', job: 'testjob' }, - values: [[1443454528, '3846']], + values: [[60, '3846']], }, ], }, @@ -70,8 +74,8 @@ describe('PrometheusDatasource', function() { }); describe('When querying prometheus with one target which return multiple series', function() { var results; - var start = 1443438660; - var end = 1443460320; + var start = 60; + var end = 360; var step = 60; var urlExpected = 'proxied/api/v1/query_range?query=' + @@ -83,7 +87,7 @@ describe('PrometheusDatasource', function() { '&step=' + step; var query = { - range: { from: moment(1443438674760), to: moment(1443460274760) }, + range: { from: time({ seconds: start }), to: time({ seconds: end }) }, targets: [{ expr: 'test{job="testjob"}', format: 'time_series' }], interval: '60s', }; @@ -139,9 +143,9 @@ describe('PrometheusDatasource', function() { }); describe('When querying prometheus with one target and instant = true', function() { var results; - var urlExpected = 'proxied/api/v1/query?query=' + encodeURIComponent('test{job="testjob"}') + '&time=1443460275'; + var urlExpected = 'proxied/api/v1/query?query=' + encodeURIComponent('test{job="testjob"}') + '&time=123'; var query = { - range: { from: moment(1443438674760), to: moment(1443460274760) }, + range: { from: time({ seconds: 63 }), to: time({ seconds: 123 }) }, targets: [{ expr: 'test{job="testjob"}', format: 'time_series', instant: true }], interval: '60s', }; @@ -152,7 +156,7 @@ describe('PrometheusDatasource', function() { result: [ { metric: { __name__: 'test', job: 'testjob' }, - value: [1443454528, '3846'], + value: [123, '3846'], }, ], }, @@ -177,7 +181,7 @@ describe('PrometheusDatasource', function() { var urlExpected = 'proxied/api/v1/query_range?query=' + encodeURIComponent('ALERTS{alertstate="firing"}') + - '&start=1443438660&end=1443460320&step=60'; + '&start=120&end=180&step=60'; var options = { annotation: { expr: 'ALERTS{alertstate="firing"}', @@ -186,8 +190,8 @@ describe('PrometheusDatasource', function() { textFormat: '{{instance}}', }, range: { - from: moment(1443438674760), - to: moment(1443460274760), + from: time({ seconds: 63 }), + to: time({ seconds: 123 }), }, }; var response = { @@ -203,7 +207,7 @@ describe('PrometheusDatasource', function() { instance: 'testinstance', job: 'testjob', }, - values: [[1443454528, '1']], + values: [[123, '1']], }, ], }, @@ -221,15 +225,15 @@ describe('PrometheusDatasource', function() { expect(results[0].tags).to.contain('testjob'); expect(results[0].title).to.be('InstanceDown'); expect(results[0].text).to.be('testinstance'); - expect(results[0].time).to.be(1443454528 * 1000); + expect(results[0].time).to.be(123 * 1000); }); }); describe('When resultFormat is table and instant = true', function() { var results; - var urlExpected = 'proxied/api/v1/query?query=' + encodeURIComponent('test{job="testjob"}') + '&time=1443460275'; + var urlExpected = 'proxied/api/v1/query?query=' + encodeURIComponent('test{job="testjob"}') + '&time=123'; var query = { - range: { from: moment(1443438674760), to: moment(1443460274760) }, + range: { from: time({ seconds: 63 }), to: time({ seconds: 123 }) }, targets: [{ expr: 'test{job="testjob"}', format: 'time_series', instant: true }], interval: '60s', }; @@ -240,7 +244,7 @@ describe('PrometheusDatasource', function() { result: [ { metric: { __name__: 'test', job: 'testjob' }, - value: [1443454528, '3846'], + value: [123, '3846'], }, ], }, @@ -270,8 +274,8 @@ describe('PrometheusDatasource', function() { it('should be min interval when greater than auto interval', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'test', @@ -280,7 +284,7 @@ describe('PrometheusDatasource', function() { ], interval: '5s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438670&end=1443460280&step=10'; + var urlExpected = 'proxied/api/v1/query_range?query=test&start=60&end=420&step=10'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -288,12 +292,12 @@ describe('PrometheusDatasource', function() { it('step should never go below 1', function() { var query = { - // 6 hour range - range: { from: moment(1508318768202), to: moment(1508318770118) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [{ expr: 'test' }], interval: '100ms', }; - var urlExpected = 'proxied/api/v1/query_range?query=test&start=1508318769&end=1508318772&step=1'; + var urlExpected = 'proxied/api/v1/query_range?query=test&start=60&end=420&step=1'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -301,8 +305,8 @@ describe('PrometheusDatasource', function() { it('should be auto interval when greater than min interval', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'test', @@ -311,7 +315,7 @@ describe('PrometheusDatasource', function() { ], interval: '10s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438670&end=1443460280&step=10'; + var urlExpected = 'proxied/api/v1/query_range?query=test&start=60&end=420&step=10'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -319,19 +323,21 @@ describe('PrometheusDatasource', function() { it('should result in querying fewer than 11000 data points', function() { var query = { // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + range: { from: time({ hours: 1 }), to: time({ hours: 7 }) }, targets: [{ expr: 'test' }], interval: '1s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438674&end=1443460276&step=2'; + var end = 7 * 60 * 60; + var start = 60 * 60; + var urlExpected = 'proxied/api/v1/query_range?query=test&start=' + start + '&end=' + end + '&step=2'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); }); it('should not apply min interval when interval * intervalFactor greater', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'test', @@ -341,15 +347,16 @@ describe('PrometheusDatasource', function() { ], interval: '5s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438650&end=1443460300&step=50'; + // times get rounded up to interval + var urlExpected = 'proxied/api/v1/query_range?query=test&start=100&end=450&step=50'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); }); it('should apply min interval when interval * intervalFactor smaller', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'test', @@ -359,15 +366,15 @@ describe('PrometheusDatasource', function() { ], interval: '5s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438675&end=1443460290&step=15'; + var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=60&end=420&step=15'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); }); it('should apply intervalFactor to auto interval when greater', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'test', @@ -377,7 +384,8 @@ describe('PrometheusDatasource', function() { ], interval: '10s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438600&end=1443460300&step=100'; + // times get rounded up to interval + var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=200&end=500&step=100'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -385,7 +393,7 @@ describe('PrometheusDatasource', function() { it('should not not be affected by the 11000 data points limit when large enough', function() { var query = { // 1 week range - range: { from: moment(1443438674760), to: moment(1444043474760) }, + range: { from: time({}), to: time({ hours: 7 * 24 }) }, targets: [ { expr: 'test', @@ -394,7 +402,9 @@ describe('PrometheusDatasource', function() { ], interval: '10s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438600&end=1444043500&step=100'; + var end = 7 * 24 * 60 * 60; + var start = 0; + var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=' + start + '&end=' + end + '&step=100'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -402,7 +412,7 @@ describe('PrometheusDatasource', function() { it('should be determined by the 11000 data points limit when too small', function() { var query = { // 1 week range - range: { from: moment(1443438674760), to: moment(1444043474760) }, + range: { from: time({}), to: time({ hours: 7 * 24 }) }, targets: [ { expr: 'test', @@ -411,12 +421,15 @@ describe('PrometheusDatasource', function() { ], interval: '5s', }; - var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=1443438660&end=1444043520&step=60'; + var end = 7 * 24 * 60 * 60; + var start = 0; + var urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=' + start + '&end=' + end + '&step=60'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); }); }); + describe('The __interval and __interval_ms template variables', function() { var response = { status: 'success', @@ -428,8 +441,8 @@ describe('PrometheusDatasource', function() { it('should be unchanged when auto interval is greater than min interval', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'rate(test[$__interval])', @@ -443,9 +456,7 @@ describe('PrometheusDatasource', function() { }, }; var urlExpected = - 'proxied/api/v1/query_range?query=' + - encodeURIComponent('rate(test[10s])') + - '&start=1443438670&end=1443460280&step=10'; + 'proxied/api/v1/query_range?query=' + encodeURIComponent('rate(test[10s])') + '&start=60&end=420&step=10'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -457,8 +468,8 @@ describe('PrometheusDatasource', function() { }); it('should be min interval when it is greater than auto interval', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'rate(test[$__interval])', @@ -472,9 +483,7 @@ describe('PrometheusDatasource', function() { }, }; var urlExpected = - 'proxied/api/v1/query_range?query=' + - encodeURIComponent('rate(test[10s])') + - '&start=1443438670&end=1443460280&step=10'; + 'proxied/api/v1/query_range?query=' + encodeURIComponent('rate(test[10s])') + '&start=60&end=420&step=10'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -486,8 +495,8 @@ describe('PrometheusDatasource', function() { }); it('should account for intervalFactor', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'rate(test[$__interval])', @@ -502,9 +511,7 @@ describe('PrometheusDatasource', function() { }, }; var urlExpected = - 'proxied/api/v1/query_range?query=' + - encodeURIComponent('rate(test[100s])') + - '&start=1443438600&end=1443460300&step=100'; + 'proxied/api/v1/query_range?query=' + encodeURIComponent('rate(test[100s])') + '&start=200&end=500&step=100'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -516,8 +523,8 @@ describe('PrometheusDatasource', function() { }); it('should be interval * intervalFactor when greater than min interval', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'rate(test[$__interval])', @@ -532,9 +539,7 @@ describe('PrometheusDatasource', function() { }, }; var urlExpected = - 'proxied/api/v1/query_range?query=' + - encodeURIComponent('rate(test[50s])') + - '&start=1443438650&end=1443460300&step=50'; + 'proxied/api/v1/query_range?query=' + encodeURIComponent('rate(test[50s])') + '&start=100&end=450&step=50'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -546,8 +551,8 @@ describe('PrometheusDatasource', function() { }); it('should be min interval when greater than interval * intervalFactor', function() { var query = { - // 6 hour range - range: { from: moment(1443438674760), to: moment(1443460274760) }, + // 6 minute range + range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [ { expr: 'rate(test[$__interval])', @@ -562,9 +567,7 @@ describe('PrometheusDatasource', function() { }, }; var urlExpected = - 'proxied/api/v1/query_range?query=' + - encodeURIComponent('rate(test[15s])') + - '&start=1443438675&end=1443460290&step=15'; + 'proxied/api/v1/query_range?query=' + encodeURIComponent('rate(test[15s])') + '&start=60&end=420&step=15'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -577,7 +580,7 @@ describe('PrometheusDatasource', function() { it('should be determined by the 11000 data points limit, accounting for intervalFactor', function() { var query = { // 1 week range - range: { from: moment(1443438674760), to: moment(1444043474760) }, + range: { from: time({}), to: time({ hours: 7 * 24 }) }, targets: [ { expr: 'rate(test[$__interval])', @@ -590,10 +593,16 @@ describe('PrometheusDatasource', function() { __interval_ms: { text: 5 * 1000, value: 5 * 1000 }, }, }; + var end = 7 * 24 * 60 * 60; + var start = 0; var urlExpected = 'proxied/api/v1/query_range?query=' + encodeURIComponent('rate(test[60s])') + - '&start=1443438660&end=1444043520&step=60'; + '&start=' + + start + + '&end=' + + end + + '&step=60'; ctx.$httpBackend.expect('GET', urlExpected).respond(response); ctx.ds.query(query); ctx.$httpBackend.verifyNoOutstandingExpectation(); @@ -604,6 +613,29 @@ describe('PrometheusDatasource', function() { expect(query.scopedVars.__interval_ms.value).to.be(5 * 1000); }); }); + + describe('Step alignment of intervals', function() { + it('does not modify already aligned intervals with perfect step', function() { + const range = ctx.ds.clampRange(0, 3, 3); + expect(range.start).to.be(0); + expect(range.end).to.be(3); + }); + it('does modify end-aligned intervals to reflect number of steps possible', function() { + const range = ctx.ds.clampRange(1, 6, 3); + expect(range.start).to.be(3); + expect(range.end).to.be(6); + }); + it('does align intervals that are a multiple of steps', function() { + const range = ctx.ds.clampRange(1, 4, 3); + expect(range.start).to.be(3); + expect(range.end).to.be(6); + }); + it('does align intervals that are not a multiple of steps', function() { + const range = ctx.ds.clampRange(1, 5, 3); + expect(range.start).to.be(3); + expect(range.end).to.be(6); + }); + }); }); describe('PrometheusDatasource for POST', function() { @@ -635,12 +667,12 @@ describe('PrometheusDatasource for POST', function() { var urlExpected = 'proxied/api/v1/query_range'; var dataExpected = $.param({ query: 'test{job="testjob"}', - start: 1443438675, - end: 1443460275, + start: 2 * 60, + end: 3 * 60, step: 60, }); var query = { - range: { from: moment(1443438674760), to: moment(1443460274760) }, + range: { from: time({ minutes: 1, seconds: 3 }), to: time({ minutes: 2, seconds: 3 }) }, targets: [{ expr: 'test{job="testjob"}', format: 'time_series' }], interval: '60s', }; @@ -651,7 +683,7 @@ describe('PrometheusDatasource for POST', function() { result: [ { metric: { __name__: 'test', job: 'testjob' }, - values: [[1443454528, '3846']], + values: [[2 * 60, '3846']], }, ], },