github.com/grafana/pyroscope@v1.18.0/pkg/frontend/frontend_series_labels.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) Series( 18 ctx context.Context, 19 c *connect.Request[querierv1.SeriesRequest], 20 ) (*connect.Response[querierv1.SeriesResponse], error) { 21 ctx = connectgrpc.WithProcedure(ctx, querierv1connect.QuerierServiceSeriesProcedure) 22 23 tenantIDs, err := tenant.TenantIDs(ctx) 24 if err != nil { 25 return nil, connect.NewError(connect.CodeInvalidArgument, err) 26 } 27 28 interval, ok := phlaremodel.GetTimeRange(c.Msg) 29 if ok { 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.SeriesResponse{}), nil 36 } 37 c.Msg.Start = int64(validated.Start) 38 c.Msg.End = int64(validated.End) 39 } 40 41 return connectgrpc.RoundTripUnary[querierv1.SeriesRequest, querierv1.SeriesResponse](ctx, f, c) 42 }