github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/util/httpgrpc/carrier.go (about) 1 package httpgrpc 2 3 import ( 4 "github.com/opentracing/opentracing-go" 5 weaveworks_httpgrpc "github.com/weaveworks/common/httpgrpc" 6 ) 7 8 // Used to transfer trace information from/to HTTP request. 9 type HeadersCarrier weaveworks_httpgrpc.HTTPRequest 10 11 func (c *HeadersCarrier) Set(key, val string) { 12 c.Headers = append(c.Headers, &weaveworks_httpgrpc.Header{ 13 Key: key, 14 Values: []string{val}, 15 }) 16 } 17 18 func (c *HeadersCarrier) 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 *weaveworks_httpgrpc.HTTPRequest) (opentracing.SpanContext, error) { 30 if tracer == nil { 31 return nil, nil 32 } 33 34 carrier := (*HeadersCarrier)(req) 35 extracted, err := tracer.Extract(opentracing.HTTPHeaders, carrier) 36 if err == opentracing.ErrSpanContextNotFound { 37 err = nil 38 } 39 return extracted, err 40 }