@@ -33,6 +33,7 @@ import (
33
33
"github.com/thanos-io/promql-engine/query"
34
34
engstorage "github.com/thanos-io/promql-engine/storage"
35
35
promstorage "github.com/thanos-io/promql-engine/storage/prometheus"
36
+ "github.com/thanos-io/promql-engine/tracing"
36
37
)
37
38
38
39
type QueryType int
@@ -237,14 +238,21 @@ type Engine struct {
237
238
}
238
239
239
240
func (e * Engine ) MakeInstantQuery (ctx context.Context , q storage.Queryable , opts * QueryOpts , qs string , ts time.Time ) (promql.Query , error ) {
241
+ span , ctx := tracing .StartSpanFromContext (ctx , "engine.MakeInstantQuery" )
242
+ defer span .Finish ()
243
+ span .SetTag ("query" , qs )
244
+ span .SetTag ("timestamp" , ts .Unix ())
245
+
240
246
idx , err := e .activeQueryTracker .Insert (ctx , qs )
241
247
if err != nil {
248
+ tracing .LogError (span , err )
242
249
return nil , err
243
250
}
244
251
defer e .activeQueryTracker .Delete (idx )
245
252
246
253
expr , err := parser .NewParser (qs , parser .WithFunctions (e .functions )).ParseExpr ()
247
254
if err != nil {
255
+ tracing .LogError (span , err )
248
256
return nil , err
249
257
}
250
258
// determine sorting order before optimizers run, we do this by looking for "sort"
@@ -254,23 +262,35 @@ func (e *Engine) MakeInstantQuery(ctx context.Context, q storage.Queryable, opts
254
262
255
263
qOpts := e .makeQueryOpts (ts , ts , 0 , opts )
256
264
if qOpts .StepsBatch > 64 {
257
- return nil , ErrStepsBatchTooLarge
265
+ err := ErrStepsBatchTooLarge
266
+ tracing .LogError (span , err )
267
+ return nil , err
258
268
}
259
269
260
270
planOpts := logicalplan.PlanOptions {
261
271
DisableDuplicateLabelCheck : e .disableDuplicateLabelChecks ,
262
272
}
273
+
274
+ optimizeSpan := tracing .ChildSpan (span , "optimize_plan" )
263
275
lplan , warns := logicalplan .NewFromAST (expr , qOpts , planOpts ).Optimize (e .getLogicalOptimizers (opts ))
276
+ optimizeSpan .Finish ()
264
277
278
+ ctx = warnings .NewContext (ctx )
279
+ defer func () { warns .Merge (warnings .FromContext (ctx )) }()
280
+
281
+ scannersSpan := tracing .ChildSpan (span , "create_storage_scanners" )
265
282
scanners , err := e .storageScanners (q , qOpts , lplan )
283
+ scannersSpan .Finish ()
266
284
if err != nil {
285
+ tracing .LogError (span , err )
267
286
return nil , errors .Wrap (err , "creating storage scanners" )
268
287
}
269
288
270
- ctx = warnings .NewContext (ctx )
271
- defer func () { warns .Merge (warnings .FromContext (ctx )) }()
289
+ execSpan := tracing .ChildSpan (span , "create_execution" )
272
290
exec , err := execution .New (ctx , lplan .Root (), scanners , qOpts )
291
+ execSpan .Finish ()
273
292
if err != nil {
293
+ tracing .LogError (span , err )
274
294
return nil , err
275
295
}
276
296
e .metrics .totalQueries .Inc ()
@@ -336,39 +356,62 @@ func (e *Engine) MakeInstantQueryFromPlan(ctx context.Context, q storage.Queryab
336
356
}
337
357
338
358
func (e * Engine ) MakeRangeQuery (ctx context.Context , q storage.Queryable , opts * QueryOpts , qs string , start , end time.Time , step time.Duration ) (promql.Query , error ) {
359
+ span , ctx := tracing .StartSpanFromContext (ctx , "engine.MakeRangeQuery" )
360
+ defer span .Finish ()
361
+ span .SetTag ("query" , qs )
362
+ span .SetTag ("start" , start .Unix ())
363
+ span .SetTag ("end" , end .Unix ())
364
+ span .SetTag ("step" , step .String ())
365
+
339
366
idx , err := e .activeQueryTracker .Insert (ctx , qs )
340
367
if err != nil {
368
+ tracing .LogError (span , err )
341
369
return nil , err
342
370
}
343
371
defer e .activeQueryTracker .Delete (idx )
344
372
345
373
expr , err := parser .NewParser (qs , parser .WithFunctions (e .functions )).ParseExpr ()
346
374
if err != nil {
375
+ tracing .LogError (span , err )
347
376
return nil , err
348
377
}
349
378
350
379
// Use same check as Prometheus for range queries.
351
380
if expr .Type () != parser .ValueTypeVector && expr .Type () != parser .ValueTypeScalar {
352
- return nil , errors .Newf ("invalid expression type %q for range query, must be Scalar or instant Vector" , parser .DocumentedType (expr .Type ()))
381
+ err := errors .Newf ("invalid expression type %q for range query, must be Scalar or instant Vector" , parser .DocumentedType (expr .Type ()))
382
+ tracing .LogError (span , err )
383
+ return nil , err
353
384
}
354
385
qOpts := e .makeQueryOpts (start , end , step , opts )
355
386
if qOpts .StepsBatch > 64 {
356
- return nil , ErrStepsBatchTooLarge
387
+ err := ErrStepsBatchTooLarge
388
+ tracing .LogError (span , err )
389
+ return nil , err
357
390
}
358
391
planOpts := logicalplan.PlanOptions {
359
392
DisableDuplicateLabelCheck : e .disableDuplicateLabelChecks ,
360
393
}
394
+
395
+ optimizeSpan := tracing .ChildSpan (span , "optimize_plan" )
361
396
lplan , warns := logicalplan .NewFromAST (expr , qOpts , planOpts ).Optimize (e .getLogicalOptimizers (opts ))
397
+ optimizeSpan .Finish ()
362
398
363
399
ctx = warnings .NewContext (ctx )
364
400
defer func () { warns .Merge (warnings .FromContext (ctx )) }()
401
+
402
+ scannersSpan := tracing .ChildSpan (span , "create_storage_scanners" )
365
403
scnrs , err := e .storageScanners (q , qOpts , lplan )
404
+ scannersSpan .Finish ()
366
405
if err != nil {
406
+ tracing .LogError (span , err )
367
407
return nil , errors .Wrap (err , "creating storage scanners" )
368
408
}
369
409
410
+ execSpan := tracing .ChildSpan (span , "create_execution" )
370
411
exec , err := execution .New (ctx , lplan .Root (), scnrs , qOpts )
412
+ execSpan .Finish ()
371
413
if err != nil {
414
+ tracing .LogError (span , err )
372
415
return nil , err
373
416
}
374
417
e .metrics .totalQueries .Inc ()
@@ -528,8 +571,21 @@ type compatibilityQuery struct {
528
571
}
529
572
530
573
func (q * compatibilityQuery ) Exec (ctx context.Context ) (ret * promql.Result ) {
574
+ span , ctx := tracing .StartSpanFromContext (ctx , "compatibilityQuery.Exec" )
575
+ defer span .Finish ()
576
+ span .SetTag ("query_type" , q .t )
577
+ span .SetTag ("query_string" , q .String ())
578
+ if q .t == RangeQuery {
579
+ span .SetTag ("start" , q .start .Unix ())
580
+ span .SetTag ("end" , q .end .Unix ())
581
+ span .SetTag ("step" , q .step .String ())
582
+ } else {
583
+ span .SetTag ("timestamp" , q .ts .Unix ())
584
+ }
585
+
531
586
idx , err := q .engine .activeQueryTracker .Insert (ctx , q .String ())
532
587
if err != nil {
588
+ tracing .LogError (span , err )
533
589
return & promql.Result {Err : err }
534
590
}
535
591
defer q .engine .activeQueryTracker .Delete (idx )
@@ -557,23 +613,32 @@ func (q *compatibilityQuery) Exec(ctx context.Context) (ret *promql.Result) {
557
613
defer cancel ()
558
614
q .cancel = cancel
559
615
616
+ seriesSpan := tracing .ChildSpan (span , "get_series" )
560
617
resultSeries , err := q .Query .exec .Series (ctx )
618
+ seriesSpan .Finish ()
561
619
if err != nil {
620
+ tracing .LogError (span , err )
562
621
return newErrResult (ret , err )
563
622
}
564
623
565
624
series := make ([]promql.Series , len (resultSeries ))
566
625
for i , s := range resultSeries {
567
626
series [i ].Metric = s
568
627
}
628
+
629
+ samplesSpan := tracing .ChildSpan (span , "collect_samples" )
569
630
loop:
570
631
for {
571
632
select {
572
633
case <- ctx .Done ():
634
+ tracing .LogError (samplesSpan , ctx .Err ())
635
+ samplesSpan .Finish ()
573
636
return newErrResult (ret , ctx .Err ())
574
637
default :
575
638
r , err := q .Query .exec .Next (ctx )
576
639
if err != nil {
640
+ tracing .LogError (samplesSpan , err )
641
+ samplesSpan .Finish ()
577
642
return newErrResult (ret , err )
578
643
}
579
644
if r == nil {
@@ -610,6 +675,10 @@ loop:
610
675
q .Query .exec .GetPool ().PutVectors (r )
611
676
}
612
677
}
678
+ samplesSpan .Finish ()
679
+
680
+ resultSpan := tracing .ChildSpan (span , "prepare_result" )
681
+ defer resultSpan .Finish ()
613
682
614
683
// For range Query we expect always a Matrix value type.
615
684
if q .t == RangeQuery {
@@ -623,7 +692,9 @@ loop:
623
692
sort .Sort (matrix )
624
693
ret .Value = matrix
625
694
if matrix .ContainsSameLabelset () {
626
- return newErrResult (ret , extlabels .ErrDuplicateLabelSet )
695
+ err := extlabels .ErrDuplicateLabelSet
696
+ tracing .LogError (resultSpan , err )
697
+ return newErrResult (ret , err )
627
698
}
628
699
return ret
629
700
}
@@ -657,7 +728,9 @@ loop:
657
728
}
658
729
sort .Slice (vector , q .resultSort .comparer (& vector ))
659
730
if vector .ContainsSameLabelset () {
660
- return newErrResult (ret , extlabels .ErrDuplicateLabelSet )
731
+ err := extlabels .ErrDuplicateLabelSet
732
+ tracing .LogError (resultSpan , err )
733
+ return newErrResult (ret , err )
661
734
}
662
735
result = vector
663
736
case parser .ValueTypeScalar :
@@ -667,7 +740,9 @@ loop:
667
740
}
668
741
result = promql.Scalar {V : v , T : q .ts .UnixMilli ()}
669
742
default :
670
- panic (errors .Newf ("new.Engine.exec: unexpected expression type %q" , q .plan .Root ().ReturnType ()))
743
+ err := errors .Newf ("new.Engine.exec: unexpected expression type %q" , q .plan .Root ().ReturnType ())
744
+ tracing .LogError (resultSpan , err )
745
+ panic (err )
671
746
}
672
747
673
748
ret .Value = result
0 commit comments