// Query is an endpoint that returns data for one or more metrics over a // specific time span. func (s *Server) Query(ctx context.Context, request *tspb.TimeSeriesQueryRequest) (*tspb.TimeSeriesQueryResponse, error) { if len(request.Queries) == 0 { return nil, grpc.Errorf(codes.InvalidArgument, "Queries cannot be empty") } response := tspb.TimeSeriesQueryResponse{ Results: make([]tspb.TimeSeriesQueryResponse_Result, 0, len(request.Queries)), } for _, q := range request.Queries { datapoints, sources, err := s.db.Query(q, Resolution10s, request.StartNanos, request.EndNanos) if err != nil { return nil, grpc.Errorf(codes.Internal, err.Error()) } result := tspb.TimeSeriesQueryResponse_Result{ Query: q, Datapoints: datapoints, } // TODO(tamird): Remove this (and all other) explicit setting of defaults. // It is currently required because the client side doesn't know about // proto defaults. result.SourceAggregator = q.GetSourceAggregator().Enum() result.Downsampler = q.GetDownsampler().Enum() result.Derivative = q.GetDerivative().Enum() result.Sources = sources response.Results = append(response.Results, result) } return &response, nil }
// Query is an endpoint that returns data for one or more metrics over a // specific time span. func (s *Server) Query(ctx context.Context, request *tspb.TimeSeriesQueryRequest) (*tspb.TimeSeriesQueryResponse, error) { if len(request.Queries) == 0 { return nil, grpc.Errorf(codes.InvalidArgument, "Queries cannot be empty") } response := tspb.TimeSeriesQueryResponse{ Results: make([]tspb.TimeSeriesQueryResponse_Result, 0, len(request.Queries)), } for _, query := range request.Queries { datapoints, sources, err := s.db.Query(query, Resolution10s, request.StartNanos, request.EndNanos) if err != nil { return nil, grpc.Errorf(codes.Internal, err.Error()) } result := tspb.TimeSeriesQueryResponse_Result{ Query: query, Datapoints: datapoints, } result.Sources = sources response.Results = append(response.Results, result) } return &response, nil }