@ -5,13 +5,13 @@ import { dateTime } from '@grafana/data';
import { LoadingState } from '@grafana/schema' ;
import { LokiDatasource } from './datasource' ;
import * as logsTimeSplit from './logsTimeSplit ' ;
import * as metricTimeSplit from './metricTimeSplit ' ;
import * as logsTimeSplit from './logsTimeChunking ' ;
import * as metricTimeSplit from './metricTimeChunking ' ;
import { createLokiDatasource , getMockFrames } from './mocks' ;
import { runPartitionedQueries } from './querySplitt ing' ;
import { runQueryInChunks } from './queryChunk ing' ;
import { LokiQuery , LokiQueryType } from './types' ;
describe ( 'runPartitionedQuerie s()' , ( ) = > {
describe ( 'runQueryInChunk s()' , ( ) = > {
let datasource : LokiDatasource ;
const range = {
from : dateTime ( '2023-02-08T05:00:00.000Z' ) ,
@ -31,7 +31,7 @@ describe('runPartitionedQueries()', () => {
} ) ;
test ( 'Splits datasource queries' , async ( ) = > {
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 3 requests.
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;
@ -41,7 +41,7 @@ describe('runPartitionedQueries()', () => {
jest
. spyOn ( datasource , 'runQuery' )
. mockReturnValue ( of ( { state : LoadingState.Error , error : { refId : 'A' , message : 'Error' } , data : [ ] } ) ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( values ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( values ) = > {
expect ( values ) . toEqual ( [ { error : { refId : 'A' , message : 'Error' } , data : [ ] , state : LoadingState.Streaming } ] ) ;
} ) ;
} ) ;
@ -63,7 +63,7 @@ describe('runPartitionedQueries()', () => {
jest . mocked ( metricTimeSplit . getRangeChunks ) . mockRestore ( ) ;
} ) ;
test ( 'Ignores hidden queries' , async ( ) = > {
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
expect ( logsTimeSplit . getRangeChunks ) . toHaveBeenCalled ( ) ;
expect ( metricTimeSplit . getRangeChunks ) . not . toHaveBeenCalled ( ) ;
} ) ;
@ -80,14 +80,14 @@ describe('runPartitionedQueries()', () => {
jest . spyOn ( datasource , 'runQuery' ) . mockReturnValue ( of ( { data : [ logFrameA ] , refId : 'A' } ) ) ;
} ) ;
test ( 'Stops requesting once maxLines of logs have been received' , async ( ) = > {
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 2 responses of 2 logs, 2 requests
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 2 ) ;
} ) ;
} ) ;
test ( 'Performs all the requests if maxLines has not been reached' , async ( ) = > {
request . targets [ 0 ] . maxLines = 9999 ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 3 responses of 2 logs, 3 requests
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;
@ -95,7 +95,7 @@ describe('runPartitionedQueries()', () => {
test ( 'Performs all the requests if not a log query' , async ( ) = > {
request . targets [ 0 ] . maxLines = 1 ;
request . targets [ 0 ] . expr = 'count_over_time({a="b"}[1m])' ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 3 responses of 2 logs, 3 requests
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;
@ -114,7 +114,7 @@ describe('runPartitionedQueries()', () => {
] ,
range ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 1x Metric + 1x Log, 6 requests.
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 6 ) ;
} ) ;
@ -127,7 +127,7 @@ describe('runPartitionedQueries()', () => {
] ,
range ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 1x2 Metric, 3 requests.
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;
@ -140,7 +140,7 @@ describe('runPartitionedQueries()', () => {
] ,
range ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 1x2 Logs, 3 requests.
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;
@ -153,7 +153,7 @@ describe('runPartitionedQueries()', () => {
] ,
range ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// Instant queries are omitted from splitting
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
@ -170,7 +170,7 @@ describe('runPartitionedQueries()', () => {
jest . spyOn ( datasource , 'runQuery' ) . mockReturnValue ( of ( { data : [ ] , refId : 'B' } ) ) ;
jest . spyOn ( datasource , 'runQuery' ) . mockReturnValueOnce ( of ( { data : [ logFrameA ] , refId : 'A' } ) ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 1x Logs + 3x Metric, 3 requests.
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 4 ) ;
} ) ;
@ -184,7 +184,7 @@ describe('runPartitionedQueries()', () => {
] ,
range ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 3 days, 3 chunks, 3x Logs + 3x Metric + 1x Instant, 7 requests.
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 7 ) ;
} ) ;
@ -208,7 +208,7 @@ describe('runPartitionedQueries()', () => {
targets : [ { expr : '{a="b"}' , refId : 'A' , chunkDuration : '30m' } ] ,
range : range1h ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 2 ) ;
} ) ;
} ) ;
@ -217,7 +217,7 @@ describe('runPartitionedQueries()', () => {
targets : [ { expr : '{a="b"}' , refId : 'A' , chunkDuration : '1h' } ] ,
range : range1h ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
} ) ;
@ -229,7 +229,7 @@ describe('runPartitionedQueries()', () => {
] ,
range : range1h ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 1 ) ;
} ) ;
} ) ;
@ -241,7 +241,7 @@ describe('runPartitionedQueries()', () => {
] ,
range : range1h ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 2 x 30m + 1 x 1h
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;
@ -254,7 +254,7 @@ describe('runPartitionedQueries()', () => {
] ,
range : range1h ,
} ) ;
await expect ( runPartitionedQuerie s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
await expect ( runQueryInChunk s ( datasource , request ) ) . toEmitValuesWith ( ( ) = > {
// 2 x 30m + 1 x 1h
expect ( datasource . runQuery ) . toHaveBeenCalledTimes ( 3 ) ;
} ) ;