From f2c3d23140ca8eedb7d3881b1398d6888aaa1ef6 Mon Sep 17 00:00:00 2001 From: Ed Welch Date: Thu, 6 Feb 2020 09:28:20 -0500 Subject: [PATCH] Prometheus: Allow sub-second step in the prometheus datasource (#21861) --- .../app/plugins/datasource/prometheus/datasource.test.ts | 4 ++-- public/app/plugins/datasource/prometheus/datasource.ts | 9 +++++++-- .../plugins/datasource/prometheus/result_transformer.ts | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/public/app/plugins/datasource/prometheus/datasource.test.ts b/public/app/plugins/datasource/prometheus/datasource.test.ts index 3cb4375e14d..692a100fd52 100644 --- a/public/app/plugins/datasource/prometheus/datasource.test.ts +++ b/public/app/plugins/datasource/prometheus/datasource.test.ts @@ -990,14 +990,14 @@ describe('PrometheusDatasource', () => { expect(res.url).toBe(urlExpected); }); - it('step should never go below 1', async () => { + it('step should be fractional for sub second intervals', async () => { const query = { // 6 minute range range: { from: time({ minutes: 1 }), to: time({ minutes: 7 }) }, targets: [{ expr: 'test' }], interval: '100ms', }; - const urlExpected = 'proxied/api/v1/query_range?query=test&start=60&end=420&step=1'; + const urlExpected = 'proxied/api/v1/query_range?query=test&start=60&end=420&step=0.1'; datasourceRequestMock.mockImplementation(() => Promise.resolve(response)); ds.query(query as any); const res = datasourceRequestMock.mock.calls[0][0]; diff --git a/public/app/plugins/datasource/prometheus/datasource.ts b/public/app/plugins/datasource/prometheus/datasource.ts index 3dce2877349..8a1f3559414 100644 --- a/public/app/plugins/datasource/prometheus/datasource.ts +++ b/public/app/plugins/datasource/prometheus/datasource.ts @@ -396,8 +396,13 @@ 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. // 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); + // Fractional safeIntervals are allowed, however serve little purpose if the interval is greater than 1 + // If this is the case take the ceil of the value. + let safeInterval = range / 11000; + if (safeInterval > 1) { + safeInterval = Math.ceil(safeInterval); + } + return Math.max(interval * intervalFactor, minInterval, safeInterval); } performTimeSeriesQuery(query: PromQueryRequest, start: number, end: number) { diff --git a/public/app/plugins/datasource/prometheus/result_transformer.ts b/public/app/plugins/datasource/prometheus/result_transformer.ts index 1fc3adb9b73..f1d42ea8931 100644 --- a/public/app/plugins/datasource/prometheus/result_transformer.ts +++ b/public/app/plugins/datasource/prometheus/result_transformer.ts @@ -46,7 +46,7 @@ export class ResultTransformer { metricLabel = this.createMetricLabel(metricData.metric, options); - const stepMs = parseInt(options.step, 10) * 1000; + const stepMs = parseFloat(options.step) * 1000; let baseTimestamp = start * 1000; if (metricData.values === undefined) {