diff --git a/public/app/plugins/datasource/prometheus/datasource.test.ts b/public/app/plugins/datasource/prometheus/datasource.test.ts index e440be233b1..645732755b6 100644 --- a/public/app/plugins/datasource/prometheus/datasource.test.ts +++ b/public/app/plugins/datasource/prometheus/datasource.test.ts @@ -1130,9 +1130,10 @@ describe('PrometheusDatasource', () => { ], interval: '5s', }; - const end = 7 * 24 * 60 * 60; + let end = 7 * 24 * 60 * 60; + end -= end % 55; const start = 0; - const urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=' + start + '&end=' + end + '&step=60'; + const urlExpected = 'proxied/api/v1/query_range?query=test' + '&start=' + start + '&end=' + end + '&step=55'; getBackendSrvMock().datasourceRequest = jest.fn(() => Promise.resolve(response)); ds.query(query as any); const res = (getBackendSrvMock().datasourceRequest as jest.Mock).mock.calls[0][0]; @@ -1379,7 +1380,8 @@ describe('PrometheusDatasource', () => { __interval_ms: { text: 5 * 1000, value: 5 * 1000 }, }, }; - const end = 7 * 24 * 60 * 60; + let end = 7 * 24 * 60 * 60; + end -= end % 55; const start = 0; const urlExpected = 'proxied/api/v1/query_range?query=' + @@ -1388,7 +1390,7 @@ describe('PrometheusDatasource', () => { start + '&end=' + end + - '&step=60'; + '&step=55'; getBackendSrvMock().datasourceRequest = jest.fn(() => Promise.resolve(response)); templateSrv.replace = jest.fn(str => str); ds.query(query as any); diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index acde4c0d6a1..454ef8e164d 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -396,11 +396,9 @@ export class PrometheusDatasource extends DataSourceApi adjustInterval(interval: number, minInterval: number, range: number, intervalFactor: number) { // Prometheus will drop queries that might return more than 11000 data points. - // Calibrate interval if it is too small. - if (interval !== 0 && range / intervalFactor / interval > 11000) { - interval = Math.ceil(range / intervalFactor / 11000); - } - return Math.max(interval * intervalFactor, minInterval, 1); + // Calculate a safe interval as an additional minimum to take into account. + const safeInterval = Math.ceil(range / 11000); + return Math.max(interval * intervalFactor, minInterval, safeInterval, 1); } performTimeSeriesQuery(query: PromQueryRequest, start: number, end: number) {