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 }