2016-04-13 22:08:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Copyright 2016 The Prometheus Authors
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Licensed under the Apache License, Version 2.0 (the "License");
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// you may not use this file except in compliance with the License.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// You may obtain a copy of the License at
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//     http://www.apache.org/licenses/LICENSE-2.0
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Unless required by applicable law or agreed to in writing, software
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// distributed under the License is distributed on an "AS IS" BASIS,
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// See the License for the specific language governing permissions and
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// limitations under the License.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								package  promql_test  
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
									
										
										
										
											2017-10-05 03:04:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"context" 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-02 23:01:32 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"fmt" 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-01 21:46:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"math" 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"os" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"path/filepath" 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-17 19:21:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"sort" 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:21:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"strings" 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 03:58:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"sync" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"testing" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"time" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/stretchr/testify/require" 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-22 17:00:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-12-06 20:49:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/model/histogram" 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-08 22:23:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/model/labels" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/model/timestamp" 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-01 21:46:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/model/value" 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/promql" 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-04 00:32:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/promql/parser" 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/promql/parser/posrange" 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/promql/promqltest" 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/storage" 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-01 21:46:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/tsdb/chunkenc" 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/util/annotations" 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/util/logging" 
							 
						 
					
						
							
								
									
										
										
										
											2023-02-10 19:39:33 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/util/stats" 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-16 20:13:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/prometheus/prometheus/util/testutil" 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									env                   =  "query execution" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defaultLookbackDelta  =  5  *  time . Minute 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defaultEpsilon        =  0.000001  // Relative error allowed for sample values.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 17:10:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestMain ( m  * testing . M )  {  
						 
					
						
							
								
									
										
											 
										
											
												feat: add limitk() and limit_ratio() operators (#12503)
* rebase 2024-07-01, picks previous renaming to `limitk()` and `limit_ratio()`
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* gofumpt -d -extra
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* more lint fixes
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* more lint fixes+
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* put limitk() and limit_ratio() behind --enable-feature=promql-experimental-functions
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* EnableExperimentalFunctions for TestConcurrentRangeQueries() also
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* use testutil.RequireEqual to fix tests, WIP equivalent thingie for require.Contains
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* lint fix
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* moar linting
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* rebase 2024-06-19
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* re-add limit(2, metric) testing for N=2 common series subset
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* move `ratio = param` to default switch case, for better readability
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* gofumpt -d -extra util/testutil/cmp.go
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* early break when reaching k elems in limitk(), should have always been so (!)
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* small typo fix
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* no-change small break-loop rearrange for readability
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* remove IsNan(ratio) condition in switch-case, already handled as input validation
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* no-change adding some comments
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* no-change simplify fullMatrix() helper functions used for tests
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* add `limitk(-1, metric)` testcase, which is handled as any k < 1 case
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* engine_test.go: no-change create `requireCommonSeries() helper func (moving code into it) for readability
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* rebase 2024-06-21
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* engine_test.go: HAPPY NOW about its code -> reorg, create and use simpleRangeQuery() function, less lines and more readable ftW \o/
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* move limitk(), limit_ratio() testing to promql/promqltest/testdata/limit.test
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* remove stale leftover after moving tests from engine_test.go to testdata/
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* fix flaky `limit_ratio(0.5, ...)` test case
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* Update promql/engine.go
Co-authored-by: Julius Volz <julius.volz@gmail.com>
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* Update promql/engine.go
Co-authored-by: Julius Volz <julius.volz@gmail.com>
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* Update promql/engine.go
Co-authored-by: Julius Volz <julius.volz@gmail.com>
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* fix AddRatioSample() implementation to use a single conditional (instead of switch/case + fallback return)
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* docs/querying/operators.md: document r < 0
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* add negative limit_ratio() example to docs/querying/examples.md
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* move more extensive docu examples to docs/querying/operators.md
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* typo
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* small docu fix for poor-mans-normality-check, add it to limit.test ;)
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* limit.test: expand "Poor man's normality check" to whole eval range
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* restore mistakenly removed existing small comment
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* expand poors-man-normality-check case(s)
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* Revert "expand poors-man-normality-check case(s)"
This reverts commit f69e1603b2ebe69c0a100197cfbcf6f81644b564, indeed too
flaky 0:)
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* remove humor from docs/querying/operators.md
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* fix signoff
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* add web/ui missing changes
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* expand limit_ratio test cases, cross-fingering they'll not be flaky
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* remove flaky test
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* add missing warnings.Merge(ws) in instant-query return shortcut
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* add missing LimitK||LimitRatio case to codemirror-promql/src/parser/parser.ts
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* fix ui-lint
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
* actually fix returned warnings :]
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
---------
Signed-off-by: JuanJo Ciarlante <juanjosec@gmail.com>
Co-authored-by: Julius Volz <julius.volz@gmail.com>
											 
										 
										
											2024-07-04 04:18:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Enable experimental functions testing
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									parser . EnableExperimentalFunctions  =  true 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-30 23:25:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									testutil . TolerantVerifyLeak ( m ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 17:10:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-09-23 17:06:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestQueryConcurrency ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2020-01-28 06:29:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									maxConcurrency  :=  10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryTracker  :=  promql . NewActiveQueryTracker ( t . TempDir ( ) ,  maxConcurrency ,  nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-28 06:29:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :              nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :                 nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :          10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :             100  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ActiveQueryTracker :  queryTracker , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-10 00:44:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2016-09-16 06:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Cleanup ( cancelCtx ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									block  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									processing  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-27 20:45:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									done  :=  make ( chan  int ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										close ( done ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f  :=  func ( context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-27 20:45:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  processing  <-  struct { } { } : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- done : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- block : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- done : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 03:58:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  wg  sync . WaitGroup 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  i  :=  0 ;  i  <  maxConcurrency ;  i ++  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										q  :=  engine . NewTestQuery ( f ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 03:58:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										wg . Add ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										go  func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											q . Exec ( ctx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											wg . Done ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  <- processing : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Expected.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-23 17:06:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										case  <- time . After ( 20  *  time . Millisecond ) : 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-14 03:19:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . Fail ( t ,  "Query within concurrency threshold not being executed" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									q  :=  engine . NewTestQuery ( f ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 03:58:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									wg . Add ( 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									go  func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										q . Exec ( ctx ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										wg . Done ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  <- processing : 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-14 03:19:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										require . Fail ( t ,  "Query above concurrency threshold being executed" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-23 17:06:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  <- time . After ( 20  *  time . Millisecond ) : 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Expected.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Terminate a running query.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									block  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									select  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									case  <- processing : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Expected.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-09-23 17:06:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									case  <- time . After ( 20  *  time . Millisecond ) : 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-14 03:19:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										require . Fail ( t ,  "Query within concurrency threshold not being executed" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Terminate remaining queries.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  i  :=  0 ;  i  <  maxConcurrency ;  i ++  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										block  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 03:58:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									wg . Wait ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-05-01 06:49:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// contextDone returns an error if the context was canceled or timed out.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  contextDone ( ctx  context . Context ,  env  string )  error  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  err  :=  ctx . Err ( ) ;  err  !=  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										switch  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  errors . Is ( err ,  context . Canceled ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  promql . ErrQueryCanceled ( env ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										case  errors . Is ( err ,  context . DeadlineExceeded ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  promql . ErrQueryTimeout ( env ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										default : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  err 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  TestQueryTimeout ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     5  *  time . Millisecond , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-16 06:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  cancelCtx ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query  :=  engine . NewTestQuery ( func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-22 18:09:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										time . Sleep ( 100  *  time . Millisecond ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  contextDone ( ctx ,  "test statement execution" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Allow per-query contexts.
For Weaveworks' Frankenstein, we need to support multitenancy. In
Frankenstein, we initially solved this without modifying the promql
package at all: we constructed a new promql.Engine for every
query and injected a storage implementation into that engine which would
be primed to only collect data for a given user.
This is problematic to upstream, however. Prometheus assumes that there
is only one engine: the query concurrency gate is part of the engine,
and the engine contains one central cancellable context to shut down all
queries. Also, creating a new engine for every query seems like overkill.
Thus, we want to be able to pass per-query contexts into a single engine.
This change gets rid of the promql.Engine's built-in base context and
allows passing in a per-query context instead. Central cancellation of
all queries is still possible by deriving all passed-in contexts from
one central one, but this is now the responsibility of the caller. The
central query context is now created in main() and passed into the
relevant components (web handler / API, rule manager).
In a next step, the per-query context would have to be passed to the
storage implementation, so that the storage can implement multi-tenancy
or other features based on the contextual information.
											 
										 
										
											2016-09-15 19:52:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									res  :=  query . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res . Err ,  "expected timeout error but got none" ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  e  promql . ErrQueryTimeout 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-07 19:35:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . ErrorAs ( t ,  res . Err ,  & e ,  "expected timeout error but got: %s" ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								const  errQueryCanceled  =  promql . ErrQueryCanceled ( "test statement execution" )  
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  TestQueryCancel ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-16 06:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  cancelCtx ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Cancel a running query before it completes.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									block  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									processing  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query1  :=  engine . NewTestQuery ( func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										processing  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										<- block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  contextDone ( ctx ,  "test statement execution" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-04-29 17:08:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  res  * promql . Result 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									go  func ( )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Allow per-query contexts.
For Weaveworks' Frankenstein, we need to support multitenancy. In
Frankenstein, we initially solved this without modifying the promql
package at all: we constructed a new promql.Engine for every
query and injected a storage implementation into that engine which would
be primed to only collect data for a given user.
This is problematic to upstream, however. Prometheus assumes that there
is only one engine: the query concurrency gate is part of the engine,
and the engine contains one central cancellable context to shut down all
queries. Also, creating a new engine for every query seems like overkill.
Thus, we want to be able to pass per-query contexts into a single engine.
This change gets rid of the promql.Engine's built-in base context and
allows passing in a per-query context instead. Central cancellation of
all queries is still possible by deriving all passed-in contexts from
one central one, but this is now the responsibility of the caller. The
central query context is now created in main() and passed into the
relevant components (web handler / API, rule manager).
In a next step, the per-query context would have to be passed to the
storage implementation, so that the storage can implement multi-tenancy
or other features based on the contextual information.
											 
										 
										
											2016-09-15 19:52:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										res  =  query1 . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										processing  <-  struct { } { } 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									} ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									<- processing 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									query1 . Cancel ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									<- processing 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res . Err ,  "expected cancellation error for query1 but got none" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Equal ( t ,  errQueryCanceled ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Canceling a query before starting it must have no effect.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query2  :=  engine . NewTestQuery ( func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  contextDone ( ctx ,  "test statement execution" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									query2 . Cancel ( ) 
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Allow per-query contexts.
For Weaveworks' Frankenstein, we need to support multitenancy. In
Frankenstein, we initially solved this without modifying the promql
package at all: we constructed a new promql.Engine for every
query and injected a storage implementation into that engine which would
be primed to only collect data for a given user.
This is problematic to upstream, however. Prometheus assumes that there
is only one engine: the query concurrency gate is part of the engine,
and the engine contains one central cancellable context to shut down all
queries. Also, creating a new engine for every query seems like overkill.
Thus, we want to be able to pass per-query contexts into a single engine.
This change gets rid of the promql.Engine's built-in base context and
allows passing in a per-query context instead. Central cancellation of
all queries is still possible by deriving all passed-in contexts from
one central one, but this is now the responsibility of the caller. The
central query context is now created in main() and passed into the
relevant components (web handler / API, rule manager).
In a next step, the per-query context would have to be passed to the
storage implementation, so that the storage can implement multi-tenancy
or other features based on the contextual information.
											 
										 
										
											2016-09-15 19:52:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									res  =  query2 . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// errQuerier implements storage.Querier which always returns error.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  errQuerier  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-12 18:37:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( q  * errQuerier )  Select ( context . Context ,  bool ,  * storage . SelectHints ,  ... * labels . Matcher )  storage . SeriesSet  {  
						 
					
						
							
								
									
										
										
										
											2020-06-10 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  errSeriesSet { err :  q . err } 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 02:39:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( * errQuerier )  LabelValues ( context . Context ,  string ,  * storage . LabelHints ,  ... * labels . Matcher )  ( [ ] string ,  annotations . Annotations ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2021-02-10 01:38:35 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil ,  nil ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 02:39:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( * errQuerier )  LabelNames ( context . Context ,  * storage . LabelHints ,  ... * labels . Matcher )  ( [ ] string ,  annotations . Annotations ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2021-07-20 20:38:08 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  nil ,  nil ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( * errQuerier )  Close ( )  error  {  return  nil  }  
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// errSeriesSet implements storage.SeriesSet which always returns error.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  errSeriesSet  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									err  error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( errSeriesSet )  Next ( )  bool                           {  return  false  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( errSeriesSet )  At ( )  storage . Series                   {  return  nil  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( e  errSeriesSet )  Err ( )  error                         {  return  e . err  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( e  errSeriesSet )  Warnings ( )  annotations . Annotations  {  return  nil  }  
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestQueryError ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									errStorage  :=  promql . ErrStorage { errors . New ( "storage error" ) } 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-12 18:37:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryable  :=  storage . QueryableFunc ( func ( mint ,  maxt  int64 )  ( storage . Querier ,  error )  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  & errQuerier { err :  errStorage } ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  cancelCtx ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-18 12:32:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									vectorQuery ,  err  :=  engine . NewInstantQuery ( ctx ,  queryable ,  nil ,  "foo" ,  time . Unix ( 1 ,  0 ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									res  :=  vectorQuery . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res . Err ,  "expected error on failed select but got none" ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-07 19:35:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . ErrorIs ( t ,  res . Err ,  errStorage ,  "expected error doesn't match" ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-04-18 12:32:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									matrixQuery ,  err  :=  engine . NewInstantQuery ( ctx ,  queryable ,  nil ,  "foo[1m]" ,  time . Unix ( 1 ,  0 ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									res  =  matrixQuery . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res . Err ,  "expected error on failed select but got none" ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-07 19:35:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . ErrorIs ( t ,  res . Err ,  errStorage ,  "expected error doesn't match" ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-02-15 20:08:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								type  noopHintRecordingQueryable  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									hints  [ ] * storage . SelectHints 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-12 18:37:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( h  * noopHintRecordingQueryable )  Querier ( int64 ,  int64 )  ( storage . Querier ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  & hintRecordingQuerier { Querier :  & errQuerier { } ,  h :  h } ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  hintRecordingQuerier  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									storage . Querier 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									h  * noopHintRecordingQueryable 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-09-12 18:37:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  ( h  * hintRecordingQuerier )  Select ( ctx  context . Context ,  sortSeries  bool ,  hints  * storage . SelectHints ,  matchers  ... * labels . Matcher )  storage . SeriesSet  {  
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									h . h . hints  =  append ( h . h . hints ,  hints ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-12 18:37:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  h . Querier . Select ( ctx ,  sortSeries ,  hints ,  matchers ... ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-06-17 15:31:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestSelectHintsSetCorrectly ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :            nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :               nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :        10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :           10  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										LookbackDelta :     5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EnableAtModifier :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  _ ,  tc  :=  range  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										query  string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// All times are in milliseconds.
 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										start  int64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										end    int64 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// TODO(bwplotka): Add support for better hints when subquerying.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  [ ] * storage . SelectHints 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  5001 ,  End :  10000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo @ 15" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  10001 ,  End :  15000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo @ 1" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 3999 ,  End :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m]" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  80001 ,  End :  200000 ,  Range :  120000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m] @ 180" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  60001 ,  End :  180000 ,  Range :  120000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m] @ 300" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  180001 ,  End :  300000 ,  Range :  120000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m] @ 60" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 59999 ,  End :  60000 ,  Range :  120000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m] offset 2m" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  60001 ,  End :  180000 ,  Range :  120000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m] @ 200 offset 2m" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 39999 ,  End :  80000 ,  Range :  120000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo[2m:1s]" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  175001 ,  End :  300000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s])" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  175001 ,  End :  300000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] @ 300)" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  175001 ,  End :  300000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] @ 200)" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  75001 ,  End :  200000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] @ 100)" ,  start :  200000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 24999 ,  End :  100000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] offset 10s)" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  165001 ,  End :  290000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo offset 10s)[2m:1s] offset 10s)" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  155001 ,  End :  280000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// When the @ is on the vector selector, the enclosing subquery parameters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// don't affect the hint ranges.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo @ 200 offset 10s)[2m:1s] offset 10s)" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  185001 ,  End :  190000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// When the @ is on the vector selector, the enclosing subquery parameters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// don't affect the hint ranges.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo @ 200 offset 10s)[2m:1s] @ 100 offset 10s)" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  185001 ,  End :  190000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo offset 10s)[2m:1s] @ 100 offset 10s)" ,  start :  300000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 44999 ,  End :  80000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo" ,  start :  10000 ,  end :  20000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  5001 ,  End :  20000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo @ 15" ,  start :  10000 ,  end :  20000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  10001 ,  End :  15000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo @ 1" ,  start :  10000 ,  end :  20000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 3999 ,  End :  1000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2m] @ 180)" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  60001 ,  End :  180000 ,  Range :  120000 ,  Func :  "rate" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2m] @ 300)" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  180001 ,  End :  300000 ,  Range :  120000 ,  Func :  "rate" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2m] @ 60)" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 59999 ,  End :  60000 ,  Range :  120000 ,  Func :  "rate" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2m])" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  80001 ,  End :  500000 ,  Range :  120000 ,  Func :  "rate" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2m] offset 2m)" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  60001 ,  End :  380000 ,  Range :  120000 ,  Func :  "rate" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2m:1s])" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  175001 ,  End :  500000 ,  Func :  "rate" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s])" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  175001 ,  End :  500000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] offset 10s)" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  165001 ,  End :  490000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] @ 300)" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  175001 ,  End :  300000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] @ 200)" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  75001 ,  End :  200000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time(foo[2m:1s] @ 100)" ,  start :  200000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 24999 ,  End :  100000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo offset 10s)[2m:1s] offset 10s)" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  155001 ,  End :  480000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// When the @ is on the vector selector, the enclosing subquery parameters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// don't affect the hint ranges.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo @ 200 offset 10s)[2m:1s] offset 10s)" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  185001 ,  End :  190000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// When the @ is on the vector selector, the enclosing subquery parameters
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// don't affect the hint ranges.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo @ 200 offset 10s)[2m:1s] @ 100 offset 10s)" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  185001 ,  End :  190000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "count_over_time((foo offset 10s)[2m:1s] @ 100 offset 10s)" ,  start :  300000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 44999 ,  End :  80000 ,  Func :  "count_over_time" ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "sum by (dim1) (foo)" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  5001 ,  End :  10000 ,  Func :  "sum" ,  By :  true ,  Grouping :  [ ] string { "dim1" } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "sum without (dim1) (foo)" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  5001 ,  End :  10000 ,  Func :  "sum" ,  Grouping :  [ ] string { "dim1" } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "sum by (dim1) (avg_over_time(foo[1s]))" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  9001 ,  End :  10000 ,  Func :  "avg_over_time" ,  Range :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "sum by (dim1) (max by (dim2) (foo))" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  5001 ,  End :  10000 ,  Func :  "max" ,  By :  true ,  Grouping :  [ ] string { "dim2" } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "(max by (dim1) (foo))[5s:1s]" ,  start :  10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  1 ,  End :  10000 ,  Func :  "max" ,  By :  true ,  Grouping :  [ ] string { "dim1" } ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "(sum(http_requests{group=~\"p.*\"})+max(http_requests{group=~\"c.*\"}))[20s:5s]" ,  start :  120000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  95001 ,  End :  120000 ,  Func :  "sum" ,  By :  true ,  Step :  5000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  95001 ,  End :  120000 ,  Func :  "max" ,  By :  true ,  Step :  5000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo @ 50 + bar @ 250 + baz @ 900" ,  start :  100000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  45001 ,  End :  50000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  245001 ,  End :  250000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  895001 ,  End :  900000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "foo @ 50 + bar + baz @ 900" ,  start :  100000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  45001 ,  End :  50000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  95001 ,  End :  500000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  895001 ,  End :  900000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2s] @ 50) + bar @ 250 + baz @ 900" ,  start :  100000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  48001 ,  End :  50000 ,  Step :  1000 ,  Func :  "rate" ,  Range :  2000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  245001 ,  End :  250000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  895001 ,  End :  900000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2s:1s] @ 50) + bar + baz" ,  start :  100000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  43001 ,  End :  50000 ,  Step :  1000 ,  Func :  "rate" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  95001 ,  End :  500000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  95001 ,  End :  500000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(foo[2s:1s] @ 50) + bar + rate(baz[2m:1s] @ 900 offset 2m) " ,  start :  100000 ,  end :  500000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  43001 ,  End :  50000 ,  Step :  1000 ,  Func :  "rate" } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  95001 ,  End :  500000 ,  Step :  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ Start :  655001 ,  End :  780000 ,  Step :  1000 ,  Func :  "rate" } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  {  // Hints are based on the inner most subquery timestamp.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` sum_over_time(sum_over_time(metric { job="1"}[100s])[100s:25s] @ 50)[3s:1s] @ 3000 ` ,  start :  100000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  - 149999 ,  End :  50000 ,  Range :  100000 ,  Func :  "sum_over_time" ,  Step :  25000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  {  // Hints are based on the inner most subquery timestamp.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` sum_over_time(sum_over_time(metric { job="1"}[100s])[100s:25s] @ 3000)[3s:1s] @ 50 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  [ ] * storage . SelectHints { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ Start :  2800001 ,  End :  3000000 ,  Range :  100000 ,  Func :  "sum_over_time" ,  Step :  25000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									}  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										t . Run ( tc . query ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											hintsRecorder  :=  & noopHintRecordingQueryable { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											var  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												query  promql . Query 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												err    error 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											) 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-18 12:32:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ctx  :=  context . Background ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  tc . end  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-18 12:32:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												query ,  err  =  engine . NewInstantQuery ( ctx ,  hintsRecorder ,  nil ,  tc . query ,  timestamp . Time ( tc . start ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-18 12:32:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												query ,  err  =  engine . NewRangeQuery ( ctx ,  hintsRecorder ,  nil ,  tc . query ,  timestamp . Time ( tc . start ) ,  timestamp . Time ( tc . end ) ,  time . Second ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											res  :=  query . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . Equal ( t ,  tc . expected ,  hintsRecorder . hints ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-17 20:52:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								func  TestEngineShutdown ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-16 06:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									processing  :=  make ( chan  struct { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									// Shutdown engine on first handler execution. Should handler execution ever become
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// concurrent this test has to be adjusted accordingly.
 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									f  :=  func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										processing  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										<- block 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  contextDone ( ctx ,  "test statement execution" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query1  :=  engine . NewTestQuery ( f ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2015-04-29 17:08:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Stopping the engine must cancel the base context. While executing queries is
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// still possible, their context is canceled from the beginning and execution should
 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									// terminate immediately.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  res  * promql . Result 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									go  func ( )  { 
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Allow per-query contexts.
For Weaveworks' Frankenstein, we need to support multitenancy. In
Frankenstein, we initially solved this without modifying the promql
package at all: we constructed a new promql.Engine for every
query and injected a storage implementation into that engine which would
be primed to only collect data for a given user.
This is problematic to upstream, however. Prometheus assumes that there
is only one engine: the query concurrency gate is part of the engine,
and the engine contains one central cancellable context to shut down all
queries. Also, creating a new engine for every query seems like overkill.
Thus, we want to be able to pass per-query contexts into a single engine.
This change gets rid of the promql.Engine's built-in base context and
allows passing in a per-query context instead. Central cancellation of
all queries is still possible by deriving all passed-in contexts from
one central one, but this is now the responsibility of the caller. The
central query context is now created in main() and passed into the
relevant components (web handler / API, rule manager).
In a next step, the per-query context would have to be passed to the
storage implementation, so that the storage can implement multi-tenancy
or other features based on the contextual information.
											 
										 
										
											2016-09-15 19:52:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										res  =  query1 . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										processing  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									<- processing 
							 
						 
					
						
							
								
									
										
										
										
											2016-09-16 06:58:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cancelCtx ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									block  <-  struct { } { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									<- processing 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res . Err ,  "expected error on shutdown during query but got none" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Equal ( t ,  errQueryCanceled ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query2  :=  engine . NewTestQuery ( func ( context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-09-14 03:19:20 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										require . FailNow ( t ,  "reached query execution unexpectedly" ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-08-10 20:21:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The second query is started after the engine shut down. It must
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// be canceled immediately.
 
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Allow per-query contexts.
For Weaveworks' Frankenstein, we need to support multitenancy. In
Frankenstein, we initially solved this without modifying the promql
package at all: we constructed a new promql.Engine for every
query and injected a storage implementation into that engine which would
be primed to only collect data for a given user.
This is problematic to upstream, however. Prometheus assumes that there
is only one engine: the query concurrency gate is part of the engine,
and the engine contains one central cancellable context to shut down all
queries. Also, creating a new engine for every query seems like overkill.
Thus, we want to be able to pass per-query contexts into a single engine.
This change gets rid of the promql.Engine's built-in base context and
allows passing in a per-query context instead. Central cancellation of
all queries is still possible by deriving all passed-in contexts from
one central one, but this is now the responsibility of the caller. The
central query context is now created in main() and passed into the
relevant components (web handler / API, rule manager).
In a next step, the per-query context would have to be passed to the
storage implementation, so that the storage can implement multi-tenancy
or other features based on the contextual information.
											 
										 
										
											2016-09-15 19:52:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									res2  :=  query2 . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res2 . Err ,  "expected error on querying with canceled context but got none" ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									var  e  promql . ErrQueryCanceled 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-07 19:35:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . ErrorAs ( t ,  res2 . Err ,  & e ,  "expected cancellation error but got: %s" ,  res2 . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2015-03-31 01:13:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2015-08-19 21:28:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestEngineEvalStmtTimestamps ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									storage  :=  promqltest . LoadedStorage ( t ,  ` 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								load  10 s  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric  1  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` )  
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-13 17:57:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Query        string 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-04 00:32:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Result       parser . Value 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-13 17:57:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Start        time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										End          time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Interval     time . Duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ShouldError  bool 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Instant queries.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :   "1" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Result :  promql . Scalar { V :  1 ,  T :  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :   time . Unix ( 1 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :  "metric" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Result :  promql . Vector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Sample { 
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Separate `Point` into `FPoint` and `HPoint`
In other words: Instead of having a “polymorphous” `Point` that can
either contain a float value or a histogram value, use an `FPoint` for
floats and an `HPoint` for histograms.
This seemingly small change has a _lot_ of repercussions throughout
the codebase.
The idea here is to avoid the increase in size of `Point` arrays that
happened after native histograms had been added.
The higher-level data structures (`Sample`, `Series`, etc.) are still
“polymorphous”. The same idea could be applied to them, but at each
step the trade-offs needed to be evaluated.
The idea with this change is to do the minimum necessary to get back
to pre-histogram performance for functions that do not touch
histograms. Here are comparisons for the `changes` function. The test
data doesn't include histograms yet. Ideally, there would be no change
in the benchmark result at all.
First runtime v2.39 compared to directly prior to this commit:
```
name                                                  old time/op    new time/op    delta
RangeQuery/expr=changes(a_one[1d]),steps=1-16            391µs ± 2%     542µs ± 1%  +38.58%  (p=0.000 n=9+8)
RangeQuery/expr=changes(a_one[1d]),steps=10-16           452µs ± 2%     617µs ± 2%  +36.48%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_one[1d]),steps=100-16         1.12ms ± 1%    1.36ms ± 2%  +21.58%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_one[1d]),steps=1000-16        7.83ms ± 1%    8.94ms ± 1%  +14.21%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_ten[1d]),steps=1-16           2.98ms ± 0%    3.30ms ± 1%  +10.67%  (p=0.000 n=9+10)
RangeQuery/expr=changes(a_ten[1d]),steps=10-16          3.66ms ± 1%    4.10ms ± 1%  +11.82%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_ten[1d]),steps=100-16         10.5ms ± 0%    11.8ms ± 1%  +12.50%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_ten[1d]),steps=1000-16        77.6ms ± 1%    87.4ms ± 1%  +12.63%  (p=0.000 n=9+9)
RangeQuery/expr=changes(a_hundred[1d]),steps=1-16       30.4ms ± 2%    32.8ms ± 1%   +8.01%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=10-16      37.1ms ± 2%    40.6ms ± 2%   +9.64%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=100-16      105ms ± 1%     117ms ± 1%  +11.69%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-16     783ms ± 3%     876ms ± 1%  +11.83%  (p=0.000 n=9+10)
```
And then runtime v2.39 compared to after this commit:
```
name                                                  old time/op    new time/op    delta
RangeQuery/expr=changes(a_one[1d]),steps=1-16            391µs ± 2%     547µs ± 1%  +39.84%  (p=0.000 n=9+8)
RangeQuery/expr=changes(a_one[1d]),steps=10-16           452µs ± 2%     616µs ± 2%  +36.15%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_one[1d]),steps=100-16         1.12ms ± 1%    1.26ms ± 1%  +12.20%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_one[1d]),steps=1000-16        7.83ms ± 1%    7.95ms ± 1%   +1.59%  (p=0.000 n=10+8)
RangeQuery/expr=changes(a_ten[1d]),steps=1-16           2.98ms ± 0%    3.38ms ± 2%  +13.49%  (p=0.000 n=9+10)
RangeQuery/expr=changes(a_ten[1d]),steps=10-16          3.66ms ± 1%    4.02ms ± 1%   +9.80%  (p=0.000 n=10+9)
RangeQuery/expr=changes(a_ten[1d]),steps=100-16         10.5ms ± 0%    10.8ms ± 1%   +3.08%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_ten[1d]),steps=1000-16        77.6ms ± 1%    78.1ms ± 1%   +0.58%  (p=0.035 n=9+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=1-16       30.4ms ± 2%    33.5ms ± 4%  +10.18%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=10-16      37.1ms ± 2%    40.0ms ± 1%   +7.98%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=100-16      105ms ± 1%     107ms ± 1%   +1.92%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-16     783ms ± 3%     775ms ± 1%   -1.02%  (p=0.019 n=9+9)
```
In summary, the runtime doesn't really improve with this change for
queries with just a few steps. For queries with many steps, this
commit essentially reinstates the old performance. This is good
because the many-step queries are the one that matter most (longest
absolute runtime).
In terms of allocations, though, this commit doesn't make a dent at
all (numbers not shown). The reason is that most of the allocations
happen in the sampleRingIterator (in the storage package), which has
to be addressed in a separate commit.
Signed-off-by: beorn7 <beorn@grafana.com>
											 
										 
										
											2022-10-28 22:58:40 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													F :       1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													T :       1000 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :  time . Unix ( 1 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :  "metric[20s]" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  2 ,  T :  10000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :  time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Range queries.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :  "1" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  1 ,  T :  1000 } ,  { F :  1 ,  T :  2000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2022-03-10 06:16:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :     time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :       time . Unix ( 2 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :  "metric" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  1 ,  T :  1000 } ,  { F :  1 ,  T :  2000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :     time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :       time . Unix ( 2 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-13 13:22:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :  "metric" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  1 ,  T :  5000 } ,  { F :  2 ,  T :  10000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-13 13:22:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :     time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :  5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-13 17:57:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-04 01:33:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :        ` count_values("wrong label!\xff", metric) ` , 
							 
						 
					
						
							
								
									
										
										
										
											2018-09-13 17:57:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ShouldError :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-25 22:22:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  i ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( fmt . Sprintf ( "%d query=%s" ,  i ,  c . Query ) ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											var  err  error 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											var  qry  promql . Query 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-25 22:22:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  c . Interval  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												qry ,  err  =  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  nil ,  c . Query ,  c . Start ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-25 22:22:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												qry ,  err  =  engine . NewRangeQuery ( context . Background ( ) ,  storage ,  nil ,  c . Query ,  c . Start ,  c . End ,  c . Interval ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-25 22:22:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-05-25 22:22:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  c . ShouldError  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												require . Error ( t ,  res . Err ,  "expected error for the query %q" ,  c . Query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-05-25 22:22:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . Equal ( t ,  c . Result ,  res . Value ,  "query %q failed" ,  c . Query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-04-18 21:51:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestQueryStatistics ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									storage  :=  promqltest . LoadedStorage ( t ,  ` 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								load  10 s  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metricWith1SampleEvery10Seconds  1 + 1 x100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metricWith3SampleEvery10Seconds { a = "1" , b = "1" }  1 + 1 x100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metricWith3SampleEvery10Seconds { a = "2" , b = "2" }  1 + 1 x100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metricWith3SampleEvery10Seconds { a = "3" , b = "2" }  1 + 1 x100 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  metricWith1HistogramEvery10Seconds  { { schema : 1  count : 5  sum : 20  buckets : [ 1  2  1  1 ] } } + { { schema : 1  count : 10  sum : 5  buckets : [ 1  2  3  4 ] } } x100 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` )  
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Query                string 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										SkipMaxCheck         bool 
							 
						 
					
						
							
								
									
										
										
										
											2022-04-12 07:22:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TotalSamples         int64 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										TotalSamplesPerStep  stats . TotalSamplesPerStep 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										PeakSamples          int 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Start                time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										End                  time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Interval             time . Duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` "literal string" ` , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											SkipMaxCheck :  true ,  // This can't fail from a max samples limit.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  0 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-28 23:13:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1HistogramEvery10Seconds" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  13 ,  // 1 histogram HPoint of size 13 / 10 seconds
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-28 23:13:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												21000 :  13 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-28 23:13:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// timestamp function has a special handling.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "timestamp(metricWith1SampleEvery10Seconds)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   2 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "timestamp(metricWith1HistogramEvery10Seconds)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 17:39:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 float sample (because of timestamp) / 10 seconds
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 22 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												22000 :  1 ,  // Aligned to the step time, not the sample time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds offset 10s" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds @ 15" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds { a="1"} ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds { a="1"} @ 19 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   1 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  1 ,  // 1 sample / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds { a="1"}[20s] @ 19 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   2 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  2 ,  // (1 sample / 10 seconds) * 20s
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith3SampleEvery10Seconds" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 21 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   3 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  3 ,  // 3 samples / 10 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												21000 :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds[60s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   6 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  6 ,  // 1 sample / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1HistogramEvery10Seconds[60s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   78 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  78 ,  // 1 histogram (size 13 HPoint) / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												201000 :  78 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith1SampleEvery10Seconds[60s])[20s:5s]" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   10 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  24 ,  // (1 sample / 10 seconds * 60 seconds) * 4
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  24 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith1SampleEvery10Seconds[61s])[20s:5s]" , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   11 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  26 ,  // (1 sample / 10 seconds * 60 seconds) * 4 + 2 as
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// max_over_time(metricWith1SampleEvery10Seconds[61s]) @ 190 and 200 will return 7 samples.
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  26 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith1HistogramEvery10Seconds[60s])[20s:5s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   78 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-01 15:31:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  312 ,  // (1 histogram (size 13) / 10 seconds * 60 seconds) * 4
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-01 15:31:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												201000 :  312 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds[60s] @ 30" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   4 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  4 ,  // @ modifier force the evaluation to at 30 seconds - So it brings 4 datapoints (0, 10, 20, 30 seconds) * 1 series
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1HistogramEvery10Seconds[60s] @ 30" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   52 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  52 ,  // @ modifier force the evaluation to at 30 seconds - So it brings 4 datapoints (0, 10, 20, 30 seconds) * 1 series
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												201000 :  52 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "sum(max_over_time(metricWith3SampleEvery10Seconds[60s] @ 30))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   7 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  12 ,  // @ modifier force the evaluation to at 30 seconds - So it brings 4 datapoints (0, 10, 20, 30 seconds) * 3 series
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "sum by (b) (max_over_time(metricWith3SampleEvery10Seconds[60s] @ 30))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-01 07:21:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   7 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  12 ,  // @ modifier force the evaluation to at 30 seconds - So it brings 4 datapoints (0, 10, 20, 30 seconds) * 3 series
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds[60s] offset 10s" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   6 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  6 ,  // 1 sample / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith3SampleEvery10Seconds[60s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   18 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  18 ,  // 3 sample / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith1SampleEvery10Seconds[60s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   7 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  6 ,  // 1 sample / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "absent_over_time(metricWith1SampleEvery10Seconds[60s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   7 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  6 ,  // 1 sample / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith3SampleEvery10Seconds[60s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   9 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  18 ,  // 3 sample / 10 seconds * 60 seconds
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds[60s:5s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   12 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  12 ,  // 1 sample per query * 12 queries (60/5)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "metricWith1SampleEvery10Seconds[60s:5s] offset 10s" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   12 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  12 ,  // 1 sample per query * 12 queries (60/5)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith3SampleEvery10Seconds[60s:5s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   51 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  36 ,  // 3 sample per query * 12 queries (60/5)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  36 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "sum(max_over_time(metricWith3SampleEvery10Seconds[60s:5s])) + sum(max_over_time(metricWith3SampleEvery10Seconds[60s:5s]))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   52 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  72 ,  // 2 * (3 sample per query * 12 queries (60/5))
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  72 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds { a="1"} ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   4 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  4 ,  // 1 sample per query * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds { a="1"} ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 204 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 223 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   4 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  4 ,  // 1 sample per query * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												204000 :  1 ,  // aligned to the step time, not the sample time
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												209000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												214000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												219000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :         ` metricWith1HistogramEvery10Seconds ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 204 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 223 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   52 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  52 ,  // 1 histogram (size 13 HPoint) per query * 4 steps
 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 01:19:14 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												204000 :  13 ,  // aligned to the step time, not the sample time
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												209000 :  13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												214000 :  13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												219000 :  13 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// timestamp function has a special handling
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :         "timestamp(metricWith1SampleEvery10Seconds)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   5 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-28 23:13:15 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  4 ,  // 1 sample per query * 4 steps
 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// timestamp function has a special handling
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "timestamp(metricWith1HistogramEvery10Seconds)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 17:39:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   5 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-29 01:10:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  4 ,  // 1 sample per query * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` max_over_time(metricWith3SampleEvery10Seconds { a="1"}[10s]) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 991 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 1021 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   2 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  2 ,  // 1 sample per query * 2 steps with data
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												991000 :   1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												1001000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												1011000 :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												1021000 :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds { a="1"} offset 10s ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   4 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  4 ,  // 1 sample per query * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith3SampleEvery10Seconds[60s] @ 30)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   12 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  48 ,  // @ modifier force the evaluation timestamp at 30 seconds - So it brings 4 datapoints (0, 10, 20, 30 seconds) * 3 series * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` metricWith3SampleEvery10Seconds ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   12 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamples :  12 ,  // 3 sample per query * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         ` max_over_time(metricWith3SampleEvery10Seconds[60s]) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   18 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  72 ,  // (3 sample / 10 seconds * 60 seconds) * 4 steps = 72
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith3SampleEvery10Seconds[60s:5s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   72 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  144 ,  // 3 sample per query * 12 queries (60/5) * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  36 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  36 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  36 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  36 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "max_over_time(metricWith1SampleEvery10Seconds[60s:5s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   32 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  48 ,  // 1 sample per query * 12 queries (60/5) * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "sum by (b) (max_over_time(metricWith1SampleEvery10Seconds[60s:5s]))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   32 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  48 ,  // 1 sample per query * 12 queries (60/5) * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  12 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "sum(max_over_time(metricWith3SampleEvery10Seconds[60s:5s])) + sum(max_over_time(metricWith3SampleEvery10Seconds[60s:5s]))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   76 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  288 ,  // 2 * (3 sample per query * 12 queries (60/5) * 4 steps)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  72 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  72 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  72 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  72 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :         "sum(max_over_time(metricWith3SampleEvery10Seconds[60s:5s])) + sum(max_over_time(metricWith1SampleEvery10Seconds[60s:5s]))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :         time . Unix ( 201 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :           time . Unix ( 220 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :      5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PeakSamples :   72 , 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											TotalSamples :  192 ,  // (1 sample per query * 12 queries (60/5) + 3 sample per query * 12 queries (60/5)) * 4 steps
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											TotalSamplesPerStep :  stats . TotalSamplesPerStep { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												201000 :  48 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												206000 :  48 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												211000 :  48 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												216000 :  48 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( c . Query ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts  :=  promql . NewPrometheusQueryOpts ( true ,  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  :=  promqltest . NewTestEngine ( t ,  true ,  0 ,  promqltest . DefaultMaxSamplesPerQuery ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											runQuery  :=  func ( expErr  error )  * stats . Statistics  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												var  err  error 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												var  qry  promql . Query 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  c . Interval  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													qry ,  err  =  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  opts ,  c . Query ,  c . Start ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													qry ,  err  =  engine . NewRangeQuery ( context . Background ( ) ,  storage ,  opts ,  c . Query ,  c . Start ,  c . End ,  c . Interval ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												require . Equal ( t ,  expErr ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												return  qry . Stats ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											stats  :=  runQuery ( nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . Equal ( t ,  c . TotalSamples ,  stats . Samples . TotalSamples ,  "Total samples mismatch" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . Equal ( t ,  & c . TotalSamplesPerStep ,  stats . Samples . TotalSamplesPerStepMap ( ) ,  "Total samples per time mismatch" ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . Equal ( t ,  c . PeakSamples ,  stats . Samples . PeakSamples ,  "Peak samples mismatch" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Check that the peak is correct by setting the max to one less.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  c . SkipMaxCheck  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												return 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  =  promqltest . NewTestEngine ( t ,  true ,  0 ,  stats . Samples . PeakSamples - 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											runQuery ( promql . ErrTooManySamples ( env ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestMaxQuerySamples ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									storage  :=  promqltest . LoadedStorage ( t ,  ` 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								load  10 s  
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  metric  1 + 1 x100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bigmetric { a = "1" }  1 + 1 x100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bigmetric { a = "2" }  1 + 1 x100 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								` )  
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// These test cases should be touching the limit exactly (hence no exceeding).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Exceeding the limit will be tested by doing -1 to the MaxSamples.
 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Query       string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples  int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Start       time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										End         time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Interval    time . Duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Instant queries.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :       "1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 1 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 1 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "metric[20s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  2 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "rate(metric[20s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "metric[20s:5s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "metric[20s] @ 10" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Range queries.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :       "1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 2 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 2 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 2 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "metric" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-28 20:36:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       "rate(bigmetric[1s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Result is duplicated, so @ also produces 3 samples.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :       "metric @ 10" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// The peak samples in memory is during the first evaluation:
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//   - Subquery takes 20 samples, 10 for each bigmetric.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//   - Result is calculated per series where the series samples is buffered, hence 10 more here.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//   - The result of two series is added before the last series buffer is discarded, so 2 more here.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//   Hence at peak it is 20 (subquery) + 10 (buffer of a series) + 2 (result from 2 series).
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// The subquery samples and the buffer is discarded before duplicating.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :       ` rate(bigmetric[10s:1s] @ 10) ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MaxSamples :  32 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Here the reasoning is same as above. But LHS and RHS are done one after another.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// So while one of them takes 32 samples at peak, we need to hold the 2 sample
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// result of the other till then.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :       ` rate(bigmetric[10s:1s] @ 10) + rate(bigmetric[10s:1s] @ 30) ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MaxSamples :  34 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 0 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// promql.Sample as above but with only 1 part as step invariant.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Here the peak is caused by the non-step invariant part as it touches more time range.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Hence at peak it is 2*20 (subquery from 0s to 20s)
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//                     + 10 (buffer of a series per evaluation)
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											//                     + 6 (result from 2 series at 3 eval times).
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Query :       ` rate(bigmetric[10s:1s]) + rate(bigmetric[10s:1s] @ 30) ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MaxSamples :  56 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											End :         time . Unix ( 20 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Interval :    5  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Nested subquery.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// We saw that innermost rate takes 32 samples which is still the peak
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// since the other two subqueries just duplicate the result.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       ` rate(rate(bigmetric[10:1s] @ 10)[100s:25s] @ 1000)[100s:20s] @ 2000 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :  32 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Nested subquery.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Now the outermost subquery produces more samples than innermost rate.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Query :       ` rate(rate(bigmetric[10s:1s] @ 10)[100s:25s] @ 1000)[17s:1s] @ 2000 ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											MaxSamples :  34 , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Start :       time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-28 20:36:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										t . Run ( c . Query ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											testFunc  :=  func ( expError  error )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												var  err  error 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												var  qry  promql . Query 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  c . Interval  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													qry ,  err  =  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  nil ,  c . Query ,  c . Start ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													qry ,  err  =  engine . NewRangeQuery ( context . Background ( ) ,  storage ,  nil ,  c . Query ,  c . Start ,  c . End ,  c . Interval ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												stats  :=  qry . Stats ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												require . Equal ( t ,  expError ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-02 10:07:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												require . NotNil ( t ,  stats ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-02-23 04:30:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												if  expError  ==  nil  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													require . Equal ( t ,  c . MaxSamples ,  stats . Samples . PeakSamples ,  "peak samples mismatch for query %q" ,  c . Query ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Within limit.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  =  promqltest . NewTestEngine ( t ,  false ,  0 ,  c . MaxSamples ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											testFunc ( nil ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Exceeding limit.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  =  promqltest . NewTestEngine ( t ,  false ,  0 ,  c . MaxSamples - 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											testFunc ( promql . ErrTooManySamples ( env ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestAtModifier ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									storage  :=  promqltest . LoadedStorage ( t ,  ` 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								load  10 s  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric { job = "1" }  0 + 1 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric { job = "2" }  0 + 2 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric_topk { instance = "1" }  0 + 1 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric_topk { instance = "2" }  0 + 2 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric_topk { instance = "3" }  1000 - 1 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								load  1 ms  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  metric_ms  0 + 1 x10000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` )  
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lbls1  :=  labels . FromStrings ( "__name__" ,  "metric" ,  "job" ,  "1" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lbls2  :=  labels . FromStrings ( "__name__" ,  "metric" ,  "job" ,  "2" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lblstopk2  :=  labels . FromStrings ( "__name__" ,  "metric_topk" ,  "instance" ,  "2" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lblstopk3  :=  labels . FromStrings ( "__name__" ,  "metric_topk" ,  "instance" ,  "3" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lblsms  :=  labels . FromStrings ( "__name__" ,  "metric_ms" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									lblsneg  :=  labels . FromStrings ( "__name__" ,  "metric_neg" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Add some samples with negative timestamp.
 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									db  :=  storage . DB 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									app  :=  db . Appender ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-18 20:07:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ref ,  err  :=  app . Append ( 0 ,  lblsneg ,  - 1000000 ,  1000 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ts  :=  int64 ( - 1000000  +  1000 ) ;  ts  <=  0 ;  ts  +=  1000  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 00:23:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_ ,  err  :=  app . Append ( ref ,  labels . EmptyLabels ( ) ,  ts ,  - float64 ( ts / 1000 ) + 1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-18 20:07:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 21:43:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// To test the fix for https://github.com/prometheus/prometheus/issues/8433.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-18 20:07:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									_ ,  err  =  app . Append ( 0 ,  labels . FromStrings ( "__name__" ,  "metric_timestamp" ) ,  3600 * 1000 ,  1000 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 21:43:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  app . Commit ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										query                 string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										start ,  end ,  interval  int64  // Time in seconds.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										result                parser . Value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  // Time of the result is the evaluation time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_neg @ 0 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Vector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Sample { F :  1 ,  T :  100000 ,  Metric :  lblsneg } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_neg @ -200 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Vector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Sample { F :  201 ,  T :  100000 ,  Metric :  lblsneg } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric { job="2"} @ 50 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  - 2 ,  end :  2 ,  interval :  1 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  10 ,  T :  - 2000 } ,  { F :  10 ,  T :  - 1000 } ,  { F :  10 ,  T :  0 } ,  { F :  10 ,  T :  1000 } ,  { F :  10 ,  T :  2000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lbls2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  {  // Timestamps for matrix selector does not depend on the evaluation time.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric[20s] @ 300" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  29 ,  T :  290000 } ,  { F :  30 ,  T :  300000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lbls1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  58 ,  T :  290000 } ,  { F :  60 ,  T :  300000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lbls2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_neg[2s] @ 0 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  2 ,  T :  - 1000 } ,  { F :  1 ,  T :  0 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblsneg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_neg[3s] @ -500 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  503 ,  T :  - 502000 } ,  { F :  502 ,  T :  - 501000 } ,  { F :  501 ,  T :  - 500000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblsneg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_ms[3ms] @ 2.345 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  2343 ,  T :  2343 } ,  { F :  2344 ,  T :  2344 } ,  { F :  2345 ,  T :  2345 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblsms , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric[100s:25s] @ 300" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  22 ,  T :  225000 } ,  { F :  25 ,  T :  250000 } ,  { F :  27 ,  T :  275000 } ,  { F :  30 ,  T :  300000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  lbls1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  44 ,  T :  225000 } ,  { F :  50 ,  T :  250000 } ,  { F :  54 ,  T :  275000 } ,  { F :  60 ,  T :  300000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  lbls2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric[100s1ms:25s] @ 300" ,  // Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  20 ,  T :  200000 } ,  { F :  22 ,  T :  225000 } ,  { F :  25 ,  T :  250000 } ,  { F :  27 ,  T :  275000 } ,  { F :  30 ,  T :  300000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lbls1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  40 ,  T :  200000 } ,  { F :  44 ,  T :  225000 } ,  { F :  50 ,  T :  250000 } ,  { F :  54 ,  T :  275000 } ,  { F :  60 ,  T :  300000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lbls2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric_neg[50s:25s] @ 0" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  26 ,  T :  - 25000 } ,  { F :  1 ,  T :  0 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  lblsneg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric_neg[50s1ms:25s] @ 0" ,  // Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  51 ,  T :  - 50000 } ,  { F :  26 ,  T :  - 25000 } ,  { F :  1 ,  T :  0 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblsneg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric_neg[50s:25s] @ -100" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  126 ,  T :  - 125000 } ,  { F :  101 ,  T :  - 100000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  lblsneg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric_neg[50s1ms:25s] @ -100" ,  // Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  151 ,  T :  - 150000 } ,  { F :  126 ,  T :  - 125000 } ,  { F :  101 ,  T :  - 100000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblsneg , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  ` metric_ms[101ms:25ms] @ 2.345 ` , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											start :  100 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  2250 ,  T :  2250 } ,  { F :  2275 ,  T :  2275 } ,  { F :  2300 ,  T :  2300 } ,  { F :  2325 ,  T :  2325 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblsms , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_topk and topk(1, sum_over_time(metric_topk[50s] @ 100)) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  50 ,  end :  80 ,  interval :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  995 ,  T :  50000 } ,  { F :  994 ,  T :  60000 } ,  { F :  993 ,  T :  70000 } ,  { F :  992 ,  T :  80000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblstopk3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_topk and topk(1, sum_over_time(metric_topk[50s] @ 5000)) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  50 ,  end :  80 ,  interval :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  10 ,  T :  50000 } ,  { F :  12 ,  T :  60000 } ,  { F :  14 ,  T :  70000 } ,  { F :  16 ,  T :  80000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblstopk2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_topk and topk(1, sum_over_time(metric_topk[50s] @ end())) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  70 ,  end :  100 ,  interval :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  993 ,  T :  70000 } ,  { F :  992 ,  T :  80000 } ,  { F :  991 ,  T :  90000 } ,  { F :  990 ,  T :  100000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblstopk3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` metric_topk and topk(1, sum_over_time(metric_topk[50s] @ start())) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  100 ,  end :  130 ,  interval :  10 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { { F :  990 ,  T :  100000 } ,  { F :  989 ,  T :  110000 } ,  { F :  988 ,  T :  120000 } ,  { F :  987 ,  T :  130000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :  lblstopk3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 21:43:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Tests for https://github.com/prometheus/prometheus/issues/8433.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// The trick here is that the query range should be > lookback delta.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  ` timestamp(metric_timestamp @ 3600) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start :  0 ,  end :  7  *  60 ,  interval :  60 , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											result :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { 
							 
						 
					
						
							
								
									
										
											 
										
											
												promql: Separate `Point` into `FPoint` and `HPoint`
In other words: Instead of having a “polymorphous” `Point` that can
either contain a float value or a histogram value, use an `FPoint` for
floats and an `HPoint` for histograms.
This seemingly small change has a _lot_ of repercussions throughout
the codebase.
The idea here is to avoid the increase in size of `Point` arrays that
happened after native histograms had been added.
The higher-level data structures (`Sample`, `Series`, etc.) are still
“polymorphous”. The same idea could be applied to them, but at each
step the trade-offs needed to be evaluated.
The idea with this change is to do the minimum necessary to get back
to pre-histogram performance for functions that do not touch
histograms. Here are comparisons for the `changes` function. The test
data doesn't include histograms yet. Ideally, there would be no change
in the benchmark result at all.
First runtime v2.39 compared to directly prior to this commit:
```
name                                                  old time/op    new time/op    delta
RangeQuery/expr=changes(a_one[1d]),steps=1-16            391µs ± 2%     542µs ± 1%  +38.58%  (p=0.000 n=9+8)
RangeQuery/expr=changes(a_one[1d]),steps=10-16           452µs ± 2%     617µs ± 2%  +36.48%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_one[1d]),steps=100-16         1.12ms ± 1%    1.36ms ± 2%  +21.58%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_one[1d]),steps=1000-16        7.83ms ± 1%    8.94ms ± 1%  +14.21%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_ten[1d]),steps=1-16           2.98ms ± 0%    3.30ms ± 1%  +10.67%  (p=0.000 n=9+10)
RangeQuery/expr=changes(a_ten[1d]),steps=10-16          3.66ms ± 1%    4.10ms ± 1%  +11.82%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_ten[1d]),steps=100-16         10.5ms ± 0%    11.8ms ± 1%  +12.50%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_ten[1d]),steps=1000-16        77.6ms ± 1%    87.4ms ± 1%  +12.63%  (p=0.000 n=9+9)
RangeQuery/expr=changes(a_hundred[1d]),steps=1-16       30.4ms ± 2%    32.8ms ± 1%   +8.01%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=10-16      37.1ms ± 2%    40.6ms ± 2%   +9.64%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=100-16      105ms ± 1%     117ms ± 1%  +11.69%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-16     783ms ± 3%     876ms ± 1%  +11.83%  (p=0.000 n=9+10)
```
And then runtime v2.39 compared to after this commit:
```
name                                                  old time/op    new time/op    delta
RangeQuery/expr=changes(a_one[1d]),steps=1-16            391µs ± 2%     547µs ± 1%  +39.84%  (p=0.000 n=9+8)
RangeQuery/expr=changes(a_one[1d]),steps=10-16           452µs ± 2%     616µs ± 2%  +36.15%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_one[1d]),steps=100-16         1.12ms ± 1%    1.26ms ± 1%  +12.20%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_one[1d]),steps=1000-16        7.83ms ± 1%    7.95ms ± 1%   +1.59%  (p=0.000 n=10+8)
RangeQuery/expr=changes(a_ten[1d]),steps=1-16           2.98ms ± 0%    3.38ms ± 2%  +13.49%  (p=0.000 n=9+10)
RangeQuery/expr=changes(a_ten[1d]),steps=10-16          3.66ms ± 1%    4.02ms ± 1%   +9.80%  (p=0.000 n=10+9)
RangeQuery/expr=changes(a_ten[1d]),steps=100-16         10.5ms ± 0%    10.8ms ± 1%   +3.08%  (p=0.000 n=8+10)
RangeQuery/expr=changes(a_ten[1d]),steps=1000-16        77.6ms ± 1%    78.1ms ± 1%   +0.58%  (p=0.035 n=9+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=1-16       30.4ms ± 2%    33.5ms ± 4%  +10.18%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=10-16      37.1ms ± 2%    40.0ms ± 1%   +7.98%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=100-16      105ms ± 1%     107ms ± 1%   +1.92%  (p=0.000 n=10+10)
RangeQuery/expr=changes(a_hundred[1d]),steps=1000-16     783ms ± 3%     775ms ± 1%   -1.02%  (p=0.019 n=9+9)
```
In summary, the runtime doesn't really improve with this change for
queries with just a few steps. For queries with many steps, this
commit essentially reinstates the old performance. This is good
because the many-step queries are the one that matter most (longest
absolute runtime).
In terms of allocations, though, this commit doesn't make a dent at
all (numbers not shown). The reason is that most of the allocations
happen in the sampleRingIterator (in the storage package), which has
to be addressed in a separate commit.
Signed-off-by: beorn7 <beorn@grafana.com>
											 
										 
										
											2022-10-28 22:58:40 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  0 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  60  *  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  2  *  60  *  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  3  *  60  *  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  4  *  60  *  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  5  *  60  *  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  6  *  60  *  1000 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ F :  3600 ,  T :  7  *  60  *  1000 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 21:43:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
											 
										
											
												PromQL engine: Delay deletion of __name__ label to the end of the query evaluation (#14477)
PromQL engine: Delay deletion of __name__ label to the end of the query evaluation
  - This change allows optionally preserving the `__name__` label via the `label_replace` and `label_join` functions, and helps prevent the dreaded "vector cannot contain metrics with the same labelset" error.
  - The implementation extends the `Series` and `Sample` structs with a boolean flag indicating whether the `__name__` label should be deleted at the end of the query evaluation.
  - The `label_replace` and `label_join` functions can still access the value of the `__name__` label, even if it has been previously marked for deletion. If  `__name__` is used as target label, it won't be dropped at the end of the query evaluation.
  - Fixes https://github.com/prometheus/prometheus/issues/11397
  - See https://github.com/jcreixell/prometheus/pull/2 for previous discussion, including the decision to create this PR and benchmark it before considering other alternatives (like refactoring `labels.Labels`).
  - See https://github.com/jcreixell/prometheus/pull/1 for an alternative implementation using a special label instead of boolean flags.
  - Note: a feature flag  `promql-delayed-name-removal` has been added as it changes the behavior of some "weird" queries (see https://github.com/prometheus/prometheus/issues/11397#issuecomment-1451998792)
Example (this always fails, as `__name__` is being dropped by `count_over_time`):
```
count_over_time({__name__!=""}[1m])
=> Error executing query: vector cannot contain metrics with the same labelset
```
Before:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=> Error executing query: vector cannot contain metrics with the same labelset
```
After:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=>
count_go_gc_cycles_automatic_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
count_go_gc_cycles_forced_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
...
```
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
---------
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
Signed-off-by: Björn Rabenstein <github@rabenste.in>
											 
										 
										
											2024-08-29 21:50:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Metric :    labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													DropName :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-03 21:43:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( c . query ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  c . interval  ==  0  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												c . interval  =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											start ,  end ,  interval  :=  time . Unix ( c . start ,  0 ) ,  time . Unix ( c . end ,  0 ) ,  time . Duration ( c . interval ) * time . Second 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											var  err  error 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											var  qry  promql . Query 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  c . end  ==  0  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												qry ,  err  =  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  nil ,  c . query ,  start ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												qry ,  err  =  engine . NewRangeQuery ( context . Background ( ) ,  storage ,  nil ,  c . query ,  start ,  end ,  interval ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-10-10 08:06:53 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  expMat ,  ok  :=  c . result . ( promql . Matrix ) ;  ok  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-24 22:53:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												sort . Sort ( expMat ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												sort . Sort ( res . Value . ( promql . Matrix ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-24 22:53:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-16 20:13:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											testutil . RequireEqual ( t ,  c . result ,  res . Value ,  "query %q failed" ,  c . query ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 17:03:36 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-10-02 19:59:19 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-02-03 21:43:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestSubquerySelector ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									type  caseType  struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Query   string 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Result  promql . Result 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Start   time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  tst  :=  range  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										loadString  string 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										cases       [ ] caseType 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											loadString :  ` load  10 s 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															metric  1  2 ` , 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cases :  [ ] caseType { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:10s]" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  2 ,  T :  10000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s]" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  1 ,  T :  5000 } ,  { F :  2 ,  T :  10000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s] offset 2s" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  1 ,  T :  5000 } ,  { F :  2 ,  T :  10000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 12 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s] offset 6s" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  1 ,  T :  0 } ,  { F :  1 ,  T :  5000 } ,  { F :  2 ,  T :  10000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 20 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s] offset 4s" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  2 ,  T :  15000 } ,  { F :  2 ,  T :  20000 } ,  { F :  2 ,  T :  25000 } ,  { F :  2 ,  T :  30000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 35 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s] offset 5s" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  2 ,  T :  15000 } ,  { F :  2 ,  T :  20000 } ,  { F :  2 ,  T :  25000 } ,  { F :  2 ,  T :  30000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 35 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s] offset 6s" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  2 ,  T :  10000 } ,  { F :  2 ,  T :  15000 } ,  { F :  2 ,  T :  20000 } ,  { F :  2 ,  T :  25000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 35 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[20s:5s] offset 7s" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  2 ,  T :  10000 } ,  { F :  2 ,  T :  15000 } ,  { F :  2 ,  T :  20000 } ,  { F :  2 ,  T :  25000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 35 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-05 08:40:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  "metric[0:10s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											loadString :  ` load  10 s 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															http_requests { job = "api-server" ,  instance = "0" ,  group = "production" } 	0 + 10 x1000  100 + 30 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															http_requests { job = "api-server" ,  instance = "1" ,  group = "production" } 	0 + 20 x1000  200 + 30 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															http_requests { job = "api-server" ,  instance = "0" ,  group = "canary" } 		0 + 30 x1000  300 + 80 x1000 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															http_requests { job = "api-server" ,  instance = "1" ,  group = "canary" } 		0 + 40 x2000 ` , 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											cases :  [ ] caseType { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{  // Normal selector.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` http_requests { group=~"pro.*",instance="0"}[30s:10s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  10000 ,  T :  10000000 } ,  { F :  100 ,  T :  10010000 } ,  { F :  130 ,  T :  10020000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "http_requests" ,  "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10020 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{  // Normal selector. Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` http_requests { group=~"pro.*",instance="0"}[30s1ms:10s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  9990 ,  T :  9990000 } ,  { F :  10000 ,  T :  10000000 } ,  { F :  100 ,  T :  10010000 } ,  { F :  130 ,  T :  10020000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "http_requests" ,  "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10020 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{  // Default step.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` http_requests { group=~"pro.*",instance="0"}[5m:] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  9840 ,  T :  9840000 } ,  { F :  9900 ,  T :  9900000 } ,  { F :  9960 ,  T :  9960000 } ,  { F :  130 ,  T :  10020000 } ,  { F :  310 ,  T :  10080000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "http_requests" ,  "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10100 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{  // Checking if high offset (>LookbackDelta) is being taken care of.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` http_requests { group=~"pro.*",instance="0"}[5m:] offset 20m ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  8640 ,  T :  8640000 } ,  { F :  8700 ,  T :  8700000 } ,  { F :  8760 ,  T :  8760000 } ,  { F :  8820 ,  T :  8820000 } ,  { F :  8880 ,  T :  8880000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . FromStrings ( "__name__" ,  "http_requests" ,  "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 10100 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` rate(http_requests[1m])[15s:5s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  3 ,  T :  7990000 } ,  { F :  3 ,  T :  7995000 } ,  { F :  3 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "canary" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  4 ,  T :  7990000 } ,  { F :  4 ,  T :  7995000 } ,  { F :  4 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "1" ,  "group" ,  "canary" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  1 ,  T :  7990000 } ,  { F :  1 ,  T :  7995000 } ,  { F :  1 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  2 ,  T :  7990000 } ,  { F :  2 ,  T :  7995000 } ,  { F :  2 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "1" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 8000 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` rate(http_requests[1m])[15s1ms:5s] ` ,  // Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
									
										
											 
										
											
												PromQL engine: Delay deletion of __name__ label to the end of the query evaluation (#14477)
PromQL engine: Delay deletion of __name__ label to the end of the query evaluation
  - This change allows optionally preserving the `__name__` label via the `label_replace` and `label_join` functions, and helps prevent the dreaded "vector cannot contain metrics with the same labelset" error.
  - The implementation extends the `Series` and `Sample` structs with a boolean flag indicating whether the `__name__` label should be deleted at the end of the query evaluation.
  - The `label_replace` and `label_join` functions can still access the value of the `__name__` label, even if it has been previously marked for deletion. If  `__name__` is used as target label, it won't be dropped at the end of the query evaluation.
  - Fixes https://github.com/prometheus/prometheus/issues/11397
  - See https://github.com/jcreixell/prometheus/pull/2 for previous discussion, including the decision to create this PR and benchmark it before considering other alternatives (like refactoring `labels.Labels`).
  - See https://github.com/jcreixell/prometheus/pull/1 for an alternative implementation using a special label instead of boolean flags.
  - Note: a feature flag  `promql-delayed-name-removal` has been added as it changes the behavior of some "weird" queries (see https://github.com/prometheus/prometheus/issues/11397#issuecomment-1451998792)
Example (this always fails, as `__name__` is being dropped by `count_over_time`):
```
count_over_time({__name__!=""}[1m])
=> Error executing query: vector cannot contain metrics with the same labelset
```
Before:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=> Error executing query: vector cannot contain metrics with the same labelset
```
After:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=>
count_go_gc_cycles_automatic_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
count_go_gc_cycles_forced_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
...
```
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
---------
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
Signed-off-by: Björn Rabenstein <github@rabenste.in>
											 
										 
										
											2024-08-29 21:50:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  3 ,  T :  7985000 } ,  { F :  3 ,  T :  7990000 } ,  { F :  3 ,  T :  7995000 } ,  { F :  3 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "canary" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
									
										
											 
										
											
												PromQL engine: Delay deletion of __name__ label to the end of the query evaluation (#14477)
PromQL engine: Delay deletion of __name__ label to the end of the query evaluation
  - This change allows optionally preserving the `__name__` label via the `label_replace` and `label_join` functions, and helps prevent the dreaded "vector cannot contain metrics with the same labelset" error.
  - The implementation extends the `Series` and `Sample` structs with a boolean flag indicating whether the `__name__` label should be deleted at the end of the query evaluation.
  - The `label_replace` and `label_join` functions can still access the value of the `__name__` label, even if it has been previously marked for deletion. If  `__name__` is used as target label, it won't be dropped at the end of the query evaluation.
  - Fixes https://github.com/prometheus/prometheus/issues/11397
  - See https://github.com/jcreixell/prometheus/pull/2 for previous discussion, including the decision to create this PR and benchmark it before considering other alternatives (like refactoring `labels.Labels`).
  - See https://github.com/jcreixell/prometheus/pull/1 for an alternative implementation using a special label instead of boolean flags.
  - Note: a feature flag  `promql-delayed-name-removal` has been added as it changes the behavior of some "weird" queries (see https://github.com/prometheus/prometheus/issues/11397#issuecomment-1451998792)
Example (this always fails, as `__name__` is being dropped by `count_over_time`):
```
count_over_time({__name__!=""}[1m])
=> Error executing query: vector cannot contain metrics with the same labelset
```
Before:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=> Error executing query: vector cannot contain metrics with the same labelset
```
After:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=>
count_go_gc_cycles_automatic_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
count_go_gc_cycles_forced_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
...
```
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
---------
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
Signed-off-by: Björn Rabenstein <github@rabenste.in>
											 
										 
										
											2024-08-29 21:50:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  4 ,  T :  7985000 } ,  { F :  4 ,  T :  7990000 } ,  { F :  4 ,  T :  7995000 } ,  { F :  4 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "1" ,  "group" ,  "canary" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
									
										
											 
										
											
												PromQL engine: Delay deletion of __name__ label to the end of the query evaluation (#14477)
PromQL engine: Delay deletion of __name__ label to the end of the query evaluation
  - This change allows optionally preserving the `__name__` label via the `label_replace` and `label_join` functions, and helps prevent the dreaded "vector cannot contain metrics with the same labelset" error.
  - The implementation extends the `Series` and `Sample` structs with a boolean flag indicating whether the `__name__` label should be deleted at the end of the query evaluation.
  - The `label_replace` and `label_join` functions can still access the value of the `__name__` label, even if it has been previously marked for deletion. If  `__name__` is used as target label, it won't be dropped at the end of the query evaluation.
  - Fixes https://github.com/prometheus/prometheus/issues/11397
  - See https://github.com/jcreixell/prometheus/pull/2 for previous discussion, including the decision to create this PR and benchmark it before considering other alternatives (like refactoring `labels.Labels`).
  - See https://github.com/jcreixell/prometheus/pull/1 for an alternative implementation using a special label instead of boolean flags.
  - Note: a feature flag  `promql-delayed-name-removal` has been added as it changes the behavior of some "weird" queries (see https://github.com/prometheus/prometheus/issues/11397#issuecomment-1451998792)
Example (this always fails, as `__name__` is being dropped by `count_over_time`):
```
count_over_time({__name__!=""}[1m])
=> Error executing query: vector cannot contain metrics with the same labelset
```
Before:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=> Error executing query: vector cannot contain metrics with the same labelset
```
After:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=>
count_go_gc_cycles_automatic_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
count_go_gc_cycles_forced_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
...
```
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
---------
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
Signed-off-by: Björn Rabenstein <github@rabenste.in>
											 
										 
										
											2024-08-29 21:50:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  1 ,  T :  7985000 } ,  { F :  1 ,  T :  7990000 } ,  { F :  1 ,  T :  7995000 } ,  { F :  1 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "0" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
									
										
											 
										
											
												PromQL engine: Delay deletion of __name__ label to the end of the query evaluation (#14477)
PromQL engine: Delay deletion of __name__ label to the end of the query evaluation
  - This change allows optionally preserving the `__name__` label via the `label_replace` and `label_join` functions, and helps prevent the dreaded "vector cannot contain metrics with the same labelset" error.
  - The implementation extends the `Series` and `Sample` structs with a boolean flag indicating whether the `__name__` label should be deleted at the end of the query evaluation.
  - The `label_replace` and `label_join` functions can still access the value of the `__name__` label, even if it has been previously marked for deletion. If  `__name__` is used as target label, it won't be dropped at the end of the query evaluation.
  - Fixes https://github.com/prometheus/prometheus/issues/11397
  - See https://github.com/jcreixell/prometheus/pull/2 for previous discussion, including the decision to create this PR and benchmark it before considering other alternatives (like refactoring `labels.Labels`).
  - See https://github.com/jcreixell/prometheus/pull/1 for an alternative implementation using a special label instead of boolean flags.
  - Note: a feature flag  `promql-delayed-name-removal` has been added as it changes the behavior of some "weird" queries (see https://github.com/prometheus/prometheus/issues/11397#issuecomment-1451998792)
Example (this always fails, as `__name__` is being dropped by `count_over_time`):
```
count_over_time({__name__!=""}[1m])
=> Error executing query: vector cannot contain metrics with the same labelset
```
Before:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=> Error executing query: vector cannot contain metrics with the same labelset
```
After:
```
label_replace(count_over_time({__name__!=""}[1m]), "__name__", "count_$1", "__name__", "(.+)")
=>
count_go_gc_cycles_automatic_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
count_go_gc_cycles_forced_gc_cycles_total{instance="localhost:9090", job="prometheus"} 1
...
```
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
---------
Signed-off-by: Jorge Creixell <jcreixell@gmail.com>
Signed-off-by: Björn Rabenstein <github@rabenste.in>
											 
										 
										
											2024-08-29 21:50:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Floats :    [ ] promql . FPoint { { F :  2 ,  T :  7985000 } ,  { F :  2 ,  T :  7990000 } ,  { F :  2 ,  T :  7995000 } ,  { F :  2 ,  T :  8000000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :    labels . FromStrings ( "job" ,  "api-server" ,  "instance" ,  "1" ,  "group" ,  "production" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																DropName :  true , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 8000 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` sum(http_requests { group=~"pro.*"})[30s:10s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  300 ,  T :  100000 } ,  { F :  330 ,  T :  110000 } ,  { F :  360 ,  T :  120000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 120 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` sum(http_requests { group=~"pro.*"})[30s:10s] ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  300 ,  T :  100000 } ,  { F :  330 ,  T :  110000 } ,  { F :  360 ,  T :  120000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 121 ,  0 ) ,  // 1s later doesn't change the result.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` sum(http_requests { group=~"pro.*"})[30s1ms:10s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  270 ,  T :  90000 } ,  { F :  300 ,  T :  100000 } ,  { F :  330 ,  T :  110000 } ,  { F :  360 ,  T :  120000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 00:23:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 120 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` sum(http_requests)[40s:10s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  900 ,  T :  90000 } ,  { F :  1000 ,  T :  100000 } ,  { F :  1100 ,  T :  110000 } ,  { F :  1200 ,  T :  120000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 120 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` sum(http_requests)[40s1ms:10s] ` ,  // Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  800 ,  T :  80000 } ,  { F :  900 ,  T :  90000 } ,  { F :  1000 ,  T :  100000 } ,  { F :  1100 ,  T :  110000 } ,  { F :  1200 ,  T :  120000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 00:23:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 120 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` (sum(http_requests { group=~"p.*"})+sum(http_requests { group=~"c.*"}))[20s:5s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-11-21 01:18:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  1000 ,  T :  105000 } ,  { F :  1100 ,  T :  110000 } ,  { F :  1100 ,  T :  115000 } ,  { F :  1200 ,  T :  120000 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 120 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													// Add 1ms to the range to see the legacy behavior of the previous test.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Query :  ` (sum(http_requests { group=~"p.*"})+sum(http_requests { group=~"c.*"}))[20s1ms:5s] ` , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Result :  promql . Result { 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															promql . Series { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Floats :  [ ] promql . FPoint { { F :  1000 ,  T :  100000 } ,  { F :  1000 ,  T :  105000 } ,  { F :  1100 ,  T :  110000 } ,  { F :  1100 ,  T :  115000 } ,  { F :  1200 ,  T :  120000 } } , 
							 
						 
					
						
							
								
									
										
										
										
											2022-07-22 00:23:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Metric :  labels . EmptyLabels ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Start :  time . Unix ( 120 ,  0 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									}  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-22 21:39:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										t . Run ( "" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											storage  :=  promqltest . LoadedStorage ( t ,  tst . loadString ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-22 21:39:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  _ ,  c  :=  range  tst . cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												t . Run ( c . Query ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													qry ,  err  :=  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  nil ,  c . Query ,  c . Start ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-22 21:39:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													require . Equal ( t ,  c . Result . Err ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													mat  :=  res . Value . ( promql . Matrix ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-22 21:39:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													sort . Sort ( mat ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-04-16 20:13:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													testutil . RequireEqual ( t ,  c . Result . Value ,  mat ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-22 21:39:51 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-12-22 21:47:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  getLogLines ( t  * testing . T ,  name  string )  [ ] string  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									content ,  err  :=  os . ReadFile ( name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									lines  :=  strings . Split ( string ( content ) ,  "\n" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  i  :=  len ( lines )  -  1 ;  i  >=  0 ;  i --  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  lines [ i ]  ==  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											lines  =  append ( lines [ : i ] ,  lines [ i + 1 : ] ... ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									return  lines 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestQueryLogger_basic ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queryExec  :=  func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										defer  cancelCtx ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										query  :=  engine . NewTestQuery ( func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											return  contextDone ( ctx ,  "test statement execution" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										res  :=  query . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// promql.Query works without query log initialized.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryExec ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tmpDir  :=  t . TempDir ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ql1File  :=  filepath . Join ( tmpDir ,  "query1.log" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f1 ,  err  :=  logging . NewJSONFileLogger ( ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine . SetQueryLogger ( f1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queryExec ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logLines  :=  getLogLines ( t ,  ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Contains ( t ,  logLines [ 0 ] ,  "params" ,  map [ string ] interface { } { "query" :  "test statement" } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Len ( t ,  logLines ,  1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									l  :=  len ( logLines ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryExec ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logLines  =  getLogLines ( t ,  ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									l2  :=  len ( logLines ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Equal ( t ,  l2 ,  2 * l ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Test that we close the query logger when unsetting it. The following
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// attempt to close the file should error.
 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine . SetQueryLogger ( nil ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  =  f1 . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . ErrorContains ( t ,  err ,  "file already closed" ,  "expected f1 to be closed, got open" ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryExec ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Test that we close the query logger when swapping.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ql2File  :=  filepath . Join ( tmpDir ,  "query2.log" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f2 ,  err  :=  logging . NewJSONFileLogger ( ql2File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ql3File  :=  filepath . Join ( tmpDir ,  "query3.log" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f3 ,  err  :=  logging . NewJSONFileLogger ( ql3File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine . SetQueryLogger ( f2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queryExec ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									engine . SetQueryLogger ( f3 ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  =  f2 . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . ErrorContains ( t ,  err ,  "file already closed" ,  "expected f2 to be closed, got open" ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									queryExec ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									err  =  f3 . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestQueryLogger_fields ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tmpDir  :=  t . TempDir ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ql1File  :=  filepath . Join ( tmpDir ,  "query1.log" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f1 ,  err  :=  logging . NewJSONFileLogger ( ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  f1 . Close ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine . SetQueryLogger ( f1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ctx  =  promql . NewOriginContext ( ctx ,  map [ string ] interface { } { "foo" :  "bar" } ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									defer  cancelCtx ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query  :=  engine . NewTestQuery ( func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  contextDone ( ctx ,  "test statement execution" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									res  :=  query . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logLines  :=  getLogLines ( t ,  ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Contains ( t ,  logLines [ 0 ] ,  "foo" ,  "bar" ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestQueryLogger_error ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-29 04:38:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										Logger :      nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :         nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :  10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :     10  *  time . Second , 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									tmpDir  :=  t . TempDir ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ql1File  :=  filepath . Join ( tmpDir ,  "query1.log" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									f1 ,  err  :=  logging . NewJSONFileLogger ( ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  f1 . Close ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine . SetQueryLogger ( f1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ctx ,  cancelCtx  :=  context . WithCancel ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									ctx  =  promql . NewOriginContext ( ctx ,  map [ string ] interface { } { "foo" :  "bar" } ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									defer  cancelCtx ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testErr  :=  errors . New ( "failure" ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									query  :=  engine . NewTestQuery ( func ( ctx  context . Context )  error  { 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return  testErr 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									res  :=  query . Exec ( ctx ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 17:43:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . Error ( t ,  res . Err ,  "query should have failed" ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-12-02 22:21:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									logLines  :=  getLogLines ( t ,  ql1File ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Contains ( t ,  logLines [ 0 ] ,  "error" ,  testErr ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Contains ( t ,  logLines [ 0 ] ,  "params" ,  map [ string ] interface { } { "query" :  "test statement" } ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-08 21:28:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestPreprocessAndWrapWithStepInvariantExpr ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									startTime  :=  time . Unix ( 1000 ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									endTime  :=  time . Unix ( 9999 ,  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-10-22 16:06:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									testCases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										input       string       // The input to be parsed.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected    parser . Expr  // The expected expression AST.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										outputTest  bool 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											input :  "123.4567" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . NumberLiteral { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Val :       123.4567 , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { Start :  0 ,  End :  8 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` "foo" ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . StringLiteral { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Val :       "foo" , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { Start :  0 ,  End :  5 } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "foo * bar" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Op :  parser . MUL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												LHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												RHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "bar" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "bar" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    9 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												VectorMatching :  & parser . VectorMatching { Card :  parser . CardOneToOne } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "foo * bar @ 10" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Op :  parser . MUL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												LHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												RHS :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "bar" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "bar" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    14 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												VectorMatching :  & parser . VectorMatching { Card :  parser . CardOneToOne } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "foo @ 20 * bar @ 10" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Op :  parser . MUL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :  makeInt64Pointer ( 20000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													RHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "bar" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "bar" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    19 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													VectorMatching :  & parser . VectorMatching { Card :  parser . CardOneToOne } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "test[5s]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . MatrixSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												VectorSelector :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "test" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Range :   5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EndPos :  8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` test { a="b"}[5y] @ 1603774699 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . MatrixSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													VectorSelector :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :       "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :  makeInt64Pointer ( 1603774699000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "a" ,  "b" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "test" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :   5  *  365  *  24  *  time . Hour , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :  28 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "sum by (foo)(some_metric)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    24 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Grouping :  [ ] string { "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													End :    25 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "sum by (foo)(some_metric @ 10)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    29 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Grouping :  [ ] string { "foo" } , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    30 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "sum(some_metric1 @ 10) + sum(some_metric2 @ 20)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Op :              parser . ADD , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													VectorMatching :  & parser . VectorMatching { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LHS :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Name :  "some_metric1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric1" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    21 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    22 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													RHS :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Name :  "some_metric2" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric2" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  29 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    46 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Timestamp :  makeInt64Pointer ( 20000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  25 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    47 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "some_metric and topk(5, rate(some_metric[1m] @ 20))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Op :  parser . LAND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												VectorMatching :  & parser . VectorMatching { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Card :  parser . CardManyToMany , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												LHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												RHS :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Op :  parser . TOPK , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Expr :  & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Func :  parser . MustGetFunction ( "rate" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Args :  parser . Expressions { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																& parser . MatrixSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	VectorSelector :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																		PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																			Start :  29 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			End :    40 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		Timestamp :  makeInt64Pointer ( 20000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	Range :   1  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	EndPos :  49 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  24 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    50 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Param :  & parser . NumberLiteral { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Val :  5 , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  21 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    22 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  16 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    51 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "time()" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Func :  parser . MustGetFunction ( "time" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Args :  parser . Expressions { } , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													End :    6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` foo { bar="baz"}[10m:6s] ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "bar" ,  "baz" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    14 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Range :   10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Step :    6  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EndPos :  22 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` foo { bar="baz"}[10m:6s] @ 10 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "bar" ,  "baz" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    14 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :      10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Step :       6  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :     27 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{  // Even though the subquery is step invariant, the inside is also wrapped separately.
 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` sum(foo { bar="baz"} @ 20)[10m:6s] @ 10 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Expr :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	parser . MustLabelMatcher ( labels . MatchEqual ,  "bar" ,  "baz" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	Start :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	End :    23 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Timestamp :  makeInt64Pointer ( 20000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    24 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :      10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Step :       6  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :     37 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` min_over_time(rate(foo { bar="baz"}[2s])[5m:] @ 1603775091)[4m:3s] ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Func :  parser . MustGetFunction ( "min_over_time" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Args :  parser . Expressions { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															& parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Expr :  & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	Func :  parser . MustGetFunction ( "rate" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	Args :  parser . Expressions { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		& parser . MatrixSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			VectorSelector :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																				Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																				LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																					parser . MustLabelMatcher ( labels . MatchEqual ,  "bar" ,  "baz" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																					parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																				} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																				PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																					Start :  19 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																					End :    33 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																				} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			Range :   2  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			EndPos :  37 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																		Start :  14 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		End :    38 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Range :      5  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Timestamp :  makeInt64Pointer ( 1603775091000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																EndPos :     56 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    57 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Range :   4  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Step :    3  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EndPos :  64 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` some_metric @ 123 offset 1m [10m:5s] ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    27 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :       makeInt64Pointer ( 123000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														OriginalOffset :  1  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Range :   10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Step :    5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												EndPos :  36 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` some_metric[10m:5s] offset 1m @ 123 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :       makeInt64Pointer ( 123000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													OriginalOffset :  1  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :           10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Step :            5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :          35 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` (foo + bar { nm="val"} @ 1234)[5m:] @ 1603775019 ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . ParenExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Expr :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Op :  parser . ADD , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															VectorMatching :  & parser . VectorMatching { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Card :  parser . CardOneToOne , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	Start :  1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	End :    4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															RHS :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	Name :  "bar" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		parser . MustLabelMatcher ( labels . MatchEqual ,  "nm" ,  "val" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "bar" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	Timestamp :  makeInt64Pointer ( 1234000 ) , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																		Start :  7 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		End :    27 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    28 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :      5  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :  makeInt64Pointer ( 1603775019000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :     46 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "abs(abs(metric @ 10))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Func :  & parser . Function { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :        "abs" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ArgTypes :    [ ] parser . ValueType { parser . ValueTypeVector } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														ReturnType :  parser . ValueTypeVector , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Args :  parser . Expressions { & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Func :  & parser . Function { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Name :        "abs" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															ArgTypes :    [ ] parser . ValueType { parser . ValueTypeVector } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															ReturnType :  parser . ValueTypeVector , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Args :  parser . Expressions { & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Name :  "metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    19 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} } , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    20 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} } , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    21 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  "sum(sum(some_metric1 @ 10) + sum(some_metric2 @ 20))" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Op :              parser . ADD , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														VectorMatching :  & parser . VectorMatching { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LHS :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Name :  "some_metric1" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric1" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	Start :  8 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	End :    25 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Timestamp :  makeInt64Pointer ( 10000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    26 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														RHS :  & parser . AggregateExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Op :  parser . SUM , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Name :  "some_metric2" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric2" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	Start :  33 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	End :    50 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Timestamp :  makeInt64Pointer ( 20000 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  29 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    52 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    52 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` foo @ start() ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    13 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :   makeInt64Pointer ( timestamp . FromTime ( startTime ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													StartOrEnd :  parser . START , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` foo @ end() ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :  "foo" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "foo" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														End :    11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :   makeInt64Pointer ( timestamp . FromTime ( endTime ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													StartOrEnd :  parser . END , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` test[5y] @ start() ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . MatrixSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													VectorSelector :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :        "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :   makeInt64Pointer ( timestamp . FromTime ( startTime ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														StartOrEnd :  parser . START , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "test" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :   5  *  365  *  24  *  time . Hour , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :  18 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` test[5y] @ end() ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . MatrixSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													VectorSelector :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :        "test" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Timestamp :   makeInt64Pointer ( timestamp . FromTime ( endTime ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														StartOrEnd :  parser . END , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "test" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :   5  *  365  *  24  *  time . Hour , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :  16 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` some_metric[10m:5s] @ start() ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :   makeInt64Pointer ( timestamp . FromTime ( startTime ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													StartOrEnd :  parser . START , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :       10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Step :        5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :      29 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											input :  ` some_metric[10m:5s] @ end() ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Expr :  & parser . SubqueryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Expr :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
														PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															End :    11 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Timestamp :   makeInt64Pointer ( timestamp . FromTime ( endTime ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													StartOrEnd :  parser . END , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Range :       10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Step :        5  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													EndPos :      27 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											input :       ` floor(some_metric / (3 * 1024)) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											outputTest :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  & parser . Call { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Func :  & parser . Function { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Name :        "floor" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ArgTypes :    [ ] parser . ValueType { parser . ValueTypeVector } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													ReturnType :  parser . ValueTypeVector , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												Args :  parser . Expressions { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													& parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														Op :  parser . DIV , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														LHS :  & parser . VectorSelector { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Name :  "some_metric" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															LabelMatchers :  [ ] * labels . Matcher { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																parser . MustLabelMatcher ( labels . MatchEqual ,  "__name__" ,  "some_metric" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																Start :  6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																End :    17 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														RHS :  & parser . StepInvariantExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															Expr :  & parser . ParenExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																Expr :  & parser . BinaryExpr { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	Op :  parser . MUL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	LHS :  & parser . NumberLiteral { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		Val :  3 , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																		PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																			Start :  21 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			End :    22 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	RHS :  & parser . NumberLiteral { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		Val :  1024 , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																		PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																			Start :  25 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																			End :    29 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	Start :  20 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																	End :    30 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
															} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2023-09-15 00:57:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												PosRange :  posrange . PositionRange { 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													Start :  0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													End :    31 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  test  :=  range  testCases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( test . input ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr ,  err  :=  parser . ParseExpr ( test . input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											expr  =  promql . PreprocessExpr ( expr ,  startTime ,  endTime ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-11-10 22:46:24 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  test . outputTest  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												require . Equal ( t ,  test . input ,  expr . String ( ) ,  "error on input '%s'" ,  test . input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . Equal ( t ,  test . expected ,  expr ,  "error on input '%s'" ,  test . input ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestEngineOptsValidation ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										opts      promql . EngineOpts 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										query     string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										fail      bool 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										expError  error 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric @ 100" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(metric[1m] @ 100)" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(metric[1h:1m] @ 100)" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric @ start()" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(metric[1m] @ start())" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(metric[1h:1m] @ start())" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric @ end()" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(metric[1m] @ end())" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "rate(metric[1h:1m] @ end())" ,  fail :  true ,  expError :  promql . ErrValidationAtModifierDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  true } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  "metric @ 100" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  true } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  "rate(metric[1m] @ start())" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  true } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  "rate(metric[1h:1m] @ end())" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-22 02:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableNegativeOffset :  false } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query :  "metric offset -1s" ,  fail :  true ,  expError :  promql . ErrValidationNegativeOffsetDisabled , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-22 02:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableNegativeOffset :  true } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-22 02:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  "metric offset -1s" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  true ,  EnableNegativeOffset :  true } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-22 02:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  "metric @ 100 offset -2m" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ,  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts :   promql . EngineOpts { EnableAtModifier :  true ,  EnableNegativeOffset :  true } , 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-22 02:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											query :  "metric offset -2m @ 100" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-14 19:28:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										eng  :=  promqltest . NewTestEngineWithOpts ( t ,  c . opts ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										_ ,  err1  :=  eng . NewInstantQuery ( context . Background ( ) ,  nil ,  nil ,  c . query ,  time . Unix ( 10 ,  0 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										_ ,  err2  :=  eng . NewRangeQuery ( context . Background ( ) ,  nil ,  nil ,  c . query ,  time . Unix ( 0 ,  0 ) ,  time . Unix ( 10 ,  0 ) ,  time . Second ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  c . fail  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-02-10 00:03:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . Equal ( t ,  c . expError ,  err1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . Equal ( t ,  c . expError ,  err2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
									
										
										
										
											2023-12-07 19:35:01 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-20 18:57:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2021-04-27 06:43:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-08 20:39:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestEngine_Close ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Run ( "nil engine" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										var  ng  * promql . Engine 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  ng . Close ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Run ( "non-nil engine" ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ng  :=  promql . NewEngine ( promql . EngineOpts { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Logger :                    nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Reg :                       nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											MaxSamples :                0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Timeout :                   100  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											NoStepSubqueryIntervalFn :  nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EnableAtModifier :          true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EnableNegativeOffset :      true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EnablePerStepStats :        false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											LookbackDelta :             0 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											EnableDelayedNameRemoval :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  ng . Close ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 08:43:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestInstantQueryWithRangeVectorSelector ( t  * testing . T )  {  
						 
					
						
							
								
									
										
										
										
											2024-06-05 16:50:41 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 08:43:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									baseT  :=  timestamp . Time ( 0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									storage  :=  promqltest . LoadedStorage ( t ,  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										load  1 m 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											some_metric { env = "1" }  0 + 1 x4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											some_metric { env = "2" }  0 + 2 x4 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-05 08:45:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											some_metric { env = "3" }  { { count : 0 } } + { { count : 1 } } x4 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 08:43:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											some_metric_with_stale_marker  0  1  stale  3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									` ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  {  require . NoError ( t ,  storage . Close ( ) )  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testCases  :=  map [ string ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expr      string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expected  promql . Matrix 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ts        time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"matches series with points in range" :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											expr :  "some_metric[2m]" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 08:43:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :    baseT . Add ( 2  *  time . Minute ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "some_metric" ,  "env" ,  "1" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( time . Minute ) ) ,  F :  1 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( 2  *  time . Minute ) ) ,  F :  2 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "some_metric" ,  "env" ,  "2" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( time . Minute ) ) ,  F :  2 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( 2  *  time . Minute ) ) ,  F :  4 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-05 08:45:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "some_metric" ,  "env" ,  "3" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Histograms :  [ ] promql . HPoint { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( time . Minute ) ) ,  H :  & histogram . FloatHistogram { Count :  1 ,  CounterResetHint :  histogram . NotCounterReset } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( 2  *  time . Minute ) ) ,  H :  & histogram . FloatHistogram { Count :  2 ,  CounterResetHint :  histogram . NotCounterReset } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 08:43:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"matches no series" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :      "some_nonexistent_metric[1m]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ts :        baseT , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  promql . Matrix { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"no samples in range" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :      "some_metric[1m]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ts :        baseT . Add ( 20  *  time . Minute ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  promql . Matrix { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"metric with stale marker" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :  "some_metric_with_stale_marker[3m]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ts :    baseT . Add ( 3  *  time . Minute ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  promql . Matrix { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Metric :  labels . FromStrings ( "__name__" ,  "some_metric_with_stale_marker" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													Floats :  [ ] promql . FPoint { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( time . Minute ) ) ,  F :  1 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
														{ T :  timestamp . FromTime ( baseT . Add ( 3  *  time . Minute ) ) ,  F :  3 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2025-02-05 08:40:54 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										"matches series but range is 0" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :      "some_metric[0]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											ts :        baseT . Add ( 2  *  time . Minute ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expected :  promql . Matrix { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-13 08:43:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  name ,  testCase  :=  range  testCases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( name ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											q ,  err  :=  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  nil ,  testCase . expr ,  testCase . ts ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											defer  q . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											res  :=  q . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											testutil . RequireEqual ( t ,  testCase . expected ,  res . Value ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestQueryLookbackDelta ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										load  =  ` load  5 m 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								metric  0  1  2  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										query            =  "metric" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										lastDatapointTs  =  time . Unix ( 600 ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									cases  :=  [ ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										name                           string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										ts                             time . Time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										engineLookback ,  queryLookback  time . Duration 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expectSamples                  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :           "default lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :             lastDatapointTs . Add ( defaultLookbackDelta  -  time . Millisecond ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											expectSamples :  true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :           "outside default lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :             lastDatapointTs . Add ( defaultLookbackDelta ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											expectSamples :  false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :            "custom engine lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :              lastDatapointTs . Add ( 10 * time . Minute  -  time . Millisecond ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engineLookback :  10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectSamples :   true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :            "outside custom engine lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :              lastDatapointTs . Add ( 10  *  time . Minute ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engineLookback :  10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectSamples :   false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :            "custom query lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :              lastDatapointTs . Add ( 20 * time . Minute  -  time . Millisecond ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engineLookback :  10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											queryLookback :   20  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectSamples :   true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :            "outside custom query lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :              lastDatapointTs . Add ( 20  *  time . Minute ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engineLookback :  10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											queryLookback :   20  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectSamples :   false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											name :            "negative custom query lookback delta" , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 00:46:52 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											ts :              lastDatapointTs . Add ( 20 * time . Minute  -  time . Millisecond ) , 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engineLookback :  - 10  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											queryLookback :   20  *  time . Minute , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectSamples :   true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  cases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										c  :=  c 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( c . name ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-08 00:14:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											engine  :=  promqltest . NewTestEngine ( t ,  false ,  c . engineLookback ,  promqltest . DefaultMaxSamplesPerQuery ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											storage  :=  promqltest . LoadedStorage ( t ,  load ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:13:23 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											opts  :=  promql . NewPrometheusQueryOpts ( false ,  c . queryLookback ) 
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											qry ,  err  :=  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  opts ,  query ,  c . ts ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-08-19 02:48:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											vec ,  ok  :=  res . Value . ( promql . Vector ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-08-02 17:15:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											require . True ( t ,  ok ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  c . expectSamples  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												require . NotEmpty ( t ,  vec ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												require . Empty ( t ,  vec ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-04-29 20:14:18 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  makeInt64Pointer ( val  int64 )  * int64  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									valp  :=  new ( int64 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									* valp  =  val 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  valp 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-08-07 02:48:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestHistogramCopyFromIteratorRegression ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Loading the following histograms creates two chunks because there's a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// counter reset. Not only the counter is lower in the last histogram
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// but also there's missing buckets.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This in turns means that chunk iterators will have different spans.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									load  :=  ` load  1 m 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								histogram  { { sum : 4  count : 4  buckets : [ 2  2 ] } }  { { sum : 6  count : 6  buckets : [ 3  3 ] } }  { { sum : 1  count : 1  buckets : [ 1 ] } }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									storage  :=  promqltest . LoadedStorage ( t ,  load ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									t . Cleanup ( func ( )  {  storage . Close ( )  } ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-26 17:54:55 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngine ( t ,  false ,  0 ,  promqltest . DefaultMaxSamplesPerQuery ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 02:48:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									verify  :=  func ( t  * testing . T ,  qry  promql . Query ,  expected  [ ] histogram . FloatHistogram )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										res  :=  qry . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										m ,  ok  :=  res . Value . ( promql . Matrix ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . True ( t ,  ok ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . Len ( t ,  m ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										series  :=  m [ 0 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . Empty ( t ,  series . Floats ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										require . Len ( t ,  series . Histograms ,  len ( expected ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  i ,  e  :=  range  expected  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											series . Histograms [ i ] . H . CounterResetHint  =  histogram . UnknownCounterReset  // Don't care.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . Equal ( t ,  & e ,  series . Histograms [ i ] . H ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 17:14:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qry ,  err  :=  engine . NewRangeQuery ( context . Background ( ) ,  storage ,  nil ,  "increase(histogram[90s])" ,  time . Unix ( 0 ,  0 ) ,  time . Unix ( 0 ,  0 ) . Add ( 60 * time . Second ) ,  time . Minute ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 02:48:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									verify ( t ,  qry ,  [ ] histogram . FloatHistogram { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 17:14:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											Count :            3 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Sum :              3 ,                                         // Increase from 4 to 6 is 2. Interpolation adds 1.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 02:48:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PositiveSpans :    [ ] histogram . Span { { Offset :  0 ,  Length :  2 } } ,  // Two buckets changed between the first and second histogram.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 17:14:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											PositiveBuckets :  [ ] float64 { 1.5 ,  1.5 } ,                       // Increase from 2 to 3 is 1 in both buckets. Interpolation adds 0.5.
 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 02:48:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 17:14:09 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									qry ,  err  =  engine . NewInstantQuery ( context . Background ( ) ,  storage ,  nil ,  "histogram[61s]" ,  time . Unix ( 0 ,  0 ) . Add ( 2 * time . Minute ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-07 02:48:16 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									verify ( t ,  qry ,  [ ] histogram . FloatHistogram { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Count :            6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Sum :              6 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											PositiveSpans :    [ ] histogram . Span { { Offset :  0 ,  Length :  2 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											PositiveBuckets :  [ ] float64 { 3 ,  3 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Count :            1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											Sum :              1 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											PositiveSpans :    [ ] histogram . Span { { Offset :  0 ,  Length :  1 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											PositiveBuckets :  [ ] float64 { 1 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:21:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestRateAnnotations ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testCases  :=  map [ string ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										data                        string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expr                        string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expectedWarningAnnotations  [ ] string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expectedInfoAnnotations     [ ] string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"info annotation when two samples are selected" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												series  1  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :                        "rate(series[1m1s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :  [ ] string { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												` PromQL info: metric might not be a counter, name does not end in _total/_sum/_count/_bucket: "series" (1:6) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"no info annotations when no samples" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												series 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :                        "rate(series[1m1s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :     [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"no info annotations when selecting one sample" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												series  1  2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :                        "rate(series[10s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :     [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"no info annotations when no samples due to mixed data types" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												series { label = "a" }  1  { { schema : 1  sum : 15  count : 10  buckets : [ 1  2  3 ] } } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :  "rate(series[1m1s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												` PromQL warning: encountered a mix of histograms and floats for metric name "series" (1:6) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"no info annotations when selecting two native histograms" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												series { label = "a" }  { { schema : 1  sum : 10  count : 5  buckets : [ 1  2  3 ] } }  { { schema : 1  sum : 15  count : 10  buckets : [ 1  2  3 ] } } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :                        "rate(series[1m1s])" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :     [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  name ,  testCase  :=  range  testCases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( name ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											store  :=  promqltest . LoadedStorage ( t ,  "load 1m\n" + strings . TrimSpace ( testCase . data ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Cleanup ( func ( )  {  _  =  store . Close ( )  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query ,  err  :=  engine . NewInstantQuery ( context . Background ( ) ,  store ,  nil ,  testCase . expr ,  timestamp . Time ( 0 ) . Add ( 1 * time . Minute ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Cleanup ( query . Close ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											res  :=  query . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											warnings ,  infos  :=  res . Warnings . AsStrings ( testCase . expr ,  0 ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											testutil . RequireEqual ( t ,  testCase . expectedWarningAnnotations ,  warnings ) 
							 
						 
					
						
							
								
									
										
										
										
											2025-01-22 21:35:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											testutil . RequireEqual ( t ,  testCase . expectedInfoAnnotations ,  infos ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestHistogramQuantileAnnotations ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									testCases  :=  map [ string ] struct  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										data                        string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expr                        string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expectedWarningAnnotations  [ ] string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										expectedInfoAnnotations     [ ] string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"info annotation for nonmonotonic buckets" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nonmonotonic_bucket { le = "0.1" }    0 + 2 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nonmonotonic_bucket { le = "1" }      0 + 1 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nonmonotonic_bucket { le = "10" }     0 + 5 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nonmonotonic_bucket { le = "100" }    0 + 4 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nonmonotonic_bucket { le = "1000" }   0 + 9 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nonmonotonic_bucket { le = "+Inf" }   0 + 8 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :                        "histogram_quantile(0.5, nonmonotonic_bucket)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :  [ ] string { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												` PromQL info: input to histogram_quantile needed to be fixed for monotonicity (see https://prometheus.io/docs/prometheus/latest/querying/functions/#histogram_quantile) for metric name "nonmonotonic_bucket" (1:25) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"warning annotation for missing le label" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												myHistogram { abe = "0.1" }    0 + 2 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :  "histogram_quantile(0.5, myHistogram)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												` PromQL warning: bucket label "le" is missing or has a malformed value of "" for metric name "myHistogram" (1:25) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"warning annotation for malformed le label" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												myHistogram { le = "Hello World" }    0 + 2 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :  "histogram_quantile(0.5, myHistogram)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												` PromQL warning: bucket label "le" is missing or has a malformed value of "Hello World" for metric name "myHistogram" (1:25) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"warning annotation for mixed histograms" :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											data :  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mixedHistogram { le = "0.1" }    0 + 2 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mixedHistogram { le = "1" }      0 + 3 x10 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												mixedHistogram { }            { { schema : 0  count : 10  sum : 50  buckets : [ 1  2  3 ] } } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expr :  "histogram_quantile(0.5, mixedHistogram)" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedWarningAnnotations :  [ ] string { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												` PromQL warning: vector contains a mix of classic and native histograms for metric name "mixedHistogram" (1:25) ` , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											expectedInfoAnnotations :  [ ] string { } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  name ,  testCase  :=  range  testCases  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										t . Run ( name ,  func ( t  * testing . T )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											store  :=  promqltest . LoadedStorage ( t ,  "load 1m\n" + strings . TrimSpace ( testCase . data ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Cleanup ( func ( )  {  _  =  store . Close ( )  } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											engine  :=  newTestEngine ( t ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											query ,  err  :=  engine . NewInstantQuery ( context . Background ( ) ,  store ,  nil ,  testCase . expr ,  timestamp . Time ( 0 ) . Add ( 1 * time . Minute ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											t . Cleanup ( query . Close ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											res  :=  query . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											warnings ,  infos  :=  res . Warnings . AsStrings ( testCase . expr ,  0 ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											testutil . RequireEqual ( t ,  testCase . expectedWarningAnnotations ,  warnings ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-18 18:21:25 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											testutil . RequireEqual ( t ,  testCase . expectedInfoAnnotations ,  infos ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-10-01 21:46:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  TestHistogramRateWithFloatStaleness ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Make a chunk with two normal histograms of the same value.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									h1  :=  histogram . Histogram { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Schema :           2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Count :            10 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Sum :              100 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PositiveSpans :    [ ] histogram . Span { { Offset :  0 ,  Length :  1 } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										PositiveBuckets :  [ ] int64 { 100 } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									c1  :=  chunkenc . NewHistogramChunk ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									app ,  err  :=  c1 . Appender ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									var  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										newc     chunkenc . Chunk 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										recoded  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									newc ,  recoded ,  app ,  err  =  app . AppendHistogram ( nil ,  0 ,  h1 . Copy ( ) ,  false ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . False ( t ,  recoded ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Nil ( t ,  newc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									newc ,  recoded ,  _ ,  err  =  app . AppendHistogram ( nil ,  10 ,  h1 . Copy ( ) ,  false ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . False ( t ,  recoded ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Nil ( t ,  newc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Make a chunk with a single float stale marker.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									c2  :=  chunkenc . NewXORChunk ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									app ,  err  =  c2 . Appender ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									app . Append ( 20 ,  math . Float64frombits ( value . StaleNaN ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Make a chunk with two normal histograms that have zero value.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									h2  :=  histogram . Histogram { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Schema :  2 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									c3  :=  chunkenc . NewHistogramChunk ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									app ,  err  =  c3 . Appender ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									newc ,  recoded ,  app ,  err  =  app . AppendHistogram ( nil ,  30 ,  h2 . Copy ( ) ,  false ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . False ( t ,  recoded ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Nil ( t ,  newc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									newc ,  recoded ,  _ ,  err  =  app . AppendHistogram ( nil ,  40 ,  h2 . Copy ( ) ,  false ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . False ( t ,  recoded ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Nil ( t ,  newc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									querier  :=  storage . MockQuerier { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SelectMockFunction :  func ( _  bool ,  _  * storage . SelectHints ,  _  ... * labels . Matcher )  storage . SeriesSet  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  & singleSeriesSet { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												series :  mockSeries { chunks :  [ ] chunkenc . Chunk { c1 ,  c2 ,  c3 } ,  labelSet :  [ ] string { "__name__" ,  "foo" } } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									queriable  :=  storage . MockQueryable { MockQuerier :  & querier } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngine ( t ,  false ,  0 ,  promqltest . DefaultMaxSamplesPerQuery ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									q ,  err  :=  engine . NewInstantQuery ( context . Background ( ) ,  & queriable ,  nil ,  "rate(foo[40s])" ,  timestamp . Time ( 45 ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									defer  q . Close ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									res  :=  q . Exec ( context . Background ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  res . Err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									vec ,  err  :=  res . Vector ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NoError ( t ,  err ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Single sample result.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Len ( t ,  vec ,  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The result is a histogram.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . NotNil ( t ,  vec [ 0 ] . H ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// The result should be zero as the histogram has not increased, so the rate is zero.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Equal ( t ,  0.0 ,  vec [ 0 ] . H . Count ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									require . Equal ( t ,  0.0 ,  vec [ 0 ] . H . Sum ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  singleSeriesSet  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									series    storage . Series 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									consumed  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  * singleSeriesSet )  Next ( )  bool                        {  c  :=  s . consumed ;  s . consumed  =  true ;  return  ! c  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  singleSeriesSet )  At ( )  storage . Series                 {  return  s . series  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  singleSeriesSet )  Err ( )  error                         {  return  nil  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  singleSeriesSet )  Warnings ( )  annotations . Annotations  {  return  nil  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								type  mockSeries  struct  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									chunks    [ ] chunkenc . Chunk 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									labelSet  [ ] string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  mockSeries )  Labels ( )  labels . Labels  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  labels . FromStrings ( s . labelSet ... ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								func  ( s  mockSeries )  Iterator ( it  chunkenc . Iterator )  chunkenc . Iterator  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									iterables  :=  [ ] chunkenc . Iterator { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  _ ,  c  :=  range  s . chunks  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										iterables  =  append ( iterables ,  c . Iterator ( nil ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  storage . ChainSampleIteratorFromIterators ( it ,  iterables ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2024-11-04 20:58:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  TestEvaluationWithDelayedNameRemovalDisabled ( t  * testing . T )  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									opts  :=  promql . EngineOpts { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Logger :                    nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Reg :                       nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EnableAtModifier :          true , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										MaxSamples :                10000 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										Timeout :                   10  *  time . Second , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										EnableDelayedNameRemoval :  false , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									engine  :=  promqltest . NewTestEngineWithOpts ( t ,  opts ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									promqltest . RunTest ( t ,  ` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								load  5 m  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									metric_total { env = "1" } 	0  60  120 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									another_metric { env = "1" } 	60  120  180 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Does  not  drop  __name__  for  vector  selector  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  metric_total { env = "1" }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									metric_total { env = "1" }  120 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  unary  operators  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  - metric_total  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  - 120 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  binary  operators  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  metric_total  +  another_metric  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  300 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Does  not  drop  __name__  for  binary  comparison  operators  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  metric_total  <=  another_metric  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									metric_total { env = "1" }  120 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  binary  comparison  operators  with  "bool"  modifier  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  metric_total  <=  bool  another_metric  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  vector - scalar  operations  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  metric_total  *  2  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  240 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  instant - vector  functions  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  clamp ( metric_total ,  0 ,  100 )  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  100 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  round  function  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  round ( metric_total )  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  120 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  __name__  for  range - vector  functions  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  rate ( metric_total { env = "1" } [ 10 m ] )  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  0.2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Does  not  drop  __name__  for  last_over_time  function  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  last_over_time ( metric_total { env = "1" } [ 10 m ] )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									metric_total { env = "1" }  120 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  Drops  name  for  other  _over_time  functions  
						 
					
						
							
								
									
										
										
										
											2024-11-21 21:20:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								eval  instant  at  10 m  max_over_time ( metric_total { env = "1" } [ 10 m ] )  
						 
					
						
							
								
									
										
										
										
											2024-10-31 15:30:22 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ env = "1" }  120 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								` ,  engine )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}