github.com/grafana/pyroscope@v1.18.0/pkg/frontend/frontend_profile_types.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) ProfileTypes( 18 ctx context.Context, 19 c *connect.Request[querierv1.ProfileTypesRequest], 20 ) (*connect.Response[querierv1.ProfileTypesResponse], error) { 21 ctx = connectgrpc.WithProcedure(ctx, querierv1connect.QuerierServiceProfileTypesProcedure) 22 23 interval, ok := phlaremodel.GetTimeRange(c.Msg) 24 if ok { 25 tenantIDs, err := tenant.TenantIDs(ctx) 26 if err != nil { 27 return nil, connect.NewError(connect.CodeInvalidArgument, err) 28 } 29 30 validated, err := validation.ValidateRangeRequest(f.limits, tenantIDs, interval, model.Now()) 31 if err != nil { 32 return nil, connect.NewError(connect.CodeInvalidArgument, err) 33 } 34 if validated.IsEmpty { 35 return connect.NewResponse(&querierv1.ProfileTypesResponse{}), nil 36 } 37 c.Msg.Start = int64(validated.Start) 38 c.Msg.End = int64(validated.End) 39 } 40 41 return connectgrpc.RoundTripUnary[querierv1.ProfileTypesRequest, querierv1.ProfileTypesResponse](ctx, f, c) 42 }