QueryStats: Fix comparison of relative and absolute timeranges (#65035)

* add missing fix of relative timeranges

* add doc
This commit is contained in:
Sven Grossmann 2023-03-20 11:35:03 +01:00 committed by GitHub
parent 5c9898a860
commit 7a17a8f02d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 46 additions and 3 deletions

View File

@ -17,7 +17,7 @@ describe('shouldUpdateStats', () => {
const query = '{job="grafana"}'; const query = '{job="grafana"}';
const prevQuery = '{job="grafana"}'; const prevQuery = '{job="grafana"}';
const timerange = getDefaultTimeRange(); const timerange = getDefaultTimeRange();
timerange.from = dateTime(Date.now() - 1000000); timerange.raw.from = 'now-14h';
const prevTimerange = getDefaultTimeRange(); const prevTimerange = getDefaultTimeRange();
expect(shouldUpdateStats(query, prevQuery, timerange, prevTimerange)).toBe(true); expect(shouldUpdateStats(query, prevQuery, timerange, prevTimerange)).toBe(true);
}); });
@ -29,6 +29,26 @@ describe('shouldUpdateStats', () => {
const prevTimerange = timerange; const prevTimerange = timerange;
expect(shouldUpdateStats(query, prevQuery, timerange, prevTimerange)).toBe(false); expect(shouldUpdateStats(query, prevQuery, timerange, prevTimerange)).toBe(false);
}); });
it('should return false if the query and timerange have not changed', () => {
const query = '{job="grafana"}';
const prevQuery = '{job="grafana"}';
const timerange = getDefaultTimeRange();
const prevTimerange = getDefaultTimeRange();
expect(shouldUpdateStats(query, prevQuery, timerange, prevTimerange)).toBe(false);
});
it('should return false if the query and timerange with absolute and relative mixed have not changed', () => {
const query = '{job="grafana"}';
const prevQuery = '{job="grafana"}';
const now = dateTime(Date.now());
const timerange = getDefaultTimeRange();
timerange.raw.from = now;
const prevTimerange = getDefaultTimeRange();
prevTimerange.raw.from = now;
expect(shouldUpdateStats(query, prevQuery, timerange, prevTimerange)).toBe(false);
});
}); });
describe('makeStatsRequest', () => { describe('makeStatsRequest', () => {

View File

@ -1,4 +1,4 @@
import { TimeRange } from '@grafana/data'; import { DateTime, isDateTime, TimeRange } from '@grafana/data';
import { LokiDatasource } from '../datasource'; import { LokiDatasource } from '../datasource';
import { QueryStats } from '../types'; import { QueryStats } from '../types';
@ -12,13 +12,36 @@ export async function getStats(datasource: LokiDatasource, query: string): Promi
return Object.values(response).every((v) => v === 0) ? undefined : response; return Object.values(response).every((v) => v === 0) ? undefined : response;
} }
/**
* This function compares two time values. If the first is absolute, it compares them using `DateTime.isSame`.
*
* @param {(DateTime | string)} time1
* @param {(DateTime | string | undefined)} time2
*/
function compareTime(time1: DateTime | string, time2: DateTime | string | undefined) {
const isAbsolute = isDateTime(time1);
if (isAbsolute) {
return time1.isSame(time2);
}
return time1 === time2;
}
export function shouldUpdateStats( export function shouldUpdateStats(
query: string, query: string,
prevQuery: string | undefined, prevQuery: string | undefined,
timerange: TimeRange, timerange: TimeRange,
prevTimerange: TimeRange | undefined prevTimerange: TimeRange | undefined
): boolean { ): boolean {
if (query === prevQuery && timerange.from.isSame(prevTimerange?.from) && timerange.to.isSame(prevTimerange?.to)) { if (query !== prevQuery) {
return true;
}
if (
compareTime(timerange.raw.from, prevTimerange?.raw.from) &&
compareTime(timerange.raw.to, prevTimerange?.raw.to)
) {
return false; return false;
} }