storage/remote/client.go
func (c *Client) Read(ctx context.Context, query *prompb.Query) (*prompb.QueryResult, error) {
	req := &prompb.ReadRequest{
		// TODO: Support batching multiple queries into one read request,
		// as the protobuf interface allows for it.
		Queries: []*prompb.Query{
			query,
		},
	}
	data, err := proto.Marshal(req)
	if err != nil {
		return nil, errors.Wrapf(err, "unable to marshal read request")
	}

	compressed := snappy.Encode(nil, data)
	httpReq, err := http.NewRequest("POST", c.url.String(), bytes.NewReader(compressed))
	if err != nil {
		return nil, errors.Wrap(err, "unable to create request")
	}
	httpReq.Header.Add("Content-Encoding", "snappy")
	httpReq.Header.Add("Accept-Encoding", "snappy")
	httpReq.Header.Set("Content-Type", "application/x-protobuf")
	httpReq.Header.Set("User-Agent", userAgent)
	httpReq.Header.Set("X-Prometheus-Remote-Read-Version", "0.1.0")

	ctx, cancel := context.WithTimeout(ctx, c.timeout)
	defer cancel()

	httpResp, err := c.client.Do(httpReq.WithContext(ctx))
	if err != nil {
		return nil, errors.Wrap(err, "error sending request")
	}
	defer func() {
		io.Copy(ioutil.Discard, httpResp.Body)
		httpResp.Body.Close()
	}()
	if httpResp.StatusCode/100 != 2 {
		return nil, errors.Errorf("server returned HTTP status %s", httpResp.Status)
	}

	compressed, err = ioutil.ReadAll(httpResp.Body)
	if err != nil {
		return nil, errors.Wrap(err, "error reading response")
	}

	uncompressed, err := snappy.Decode(nil, compressed)
	if err != nil {
		return nil, errors.Wrap(err, "error reading response")
	}

	var resp prompb.ReadResponse
	err = proto.Unmarshal(uncompressed, &resp)
	if err != nil {
		return nil, errors.Wrap(err, "unable to unmarshal response body")
	}

	if len(resp.Results) != len(req.Queries) {
		return nil, errors.Errorf("responses: want %d, got %d", len(req.Queries), len(resp.Results))
	}

	return resp.Results[0], nil
}
func (c *Client) Read(ctx context.Context, query *prompb.Query) (*prompb.QueryResult, error) {
	req := &prompb.ReadRequest{
		// TODO: Support batching multiple queries into one read request,
		// as the protobuf interface allows for it.
		Queries: []*prompb.Query{
			query,
		},
	}
	data, err := proto.Marshal(req)
	if err != nil {
		return nil, errors.Wrapf(err, "unable to marshal read request")
	}

	compressed := snappy.Encode(nil, data)
	httpReq, err := http.NewRequest("POST", c.url.String(), bytes.NewReader(compressed))
	if err != nil {
		return nil, errors.Wrap(err, "unable to create request")
	}
	httpReq.Header.Add("Content-Encoding", "snappy")
	httpReq.Header.Add("Accept-Encoding", "snappy")
	httpReq.Header.Set("Content-Type", "application/x-protobuf")
	httpReq.Header.Set("User-Agent", userAgent)
	httpReq.Header.Set("X-Prometheus-Remote-Read-Version", "0.1.0")

	ctx, cancel := context.WithTimeout(ctx, c.timeout)
	defer cancel()

	httpResp, err := c.client.Do(httpReq.WithContext(ctx))
	if err != nil {
		return nil, errors.Wrap(err, "error sending request")
	}
	defer func() {
		io.Copy(ioutil.Discard, httpResp.Body)
		httpResp.Body.Close()
	}()
	if httpResp.StatusCode/100 != 2 {
		return nil, errors.Errorf("server returned HTTP status %s", httpResp.Status)
	}

	compressed, err = ioutil.ReadAll(httpResp.Body)
	if err != nil {
		return nil, errors.Wrap(err, "error reading response")
	}

	uncompressed, err := snappy.Decode(nil, compressed)
	if err != nil {
		return nil, errors.Wrap(err, "error reading response")
	}

	var resp prompb.ReadResponse
	err = proto.Unmarshal(uncompressed, &resp)
	if err != nil {
		return nil, errors.Wrap(err, "unable to unmarshal response body")
	}

	if len(resp.Results) != len(req.Queries) {
		return nil, errors.Errorf("responses: want %d, got %d", len(req.Queries), len(resp.Results))
	}

	return resp.Results[0], nil
}
func ( c * Client ) Read ( ctx context . Context , query * prompb . Query ) ( * prompb . QueryResult , error ) { req := & prompb . ReadRequest { // TODO: Support batching multiple queries into one read request, // as the protobuf interface allows for it. Queries : [ ] * prompb . Query { query , } , } data , err := proto . Marshal ( req ) if err != nil { return nil , errors . Wrapf ( err , " " ) } compressed := snappy . Encode ( nil , data ) httpReq , err := http . NewRequest ( " " , c . url . String ( ) , bytes . NewReader ( compressed ) ) if err != nil { return nil , errors . Wrap ( err , " " ) } httpReq . Header . Add ( " " , " " ) httpReq . Header . Add ( " " , " " ) httpReq . Header . Set ( " " , " " ) httpReq . Header . Set ( " " , userAgent ) httpReq . Header . Set ( " " , " " ) ctx , cancel := context . WithTimeout ( ctx , c . timeout ) defer cancel ( ) httpResp , err := c . client . Do ( httpReq . WithContext ( ctx ) ) if err != nil { return nil , errors . Wrap ( err , " " ) } defer func ( ) { io . Copy ( ioutil . Discard , httpResp . Body ) httpResp . Body . Close ( ) } ( ) if httpResp . StatusCode / 100 != 2 { return nil , errors . Errorf ( " " , httpResp . Status ) } compressed , err = ioutil . ReadAll ( httpResp . Body ) if err != nil { return nil , errors . Wrap ( err , " " ) } uncompressed , err := snappy . Decode ( nil , compressed ) if err != nil { return nil , errors . Wrap ( err , " " ) } var resp prompb . ReadResponse err = proto . Unmarshal ( uncompressed , & resp ) if err != nil { return nil , errors . Wrap ( err , " " ) } if len ( resp . Results ) != len ( req . Queries ) { return nil , errors . Errorf ( " " , len ( req . Queries ) , len ( resp . Results ) ) } return resp . Results [ 0 ] , nil }
// Read reads from a remote endpoint.
Read reads from a remote endpoint .