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 }