@@ -33,6 +33,7 @@ import (
3333 "github.com/thanos-io/promql-engine/query"
3434 engstorage "github.com/thanos-io/promql-engine/storage"
3535 promstorage "github.com/thanos-io/promql-engine/storage/prometheus"
36+ "github.com/thanos-io/promql-engine/tracing"
3637)
3738
3839type QueryType int
@@ -237,14 +238,21 @@ type Engine struct {
237238}
238239
239240func (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+
240246 idx , err := e .activeQueryTracker .Insert (ctx , qs )
241247 if err != nil {
248+ tracing .LogError (span , err )
242249 return nil , err
243250 }
244251 defer e .activeQueryTracker .Delete (idx )
245252
246253 expr , err := parser .NewParser (qs , parser .WithFunctions (e .functions )).ParseExpr ()
247254 if err != nil {
255+ tracing .LogError (span , err )
248256 return nil , err
249257 }
250258 // 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
254262
255263 qOpts := e .makeQueryOpts (ts , ts , 0 , opts )
256264 if qOpts .StepsBatch > 64 {
257- return nil , ErrStepsBatchTooLarge
265+ err := ErrStepsBatchTooLarge
266+ tracing .LogError (span , err )
267+ return nil , err
258268 }
259269
260270 planOpts := logicalplan.PlanOptions {
261271 DisableDuplicateLabelCheck : e .disableDuplicateLabelChecks ,
262272 }
273+
274+ optimizeSpan := tracing .ChildSpan (span , "optimize_plan" )
263275 lplan , warns := logicalplan .NewFromAST (expr , qOpts , planOpts ).Optimize (e .getLogicalOptimizers (opts ))
276+ optimizeSpan .Finish ()
264277
278+ ctx = warnings .NewContext (ctx )
279+ defer func () { warns .Merge (warnings .FromContext (ctx )) }()
280+
281+ scannersSpan := tracing .ChildSpan (span , "create_storage_scanners" )
265282 scanners , err := e .storageScanners (q , qOpts , lplan )
283+ scannersSpan .Finish ()
266284 if err != nil {
285+ tracing .LogError (span , err )
267286 return nil , errors .Wrap (err , "creating storage scanners" )
268287 }
269288
270- ctx = warnings .NewContext (ctx )
271- defer func () { warns .Merge (warnings .FromContext (ctx )) }()
289+ execSpan := tracing .ChildSpan (span , "create_execution" )
272290 exec , err := execution .New (ctx , lplan .Root (), scanners , qOpts )
291+ execSpan .Finish ()
273292 if err != nil {
293+ tracing .LogError (span , err )
274294 return nil , err
275295 }
276296 e .metrics .totalQueries .Inc ()
@@ -336,39 +356,62 @@ func (e *Engine) MakeInstantQueryFromPlan(ctx context.Context, q storage.Queryab
336356}
337357
338358func (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+
339366 idx , err := e .activeQueryTracker .Insert (ctx , qs )
340367 if err != nil {
368+ tracing .LogError (span , err )
341369 return nil , err
342370 }
343371 defer e .activeQueryTracker .Delete (idx )
344372
345373 expr , err := parser .NewParser (qs , parser .WithFunctions (e .functions )).ParseExpr ()
346374 if err != nil {
375+ tracing .LogError (span , err )
347376 return nil , err
348377 }
349378
350379 // Use same check as Prometheus for range queries.
351380 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
353384 }
354385 qOpts := e .makeQueryOpts (start , end , step , opts )
355386 if qOpts .StepsBatch > 64 {
356- return nil , ErrStepsBatchTooLarge
387+ err := ErrStepsBatchTooLarge
388+ tracing .LogError (span , err )
389+ return nil , err
357390 }
358391 planOpts := logicalplan.PlanOptions {
359392 DisableDuplicateLabelCheck : e .disableDuplicateLabelChecks ,
360393 }
394+
395+ optimizeSpan := tracing .ChildSpan (span , "optimize_plan" )
361396 lplan , warns := logicalplan .NewFromAST (expr , qOpts , planOpts ).Optimize (e .getLogicalOptimizers (opts ))
397+ optimizeSpan .Finish ()
362398
363399 ctx = warnings .NewContext (ctx )
364400 defer func () { warns .Merge (warnings .FromContext (ctx )) }()
401+
402+ scannersSpan := tracing .ChildSpan (span , "create_storage_scanners" )
365403 scnrs , err := e .storageScanners (q , qOpts , lplan )
404+ scannersSpan .Finish ()
366405 if err != nil {
406+ tracing .LogError (span , err )
367407 return nil , errors .Wrap (err , "creating storage scanners" )
368408 }
369409
410+ execSpan := tracing .ChildSpan (span , "create_execution" )
370411 exec , err := execution .New (ctx , lplan .Root (), scnrs , qOpts )
412+ execSpan .Finish ()
371413 if err != nil {
414+ tracing .LogError (span , err )
372415 return nil , err
373416 }
374417 e .metrics .totalQueries .Inc ()
@@ -528,8 +571,21 @@ type compatibilityQuery struct {
528571}
529572
530573func (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+
531586 idx , err := q .engine .activeQueryTracker .Insert (ctx , q .String ())
532587 if err != nil {
588+ tracing .LogError (span , err )
533589 return & promql.Result {Err : err }
534590 }
535591 defer q .engine .activeQueryTracker .Delete (idx )
@@ -557,23 +613,32 @@ func (q *compatibilityQuery) Exec(ctx context.Context) (ret *promql.Result) {
557613 defer cancel ()
558614 q .cancel = cancel
559615
616+ seriesSpan := tracing .ChildSpan (span , "get_series" )
560617 resultSeries , err := q .Query .exec .Series (ctx )
618+ seriesSpan .Finish ()
561619 if err != nil {
620+ tracing .LogError (span , err )
562621 return newErrResult (ret , err )
563622 }
564623
565624 series := make ([]promql.Series , len (resultSeries ))
566625 for i , s := range resultSeries {
567626 series [i ].Metric = s
568627 }
628+
629+ samplesSpan := tracing .ChildSpan (span , "collect_samples" )
569630loop:
570631 for {
571632 select {
572633 case <- ctx .Done ():
634+ tracing .LogError (samplesSpan , ctx .Err ())
635+ samplesSpan .Finish ()
573636 return newErrResult (ret , ctx .Err ())
574637 default :
575638 r , err := q .Query .exec .Next (ctx )
576639 if err != nil {
640+ tracing .LogError (samplesSpan , err )
641+ samplesSpan .Finish ()
577642 return newErrResult (ret , err )
578643 }
579644 if r == nil {
@@ -610,6 +675,10 @@ loop:
610675 q .Query .exec .GetPool ().PutVectors (r )
611676 }
612677 }
678+ samplesSpan .Finish ()
679+
680+ resultSpan := tracing .ChildSpan (span , "prepare_result" )
681+ defer resultSpan .Finish ()
613682
614683 // For range Query we expect always a Matrix value type.
615684 if q .t == RangeQuery {
@@ -623,7 +692,9 @@ loop:
623692 sort .Sort (matrix )
624693 ret .Value = matrix
625694 if matrix .ContainsSameLabelset () {
626- return newErrResult (ret , extlabels .ErrDuplicateLabelSet )
695+ err := extlabels .ErrDuplicateLabelSet
696+ tracing .LogError (resultSpan , err )
697+ return newErrResult (ret , err )
627698 }
628699 return ret
629700 }
@@ -657,7 +728,9 @@ loop:
657728 }
658729 sort .Slice (vector , q .resultSort .comparer (& vector ))
659730 if vector .ContainsSameLabelset () {
660- return newErrResult (ret , extlabels .ErrDuplicateLabelSet )
731+ err := extlabels .ErrDuplicateLabelSet
732+ tracing .LogError (resultSpan , err )
733+ return newErrResult (ret , err )
661734 }
662735 result = vector
663736 case parser .ValueTypeScalar :
@@ -667,7 +740,9 @@ loop:
667740 }
668741 result = promql.Scalar {V : v , T : q .ts .UnixMilli ()}
669742 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 )
671746 }
672747
673748 ret .Value = result
0 commit comments