gitee.com/zhaochuninhefei/gmgo@v0.0.31-0.20240209061119-069254a02979/go-grpc-middleware/tracing/opentracing/metadata.go (about) 1 // Copyright 2017 Michal Witkowski. All Rights Reserved. 2 // See LICENSE for licensing terms. 3 4 package grpc_opentracing 5 6 import ( 7 "encoding/base64" 8 "strings" 9 10 "gitee.com/zhaochuninhefei/gmgo/grpc/metadata" 11 ) 12 13 const ( 14 binHdrSuffix = "-bin" 15 ) 16 17 // metadataTextMap extends a metadata.MD to be an opentracing textmap 18 type metadataTextMap metadata.MD 19 20 // Set is a opentracing.TextMapReader interface that extracts values. 21 func (m metadataTextMap) Set(key, val string) { 22 // gRPC allows for complex binary values to be written. 23 encodedKey, encodedVal := encodeKeyValue(key, val) 24 // The metadata object is a multimap, and previous values may exist, but for opentracing headers, we do not append 25 // we just override. 26 m[encodedKey] = []string{encodedVal} 27 } 28 29 // ForeachKey is a opentracing.TextMapReader interface that extracts values. 30 func (m metadataTextMap) ForeachKey(callback func(key, val string) error) error { 31 for k, vv := range m { 32 for _, v := range vv { 33 // metadata.DecodeKeyValue is deprecated, use k and v directly instead. 34 //if decodedKey, decodedVal, err := metadata.DecodeKeyValue(k, v); err == nil { 35 // if err = callback(decodedKey, decodedVal); err != nil { 36 // return err 37 // } 38 //} else { 39 // return fmt.Errorf("failed decoding opentracing from gRPC metadata: %v", err) 40 //} 41 if err := callback(k, v); err != nil { 42 return err 43 } 44 } 45 } 46 return nil 47 } 48 49 // encodeKeyValue encodes key and value qualified for transmission via gRPC. 50 // note: copy pasted from private values of grpc.metadata 51 func encodeKeyValue(k, v string) (string, string) { 52 k = strings.ToLower(k) 53 if strings.HasSuffix(k, binHdrSuffix) { 54 val := base64.StdEncoding.EncodeToString([]byte(v)) 55 v = val 56 } 57 return k, v 58 }