38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
// every timestamp in this file is a number which contains an unix-timestamp-in-millisecond format,
|
|
// like returned by `new Date().getTime()`. this is needed because the "math"
|
|
// has to be done on integer numbers.
|
|
|
|
// we are trying to be compatible with
|
|
// https://github.com/grafana/loki/blob/089ec1b05f5ec15a8851d0e8230153e0eeb4dcec/pkg/querier/queryrange/split_by_interval.go#L327-L336
|
|
|
|
export function splitTimeRange(
|
|
startTime: number,
|
|
endTime: number,
|
|
step: number,
|
|
idealRangeDuration: number
|
|
): Array<[number, number]> {
|
|
if (idealRangeDuration < step) {
|
|
// we cannot create chunks smaller than `step`
|
|
return [[startTime, endTime]];
|
|
}
|
|
|
|
// we make the duration a multiple of `step`, lowering it if necessary
|
|
const alignedDuration = Math.trunc(idealRangeDuration / step) * step;
|
|
|
|
const alignedStartTime = startTime - (startTime % step);
|
|
|
|
const result: Array<[number, number]> = [];
|
|
|
|
// in a previous version we started iterating from the end, to the start.
|
|
// However this is not easily possible as end timestamps are always inclusive
|
|
// for Loki. So a `2022-02-08T00:00:00Z` end time with a 1day step would mean
|
|
// to include the 08.02.2022, which we don't want. So we have to start from
|
|
// the start, always ending at the last step before the actual end, or the total end.
|
|
for (let chunkStartTime = alignedStartTime; chunkStartTime < endTime; chunkStartTime += alignedDuration) {
|
|
const chunkEndTime = Math.min(chunkStartTime + alignedDuration - step, endTime);
|
|
result.push([chunkStartTime, chunkEndTime]);
|
|
}
|
|
|
|
return result;
|
|
}
|