diff --git a/pkg/registry/apis/query/query.go b/pkg/registry/apis/query/query.go index f24e0e10ba5..1bbd6ef95a5 100644 --- a/pkg/registry/apis/query/query.go +++ b/pkg/registry/apis/query/query.go @@ -109,6 +109,7 @@ func (r *queryREST) Connect(connectCtx context.Context, name string, _ runtime.O raw := &query.QueryDataRequest{} err := web.Bind(httpreq, raw) if err != nil { + b.log.Error("Hit unexpected error when reading query", "err", err) err = errorsK8s.NewBadRequest("error reading query") // TODO: can we wrap the error so details are not lost?! // errutil.BadRequest( @@ -170,17 +171,22 @@ func (r *queryREST) Connect(connectCtx context.Context, name string, _ runtime.O func (b *QueryAPIBuilder) execute(ctx context.Context, req parsedRequestInfo) (qdr *backend.QueryDataResponse, err error) { switch len(req.Requests) { case 0: + b.log.Debug("executing empty query") qdr = &backend.QueryDataResponse{} case 1: + b.log.Debug("executing single query") qdr, err = b.handleQuerySingleDatasource(ctx, req.Requests[0]) if alertQueryWithoutExpression(req) { + b.log.Debug("handling alert query without expression") qdr, err = b.convertQueryWithoutExpression(ctx, req.Requests[0], qdr) } default: + b.log.Debug("executing concurrent queries") qdr, err = b.executeConcurrentQueries(ctx, req.Requests) } if len(req.Expressions) > 0 { + b.log.Debug("executing expressions") qdr, err = b.handleExpressions(ctx, req, qdr) } @@ -330,6 +336,9 @@ func (b *QueryAPIBuilder) executeConcurrentQueries(ctx context.Context, requests func (b *QueryAPIBuilder) handleExpressions(ctx context.Context, req parsedRequestInfo, data *backend.QueryDataResponse) (qdr *backend.QueryDataResponse, err error) { start := time.Now() ctx, span := b.tracer.Start(ctx, "Query.handleExpressions") + traceId := span.SpanContext().TraceID() + expressionsLogger := b.log.New("traceId", traceId.String()) + expressionsLogger.Debug("handling expressions") defer func() { var respStatus string switch { @@ -363,10 +372,12 @@ func (b *QueryAPIBuilder) handleExpressions(ctx context.Context, req parsedReque allowLongFrames := false // TODO -- depends on input type and only if SQL? _, res, err := b.converter.Convert(ctx, req.RefIDTypes[refId], dr.Frames, allowLongFrames) if err != nil { + expressionsLogger.Error("error converting frames for expressions", "error", err) res.Error = err } vars[refId] = res } else { + expressionsLogger.Error("missing variable in handle expressions", "refId", refId, "expressionRefId", expression.RefID) // This should error in the parsing phase err := fmt.Errorf("missing variable %s for %s", refId, expression.RefID) qdr.Responses[refId] = backend.DataResponse{ @@ -380,6 +391,7 @@ func (b *QueryAPIBuilder) handleExpressions(ctx context.Context, req parsedReque refId := expression.RefID results, err := expression.Command.Execute(ctx, now, vars, b.tracer) if err != nil { + expressionsLogger.Error("error executing expression", "error", err) results.Error = err } qdr.Responses[refId] = backend.DataResponse{