github.com/grafana/pyroscope@v1.18.0/pkg/util/httpgrpcutil/carrier.go (about)

     1  // SPDX-License-Identifier: AGPL-3.0-only
     2  // Provenance-includes-location: https://github.com/cortexproject/cortex/blob/master/pkg/util/grpcutil/carrier.go
     3  // Provenance-includes-license: Apache-2.0
     4  // Provenance-includes-copyright: The Cortex Authors.
     5  
     6  package httpgrpcutil
     7  
     8  import (
     9  	"errors"
    10  
    11  	"github.com/opentracing/opentracing-go"
    12  
    13  	"github.com/grafana/pyroscope/pkg/util/httpgrpc"
    14  )
    15  
    16  // Used to transfer trace information from/to HTTP request.
    17  type HttpgrpcHeadersCarrier httpgrpc.HTTPRequest
    18  
    19  func (c *HttpgrpcHeadersCarrier) Set(key, val string) {
    20  	c.Headers = append(c.Headers, &httpgrpc.Header{
    21  		Key:    key,
    22  		Values: []string{val},
    23  	})
    24  }
    25  
    26  func (c *HttpgrpcHeadersCarrier) ForeachKey(handler func(key, val string) error) error {
    27  	for _, h := range c.Headers {
    28  		for _, v := range h.Values {
    29  			if err := handler(h.Key, v); err != nil {
    30  				return err
    31  			}
    32  		}
    33  	}
    34  	return nil
    35  }
    36  
    37  func GetParentSpanForRequest(tracer opentracing.Tracer, req *httpgrpc.HTTPRequest) (opentracing.SpanContext, error) {
    38  	if tracer == nil {
    39  		return nil, nil
    40  	}
    41  
    42  	carrier := (*HttpgrpcHeadersCarrier)(req)
    43  	extracted, err := tracer.Extract(opentracing.HTTPHeaders, carrier)
    44  	if errors.Is(err, opentracing.ErrSpanContextNotFound) {
    45  		err = nil
    46  	}
    47  	return extracted, err
    48  }