github.com/grafana/pyroscope@v1.18.0/pkg/frontend/frontend_analyze_query.go (about)

     1  package frontend
     2  
     3  import (
     4  	"context"
     5  
     6  	"connectrpc.com/connect"
     7  	"github.com/grafana/dskit/tenant"
     8  	"github.com/prometheus/common/model"
     9  
    10  	querierv1 "github.com/grafana/pyroscope/api/gen/proto/go/querier/v1"
    11  	"github.com/grafana/pyroscope/api/gen/proto/go/querier/v1/querierv1connect"
    12  	phlaremodel "github.com/grafana/pyroscope/pkg/model"
    13  	"github.com/grafana/pyroscope/pkg/util/connectgrpc"
    14  	"github.com/grafana/pyroscope/pkg/validation"
    15  )
    16  
    17  func (f *Frontend) AnalyzeQuery(
    18  	ctx context.Context,
    19  	c *connect.Request[querierv1.AnalyzeQueryRequest],
    20  ) (*connect.Response[querierv1.AnalyzeQueryResponse], error) {
    21  	tenantID, err := tenant.TenantID(ctx)
    22  	if err != nil {
    23  		return nil, connect.NewError(connect.CodeInvalidArgument, err)
    24  	}
    25  
    26  	if !f.limits.QueryAnalysisEnabled(tenantID) {
    27  		return connect.NewResponse(&querierv1.AnalyzeQueryResponse{}), nil
    28  	}
    29  
    30  	tenantIDs, err := tenant.TenantIDs(ctx)
    31  	if err != nil {
    32  		return nil, connect.NewError(connect.CodeInvalidArgument, err)
    33  	}
    34  
    35  	interval, ok := phlaremodel.GetTimeRange(c.Msg)
    36  	if ok {
    37  		validated, err := validation.ValidateRangeRequest(f.limits, tenantIDs, interval, model.Now())
    38  		if err != nil {
    39  			return nil, connect.NewError(connect.CodeInvalidArgument, err)
    40  		}
    41  		if validated.IsEmpty {
    42  			return connect.NewResponse(&querierv1.AnalyzeQueryResponse{}), nil
    43  		}
    44  		c.Msg.Start = int64(validated.Start)
    45  		c.Msg.End = int64(validated.End)
    46  	} else {
    47  		return connect.NewResponse(&querierv1.AnalyzeQueryResponse{}), nil
    48  	}
    49  
    50  	ctx = connectgrpc.WithProcedure(ctx, querierv1connect.QuerierServiceAnalyzeQueryProcedure)
    51  	return connectgrpc.RoundTripUnary[querierv1.AnalyzeQueryRequest, querierv1.AnalyzeQueryResponse](ctx, f, c)
    52  }