github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/util/httpgrpcutil/carrier.go (about)

     1  package httpgrpcutil
     2  
     3  import (
     4  	"github.com/opentracing/opentracing-go"
     5  	"github.com/weaveworks/common/httpgrpc"
     6  )
     7  
     8  // Used to transfer trace information from/to HTTP request.
     9  type HttpgrpcHeadersCarrier httpgrpc.HTTPRequest
    10  
    11  func (c *HttpgrpcHeadersCarrier) Set(key, val string) {
    12  	c.Headers = append(c.Headers, &httpgrpc.Header{
    13  		Key:    key,
    14  		Values: []string{val},
    15  	})
    16  }
    17  
    18  func (c *HttpgrpcHeadersCarrier) ForeachKey(handler func(key, val string) error) error {
    19  	for _, h := range c.Headers {
    20  		for _, v := range h.Values {
    21  			if err := handler(h.Key, v); err != nil {
    22  				return err
    23  			}
    24  		}
    25  	}
    26  	return nil
    27  }
    28  
    29  func GetParentSpanForRequest(tracer opentracing.Tracer, req *httpgrpc.HTTPRequest) (opentracing.SpanContext, error) {
    30  	if tracer == nil {
    31  		return nil, nil
    32  	}
    33  
    34  	carrier := (*HttpgrpcHeadersCarrier)(req)
    35  	extracted, err := tracer.Extract(opentracing.HTTPHeaders, carrier)
    36  	if err == opentracing.ErrSpanContextNotFound {
    37  		err = nil
    38  	}
    39  	return extracted, err
    40  }